|
1 | 1 | (ns docker-clojure.dockerfile.lein |
2 | | - (:require [clojure.string :as str] |
3 | | - [docker-clojure.dockerfile.shared |
4 | | - :refer [concat-commands entrypoint install-distro-deps |
| 2 | + (:require [docker-clojure.dockerfile.shared |
| 3 | + :refer [install-distro-deps render-template |
5 | 4 | uninstall-distro-build-deps]])) |
6 | 5 |
|
7 | 6 | (defn prereqs [_ _] nil) |
8 | 7 |
|
| 8 | +;; Leiningen no longer publishes a standalone uberjar, so we build it from |
| 9 | +;; source: clone the GPG-signed release tag, bootstrap leiningen-core's deps |
| 10 | +;; with Maven, and run `lein uberjar`. That needs git, gnupg & Maven at build |
| 11 | +;; time. |
9 | 12 | (def distro-deps |
10 | | - {:debian-slim {:build #{"wget" "gnupg"} |
| 13 | + {:debian-slim {:build #{"git" "gnupg" "maven"} |
11 | 14 | :runtime #{}} |
12 | | - :debian {:build #{"wget" "gnupg"} |
| 15 | + :debian {:build #{"git" "gnupg" "maven"} |
13 | 16 | :runtime #{"make"}} |
14 | | - :ubuntu {:build #{"wget" "gnupg"} |
| 17 | + :ubuntu {:build #{"git" "gnupg" "maven"} |
15 | 18 | :runtime #{"make"}} |
16 | | - :alpine {:build #{"tar" "gnupg" "openssl" "ca-certificates"} |
| 19 | + :alpine {:build #{"git" "gnupg" "maven" "ca-certificates"} |
17 | 20 | :runtime #{"bash"}}}) |
18 | 21 |
|
19 | 22 | (def install-deps (partial install-distro-deps distro-deps)) |
20 | 23 |
|
21 | 24 | (def uninstall-build-deps (partial uninstall-distro-build-deps distro-deps)) |
22 | 25 |
|
23 | | -(def ^:const old-key "6A2D483DB59437EBB97D09B1040193357D0606ED") |
24 | | -(def ^:const new-key "9D13D9426A0814B3373CF5E3D8A8243577A7859F") |
| 26 | +;; Clojure version pre-installed into lein images so users don't download it on |
| 27 | +;; first use. |
| 28 | +(def ^:const bundled-clojure-version "1.12.5") |
25 | 29 |
|
26 | | -(defn gpg-key |
27 | | - [version] |
28 | | - (let [[major minor] (map #(Integer/parseInt %) (str/split version #"\."))] |
29 | | - (cond |
30 | | - (< 2 major) new-key |
31 | | - (and (= 2 major) (< 10 minor)) new-key |
32 | | - :else old-key))) |
| 30 | +;; Leiningen release tags are signed with this key (Phil Hagelberg). |
| 31 | +(def ^:const signing-key "9D13D9426A0814B3373CF5E3D8A8243577A7859F") |
33 | 32 |
|
34 | | -(defn install [installer-hashes {:keys [build-tool-version] :as variant}] |
35 | | - (let [install-dep-cmds (install-deps variant) |
36 | | - uninstall-dep-cmds (uninstall-build-deps variant)] |
37 | | - (-> [(format "ENV LEIN_VERSION=%s" build-tool-version) |
38 | | - "ENV LEIN_INSTALL=/usr/local/bin/" |
39 | | - "" |
40 | | - "WORKDIR /tmp" |
41 | | - "" |
42 | | - "# Download the whole repo as an archive" |
43 | | - "RUN set -eux; \\"] |
44 | | - (concat-commands install-dep-cmds) |
45 | | - (concat-commands |
46 | | - ["mkdir -p $LEIN_INSTALL" |
47 | | - "wget -q https://codeberg.org/leiningen/leiningen/raw/tag/$LEIN_VERSION/bin/lein-pkg" |
48 | | - "echo \"Comparing lein-pkg checksum ...\"" |
49 | | - "sha256sum lein-pkg" |
50 | | - (str "echo \"" (get-in installer-hashes ["lein" build-tool-version]) " *lein-pkg\" | sha256sum -c -") |
51 | | - "mv lein-pkg $LEIN_INSTALL/lein" |
52 | | - "chmod 0755 $LEIN_INSTALL/lein" |
53 | | - "export GNUPGHOME=\"$(mktemp -d)\"" |
54 | | - "export FILENAME_EXT=jar" ; used to be zip but hopefully it's always jar now? |
55 | | - (str "gpg --batch --keyserver hkps://keyserver.ubuntu.com --recv-keys " |
56 | | - (gpg-key build-tool-version)) |
57 | | - "wget -q https://codeberg.org/leiningen/leiningen/releases/download/$LEIN_VERSION/leiningen-$LEIN_VERSION-standalone.$FILENAME_EXT" |
58 | | - "wget -q https://codeberg.org/leiningen/leiningen/releases/download/$LEIN_VERSION/leiningen-$LEIN_VERSION-standalone.$FILENAME_EXT.asc" |
59 | | - "echo \"Verifying file PGP signature...\"" |
60 | | - "gpg --batch --verify leiningen-$LEIN_VERSION-standalone.$FILENAME_EXT.asc leiningen-$LEIN_VERSION-standalone.$FILENAME_EXT" |
61 | | - "gpgconf --kill all" |
62 | | - "rm -rf \"$GNUPGHOME\" leiningen-$LEIN_VERSION-standalone.$FILENAME_EXT.asc" |
63 | | - "mkdir -p /usr/share/java" |
64 | | - "mkdir -p /root/.lein" |
65 | | - "mv leiningen-$LEIN_VERSION-standalone.$FILENAME_EXT /usr/share/java/leiningen-$LEIN_VERSION-standalone.jar"] |
66 | | - (empty? uninstall-dep-cmds)) |
67 | | - (concat-commands uninstall-dep-cmds :end) |
68 | | - (concat |
69 | | - ["" |
70 | | - "ENV PATH=$PATH:$LEIN_INSTALL" |
71 | | - "ENV LEIN_ROOT 1" |
72 | | - "" |
73 | | - "# Install clojure 1.12.1 so users don't have to download it every time" |
74 | | - "RUN echo '(defproject dummy \"\" :dependencies [[org.clojure/clojure \"1.12.1\"]])' > project.clj \\" |
75 | | - " && lein deps && rm project.clj"]) |
76 | | - |
77 | | - (->> (remove nil?))))) |
| 33 | +(defn install [_installer-hashes {:keys [build-tool-version] :as variant}] |
| 34 | + (render-template |
| 35 | + "templates/lein.tmpl" |
| 36 | + {:lein-version build-tool-version |
| 37 | + :clojure-version bundled-clojure-version |
| 38 | + :gpg-key signing-key |
| 39 | + :install-deps (install-deps variant) |
| 40 | + :uninstall-deps (uninstall-build-deps variant)})) |
78 | 41 |
|
79 | 42 | (defn command [{:keys [jdk-version]}] |
80 | 43 | (if (>= jdk-version 16) |
81 | | - ["CMD [\"repl\"]"] |
82 | | - ["CMD [\"lein\", \"repl\"]"])) |
83 | | - |
84 | | -(defn contents [installer-hashes variant] |
85 | | - (concat (install installer-hashes variant) [""] (entrypoint variant) (command variant))) |
| 44 | + "CMD [\"repl\"]" |
| 45 | + "CMD [\"lein\", \"repl\"]")) |
0 commit comments