(for PR #23309)

2026-04-27 07:45.27: New job: build odnnr.2.0.3, using opam dev
                              from https://github.com/ocaml/opam-repository.git#refs/pull/23309/head (6b62b33f94fa0d7f64aa4da5cb0c75e78fa3b3ee)
                              on alpine-3.23-ocaml-4.14/amd64

To reproduce locally:

cd $(mktemp -d)
git clone --recursive "https://github.com/ocaml/opam-repository.git" && cd "opam-repository" && git fetch origin "refs/pull/23309/head" && git reset --hard 6b62b33f
git fetch origin master
git merge --no-edit d5058a91d400180e2118d7eeefa040cfcee45d2c
cat > ../Dockerfile <<'END-OF-DOCKERFILE'
FROM ocaml/opam:alpine-3.23-ocaml-4.14@sha256:c98c3afc38d39340ca2b1e9c3c1b8c127283806cba433dd4865c01d18c619ef9
USER 1000:1000
WORKDIR /home/opam
RUN sudo ln -f /usr/bin/opam-dev /usr/bin/opam
RUN opam init --reinit -ni
RUN opam option solver=builtin-0install && opam config report
ENV OPAMDOWNLOADJOBS="1"
ENV OPAMERRLOGLEN="0"
ENV OPAMPRECISETRACKING="1"
ENV CI="true"
ENV OPAM_REPO_CI="true"
RUN rm -rf opam-repository/
COPY --chown=1000:1000 . opam-repository/
RUN opam repository set-url --strict default opam-repository/
RUN opam update --depexts || true
RUN opam pin add -k version -yn odnnr.2.0.3 2.0.3
RUN opam reinstall odnnr.2.0.3; \
    res=$?; \
    test "$res" != 31 && exit "$res"; \
    export OPAMCLI=2.0; \
    build_dir=$(opam var prefix)/.opam-switch/build; \
    failed=$(ls "$build_dir"); \
    partial_fails=""; \
    for pkg in $failed; do \
    if opam show -f x-ci-accept-failures: "$pkg" | grep -qF "\"alpine-3.23\""; then \
    echo "A package failed and has been disabled for CI using the 'x-ci-accept-failures' field."; \
    fi; \
    test "$pkg" != 'odnnr.2.0.3' && partial_fails="$partial_fails $pkg"; \
    done; \
    test "${partial_fails}" != "" && echo "opam-repo-ci detected dependencies failing: ${partial_fails}"; \
    exit 1

END-OF-DOCKERFILE
docker build -f ../Dockerfile .

2026-04-27 07:45.27: Using cache hint "ocaml/opam:alpine-3.23-ocaml-4.14@sha256:c98c3afc38d39340ca2b1e9c3c1b8c127283806cba433dd4865c01d18c619ef9-odnnr.2.0.3-6b62b33f94fa0d7f64aa4da5cb0c75e78fa3b3ee"
2026-04-27 07:45.27: Using OBuilder spec:
((from ocaml/opam:alpine-3.23-ocaml-4.14@sha256:c98c3afc38d39340ca2b1e9c3c1b8c127283806cba433dd4865c01d18c619ef9)
 (user (uid 1000) (gid 1000))
 (workdir /home/opam)
 (run (shell "sudo ln -f /usr/bin/opam-dev /usr/bin/opam"))
 (run (network host)
      (shell "opam init --reinit --config .opamrc-sandbox -ni"))
 (run (shell "opam option solver=builtin-0install && opam config report"))
 (env OPAMDOWNLOADJOBS 1)
 (env OPAMERRLOGLEN 0)
 (env OPAMPRECISETRACKING 1)
 (env CI true)
 (env OPAM_REPO_CI true)
 (run (shell "rm -rf opam-repository/"))
 (copy (src .) (dst opam-repository/))
 (run (shell "opam repository set-url --strict default opam-repository/"))
 (run (network host)
      (shell "opam update --depexts || true"))
 (run (shell "opam pin add -k version -yn odnnr.2.0.3 2.0.3"))
 (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
      (network host)
      (shell  "opam reinstall odnnr.2.0.3;\
             \n        res=$?;\
             \n        test \"$res\" != 31 && exit \"$res\";\
             \n        export OPAMCLI=2.0;\
             \n        build_dir=$(opam var prefix)/.opam-switch/build;\
             \n        failed=$(ls \"$build_dir\");\
             \n        partial_fails=\"\";\
             \n        for pkg in $failed; do\
             \n          if opam show -f x-ci-accept-failures: \"$pkg\" | grep -qF \"\\\"alpine-3.23\\\"\"; then\
             \n            echo \"A package failed and has been disabled for CI using the 'x-ci-accept-failures' field.\";\
             \n          fi;\
             \n          test \"$pkg\" != 'odnnr.2.0.3' && partial_fails=\"$partial_fails $pkg\";\
             \n        done;\
             \n        test \"${partial_fails}\" != \"\" && echo \"opam-repo-ci detected dependencies failing: ${partial_fails}\";\
             \n        exit 1"))
)

2026-04-27 07:45.27: Connecting to build cluster…
2026-04-27 07:45.27: Waiting for resource in pool OCluster
2026-04-27 07:58.44: Waiting for worker…
2026-04-27 08:00.58: Got resource from pool OCluster
Building on toxis.caelum.ci.dev
All commits already cached
Updating files:  91% (17321/18863)
Updating files:  92% (17354/18863)
Updating files:  93% (17543/18863)
Updating files:  94% (17732/18863)
Updating files:  95% (17920/18863)
Updating files:  96% (18109/18863)
Updating files:  97% (18298/18863)
Updating files:  98% (18486/18863)
Updating files:  99% (18675/18863)
Updating files: 100% (18863/18863)
Updating files: 100% (18863/18863), done.
HEAD is now at d5058a91d4 Merge pull request #29801 from YuriyKrasilnikov/opam-publish-idna.0.4.0
Merge made by the 'ort' strategy.
 packages/odnnr/odnnr.2.0.3/files/install_keras.r |  8 +++++
 packages/odnnr/odnnr.2.0.3/opam                  | 46 ++++++++++++++++++++++++
 2 files changed, 54 insertions(+)
 create mode 100644 packages/odnnr/odnnr.2.0.3/files/install_keras.r
 create mode 100644 packages/odnnr/odnnr.2.0.3/opam

(from ocaml/opam:alpine-3.23-ocaml-4.14@sha256:c98c3afc38d39340ca2b1e9c3c1b8c127283806cba433dd4865c01d18c619ef9)
Unable to find image 'ocaml/opam:alpine-3.23-ocaml-4.14@sha256:c98c3afc38d39340ca2b1e9c3c1b8c127283806cba433dd4865c01d18c619ef9' locally
docker.io/ocaml/opam@sha256:c98c3afc38d39340ca2b1e9c3c1b8c127283806cba433dd4865c01d18c619ef9: Pulling from ocaml/opam
6a0ac1617861: Already exists
9630673831f3: Already exists
4cffb540229a: Already exists
aa3cee094119: Already exists
f2700202f619: Already exists
33135c7375d5: Already exists
1ea4b64ae955: Already exists
ca34ef70eda1: Already exists
d4998b6f8f35: Already exists
4a43cfe8648c: Already exists
453dd28eaace: Already exists
a962f0379f0a: Already exists
b68882dcbbd8: Already exists
3f63b4eac828: Already exists
0720e1e1068a: Already exists
0676d4d6023a: Already exists
0ab690805f49: Already exists
fc0af979c0fe: Already exists
4f4fb700ef54: Already exists
63f1d0bef8ae: Already exists
43fd6995d88f: Already exists
c775bfb331ab: Already exists
a7a9b5ed8780: Already exists
86ac791930d3: Already exists
2e34d70b785c: Already exists
56c554cb0baa: Already exists
0109b7ea4beb: Already exists
a72aa581a14e: Already exists
0b969b88b90b: Already exists
d1ae0e2bf910: Already exists
cfd8efe5a061: Already exists
a34595d6f491: Already exists
7333547f58a0: Already exists
803cdf5f2902: Already exists
d74501489c54: Already exists
628aecb9cafb: Already exists
0c52f398a865: Already exists
c0458221ae1b: Pulling fs layer
5f395ae7d7f2: Pulling fs layer
767edc63c5be: Pulling fs layer
f3eb2829860a: Pulling fs layer
2cde0115c1f3: Pulling fs layer
f3eb2829860a: Waiting
2cde0115c1f3: Waiting
767edc63c5be: Download complete
f3eb2829860a: Verifying Checksum
f3eb2829860a: Download complete
2cde0115c1f3: Verifying Checksum
2cde0115c1f3: Download complete
c0458221ae1b: Download complete
5f395ae7d7f2: Verifying Checksum
5f395ae7d7f2: Download complete
c0458221ae1b: Pull complete
5f395ae7d7f2: Pull complete
767edc63c5be: Pull complete
f3eb2829860a: Pull complete
2cde0115c1f3: Pull complete
Digest: sha256:c98c3afc38d39340ca2b1e9c3c1b8c127283806cba433dd4865c01d18c619ef9
Status: Downloaded newer image for ocaml/opam@sha256:c98c3afc38d39340ca2b1e9c3c1b8c127283806cba433dd4865c01d18c619ef9
2026-04-27 08:02.06 ---> using "8e65bc4d84a4bbc3f291f4c89c5f0411ea9740fc4228eddb2c11cbc44748b04d" from cache

/: (user (uid 1000) (gid 1000))

/: (workdir /home/opam)

/home/opam: (run (shell "sudo ln -f /usr/bin/opam-dev /usr/bin/opam"))
2026-04-27 08:02.06 ---> using "675c877c9dd486f641aee3378b59285238ab2b565463dcdb193b45608fd93b81" from cache

/home/opam: (run (network host)
                 (shell "opam init --reinit --config .opamrc-sandbox -ni"))
Configuring from /home/opam/.opamrc-sandbox, then /home/opam/.opamrc, and finally from built-in defaults.
Checking for available remotes: rsync and local, git.
  - you won't be able to use mercurial repositories unless you install the hg command on your system.
  - you won't be able to use darcs repositories unless you install the darcs command on your system.

This version of opam requires an update to the layout of /home/opam/.opam from version 2.0 to version 2.2, which can't be reverted.
You may want to back it up before going further.

Continue? [Y/n] y
[NOTE] The 'jobs' option was reset, its value was 255 and its new value will vary according to the current number of cores on your machine. You can restore the fixed value using:
           opam option jobs=255 --global
Format upgrade done.

<><> Updating repositories ><><><><><><><><><><><><><><><><><><><><><><><><><><>
[ocaml-patches-overlay] no changes from git+https://github.com/ocurrent/opam-repository#patches
[default] Initialised
2026-04-27 08:02.06 ---> using "a88ef8b7fb3aa3efabd87d4593879d154a4323a2f4d086ab73e1cdbcf7918269" from cache

/home/opam: (run (shell "opam option solver=builtin-0install && opam config report"))
Set to 'builtin-0install' the field solver in global configuration
# opam config report
# opam-version         2.5.1
# self-upgrade         no
# system               arch=x86_64 os=linux os-distribution=alpine os-version=3.23.4
# solver               builtin-0install
# install-criteria     -changed,-count[avoid-version,solution]
# upgrade-criteria     -count[avoid-version,solution]
# jobs                 71
# repositories         2 (version-controlled)
# pinned               1 (version)
# current-switch       4.14
# invariant            ["ocaml-base-compiler" {= "4.14.3"}]
# compiler-packages    ocaml-base-compiler.4.14.3, ocaml-options-vanilla.1
# ocaml:native         true
# ocaml:native-tools   true
# ocaml:native-dynlink true
# ocaml:stubsdir       /home/opam/.opam/4.14/lib/ocaml/stublibs:/home/opam/.opam/4.14/lib/ocaml
# ocaml:preinstalled   false
# ocaml:compiler       4.14.3
2026-04-27 08:02.06 ---> using "636b99ed7c292adfd5c94f091ec6e2d271a13089a57db5c9b45f98e4a6e23269" from cache

/home/opam: (env OPAMDOWNLOADJOBS 1)

/home/opam: (env OPAMERRLOGLEN 0)

/home/opam: (env OPAMPRECISETRACKING 1)

/home/opam: (env CI true)

/home/opam: (env OPAM_REPO_CI true)

/home/opam: (run (shell "rm -rf opam-repository/"))
2026-04-27 08:02.06 ---> using "139d3baade1b3746ddb5cd8cea87afe31917f294090b5c8d8bf4ccbce794d121" from cache

/home/opam: (copy (src .) (dst opam-repository/))
2026-04-27 08:02.07 ---> using "b7c9897a333a64594fa9cb5d9ba7d65433ea6b4becf058b2ca8048f5a4db730a" from cache

/home/opam: (run (shell "opam repository set-url --strict default opam-repository/"))
[default] Initialised
2026-04-27 08:02.11 ---> saved as "13fe75c22f237aba207de205ae29c33daaf1295d316557ce286d536ecfce315d"

/home/opam: (run (network host)
                 (shell "opam update --depexts || true"))
+ /usr/bin/sudo "apk" "update"
- v3.23.4-59-gb9ff5fecad9 [https://dl-cdn.alpinelinux.org/alpine/v3.23/main]
- v3.23.4-62-gc06bcbb6e5a [https://dl-cdn.alpinelinux.org/alpine/v3.23/community]
- v20260127-8558-gb12fae68f31 [https://dl-cdn.alpinelinux.org/alpine/edge/main]
- v20260127-8559-g6fd958a3511 [https://dl-cdn.alpinelinux.org/alpine/edge/community]
- v20260127-8554-gb33de4ab903 [https://dl-cdn.alpinelinux.org/alpine/edge/testing]
- OK: 62090 distinct packages available
2026-04-27 08:02.12 ---> saved as "0996b59ecd8671d4a3aec9c3612f483e30bab46a248eaec6030310c5b01de23b"

/home/opam: (run (shell "opam pin add -k version -yn odnnr.2.0.3 2.0.3"))
odnnr is now pinned to version 2.0.3
2026-04-27 08:02.13 ---> saved as "573a6752ad003bedb669b7134cf9bcdc622725849c9833bfe4dccd0ab4b2e5c6"

/home/opam: (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
                 (network host)
                 (shell  "opam reinstall odnnr.2.0.3;\
                        \n        res=$?;\
                        \n        test \"$res\" != 31 && exit \"$res\";\
                        \n        export OPAMCLI=2.0;\
                        \n        build_dir=$(opam var prefix)/.opam-switch/build;\
                        \n        failed=$(ls \"$build_dir\");\
                        \n        partial_fails=\"\";\
                        \n        for pkg in $failed; do\
                        \n          if opam show -f x-ci-accept-failures: \"$pkg\" | grep -qF \"\\\"alpine-3.23\\\"\"; then\
                        \n            echo \"A package failed and has been disabled for CI using the 'x-ci-accept-failures' field.\";\
                        \n          fi;\
                        \n          test \"$pkg\" != 'odnnr.2.0.3' && partial_fails=\"$partial_fails $pkg\";\
                        \n        done;\
                        \n        test \"${partial_fails}\" != \"\" && echo \"opam-repo-ci detected dependencies failing: ${partial_fails}\";\
                        \n        exit 1"))
odnnr.2.0.3 is not installed. Install it? [Y/n] y
The following actions will be performed:
=== install 14 packages
  - install batteries     3.10.0         [required by odnnr]
  - install camlp-streams 5.0.1          [required by batteries]
  - install conf-autoconf 0.2            [required by cpu]
  - install conf-gnuplot  0.1            [required by odnnr]
  - install conf-r        1.0.0          [required by odnnr]
  - install cpm           12.2.0         [required by odnnr]
  - install cpu           2.0.0          [required by parany]
  - install dolog         6.0.0          [required by odnnr]
  - install dune          3.22.2         [required by odnnr]
  - install minicli       5.0.2          [required by odnnr]
  - install num           1.6            [required by batteries]
  - install ocamlfind     1.9.8          [required by batteries]
  - install odnnr         2.0.3 (pinned)
  - install parany        14.0.1         [required by odnnr]

The following system packages will first need to be installed:
    autoconf gnuplot R

<><> Handling external dependencies <><><><><><><><><><><><><><><><><><><><><><>

opam believes some required external dependencies are missing. opam can:
> 1. Run apk to install them (may need root/sudo access)
  2. Display the recommended apk command and wait while you run it manually (e.g. in another terminal)
  3. Continue anyway, and, upon success, permanently register that this external dependency is present, but not detectable
  4. Abort the installation

[1/2/3/4] 1

+ /usr/bin/sudo "apk" "add" "autoconf" "gnuplot" "R"
- ( 1/53) Installing m4 (1.4.20-r0)
- ( 2/53) Installing perl (5.42.2-r0)
- ( 3/53) Installing autoconf (2.72-r1)
- ( 4/53) Installing perl-error (0.17030-r0)
- ( 5/53) Installing perl-git (2.52.0-r0)
- ( 6/53) Installing git-perl (2.52.0-r0)
- ( 7/53) Installing libxext (1.3.6-r2)
- ( 8/53) Installing libxrender (0.9.12-r0)
- ( 9/53) Installing libpng (1.6.57-r0)
- (10/53) Installing freetype (2.14.1-r0)
- (11/53) Installing fontconfig (2.17.1-r0)
- (12/53) Installing pixman (0.46.4-r0)
- (13/53) Installing cairo (1.18.4-r0)
- (14/53) Installing libcerf (3.3-r0)
- (15/53) Installing libice (1.1.2-r0)
- (16/53) Installing libuuid (2.41.4-r0)
- (17/53) Installing libsm (1.2.6-r0)
- (18/53) Installing libxt (1.3.1-r0)
- (19/53) Installing libxpm (3.5.19-r0)
- (20/53) Installing aom-libs (3.13.1-r1)
- (21/53) Installing libdav1d (1.5.2-r0)
- (22/53) Installing libjpeg-turbo (3.1.2-r0)
- (23/53) Installing libyuv (0.0.1887.20251502-r1)
- (24/53) Installing libavif (1.3.0-r0)
- (25/53) Installing libsharpyuv (1.6.0-r0)
- (26/53) Installing libwebp (1.6.0-r0)
- (27/53) Installing tiff (4.7.1-r0)
- (28/53) Installing libgd (2.3.3-r10)
- (29/53) Installing libintl (0.24.1-r1)
- (30/53) Installing libeconf (0.8.3-r0)
- (31/53) Installing libblkid (2.41.4-r0)
- (32/53) Installing libmount (2.41.4-r0)
- (33/53) Installing glib (2.86.3-r0)
- (34/53) Installing lua5.3-libs (5.3.6-r6)
- (35/53) Installing libxft (2.3.9-r0)
- (36/53) Installing fribidi (1.0.16-r2)
- (37/53) Installing graphite2 (1.3.14-r6)
- (38/53) Installing harfbuzz (12.2.0-r0)
- (39/53) Installing pango (1.56.4-r0)
- (40/53) Installing libwebpmux (1.6.0-r0)
- (41/53) Installing gnuplot (6.0.3-r2)
- (42/53) Installing R-mathlib (4.5.2-r0)
- (43/53) Installing tzdata (2026a-r0)
- (44/53) Installing libquadmath (15.2.0-r2)
- (45/53) Installing libgfortran (15.2.0-r2)
- (46/53) Installing openblas (0.3.30-r2)
- (47/53) Installing libxmu (1.2.1-r0)
- (48/53) Installing libdeflate (1.25-r0)
- (49/53) Installing icu-data-en (76.1-r1)
-   Executing icu-data-en-76.1-r1.post-install
-   * 
-   * If you need ICU with non-English locales and legacy charset support, install
-   * package icu-data-full.
-   * 
- (50/53) Installing icu-libs (76.1-r1)
- (51/53) Installing tcl (8.6.17-r0)
- (52/53) Installing tk (8.6.17-r0)
- (53/53) Installing R (4.5.2-r0)
-   Executing R-4.5.2-r0.post-install
-   * 
-   * If you want to install R packages from CRAN that contains native extensions,
-   * then you must also install R-dev.
-   * 
-   * To avoid warnings about R.css when installing R extensions also install R-doc.
-   * 
- Executing busybox-1.37.0-r30.trigger
- Executing glib-2.86.3-r0.trigger
- OK: 495.6 MiB in 156 packages

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> retrieved batteries.3.10.0  (cached)
-> retrieved camlp-streams.5.0.1  (cached)
-> retrieved conf-r.1.0.0  (cached)
-> retrieved cpm.12.2.0  (cached)
-> retrieved cpu.2.0.0  (cached)
-> retrieved dolog.6.0.0  (cached)
-> installed conf-gnuplot.0.1
-> installed conf-autoconf.0.2
-> installed conf-r.1.0.0
-> retrieved dune.3.22.2  (cached)
-> retrieved minicli.5.0.2  (cached)
-> retrieved num.1.6  (cached)
-> retrieved ocamlfind.1.9.8  (cached)
-> retrieved odnnr.2.0.3  (https://github.com/UnixJunkie/odnnr/archive/v2.0.3.tar.gz)
-> retrieved parany.14.0.1  (cached)
-> installed num.1.6
-> installed ocamlfind.1.9.8
-> installed dune.3.22.2
-> installed minicli.5.0.2
-> installed dolog.6.0.0
-> installed camlp-streams.5.0.1
-> installed cpu.2.0.0
-> installed parany.14.0.1
-> installed batteries.3.10.0
-> installed cpm.12.2.0
[ERROR] The installation of odnnr failed at "R CMD BATCH install_keras.r".

#=== ERROR while installing odnnr.2.0.3 =======================================#
# context              2.5.1 | linux/x86_64 | ocaml-base-compiler.4.14.3 | pinned(https://github.com/UnixJunkie/odnnr/archive/v2.0.3.tar.gz)
# path                 ~/.opam/4.14/.opam-switch/build/odnnr.2.0.3
# command              ~/.opam/opam-init/hooks/sandbox.sh install R CMD BATCH install_keras.r
# exit-code            1
# env-file             ~/.opam/log/odnnr-7-080b06.env
# output-file          ~/.opam/log/odnnr-7-080b06.out



<><> Error report <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
+- The following actions failed
| - install odnnr 2.0.3
+- 
+- The following changes have been performed
| - install batteries     3.10.0
| - install camlp-streams 5.0.1
| - install conf-autoconf 0.2
| - install conf-gnuplot  0.1
| - install conf-r        1.0.0
| - install cpm           12.2.0
| - install cpu           2.0.0
| - install dolog         6.0.0
| - install dune          3.22.2
| - install minicli       5.0.2
| - install num           1.6
| - install ocamlfind     1.9.8
| - install parany        14.0.1
+- 

<><> odnnr.2.0.3 troubleshooting ><><><><><><><><><><><><><><><><><><><><><><><>
=> Please interact with pip3 then R to install required dependencies in user-space:
   pip3 install tensorflow keras
   R
   install.packages('keras', repos='http://cran.r-project.org')
   library(keras)
# To update the current shell environment, run: eval $(opam env)

The former state can be restored with:
    /usr/bin/opam switch import "/home/opam/.opam/4.14/.opam-switch/backup/state-20260427080214.export"
[WARNING] OPAMCONFIRMLEVEL was ignored because CLI 2.0 was requested and it was introduced in 2.1.
[WARNING] OPAMCONFIRMLEVEL was ignored because CLI 2.0 was requested and it was introduced in 2.1.
"/usr/bin/env" "bash" "-c" "opam reinstall odnnr.2.0.3;
        res=$?;
        test "$res" != 31 && exit "$res";
        export OPAMCLI=2.0;
        build_dir=$(opam var prefix)/.opam-switch/build;
        failed=$(ls "$build_dir");
        partial_fails="";
        for pkg in $failed; do
          if opam show -f x-ci-accept-failures: "$pkg" | grep -qF "\"alpine-3.23\""; then
            echo "A package failed and has been disabled for CI using the 'x-ci-accept-failures' field.";
          fi;
          test "$pkg" != 'odnnr.2.0.3' && partial_fails="$partial_fails $pkg";
        done;
        test "${partial_fails}" != "" && echo "opam-repo-ci detected dependencies failing: ${partial_fails}";
        exit 1" failed with exit status 1
2026-04-27 08:03.09: Job failed: Failed: Build failed
2026-04-27 08:03.09: Log analysis:
2026-04-27 08:03.09: >>> 
[ERROR] The installation of odnnr failed at "R CMD BATCH install_keras.r".
 (score = 20)
2026-04-27 08:03.09: The installation of odnnr failed at "R CMD BATCH install_keras.r".