Skip to content

Commit

Permalink
Merge pull request #76 from kit-ty-kate/opam-dev
Browse files Browse the repository at this point in the history
Add opam master (opam-dev + opam-2.2) to the base images
  • Loading branch information
dra27 committed Dec 18, 2021
2 parents eeb43a6 + 6cd0ebb commit 7a1b2a2
Show file tree
Hide file tree
Showing 2 changed files with 99 additions and 47 deletions.
132 changes: 89 additions & 43 deletions src-opam/dockerfile_opam.ml
Original file line number Diff line number Diff line change
Expand Up @@ -109,41 +109,95 @@ let header ?win10_revision ?arch ?maintainer ?img ?tag d =
@@ maintainer
@@ shell

type opam_hashes = {
opam_2_0_hash : string;
opam_2_1_hash : string;
opam_master_hash : string;
}

type opam_branch = {
branch : string;
hash : string;
enable_0install_solver : bool;
public_name : string;
aliases : string list;
}

let create_opam_branches opam_hashes =
let {
opam_2_0_hash;
opam_2_1_hash;
opam_master_hash;
} = opam_hashes in
[
{
branch = "2.0";
hash = opam_2_0_hash;
enable_0install_solver = false;
public_name = "opam-2.0";
aliases = ["opam"]; (* Default *)
};
{
branch = "2.1";
hash = opam_2_1_hash;
enable_0install_solver = true;
public_name = "opam-2.1";
aliases = [];
};
{
branch = "master";
hash = opam_master_hash;
enable_0install_solver = true;
public_name = "opam-dev";
aliases = ["opam-2.2"]; (* TODO: Remove/update when opam 2.2 is branched *)
};
]

let install_opams ?prefix f opam_branches =
List.fold_left (fun acc {branch; hash; enable_0install_solver; _} ->
let add_default_link = Some false in
let enable_0install_solver = Some enable_0install_solver in
acc @@ f ?add_default_link ?prefix ?enable_0install_solver ~branch ~hash ()
) empty opam_branches

let copy_opams ~src ~dst opam_branches =
List.fold_left (fun acc {branch; public_name; aliases; _} ->
acc @@
copy ~from:"0" ~src:[src^"/opam-"^branch] ~dst:(dst^"/"^public_name) () @@@
List.map (fun alias -> run "ln %s/%s %s/%s" dst public_name dst alias) aliases
) empty opam_branches

(* Apk based Dockerfile *)
let apk_opam2 ?(labels=[]) ?arch ~hash_opam_2_0 ~hash_opam_2_1 distro () =
let apk_opam2 ?(labels=[]) ?arch ~opam_hashes distro () =
let opam_branches = create_opam_branches opam_hashes in
let img, tag = D.base_distro_tag ?arch distro in
header ?arch distro @@ label (("distro_style", "apk") :: labels)
@@ Linux.Apk.install "build-base bzip2 git tar curl ca-certificates openssl"
@@ Linux.Git.init ()
@@ install_opam_from_source ~add_default_link:false ~branch:"2.0" ~hash:hash_opam_2_0 ()
@@ install_opam_from_source ~add_default_link:false ~enable_0install_solver:true ~branch:"2.1" ~hash:hash_opam_2_1 ()
@@ install_opams install_opam_from_source opam_branches
@@ run "strip /usr/local/bin/opam*"
@@ from ~tag img
@@ Linux.Apk.add_repository ~tag:"edge" "https://dl-cdn.alpinelinux.org/alpine/edge/main"
@@ Linux.Apk.add_repository ~tag:"edgecommunity" "https://dl-cdn.alpinelinux.org/alpine/edge/community"
@@ Linux.Apk.add_repository ~tag:"testing" "https://dl-cdn.alpinelinux.org/alpine/edge/testing"
@@ copy ~from:"0" ~src:["/usr/local/bin/opam-2.0"] ~dst:"/usr/bin/opam-2.0" ()
@@ copy ~from:"0" ~src:["/usr/local/bin/opam-2.1"] ~dst:"/usr/bin/opam-2.1" ()
@@ run "ln /usr/bin/opam-2.0 /usr/bin/opam"
@@ copy_opams ~src:"/usr/local/bin" ~dst:"/usr/bin" opam_branches
@@ Linux.Apk.dev_packages ()
@@ Linux.Apk.add_user ~uid:1000 ~gid:1000 ~sudo:true "opam"
@@ install_bubblewrap_wrappers @@ Linux.Git.init ()


