Skip to content

Conversation

@sabine
Copy link
Collaborator

@sabine sabine commented Aug 28, 2025

This is the reopen of #3132. Me and @cuihtlauac met to migrate all the open tasks over here. I hope we got them all!


Open issues:

  • make docker fails on Ubuntu 22.04 with curl error 6
  • review Backstage OCaml announcement included in this PR to make sure it's still accurate

General concerns that haven't been fully decided / documented:

  • (@cuihtlauac) To what extent will we support opam workflows on OCaml.org in the future? (@cuihtlauac has explored and considers it feasible)
  • (@sabine) The opam-repository pin update scenario: What do we need to communicate about this to contributors, how exaclty do we do this as maintainers? (e.g. have a section in contributor docs about "after rebase on main, my branch doesn't build anymore" and mention that this could be because the dependencies have beeen updated, with example of error message and steps to fix that - deleting dune.lock)

Remaining simple todos::

  • (@sabine) Update README.md, section “Getting Started”
  • (@sabine) we need to use a stable version of Dune on all GitHub Actions Workflows, in the Dockerfile, and for the local build / install (Makefile) (this PR aims to add a version parameter to the GitHub Action: update action to take a parameter 'version' to install stable Dune ocaml-dune/setup-dune#10, and the changes from this PR will only work afterwards)
  • (@sabine) as a smoke test, we create a new daily(?) GitHub Action that uses Developer Preview to build ocaml.org (this intends to benefit Dune Developer Preview)
  • (@sabine) Performance impact:
    • How does this change affect the build times (switch creation vs dune pkg, cold build difference, warm build difference)? Needs to be documented in this PR.
    • make clean must be implemented in such a way that it doesn't delete the dependencies (this would be equivalent to deleting the opam switch. All we need make clean to do is to delete all the build artifacts!)
    • [ ] add a new command make wipe that deletes the dependencies? (This would be useful in the docs, to tell people to use this when they run into trouble because we advanced the opam-repository pin for ocaml.org's dependencies.)

To put in maintenance backlog, without blocking this PR:

  • (@cuihtlauac) curl / ipv4 / ipv6-related Docker build issues under Ubuntu 25.04 (is this something to report on upstream, i.e. Ubuntu / Docker / Dune?)

What Contributors and Maintainers Need to Do

In order to switch from the old opam-based build to the Dune build:

  1. if you have a local opam switch for ocaml.org, you probably want to delete it - to make sure you're not accidentally picking up the wrong version of dune from there
  2. have dune >= 3.20 installed
  3. run make

Performance Impact

This Branch

Clean build, after using make clean:
$ make clean
dune clean --root .
sabine@pop-os:~/ocaml.org$ time make
dune build --root .
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
Browserslist: caniuse-lite is outdated. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme

Rebuilding...

Done in 1179ms.
######################################################################## 100.0%
real    2m14.213s
user    5m43.592s
sys     2m40.199s

Repeat build without changes:

$ time make
dune build --root .
                                         
real    0m4.844s
user    0m3.828s
sys     0m1.008s
Clean build, including installation of dependencies:
$ time make
dune pkg lock
Locking dune.lock: Updating package repos "overlay", "pinned_opam_repository", "pinned_overlay_repository" and "upst                                                                                                                    Locking dune.lock: Updating package repos "overlay", "pinned_opam_repository", "pinned_overlay_repository" and "upst                                                                                                                    Solution for dune.lock:      
- alcotest.1.9.0
- angstrom.0.16.1
- asn1-combinators.0.3.2
- astring.0.8.5
- base.v0.17.2
- base-bytes.base
- base-threads.base
- base-unix.base
- base64.3.5.1
- bigarray-compat.1.1.0
- bigarray-overlap.0.2.1
- bigstringaf.0.10.0
- bos.0.2.1
- ca-certs.1.0.1
- camlp-streams.5.0.1
- caqti.2.2.4
- caqti-lwt.2.2.4
- checkseum.0.5.2
- cmarkit.0.3.0
- cmdliner.1.3.0
- cohttp.6.1.0
- cohttp-lwt.6.1.0
- cohttp-lwt-unix.6.1.0
- conduit.8.0.0
- conduit-lwt.8.0.0
- conduit-lwt-unix.8.0.0
- conf-gmp.5
- conf-gmp-powm-sec.4
- conf-libev.4-12
- conf-libssl.4
- conf-oniguruma.1
- conf-pkg-config.4
- cppo.1.8.0
- crunch.4.0.0
- csexp.1.5.2
- cstruct.6.2.0
- ctypes.0.23.0
- decompress.1.5.3
- digestif.1.3.0
- domain-name.0.4.1
- dream.1.0.0~alpha8
- dream-accept.0.1.0
- dream-encoding.0.3.0
- dream-httpaf.1.0.0~alpha4
- dream-pure.1.0.0~alpha2
- dune-build-info.3.19.0
- dune-configurator.3.19.0
- dune-private-libs.3.19.0
- dune-site.3.19.0
- duration.0.2.1
- dyn.3.19.0
- either.1.0.0
- eqaf.0.10
- ezjsonm.1.3.0
- faraday.0.8.2
- faraday-lwt.0.8.2
- faraday-lwt-unix.0.8.2
- fix.20250428
- fmt.0.10.0
- fpath.0.7.3
- gluten.0.5.2
- gluten-lwt.0.5.2
- gluten-lwt-unix.0.5.2
- gmap.0.3.0
- graphql.0.14.0
- graphql-lwt.0.14.0
- graphql_parser.0.14.0
- h2.0.12.0
- h2-lwt.0.12.0
- h2-lwt-unix.0.12.0
- hex.1.5.0
- hilite.0.4.0
- hmap.0.8.1
- hpack.0.12.0
- http.6.1.0
- httpun.0.1.0
- httpun-lwt.0.1.0
- httpun-lwt-unix.0.1.0
- httpun-types.0.1.0
- httpun-ws.0.2.0
- integers.0.7.0
- ipaddr.5.6.0
- ipaddr-sexp.5.6.0
- jsonm.1.0.2
- kdf.1.0.0
- ke.0.6
- lambdasoup.1.1.1
- logs.0.8.0
- lru.0.3.1
- lwt.5.9.1
- lwt-dllist.1.1.0
- lwt_ppx.5.9.1
- lwt_ssl.1.2.0
- macaddr.5.6.0
- magic-mime.1.3.1
- markup.1.0.3
- mdx.2.5.0
- menhir.20240715
- menhirCST.20240715
- menhirLib.20240715
- menhirSdk.20240715
- mirage-clock.4.2.0
- mirage-crypto.1.2.0
- mirage-crypto-ec.1.2.0
- mirage-crypto-pk.1.2.0
- mirage-crypto-rng.1.2.0
- mirage-crypto-rng-lwt.1.2.0
- mirage-kv.6.1.1
- mirage-kv-mem.4.0.0
- mirage-ptime.5.0.0
- mtime.2.1.0
- multipart_form.0.6.0
- multipart_form-lwt.0.6.0
- ocaml.5.2.0
- ocaml-base-compiler.5.2.0
- ocaml-compiler-libs.v0.17.0
- ocaml-config.3
- ocaml-syntax-shims.1.0.0
- ocaml-version.4.0.0
- ocaml_intrinsics_kernel.v0.17.1
- ocamlbuild.0.16.1+dune
- ocamlfind.1.9.8+dune
- ocamlformat.0.26.2
- ocamlformat-lib.0.26.2
- ocamlgraph.2.2.0
- ocp-indent.1.8.1
- ocplib-endian.1.2
- ohex.0.2.0
- oniguruma.0.1.2
- opam-core.2.3.0
- opam-file-format.2.1.6
- opam-format.2.3.0
- optint.0.3.0
- ordering.3.19.0
- ounit.2.2.7
- ounit2.2.2.7
- pecu.0.7
- pp.2.0.0
- ppx_derivers.1.2.1
- ppx_deriving.6.0.3
- ppx_deriving_yaml.0.4.0
- ppx_deriving_yojson.3.9.1
- ppx_import.1.11.0
- ppx_sexp_conv.v0.17.0
- ppx_stable.v0.17.0
- ppxlib.0.35.0
- ppxlib_jane.v0.17.0
- prettym.0.0.3
- psq.0.2.1
- ptime.1.2.0
- re.1.12.0
- result.1.5
- river.0.4
- rresult.0.7.0
- seq.base
- sexplib0.v0.17.0
- sha.1.15.4
- ssl.0.7.0
- stdio.v0.17.0
- stdlib-shims.0.3.0
- stdune.3.19.0
- stringext.1.6.0
- swhid_core.0.1
- syndic.1.6.1
- textmate-language.0.4.0
- timedesc.3.1.0
- timedesc-tzdb.3.1.0
- timedesc-tzlocal.3.1.0
- tls.2.0.1
- topkg.1.0.8
- uchar.0.0.2
- unstrctrd.0.4
- uri.4.4.0
- uri-sexp.4.4.0
- uucp.16.0.0
- uuseg.16.0.0
- uutf.1.0.4
- x509.1.0.6
- xmlm.1.4.0
- yaml.3.2.0
- yojson.2.2.2
- zarith.1.14
dune build --root .          
Done: 57% (4/7, 3 left) (jobs: 1)
######################################################################## 100.0%
######################################################################## 100.0%
Browserslist: caniuse-lite is outdated. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme

Rebuilding...

Done in 1116ms.
######################################################################## 100.0%
######################################################################## 100.0%
real    3m25.763s
user    10m6.832s
sys     3m24.536s

Before Patch

Clean build, after using make clean:
$ make clean
opam exec -- dune clean --root .
sabine@pop-os:~/ocaml.org$ time make
opam exec -- dune build --root .
######################################################################## 100.0%
Browserslist: caniuse-lite is outdated. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme

Rebuilding...

Done in 1323ms.
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
real    0m24.701s
user    0m55.949s
sys     0m18.443s
Repeat build without changes:
$ time make
opam exec -- dune build --root .
real    0m0.498s
user    0m0.376s
sys     0m0.107s
Clean build, including installation of dependencies:
$ time (make switch && make)
opam switch create . 5.2.0 --no-install --repos pin=git+https://github.com/ocaml/opam-repository#584630e7a7e27e3cf56158696a3fe94623a0cf4f

<><> Installing new switch packages <><><><><><><><><><><><><><><><><><><><><><>
Switch invariant: ["ocaml-base-compiler" {= "5.2.0"} | "ocaml-system" {= "5.2.0"}]
[NOTE] It seems you have not updated your repositories for a while. Consider updating them with:
       opam update


<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
⬇ retrieved ocaml-config.3  (cached)
∗ installed base-bigarray.base
∗ installed base-threads.base
∗ installed base-unix.base
∗ installed ocaml-options-vanilla.1
⬇ retrieved ocaml-base-compiler.5.2.0  (cached)
∗ installed ocaml-base-compiler.5.2.0
∗ installed ocaml-config.3
∗ installed ocaml.5.2.0
∗ installed base-domains.base
∗ installed base-nnp.base
Done.
# Run eval $(opam env) to update the current shell environment
opam install -y ocamlformat=0.26.2 ocaml-lsp-server
[NOTE] It seems you have not updated your repositories for a while. Consider updating them with:
       opam update

The following actions will be performed:
=== install 49 packages
  ∗ astring                 0.8.5    [required by ocaml-lsp-server]
  ∗ base                    v0.17.2  [required by ocaml-lsp-server]
  ∗ base-bytes              base     [required by ocp-indent]
  ∗ camlp-streams           5.0.1    [required by ocaml-lsp-server]
  ∗ chrome-trace            3.19.0   [required by ocaml-lsp-server]
  ∗ cmdliner                1.3.0    [required by ocamlformat]
  ∗ csexp                   1.5.2    [required by ocaml-lsp-server]
  ∗ dune                    3.19.0   [required by ocaml-lsp-server, ocamlformat]
  ∗ dune-build-info         3.19.0   [required by ocaml-lsp-server]
  ∗ dune-configurator       3.19.0   [required by base]
  ∗ dune-rpc                3.19.0   [required by ocaml-lsp-server]
  ∗ dyn                     3.19.0   [required by ocaml-lsp-server]
  ∗ either                  1.0.0    [required by ocamlformat-lib]
  ∗ fiber                   3.7.0    [required by ocaml-lsp-server]
  ∗ fix                     20250428 [required by ocamlformat-lib]
  ∗ fpath                   0.7.3    [required by ocamlformat-lib]
  ∗ jsonrpc                 1.21.0   [required by ocaml-lsp-server]
  ∗ lsp                     1.21.0   [required by ocaml-lsp-server]
  ∗ menhir                  20240715 [required by ocamlformat-lib]
  ∗ menhirCST               20240715 [required by menhir]
  ∗ menhirLib               20240715 [required by ocamlformat-lib]
  ∗ menhirSdk               20240715 [required by ocamlformat-lib]
  ∗ merlin-lib              5.3-502  [required by ocaml-lsp-server]
  ∗ ocaml-lsp-server        1.21.0
  ∗ ocaml-version           4.0.0    [required by ocamlformat-lib]
  ∗ ocaml_intrinsics_kernel v0.17.1  [required by base]
  ∗ ocamlbuild              0.16.1   [required by astring]
  ∗ ocamlc-loc              3.19.0   [required by ocaml-lsp-server]
  ∗ ocamlfind               1.9.8    [required by astring]
  ∗ ocamlformat             0.26.2
  ∗ ocamlformat-lib         0.26.2   [required by ocamlformat]
  ∗ ocamlformat-rpc-lib     0.27.0   [required by ocaml-lsp-server]
  ∗ ocp-indent              1.8.1    [required by ocamlformat-lib]
  ∗ ordering                3.19.0   [required by ocaml-lsp-server]
  ∗ pp                      2.0.0    [required by ocaml-lsp-server]
  ∗ ppx_yojson_conv_lib     v0.17.0  [required by ocaml-lsp-server]
  ∗ re                      1.12.0   [required by ocaml-lsp-server, ocamlformat]
  ∗ result                  1.5      [required by ocamlformat-lib]
  ∗ seq                     base     [required by re]
  ∗ sexplib0                v0.17.0  [required by base]
  ∗ spawn                   v0.17.0  [required by ocaml-lsp-server]
  ∗ stdio                   v0.17.0  [required by ocamlformat-lib]
  ∗ stdune                  3.19.0   [required by ocaml-lsp-server]
  ∗ topkg                   1.0.8    [required by astring]
  ∗ uucp                    16.0.0   [required by uuseg]
  ∗ uuseg                   16.0.0   [required by ocamlformat-lib]
  ∗ uutf                    1.0.4    [required by lsp, ocamlformat-lib]
  ∗ xdg                     3.19.0   [required by ocaml-lsp-server]
  ∗ yojson                  2.2.2    [required by ocaml-lsp-server]

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
⬇ retrieved astring.0.8.5  (cached)
⬇ retrieved base.v0.17.2  (cached)
⬇ retrieved camlp-streams.5.0.1  (cached)
⬇ retrieved csexp.1.5.2  (cached)
⬇ retrieved cmdliner.1.3.0  (cached)
⬇ retrieved either.1.0.0  (cached)
⬇ retrieved fiber.3.7.0  (cached)
⬇ retrieved fix.20250428  (cached)
⬇ retrieved fpath.0.7.3  (cached)
⬇ retrieved menhir.20240715, menhirCST.20240715, menhirLib.20240715, menhirSdk.20240715  (cached)
⬇ retrieved chrome-trace.3.19.0, dune.3.19.0, dune-build-info.3.19.0, dune-configurator.3.19.0, dune-rpc.3.19.0, dyn.3.19.0, ocamlc-loc.3.19.0, ordering.3.19.0, stdune.3.19.0, xdg.3.19.0  (cached)
⬇ retrieved jsonrpc.1.21.0, lsp.1.21.0, ocaml-lsp-server.1.21.0  (cached)
⬇ retrieved merlin-lib.5.3-502  (cached)
⬇ retrieved ocaml-version.4.0.0  (cached)
⬇ retrieved ocaml_intrinsics_kernel.v0.17.1  (cached)
⬇ retrieved ocamlbuild.0.16.1  (cached)
⬇ retrieved ocamlfind.1.9.8  (cached)
∗ installed cmdliner.1.3.0
⬇ retrieved ocp-indent.1.8.1  (cached)
⬇ retrieved pp.2.0.0  (cached)
⬇ retrieved ppx_yojson_conv_lib.v0.17.0  (cached)
⬇ retrieved re.1.12.0  (cached)
⬇ retrieved result.1.5  (cached)
⬇ retrieved seq.base  (cached)
∗ installed seq.base
⬇ retrieved sexplib0.v0.17.0  (cached)
⬇ retrieved ocamlformat.0.26.2, ocamlformat-lib.0.26.2  (cached)
⬇ retrieved ocamlformat-rpc-lib.0.27.0  (cached)
⬇ retrieved spawn.v0.17.0  (cached)
⬇ retrieved stdio.v0.17.0  (cached)
⬇ retrieved uuseg.16.0.0  (cached)
⬇ retrieved topkg.1.0.8  (cached)
⬇ retrieved uutf.1.0.4  (cached)
⬇ retrieved yojson.2.2.2  (cached)
⬇ retrieved uucp.16.0.0  (cached)
∗ installed ocamlfind.1.9.8
∗ installed base-bytes.base
∗ installed ocamlbuild.0.16.1
∗ installed topkg.1.0.8
∗ installed uutf.1.0.4
∗ installed astring.0.8.5
∗ installed fpath.0.7.3
∗ installed dune.3.19.0
∗ installed camlp-streams.5.0.1
∗ installed csexp.1.5.2
∗ installed either.1.0.0
∗ installed fix.20250428
∗ installed jsonrpc.1.21.0
∗ installed menhirCST.20240715
∗ installed menhirLib.20240715
∗ installed menhirSdk.20240715
∗ installed ocaml-version.4.0.0
∗ installed ocaml_intrinsics_kernel.v0.17.1
∗ installed ocp-indent.1.8.1
∗ installed pp.2.0.0
∗ installed re.1.12.0
∗ installed ocamlformat-rpc-lib.0.27.0
∗ installed result.1.5
∗ installed sexplib0.v0.17.0
∗ installed spawn.v0.17.0
∗ installed dune-build-info.3.19.0
∗ installed chrome-trace.3.19.0
∗ installed ordering.3.19.0
∗ installed yojson.2.2.2
∗ installed dune-configurator.3.19.0
∗ installed xdg.3.19.0
∗ installed ppx_yojson_conv_lib.v0.17.0
∗ installed dyn.3.19.0
∗ installed ocamlc-loc.3.19.0
∗ installed stdune.3.19.0
∗ installed base.v0.17.2
∗ installed lsp.1.21.0
∗ installed uucp.16.0.0
∗ installed fiber.3.7.0
∗ installed stdio.v0.17.0
∗ installed merlin-lib.5.3-502
∗ installed dune-rpc.3.19.0
∗ installed uuseg.16.0.0
∗ installed menhir.20240715
∗ installed ocaml-lsp-server.1.21.0
∗ installed ocamlformat-lib.0.26.2
∗ installed ocamlformat.0.26.2
Done.

<><> ocp-indent.1.8.1 installed successfully ><><><><><><><><><><><><><><><><><>
=> This package requires additional configuration for use in editors. Install package 'user-setup', or manually:

   * for Emacs, add these lines to ~/.emacs:
     (add-to-list 'load-path "/home/sabine/ocaml.org/_opam/share/emacs/site-lisp")
     (require 'ocp-indent)

   * for Vim, add this line to ~/.vimrc:
     set rtp^="/home/sabine/ocaml.org/_opam/share/ocp-indent/vim"
# Run eval $(opam env) to update the current shell environment
opam install -y --deps-only --with-test --with-doc .
[WARNING] Failed checks on tailwindcss package definition from source at git+file:///home/sabine/ocaml.org#HEAD:
    error 57: Synopsis must not be empty
The following additional pinnings are required by ocamlorg.dev:
  - river.dev at git+https://github.com/aantron/river#476dc945a908a69548bddd267f143a3e5d9c8a1a
Pin and install them? [y/n] y
[river.dev] synchronised (no changes)
river is now pinned to git+https://github.com/aantron/river#476dc945a908a69548bddd267f143a3e5d9c8a1a (version dev)
[NOTE] It seems you have not updated your repositories for a while. Consider updating them with:
       opam update

The following actions will be performed:
=== install 132 packages
  ∗ alcotest              1.9.0        [required by ocamlorg]
  ∗ angstrom              0.16.1       [required by timedesc]
  ∗ asn1-combinators      0.3.2        [required by x509]
  ∗ base64                3.5.1        [required by cohttp]
  ∗ bigarray-compat       1.1.0        [required by dream]
  ∗ bigarray-overlap      0.2.1        [required by prettym]
  ∗ bigstringaf           0.10.0       [required by multipart_form, caqti, angstrom, etc.]
  ∗ bos                   0.2.1        [required by ocamlorg]
  ∗ ca-certs              1.0.1        [required by conduit-lwt-unix]
  ∗ caqti                 2.2.4        [required by dream]
  ∗ caqti-lwt             2.2.4        [required by dream]
  ∗ checkseum             0.5.2        [required by decompress]
  ∗ cmarkit               0.3.0        [required by ocamlorg]
  ∗ cohttp                6.1.0        [required by ocamlorg]
  ∗ cohttp-lwt            6.1.0        [required by cohttp-lwt-unix, river]
  ∗ cohttp-lwt-unix       6.1.0        [required by ocamlorg]
  ∗ conduit               8.0.0        [required by conduit-lwt]
  ∗ conduit-lwt           8.0.0        [required by cohttp-lwt-unix]
  ∗ conduit-lwt-unix      8.0.0        [required by cohttp-lwt-unix]
  ∗ conf-gmp              5            [required by conf-gmp-powm-sec, zarith]
  ∗ conf-gmp-powm-sec     4            [required by mirage-crypto-pk]
  ∗ conf-libev            4-12         [required by dream]
  ∗ conf-libssl           4            [required by ssl]
  ∗ conf-oniguruma        1            [required by oniguruma]
  ∗ conf-pkg-config       4            [required by conf-oniguruma]
  ∗ cppo                  1.8.0        [required by odoc, mdx, ppx_deriving]
  ∗ crunch                4.0.0        [required by ocamlorg]
  ∗ cstruct               6.2.0        [required by dream, hex]
  ∗ ctypes                0.23.0       [required by yaml]
  ∗ decompress            1.5.3        [required by dream-encoding]
  ∗ digestif              1.3.0        [required by dream]
  ∗ domain-name           0.4.1        [required by caqti, ipaddr, caqti-lwt]
  ∗ dream                 1.0.0~alpha7 [required by dream-accept, dream-encoding]
  ∗ dream-accept          0.1.0        [required by ocamlorg]
  ∗ dream-encoding        0.3.0        [required by ocamlorg]
  ∗ dream-httpaf          1.0.0~alpha3 [required by dream]
  ∗ dream-pure            1.0.0~alpha2 [required by dream]
  ∗ dune-private-libs     3.19.0       [required by dune-site]
  ∗ dune-site             3.19.0       [required by caqti]
  ∗ duration              0.2.1        [required by mirage-crypto-rng-lwt]
  ∗ eqaf                  0.10         [required by digestif, mirage-crypto]
  ∗ ezjsonm               1.3.0        [required by ocamlorg]
  ∗ faraday               0.8.2        [required by dream-httpaf]
  ∗ faraday-lwt           0.8.2        [required by faraday-lwt-unix]
  ∗ faraday-lwt-unix      0.8.2        [required by dream-httpaf]
  ∗ fmt                   0.10.0       [required by ocamlorg]
  ∗ gmap                  0.3.0        [required by x509]
  ∗ graphql               0.14.0       [required by ocamlorg]
  ∗ graphql-lwt           0.14.0       [required by dream]
  ∗ graphql_parser        0.14.0       [required by dream]
  ∗ hex                   1.5.0        [required by ezjsonm]
  ∗ hilite                0.4.0        [required by ocamlorg]
  ∗ hmap                  0.8.1        [required by dream-pure]
  ∗ http                  6.1.0        [required by cohttp, cohttp-lwt-unix]
  ∗ integers              0.7.0        [required by ctypes]
  ∗ ipaddr                5.6.0        [required by cohttp-lwt, conduit-lwt-unix]
  ∗ ipaddr-sexp           5.6.0        [required by conduit-lwt-unix]
  ∗ jsonm                 1.0.2        [required by ezjsonm]
  ∗ kdf                   1.0.0        [required by x509, tls]
  ∗ ke                    0.6          [required by multipart_form, multipart_form-lwt]
  ∗ lambdasoup            1.1.1        [required by ocamlorg]
  ∗ logs                  0.8.0        [required by ocamlorg]
  ∗ lru                   0.3.1        [required by caqti]
  ∗ lwt                   5.9.1        [required by ocamlorg]
  ∗ lwt-dllist            1.1.0        [required by caqti]
  ∗ lwt_ppx               5.9.1        [required by dream-encoding]
  ∗ lwt_ssl               1.2.0        [required by conduit-lwt-unix, dream]
  ∗ macaddr               5.6.0        [required by ipaddr]
  ∗ magic-mime            1.3.1        [required by cohttp-lwt-unix]
  ∗ markup                1.0.3        [required by dream]
  ∗ mdx                   2.5.0        [required by ocamlorg]
  ∗ mirage-clock          4.2.0        [required by dream]
  ∗ mirage-crypto         1.2.0        [required by dream]
  ∗ mirage-crypto-ec      1.2.0        [required by x509, tls]
  ∗ mirage-crypto-pk      1.2.0        [required by x509, tls]
  ∗ mirage-crypto-rng     1.2.0        [required by dream]
  ∗ mirage-crypto-rng-lwt 1.2.0        [required by dream]
  ∗ mirage-kv             6.1.1        [required by mirage-kv-mem]
  ∗ mirage-kv-mem         4.0.0        [required by ocamlorg]
  ∗ mirage-ptime          5.0.0        [required by mirage-kv-mem]
  ∗ mtime                 2.1.0        [required by caqti-lwt, caqti, mirage-crypto-rng-lwt]
  ∗ multipart_form        0.6.0        [required by dream]
  ∗ multipart_form-lwt    0.6.0        [required by dream]
  ∗ ocaml-compiler-libs   v0.17.0      [required by ppxlib]
  ∗ ocaml-syntax-shims    1.0.0        [required by alcotest]
  ∗ ocamlgraph            2.2.0        [required by opam-core]
  ∗ ocplib-endian         1.2          [required by lwt]
  ∗ odoc                  3.0.0        [required by ocamlorg, tailwindcss]
  ∗ odoc-parser           3.0.0        [required by odoc]
  ∗ ohex                  0.2.0        [required by ca-certs]
  ∗ oniguruma             0.1.2        [required by textmate-language]
  ∗ opam-core             2.3.0        [required by opam-format]
  ∗ opam-file-format      2.1.6        [required by opam-format]
  ∗ opam-format           2.3.0        [required by ocamlorg]
  ∗ optint                0.3.0        [required by mirage-kv-mem]
  ∗ ounit                 2.2.7        [required by ocamlorg]
  ∗ ounit2                2.2.7        [required by ounit]
  ∗ pecu                  0.7          [required by multipart_form]
  ∗ ppx_derivers          1.2.1        [required by ppx_deriving]
  ∗ ppx_deriving          6.0.3        [required by ocamlorg]
  ∗ ppx_deriving_yaml     0.4.0        [required by ocamlorg]
  ∗ ppx_deriving_yojson   3.9.1        [required by ocamlorg]
  ∗ ppx_import            1.11.0       [required by ocamlorg]
  ∗ ppx_sexp_conv         v0.17.0      [required by cohttp, cohttp-lwt-unix]
  ∗ ppx_stable            v0.17.0      [required by ocamlorg]
  ∗ ppxlib                0.35.0       [required by ppx_import, ppx_deriving_yaml, ppx_deriving, etc.]
  ∗ ppxlib_jane           v0.17.0      [required by ppx_sexp_conv]
  ∗ prettym               0.0.3        [required by multipart_form]
  ∗ psq                   0.2.1        [required by dream-httpaf]
  ∗ ptime                 1.2.0        [required by ocamlorg]
  ∗ river                 dev (pinned) [required by ocamlorg]
  ∗ rresult               0.7.0        [required by bos]
  ∗ sha                   1.15.4       [required by opam-core]
  ∗ ssl                   0.7.0        [required by dream]
  ∗ stdlib-shims          0.3.0        [required by alcotest]
  ∗ stringext             1.6.0        [required by cohttp]
  ∗ swhid_core            0.1          [required by opam-core]
  ∗ syndic                1.6.1        [required by ocamlorg]
  ∗ textmate-language     0.4.0        [required by hilite]
  ∗ timedesc              3.1.0        [required by ocamlorg]
  ∗ timedesc-tzdb         3.1.0        [required by timedesc]
  ∗ timedesc-tzlocal      3.1.0        [required by timedesc]
  ∗ tls                   2.0.1        [required by caqti]
  ∗ tyxml                 4.6.0        [required by odoc]
  ∗ uchar                 0.0.2        [required by markup]
  ∗ unstrctrd             0.4          [required by multipart_form]
  ∗ uri                   4.4.0        [required by ocamlorg]
  ∗ uri-sexp              4.4.0        [required by cohttp]
  ∗ x509                  1.0.6        [required by ca-certs, caqti]
  ∗ xmlm                  1.4.0        [required by ocamlorg]
  ∗ yaml                  3.2.0        [required by ppx_deriving_yaml]
  ∗ zarith                1.14         [required by mirage-crypto-pk]

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
⬇ retrieved asn1-combinators.0.3.2  (cached)
⬇ retrieved angstrom.0.16.1  (cached)
⬇ retrieved alcotest.1.9.0  (cached)
⬇ retrieved base64.3.5.1  (cached)
⬇ retrieved bigarray-compat.1.1.0  (cached)
⬇ retrieved bigarray-overlap.0.2.1  (cached)
⬇ retrieved bigstringaf.0.10.0  (cached)
⬇ retrieved bos.0.2.1  (cached)
⬇ retrieved ca-certs.1.0.1  (cached)
⬇ retrieved checkseum.0.5.2  (cached)
⬇ retrieved caqti.2.2.4, caqti-lwt.2.2.4  (cached)
⬇ retrieved cmarkit.0.3.0  (cached)
⬇ retrieved conf-gmp.5  (cached)
⬇ retrieved conf-gmp-powm-sec.4  (cached)
⬇ retrieved conf-libev.4-12  (cached)
⬇ retrieved conf-libssl.4  (cached)
⬇ retrieved cohttp.6.1.0, cohttp-lwt.6.1.0, cohttp-lwt-unix.6.1.0, http.6.1.0  (cached)
∗ installed base64.3.5.1
∗ installed bigarray-compat.1.1.0
∗ installed bigstringaf.0.10.0
⬇ retrieved conduit.8.0.0, conduit-lwt.8.0.0, conduit-lwt-unix.8.0.0  (cached)
⬇ retrieved cppo.1.8.0  (cached)
∗ installed conf-gmp.5
∗ installed conf-libev.4-12
∗ installed conf-pkg-config.4
⬇ retrieved crunch.4.0.0  (cached)
⬇ retrieved cstruct.6.2.0  (cached)
⬇ retrieved ctypes.0.23.0  (cached)
∗ installed conf-gmp-powm-sec.4
∗ installed conf-libssl.4
∗ installed conf-oniguruma.1
⬇ retrieved domain-name.0.4.1  (cached)
⬇ retrieved dream.1.0.0~alpha7  (cached)
⬇ retrieved dream-accept.0.1.0  (cached)
⬇ retrieved dream-encoding.0.3.0  (cached)
∗ installed http.6.1.0
⬇ retrieved dream-httpaf.1.0.0~alpha3  (cached)
∗ installed bigarray-overlap.0.2.1
⬇ retrieved decompress.1.5.3  (cached)
∗ installed domain-name.0.4.1
⬇ retrieved dream-pure.1.0.0~alpha2  (cached)
⬇ retrieved duration.0.2.1  (cached)
⬇ retrieved eqaf.0.10  (cached)
⬇ retrieved ezjsonm.1.3.0  (cached)
⬇ retrieved faraday.0.8.2, faraday-lwt.0.8.2, faraday-lwt-unix.0.8.2  (cached)
⬇ retrieved fmt.0.10.0  (cached)
⬇ retrieved gmap.0.3.0  (cached)
⬇ retrieved graphql.0.14.0, graphql-lwt.0.14.0, graphql_parser.0.14.0  (cached)
⬇ retrieved hex.1.5.0  (cached)
⬇ retrieved hilite.0.4.0  (cached)
⬇ retrieved hmap.0.8.1  (cached)
⬇ retrieved integers.0.7.0  (cached)
⬇ retrieved ipaddr.5.6.0, ipaddr-sexp.5.6.0, macaddr.5.6.0  (cached)
∗ installed duration.0.2.1
∗ installed gmap.0.3.0
⬇ retrieved jsonm.1.0.2  (cached)
∗ installed faraday.0.8.2
⬇ retrieved kdf.1.0.0  (cached)
⬇ retrieved ke.0.6  (cached)
⬇ retrieved lambdasoup.1.1.1  (cached)
⬇ retrieved logs.0.8.0  (cached)
⬇ retrieved lru.0.3.1  (cached)
⬇ retrieved lwt.5.9.1, lwt_ppx.5.9.1  (cached)
⬇ retrieved lwt-dllist.1.1.0  (cached)
⬇ retrieved lwt_ssl.1.2.0  (cached)
⬇ retrieved magic-mime.1.3.1  (cached)
⬇ retrieved markup.1.0.3  (cached)
∗ installed macaddr.5.6.0
∗ installed hmap.0.8.1
∗ installed eqaf.0.10
∗ installed cppo.1.8.0
⬇ retrieved mdx.2.5.0  (cached)
⬇ retrieved digestif.1.3.0  (cached)
∗ installed lwt-dllist.1.1.0
⬇ retrieved mirage-clock.4.2.0  (cached)
⬇ retrieved mirage-kv.6.1.1  (cached)
⬇ retrieved mirage-kv-mem.4.0.0  (cached)
⬇ retrieved mirage-ptime.5.0.0  (cached)
⬇ retrieved mtime.2.1.0  (cached)
⬇ retrieved multipart_form.0.6.0, multipart_form-lwt.0.6.0  (cached)
⬇ retrieved ocaml-compiler-libs.v0.17.0  (cached)
⬇ retrieved ocaml-syntax-shims.1.0.0  (cached)
∗ installed mirage-clock.4.2.0
⬇ retrieved ocamlgraph.2.2.0  (cached)
⬇ retrieved dune-private-libs.3.19.0, dune-site.3.19.0  (cached)
∗ installed cmarkit.0.3.0
∗ installed fmt.0.10.0
∗ installed jsonm.1.0.2
∗ installed magic-mime.1.3.1
∗ installed ipaddr.5.6.0
⬇ retrieved mirage-crypto.1.2.0, mirage-crypto-ec.1.2.0, mirage-crypto-pk.1.2.0, mirage-crypto-rng.1.2.0, mirage-crypto-rng-lwt.1.2.0  (cached)
∗ installed digestif.1.3.0
∗ installed mtime.2.1.0
∗ installed ocaml-compiler-libs.v0.17.0
∗ installed ocaml-syntax-shims.1.0.0
⬇ retrieved ocplib-endian.1.2  (cached)
∗ installed ocamlgraph.2.2.0
⬇ retrieved odoc.3.0.0, odoc-parser.3.0.0  (cached)
∗ installed cstruct.6.2.0
∗ installed graphql_parser.0.14.0
∗ installed ke.0.6
⬇ retrieved ohex.0.2.0  (cached)
∗ installed angstrom.0.16.1
⬇ retrieved oniguruma.0.1.2  (cached)
∗ installed ocplib-endian.1.2
∗ installed mirage-crypto.1.2.0
⬇ retrieved opam-core.2.3.0, opam-format.2.3.0  (cached)
∗ installed hex.1.5.0
⬇ retrieved opam-file-format.2.1.6  (cached)
∗ installed ohex.0.2.0
⬇ retrieved optint.0.3.0  (cached)
⬇ retrieved ounit.2.2.7, ounit2.2.2.7  (cached)
⬇ retrieved pecu.0.7  (cached)
⬇ retrieved ppx_derivers.1.2.1  (cached)
∗ installed kdf.1.0.0
⬇ retrieved ppx_deriving.6.0.3  (cached)
⬇ retrieved ppx_deriving_yaml.0.4.0  (cached)
⬇ retrieved ppx_deriving_yojson.3.9.1  (cached)
⬇ retrieved ppx_import.1.11.0  (cached)
⬇ retrieved ppx_sexp_conv.v0.17.0  (cached)
⬇ retrieved ppx_stable.v0.17.0  (cached)
⬇ retrieved ppxlib_jane.v0.17.0  (cached)
⬇ retrieved prettym.0.0.3  (cached)
⬇ retrieved psq.0.2.1  (cached)
⬇ retrieved ptime.1.2.0  (cached)
⬇ retrieved rresult.0.7.0  (cached)
∗ installed ppx_derivers.1.2.1
∗ installed ezjsonm.1.3.0
∗ installed odoc-parser.3.0.0
⬇ retrieved sha.1.15.4  (cached)
⬇ retrieved ssl.0.7.0  (cached)
∗ installed oniguruma.0.1.2
∗ installed pecu.0.7
⬇ retrieved stdlib-shims.0.3.0  (cached)
⬇ retrieved stringext.1.6.0  (cached)
⬇ retrieved swhid_core.0.1  (cached)
∗ installed optint.0.3.0
⬇ retrieved ppxlib.0.35.0  (cached)
∗ installed psq.0.2.1
∗ installed stdlib-shims.0.3.0
∗ installed opam-file-format.2.1.6
∗ installed stringext.1.6.0
⬇ retrieved syndic.1.6.1  (cached)
∗ installed swhid_core.0.1
∗ installed prettym.0.0.3
⬇ retrieved textmate-language.0.4.0  (cached)
⬇ retrieved timedesc.3.1.0, timedesc-tzdb.3.1.0, timedesc-tzlocal.3.1.0  (cached)
∗ installed dune-private-libs.3.19.0
∗ installed ptime.1.2.0
∗ installed rresult.0.7.0
∗ installed ssl.0.7.0
∗ installed checkseum.0.5.2
∗ installed lru.0.3.1
∗ installed alcotest.1.9.0
∗ installed integers.0.7.0
∗ installed ounit2.2.2.7
⬇ retrieved tls.2.0.1  (cached)
⬇ retrieved river.dev  (no changes)
⬇ retrieved tyxml.4.6.0  (cached)
∗ installed ounit.2.2.7
∗ installed mirage-ptime.5.0.0
∗ installed textmate-language.0.4.0
∗ installed lwt.5.9.1
∗ installed crunch.4.0.0
∗ installed sha.1.15.4
⬇ retrieved uchar.0.0.2  (cached)
⬇ retrieved unstrctrd.0.4  (cached)
∗ installed asn1-combinators.0.3.2
⬇ retrieved uri.4.4.0, uri-sexp.4.4.0  (cached)
∗ installed graphql.0.14.0
∗ installed timedesc-tzdb.3.1.0
∗ installed timedesc-tzlocal.3.1.0
⬇ retrieved x509.1.0.6  (cached)
∗ installed faraday-lwt.0.8.2
∗ installed lwt_ssl.1.2.0
∗ installed mirage-kv.6.1.1
⬇ retrieved xmlm.1.4.0  (cached)
⬇ retrieved yaml.3.2.0  (cached)
⬇ retrieved zarith.1.14  (cached)
∗ installed graphql-lwt.0.14.0
∗ installed hilite.0.4.0
∗ installed unstrctrd.0.4
∗ installed faraday-lwt-unix.0.8.2
∗ installed uchar.0.0.2
∗ installed mirage-kv-mem.4.0.0
∗ installed decompress.1.5.3
∗ installed dune-site.3.19.0
∗ installed timedesc.3.1.0
∗ installed logs.0.8.0
∗ installed uri.4.4.0
∗ installed xmlm.1.4.0
∗ installed markup.1.0.3
∗ installed mirage-crypto-rng.1.2.0
∗ installed multipart_form.0.6.0
∗ installed lambdasoup.1.1.1
∗ installed mirage-crypto-rng-lwt.1.2.0
∗ installed syndic.1.6.1
∗ installed multipart_form-lwt.0.6.0
∗ installed tyxml.4.6.0
∗ installed zarith.1.14
∗ installed mdx.2.5.0
∗ installed mirage-crypto-pk.1.2.0
∗ installed opam-core.2.3.0
∗ installed bos.0.2.1
∗ installed ctypes.0.23.0
∗ installed mirage-crypto-ec.1.2.0
∗ installed yaml.3.2.0
∗ installed x509.1.0.6
∗ installed ca-certs.1.0.1
∗ installed opam-format.2.3.0
∗ installed odoc.3.0.0
∗ installed tls.2.0.1
∗ installed ppxlib.0.35.0
∗ installed caqti.2.2.4
∗ installed caqti-lwt.2.2.4
∗ installed ppxlib_jane.v0.17.0
∗ installed ppx_deriving_yaml.0.4.0
∗ installed ppx_stable.v0.17.0
∗ installed ppx_import.1.11.0
∗ installed lwt_ppx.5.9.1
∗ installed ppx_deriving.6.0.3
∗ installed ppx_sexp_conv.v0.17.0
∗ installed dream-pure.1.0.0~alpha2
∗ installed ppx_deriving_yojson.3.9.1
∗ installed ipaddr-sexp.5.6.0
∗ installed uri-sexp.4.4.0
∗ installed dream-httpaf.1.0.0~alpha3
∗ installed conduit.8.0.0
∗ installed cohttp.6.1.0
∗ installed conduit-lwt.8.0.0
∗ installed dream.1.0.0~alpha7
∗ installed cohttp-lwt.6.1.0
∗ installed conduit-lwt-unix.8.0.0
∗ installed dream-encoding.0.3.0
∗ installed dream-accept.0.1.0
∗ installed cohttp-lwt-unix.6.1.0
∗ installed river.dev
Done.
# Run eval $(opam env) to update the current shell environment
opam exec -- dune build --root .
######################################################################## 100.0%
######################################################################## 100.0%
Browserslist: caniuse-lite is outdated. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme

Rebuilding...

Done in 1501ms.
######################################################################## 100.0%
######################################################################## 100.0%
real    4m7.485s
user    15m8.991s
sys     4m40.868s

@sabine sabine mentioned this pull request Aug 28, 2025
16 tasks
@cuihtlauac
Copy link
Collaborator

cuihtlauac commented Aug 28, 2025

Here is an update on the docker build issue I'm facing in Ubuntu 25.04. I'm using a simplified set-up:

Dockerfile:

FROM alpine:3.21 AS build

RUN apk -U upgrade --no-cache && apk add --no-cache curl

RUN curl -v -6 -sSL https://github.com/ocaml-dune/dune-bin-install/releases/download/v1/install.sh

Makefile:

docker: Dockerfile
	docker build --no-cache --progress=plaisetup $< .

This fails in my setup. However, if I replace -6 by -4, it succeeds.

Here is the error log:

bidon>make                                                              default
docker build --no-cache --progress=plain -f Dockerfile .
#0 building with "default" instance using docker driver

#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 223B done
#1 DONE 0.0s

#2 [internal] load metadata for docker.io/library/alpine:3.21
#2 DONE 0.0s

#3 [internal] load .dockerignore
#3 transferring context: 2B done
#3 DONE 0.0s

#4 [1/3] FROM docker.io/library/alpine:3.21
#4 CACHED

#5 [2/3] RUN apk -U upgrade --no-cache && apk add --no-cache curl
#5 0.111 fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
#5 0.240 fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
#5 0.432 (1/3) Upgrading busybox (1.37.0-r12 -> 1.37.0-r13)
#5 0.475 Executing busybox-1.37.0-r13.post-upgrade
#5 0.490 (2/3) Upgrading busybox-binsh (1.37.0-r12 -> 1.37.0-r13)
#5 0.503 (3/3) Upgrading ssl_client (1.37.0-r12 -> 1.37.0-r13)
#5 0.515 Executing busybox-1.37.0-r13.trigger
#5 0.519 OK: 7 MiB in 15 packages
#5 0.562 fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
#5 0.694 fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
#5 0.880 (1/9) Installing brotli-libs (1.1.0-r2)
#5 0.914 (2/9) Installing c-ares (1.34.5-r0)
#5 0.931 (3/9) Installing libunistring (1.2-r0)
#5 0.956 (4/9) Installing libidn2 (2.3.7-r0)
#5 0.977 (5/9) Installing nghttp2-libs (1.64.0-r0)
#5 0.990 (6/9) Installing libpsl (0.21.5-r3)
#5 1.004 (7/9) Installing zstd-libs (1.5.6-r2)
#5 1.026 (8/9) Installing libcurl (8.12.1-r1)
#5 1.045 (9/9) Installing curl (8.12.1-r1)
#5 1.081 Executing busybox-1.37.0-r13.trigger
#5 1.085 OK: 12 MiB in 24 packages
#5 DONE 1.1s

#6 [3/3] RUN curl -v -6 -sSL https://github.com/ocaml-dune/dune-bin-install/releases/download/v1/install.sh
#6 12.16 * Could not resolve host: github.com
#6 12.16 * shutting down connection #0
#6 12.16 curl: (6) Could not resolve host: github.com
#6 ERROR: process "/bin/sh -c curl -v -6 -sSL https://github.com/ocaml-dune/dune-bin-install/releases/download/v1/install.sh" did not complete successfully: exit code: 6
------
 > [3/3] RUN curl -v -6 -sSL https://github.com/ocaml-dune/dune-bin-install/releases/download/v1/install.sh:
12.16 * Could not resolve host: github.com
12.16 * shutting down connection #0
12.16 curl: (6) Could not resolve host: github.com
------
Dockerfile:5
--------------------
   3 |     RUN apk -U upgrade --no-cache && apk add --no-cache curl
   4 |
   5 | >>> RUN curl -v -6 -sSL https://github.com/ocaml-dune/dune-bin-install/releases/download/v1/install.sh
   6 |
--------------------
ERROR: failed to solve: process "/bin/sh -c curl -v -6 -sSL https://github.com/ocaml-dune/dune-bin-install/releases/download/v1/install.sh" did not complete successfully: exit code: 6
make: *** [Makefile:2: docker] Error 1

This is pretty similar to the error I observed in ocaml.org docker build in my machine. I also observe that if neither -4 nor -6 are present, it fails the same way. But, not always! Most often it fails, but once in a while, it is successful.

Here is my current understanding of the problem

  • curl needs to do a GET on some GitHub host, DNS fails
  • Failure is frequent, but does not always take place
  • Using
    • curl 8.12.1
    • Alpine 3.21 (using musl)
    • docker 27.5.1
    • ubuntu 25.04

@gridbugs
Copy link
Contributor

gridbugs commented Sep 1, 2025

Heads up that I can reproduce the issue @cuihtlauac reports when attempting to use IP 6 to connect to github (from any OS, natively and inside docker). Maybe not the most official source but a quick google found https://doesgithubhaveipv6yet.com. I've never experienced curl trying to use IP6 unless forced to do so with -6 however to make sure we only ever attempt to connect with IP4, how about we pass -4 to curl explicitly?

@cuihtlauac
Copy link
Collaborator

Having a means to tweak the options passed to curl may be helpful. So many things can go wrong there.

@gridbugs
Copy link
Contributor

gridbugs commented Sep 2, 2025

I think for now just pass -4 whenever curl-ing a github.com url. I can update the install script to pass -4 to its internal invocations of curl and update the example install commands in the readme. @sabine can you update the dockerfile(s) in this PR.

@shym
Copy link

shym commented Sep 8, 2025

FYI, I’ve just tagged setup-dune version 1.0.0 (with tags v1 and v1.0.0) in particular with the ability to use stable binary releases of Dune.

@sabine
Copy link
Collaborator Author

sabine commented Sep 9, 2025

Merged @gridbugs fix for the ipv6 issue. Updated workflows to use ocaml-dune/setup-dune@v1 (thank you so much @shym)!

Putting some time now to resolve the remaining points.

@sabine sabine marked this pull request as ready for review September 9, 2025 10:12
@sabine sabine requested a review from cuihtlauac September 10, 2025 12:15
@sabine
Copy link
Collaborator Author

sabine commented Sep 10, 2025

@cuihtlauac if you don't see anything that blocks us from merging (and potentially fixing issues as they come - I'm ready for this), then let's merge!

Copy link
Member

@shonfeder shonfeder left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome work getting this all in such good shape. And thanks for the careful reviews, @cuihtlauac!

@shonfeder
Copy link
Member

shonfeder commented Sep 29, 2025

What is blocking this from being merged? (Aside from the merge conflict, which is a symptom of this not being completed, rather than a cause).

@cuihtlauac
Copy link
Collaborator

I remain concerned about make clean. Here is what I see:

( make clean; make; )  739,03s user 165,83s system 486% cpu 3:06,18 total
( make clean; make; )  56,81s user 12,45s system 478% cpu 14,473 total

Both ran after a first successful build. The former is in this PR's current branch, the latter is in main. Am I doing this the wrong way?

However, I have successfully built using make docker and make. This is awesome; congratulations to all for the good work in solving this issue.

Copy link
Collaborator Author

@sabine sabine left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO there's nothing blocking, we just need to merge and if there's anything that comes up, we fix forward.

@sabine
Copy link
Collaborator Author

sabine commented Oct 2, 2025

Yeah, the performance impact on make clean is pretty bad. Seems like an issue for upstream that can be resolved after we merge this?

@cuihtlauac
Copy link
Collaborator

I've pushed commit 1cd3871 to address the make clean issue

@cuihtlauac
Copy link
Collaborator

Previously, make clean && make forced downloading tailwindcss, which was painful. It is no longer the case, which is good, but I'm curious about what's happening behind the scenes. How is this possible? File tool/tailwindcss/dune isn't touched by this PR.

Copy link
Collaborator

@cuihtlauac cuihtlauac left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks mostly good to me. I recommend not merging on Friday and being ready to roll back if anything goes south. The PR can't test itself (In a convoluted but untested scenario, we could end up in a state where this PR is all green, merged and then subsequent PR don't build)

@ElectreAAS
Copy link

To reassure everyone, I tried running make docker on the latest commit of this PR - with a ubuntu 25.04 machine, and it doesn't work :(
We see the now familiar

=> ERROR [build  9/10] RUN dune build @install --profile=release                                                                           14.2s
------                                                                                                                                            
 > [build  9/10] RUN dune build @install --profile=release:                                                                                       
14.17 File "dune.lock/ocaml-base-compiler.pkg", line 13, characters 7-58:                                                                         
14.17 13 |   (url https://github.com/ocaml/ocaml/archive/5.2.0.tar.gz)                                                                            
14.17             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
14.17 Error: curl returned an invalid error code 6

Note that on a different run I get the error about a different url (result), indicating that the apparmor problem isn't entirely solved :/

@cuihtlauac
Copy link
Collaborator

cuihtlauac commented Oct 3, 2025

Yesterday, I did the same test as @ElectreAAS, and it passed.

Today, I did it again, and it failed.

rm -fr ocaml.org
git clone [email protected]:ocaml/ocaml.org.git
cd ocaml.org
gh pr checkout 3281
make docker

Here is the error I'm seeing:

Cloning into 'ocaml.org'...
remote: Enumerating objects: 41090, done.
remote: Counting objects: 100% (172/172), done.
remote: Compressing objects: 100% (117/117), done.
remote: Total 41090 (delta 85), reused 105 (delta 55), pack-reused 40918 (from 2)
Receiving objects: 100% (41090/41090), 145.57 MiB | 14.66 MiB/s, done.
Resolving deltas: 100% (26155/26155), done.
tmp>cd ocaml.org                                                        default
ocaml.org:main>gh pr checkout 3281                                      default
branch 'dune_pkg' set up to track 'origin/dune_pkg'.
Switched to a new branch 'dune_pkg'
ocaml.org:dune_pkg>make docker                                          default
docker build -f Dockerfile . -t ocamlorg:latest
[+] Building 139.3s (13/22)                                      docker:default
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 1.73kB                                     0.0s
 => [internal] load metadata for docker.io/library/alpine:3.21             0.8s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 163B                                          0.0s
 => [internal] load build context                                          0.9s
 => => transferring context: 233.65MB                                      0.9s
 => [build  1/10] FROM docker.io/library/alpine:3.21@sha256:b6a6be0ff92ab  0.0s
 => CACHED [build  2/10] RUN apk -U upgrade --no-cache && apk add --no-ca  0.0s
 => CACHED [build  3/10] RUN curl -4fsSL https://github.com/ocaml-dune/du  0.0s
 => CACHED [build  4/10] RUN dune --version                                0.0s
 => CACHED [build  5/10] WORKDIR /root/ocaml.org                           0.0s
 => [build  6/10] COPY --chown=root . .                                    0.4s
 => [build  7/10] RUN ls                                                   0.1s
 => [build  8/10] RUN dune pkg lock                                       32.1s
 => ERROR [build  9/10] RUN dune build @install --profile=release        104.8s 
------                                                                          
 > [build  9/10] RUN dune build @install --profile=release:                     
97.51 File "dune.lock/stdune.pkg", line 17, characters 3-73:                    
97.51 17 |    https://github.com/ocaml/dune/releases/download/3.19.0/dune-3.19.0.tbz)                                                                           
97.51         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
97.51 Error: curl returned an invalid error code 6
97.51        
97.51        
------
Dockerfile:25
--------------------
  23 |     
  24 |     RUN dune pkg lock
  25 | >>> RUN dune build @install --profile=release
  26 |     
  27 |     # Launch project in order to generate the package state cache
--------------------
ERROR: failed to solve: process "/bin/sh -c dune build @install --profile=release" did not complete successfully: exit code: 1
make: *** [Makefile:71: docker] Error 1

The only thing that changed from my side is the network. I was at my parents' yesterday, I'm at home today.

We must conduct more tests to resolve this before merging :-(

Copy link
Collaborator

@cuihtlauac cuihtlauac left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

make docker still fails either transiently or in relation to the network. This must be fixed before merging

@shonfeder
Copy link
Member

shonfeder commented Oct 3, 2025

AFAIU, the issue here is isolated to specific versions of Ubuntu and related to an interaction with Docker, apparently on specific networks. This does not seem to be within the purview of dune pkg, or indeed have fundamentally have anything to do with this PR. I have received approval to down scope our objective tracking this PR, and I am doing so. This means that the PR is no longer blocking for our team's work, and it can be dealt with as the ocaml.org maintainers wish.

Thanks for the commendable work here, @sabine and @Sudha247, and for the careful reviews and diligence, @cuihtlauac and @ElectreAAS.

Copy link
Contributor

@MisterDA MisterDA left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This worked for me. I have some suggestions on the Dockerfile.

@MisterDA
Copy link
Contributor

MisterDA commented Oct 6, 2025

I thought that buildkit syntax was enabled on the deployer, apparently it's not?
You could try adding that as the first line of the Dockerfile:

# syntax=docker/dockerfile:1

EDIT: I've looked at the deployer and buildkit should be enabled. Could you try adding this line?

cuihtlauac and others added 12 commits October 14, 2025 15:57
* use `COPY --link`

Co-authored-by: Antonin Décimo <[email protected]>
* use `COPY --link`

Co-authored-by: Antonin Décimo <[email protected]>
Keep the cache as this is a multi-staged build. This will avoid downloading the package index twice.

Co-authored-by: Antonin Décimo <[email protected]>
* use `ADD --link`

Co-authored-by: Antonin Décimo <[email protected]>
use `ADD` to download HTML compiler manuals repo

Co-authored-by: Antonin Décimo <[email protected]>
Apparently even though BuildKit is enabled in the deployer, it still needs Dockerfiles to opt-in the syntax.

Co-authored-by: Antonin Décimo <[email protected]>
@sabine
Copy link
Collaborator Author

sabine commented Oct 29, 2025

After checking on Slack, I believe it was confirmed that adding --network=host to the docker build invocation avoids the issue. So I updated the Makefile to use this workaround.

I also updated the included Backstage OCaml post to reflect the current state of the build updates and (I believe) fully addressed @MisterDA's Oct 3 review, now.

With this, I believe the PR is ready to merge.

@sabine sabine requested a review from cuihtlauac October 29, 2025 12:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants