diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ad60bd9..b6beaddf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,10 +25,10 @@ jobs: runs-on: ubuntu-latest steps: - - name: Install cljfmt + - name: Install babashka uses: DeLaGuardo/setup-clojure@13.4 with: - cljfmt: latest + bb: 1.12.217 - uses: actions/checkout@v4 - name: Check formatting - run: cljfmt check src test bb.edn deps.edn tests.edn + run: bb fmt-check diff --git a/bb.edn b/bb.edn index bd92e6c0..7173c7cf 100644 --- a/bb.edn +++ b/bb.edn @@ -1,12 +1,18 @@ {:paths ["src"] :deps {local/deps {:local/root "."} + dev.weavejester/cljfmt {:mvn/version "0.16.4"} org.babashka/spec.alpha {:git/url "https://github.com/babashka/spec.alpha" :git/sha "b6eb0f2208ab036c0a5d0e7235cb0b09d2feabb7"}} :tasks - {:requires ([docker-clojure.core :as dc]) + {:requires ([cljfmt.tool :as fmt] + [docker-clojure.core :as dc]) clean (dc/-main "clean") dockerfiles {:depends [clean] :task (apply dc/-main "dockerfiles" *command-line-args*)} manifest (apply dc/-main "manifest" *command-line-args*) build-images {:task (apply dc/-main "build-images" *command-line-args*)} - test (clojure '-X:test)}} + test (clojure '-X:test) + fmt-check {:doc "Check formatting with cljfmt" + :task (fmt/check {:paths ["src" "test" "bb.edn" "deps.edn" "tests.edn"]})} + fmt-fix {:doc "Fix formatting with cljfmt" + :task (fmt/fix {:paths ["src" "test" "bb.edn" "deps.edn" "tests.edn"]})}}} diff --git a/deps.edn b/deps.edn index 7f5a1834..0788d52e 100644 --- a/deps.edn +++ b/deps.edn @@ -2,6 +2,7 @@ {org.clojure/clojure {:mvn/version "1.12.4"} org.clojure/math.combinatorics {:mvn/version "0.3.2"} org.clojure/core.async {:mvn/version "1.9.865"} + org.babashka/cli {:mvn/version "0.12.75"} selmer/selmer {:mvn/version "1.12.61"} com.gfredericks/test.chuck {:git/url "https://github.com/gfredericks/test.chuck" :git/sha "ab5c11b013d3526e587dd53a860fa651b3e8a5a7"}} @@ -9,13 +10,9 @@ :paths ["src" "resources"] :aliases - {:build-images {:exec-fn docker-clojure.core/run - :exec-args {:cmd :build-images - :parallelization 2}} - - :test {:extra-paths ["test"] - :extra-deps {lambdaisland/kaocha {:mvn/version "1.91.1392"} - orchestra/orchestra {:mvn/version "2021.01.01-1"} - org.clojure/test.check {:mvn/version "1.1.3"}} - :exec-fn docker-clojure.fix-kaocha/run-tests - :exec-args {}}}} + {:test {:extra-paths ["test"] + :extra-deps {lambdaisland/kaocha {:mvn/version "1.91.1392"} + orchestra/orchestra {:mvn/version "2021.01.01-1"} + org.clojure/test.check {:mvn/version "1.1.3"}} + :exec-fn docker-clojure.fix-kaocha/run-tests + :exec-args {}}}} diff --git a/src/docker_clojure/core.clj b/src/docker_clojure/core.clj index 4e734f1f..9dc7a44a 100644 --- a/src/docker_clojure/core.clj +++ b/src/docker_clojure/core.clj @@ -1,18 +1,17 @@ (ns docker-clojure.core - (:require - [clojure.core.async :refer [> ["git" "rev-parse" "HEAD"] (apply sh) :out) - target-file (or (first args) :stdout) manifest (manifest/generate {:maintainers cfg/maintainers :architectures cfg/architectures :git-repo cfg/git-repo} @@ -95,42 +91,59 @@ (.close output-writer))))) (defn generate-variants - [args] - ; TODO: Maybe replace this with bb/cli - (let [key-vals (->> args - (map #(if (str/starts-with? % ":") - (edn/read-string %) - %)) - (map #(try (Integer/parseInt %) - (catch Exception _ %))) - (partition 2)) - variant-filter #(or - (empty? key-vals) + [opts] + (let [variant-filter #(or + (empty? opts) (every? (fn [[k v]] (= (get % k) v)) - key-vals))] - (when (seq key-vals) + opts))] + (when (seq opts) (println "Filtering variants with:") - (doseq [[k v] key-vals] + (doseq [[k v] opts] (println (str "(= " (pr-str v) " (get variant " (pr-str k) "))"))) (println)) (filter variant-filter (valid-variants)))) -(defn run - "Entrypoint for exec-fn." - [{:keys [cmd args parallelization]}] - (logger/start) - (let [variants (generate-variants args)] - (case cmd - :clean (df/clean-all) - :dockerfiles (generate-dockerfiles! cfg/installer-hashes variants) - :manifest (generate-manifest! variants args) - :build-images (build-images parallelization cfg/installer-hashes variants))) - (logger/stop)) +(defn cmd-clean [{:keys [_opts]}] + (df/clean-all)) + +(defn cmd-dockerfiles [{:keys [opts]}] + (generate-dockerfiles! cfg/installer-hashes (generate-variants opts))) + +(defn cmd-manifest [{:keys [opts]}] + (let [target-file (or (:output-file opts) :stdout) + filter-opts (dissoc opts :output-file)] + (generate-manifest! (generate-variants filter-opts) target-file))) + +(defn cmd-build-images [{:keys [opts]}] + (let [parallelism (:parallelism opts) + filter-opts (dissoc opts :parallelism)] + (build-images (or parallelism 4) cfg/installer-hashes (generate-variants filter-opts)))) + +(def cmd-table + [{:cmds ["clean"] + :fn cmd-clean + :doc "Clean all generated Dockerfiles"} + {:cmds ["dockerfiles"] + :fn cmd-dockerfiles + :doc "Generate Dockerfiles for matching variants"} + {:cmds ["manifest"] + :fn cmd-manifest + :doc "Generate manifest for matching variants" + :args->opts [:output-file] + :spec {:output-file {:desc "Output file (default: stdout)"}}} + {:cmds ["build-images"] + :fn cmd-build-images + :doc "Build Docker images for matching variants" + :spec {:parallelism {:alias :p + :coerce :long + :desc "Number of parallel builds" + :default 4 + :validate pos?}}}]) (defn -main - [& cmd-args] - (let [[cmd & args] cmd-args] - (run {:cmd (if cmd (keyword cmd) :build-images) - :args args - :parallelization 4}))) + "Entrypoint for CLI." + [& args] + (logger/start) + (cli/dispatch cmd-table args {:prog "docker-clojure" :help true}) + (logger/stop))