(* Debian based Dockerfile *)
let apt_opam2 ?(labels=[]) ?arch distro ~hash_opam_2_0 ~hash_opam_2_1 () =
let apt_opam2 ?(labels=[]) ?arch distro ~opam_hashes () =
let opam_branches = create_opam_branches opam_hashes in
let img, tag = D.base_distro_tag ?arch distro in
header ?arch distro @@ label (("distro_style", "apt") :: labels)
@@ Linux.Apt.install "build-essential curl git libcap-dev sudo"
@@ Linux.Git.init ()
@@ install_bubblewrap_from_source ()
@@ install_opam_from_source ~add_default_link:false ~branch:"2.0" ~hash:hash_opam_2_0 ()
@@ install_opam_from_source ~add_default_link:false ~enable_0install_solver:true ~branch:"2.1" ~hash:hash_opam_2_1 ()
@@ install_opams install_opam_from_source opam_branches
@@ from ~tag img
@@ copy ~from:"0" ~src:["/usr/local/bin/bwrap"] ~dst:"/usr/bin/bwrap" ()
@@ copy ~from:"0" ~src:["/usr/local/bin/opam-2.0"] ~dst:"/usr/bin/opam-2.0" ()
@@ copy ~from:"0" ~src:["/usr/local/bin/opam-2.1"] ~dst:"/usr/bin/opam-2.1" ()
@@ run "ln /usr/bin/opam-2.0 /usr/bin/opam"
@@ copy_opams ~src:"/usr/local/bin" ~dst:"/usr/bin" opam_branches
@@ run "ln -fs /usr/share/zoneinfo/Europe/London /etc/localtime"
@@ Linux.Apt.dev_packages ()
@@ run "echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections"
Expand All @@ -158,7 +212,8 @@ let apt_opam2 ?(labels=[]) ?arch distro ~hash_opam_2_0 ~hash_opam_2_1 () =
[enable_powertools] enables the PowerTools repository on CentOS 8 and above.
This is needed to get most of *-devel packages frequently used by opam packages. *)
let yum_opam2 ?(labels= []) ?arch ~yum_workaround ~enable_powertools ~hash_opam_2_0 ~hash_opam_2_1 distro () =
let yum_opam2 ?(labels= []) ?arch ~yum_workaround ~enable_powertools ~opam_hashes distro () =
let opam_branches = create_opam_branches opam_hashes in
let img, tag = D.base_distro_tag ?arch distro in
let workaround =
if yum_workaround then
Expand All @@ -173,74 +228,65 @@ let yum_opam2 ?(labels= []) ?arch ~yum_workaround ~enable_powertools ~hash_opam_
@@ Linux.RPM.dev_packages ~extra:"which tar curl xz libcap-devel openssl" ()
@@ Linux.Git.init ()
@@ install_bubblewrap_from_source ()
@@ install_opam_from_source ~prefix:"/usr" ~add_default_link:false ~branch:"2.0" ~hash:hash_opam_2_0 ()
@@ install_opam_from_source ~prefix:"/usr" ~add_default_link:false ~enable_0install_solver:true ~branch:"2.1" ~hash:hash_opam_2_1 ()
@@ install_opams ~prefix:"/usr" install_opam_from_source opam_branches
@@ from ~tag img
@@ run "yum --version || dnf install -y yum"
@@ workaround
@@ Linux.RPM.update
@@ Linux.RPM.dev_packages ()
@@ (if enable_powertools then run "yum config-manager --set-enabled powertools" @@ Linux.RPM.update else empty)
@@ copy ~from:"0" ~src:["/usr/local/bin/bwrap"] ~dst:"/usr/bin/bwrap" ()
@@ copy ~from:"0" ~src:["/usr/bin/opam-2.0"] ~dst:"/usr/bin/opam-2.0" ()
@@ copy ~from:"0" ~src:["/usr/bin/opam-2.1"] ~dst:"/usr/bin/opam-2.1" ()
@@ run "ln /usr/bin/opam-2.0 /usr/bin/opam"
@@ copy_opams ~src:"/usr/bin" ~dst:"/usr/bin" opam_branches
@@ run
"sed -i.bak '/LC_TIME LC_ALL LANGUAGE/aDefaults env_keep += \"OPAMYES OPAMJOBS OPAMVERBOSE\"' /etc/sudoers"
@@ Linux.RPM.add_user ~uid:1000 ~sudo:true "opam"
@@ install_bubblewrap_wrappers @@ Linux.Git.init ()


(* Zypper based Dockerfile *)
let zypper_opam2 ?(labels=[]) ?arch ~hash_opam_2_0 ~hash_opam_2_1 distro () =
let zypper_opam2 ?(labels=[]) ?arch ~opam_hashes distro () =
let opam_branches = create_opam_branches opam_hashes in
let img, tag = D.base_distro_tag ?arch distro in
header ?arch distro @@ label (("distro_style", "zypper") :: labels)
@@ Linux.Zypper.dev_packages ()
@@ Linux.Git.init ()
@@ install_bubblewrap_from_source ()
@@ install_opam_from_source ~prefix:"/usr" ~add_default_link:false ~branch:"2.0" ~hash:hash_opam_2_0 ()
@@ install_opam_from_source ~prefix:"/usr" ~add_default_link:false ~enable_0install_solver:true ~branch:"2.1" ~hash:hash_opam_2_1 ()
@@ install_opams ~prefix:"/usr" install_opam_from_source opam_branches
@@ from ~tag img
@@ Linux.Zypper.dev_packages ()
@@ copy ~from:"0" ~src:["/usr/local/bin/bwrap"] ~dst:"/usr/bin/bwrap" ()
@@ copy ~from:"0" ~src:["/usr/bin/opam-2.0"] ~dst:"/usr/bin/opam-2.0" ()
@@ copy ~from:"0" ~src:["/usr/bin/opam-2.1"] ~dst:"/usr/bin/opam-2.1" ()
@@ run "ln /usr/bin/opam-2.0 /usr/bin/opam"
@@ copy_opams ~src:"/usr/bin" ~dst:"/usr/bin" opam_branches
@@ Linux.Zypper.add_user ~uid:1000 ~sudo:true "opam"
@@ install_bubblewrap_wrappers @@ Linux.Git.init ()

(* Pacman based Dockerfile *)
let pacman_opam2 ?(labels=[]) ?arch ~hash_opam_2_0 ~hash_opam_2_1 distro () =
let pacman_opam2 ?(labels=[]) ?arch ~opam_hashes distro () =
let opam_branches = create_opam_branches opam_hashes in
let img, tag = D.base_distro_tag ?arch distro in
header ?arch distro @@ label (("distro_style", "pacman") :: labels)
@@ Linux.Pacman.dev_packages ()
@@ Linux.Git.init ()
@@ install_opam_from_source ~add_default_link:false ~branch:"2.0" ~hash:hash_opam_2_0 ()
@@ install_opam_from_source ~add_default_link:false ~enable_0install_solver:true ~branch:"2.1" ~hash:hash_opam_2_1 ()
@@ install_opams install_opam_from_source opam_branches
@@ run "strip /usr/local/bin/opam*"
@@ from ~tag img
@@ copy ~from:"0" ~src:["/usr/local/bin/opam-2.0"] ~dst:"/usr/bin/opam-2.0" ()
@@ copy ~from:"0" ~src:["/usr/local/bin/opam-2.1"] ~dst:"/usr/bin/opam-2.1" ()
@@ run "ln /usr/bin/opam-2.0 /usr/bin/opam"
@@ copy_opams ~src:"/usr/local/bin" ~dst:"/usr/bin" opam_branches
@@ Linux.Pacman.dev_packages ()
@@ Linux.Pacman.add_user ~uid:1000 ~sudo:true "opam"
@@ install_bubblewrap_wrappers @@ Linux.Git.init ()

(* Cygwin based Dockerfile *)
let cygwin_opam2 ?win10_revision ?(labels=[]) ?arch ~hash_opam_2_0 ~hash_opam_2_1 distro () =
let cygwin_opam2 ?win10_revision ?(labels=[]) ?arch ~opam_hashes distro () =
let opam_branches = create_opam_branches opam_hashes in
let img, tag = D.base_distro_tag ?arch distro in
let cyg = Windows.Cygwin.{ default with args = "--allow-test-packages" :: default.args } in
header ?win10_revision ?arch distro @@ label (("distro_style", "cygwin") :: labels)
@@ user "ContainerAdministrator"
@@ Windows.Cygwin.(setup ~cyg ~extra:(cygwin_packages ()) ())
@@ Windows.Cygwin.Git.init ()
@@ install_opam_from_source_cygwin ~add_default_link:false ~branch:"2.0" ~hash:hash_opam_2_0 ()
@@ install_opam_from_source_cygwin ~add_default_link:false ~enable_0install_solver:true ~branch:"2.1" ~hash:hash_opam_2_1 ()
@@ install_opams install_opam_from_source_cygwin opam_branches
@@ run "strip /usr/local/bin/opam*"
@@ from ~tag img
@@ copy ~from:"0" ~src:["/usr/local/bin/opam-2.0"] ~dst:"/usr/bin/opam-2.0" ()
@@ copy ~from:"0" ~src:["/usr/local/bin/opam-2.1"] ~dst:"/usr/bin/opam-2.1" ()
@@ run "ln /usr/bin/opam-2.0 /usr/bin/opam"
@@ copy_opams ~src:"/usr/local/bin" ~dst:"/usr/bin" opam_branches
@@ Windows.Cygwin.(setup ~cyg ~extra:(cygwin_packages ()) ())
@@ Windows.Cygwin.Git.init ()

Expand Down Expand Up @@ -278,17 +324,17 @@ let windows_opam2 ?win10_revision ?winget ?(labels=[]) ?arch distro () =
@@ Windows.Cygwin.Git.init ()
@@ Windows.cleanup ()

let gen_opam2_distro ?win10_revision ?winget ?(clone_opam_repo=true) ?arch ?labels ~hash_opam_2_0 ~hash_opam_2_1 d =
let gen_opam2_distro ?win10_revision ?winget ?(clone_opam_repo=true) ?arch ?labels ~opam_hashes d =
let fn = match D.package_manager d with
| `Apk -> apk_opam2 ?labels ?arch ~hash_opam_2_0 ~hash_opam_2_1 d ()
| `Apt -> apt_opam2 ?labels ?arch ~hash_opam_2_0 ~hash_opam_2_1 d ()
| `Apk -> apk_opam2 ?labels ?arch ~opam_hashes d ()
| `Apt -> apt_opam2 ?labels ?arch ~opam_hashes d ()
| `Yum ->
let yum_workaround = match d with `CentOS `V7 -> true | _ -> false in
let enable_powertools = match d with `CentOS (`V6 | `V7) -> false | `CentOS _ -> true | _ -> false in
yum_opam2 ?labels ?arch ~yum_workaround ~enable_powertools ~hash_opam_2_0 ~hash_opam_2_1 d ()
| `Zypper -> zypper_opam2 ?labels ?arch ~hash_opam_2_0 ~hash_opam_2_1 d ()
| `Pacman -> pacman_opam2 ?labels ?arch ~hash_opam_2_0 ~hash_opam_2_1 d ()
| `Cygwin -> cygwin_opam2 ?win10_revision ?labels ?arch ~hash_opam_2_0 ~hash_opam_2_1 d ()
yum_opam2 ?labels ?arch ~yum_workaround ~enable_powertools ~opam_hashes d ()
| `Zypper -> zypper_opam2 ?labels ?arch ~opam_hashes d ()
| `Pacman -> pacman_opam2 ?labels ?arch ~opam_hashes d ()
| `Cygwin -> cygwin_opam2 ?win10_revision ?labels ?arch ~opam_hashes d ()
| `Windows -> windows_opam2 ?win10_revision ?winget ?labels ?arch d ()
in
let clone = if clone_opam_repo then
Expand Down
14 changes: 10 additions & 4 deletions src-opam/dockerfile_opam.mli
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,24 @@ val install_opam_from_source : ?add_default_link:bool ->
If [enable_0install_solver] is true (false by default), then the [builtin-0install]
solver should be accessible in the resulting opam binary. *)

type opam_hashes = {
opam_2_0_hash : string;
opam_2_1_hash : string;
opam_master_hash : string;
}

val gen_opam2_distro :
?win10_revision:Dockerfile_distro.win10_lcu ->
?winget:string ->
?clone_opam_repo:bool ->
?arch:Ocaml_version.arch ->
?labels:(string * string) list ->
hash_opam_2_0:string ->
hash_opam_2_1:string ->
opam_hashes:opam_hashes ->
Dockerfile_distro.t
-> string * Dockerfile.t
(** [gen_opam2_distro ~hash_opam_2_0 ~hash_opam_2_1 d] will generate a Dockerfile
for Linux distribution [d] with opam 2.0 and opam 2.1, per hash given in parameter.
(** [gen_opam2_distro ~opam_hashes d] will generate a Dockerfile
for Linux distribution [d] with opam 2.0, opam 2.1, opam 2.2 and opam master,
per hash given in parameter.
@return a tuple of the Docker tag and the Dockerfile.
If [clone_opam_repo] is true (the default) then the Dockerfile will also git
clone the official opam-repository into [/home/opam/opam-repository].
Expand Down

0 comments on commit 7a1b2a2

Please sign in to comment.