diff --git a/Makefile b/Makefile index 1adaaf1..eef929f 100644 --- a/Makefile +++ b/Makefile @@ -62,7 +62,7 @@ install: build-jar clojure -T:build install deploy: build-jar - $(info --------- install library jar ---------) + $(info --------- deploy library jar ---------) clojure -T:build deploy publish: build-jar diff --git a/deps.edn b/deps.edn index f8eba13..3f6c33c 100644 --- a/deps.edn +++ b/deps.edn @@ -5,9 +5,9 @@ ["src" "resources"] :deps - {org.clojure/clojure {:mvn/version "1.11.4"} - org.clojure/spec.alpha {:mvn/version "0.5.238"} + {org.clojure/spec.alpha {:mvn/version "0.5.238"} orchestra/orchestra {:mvn/version "2021.01.01-1"} + aero/aero {:mvn/version "1.1.6"} org.domaindrivenarchitecture/c4k-common-clj {:mvn/version "8.0.1-SNAPSHOT"} cheshire/cheshire {:mvn/version "5.13.0"}} diff --git a/src/dda/build/c4k.clj b/src/dda/build/c4k.clj index 4506341..a61b584 100644 --- a/src/dda/build/c4k.clj +++ b/src/dda/build/c4k.clj @@ -1,83 +1,59 @@ (ns dda.build.c4k (:require [orchestra.core :refer [defn-spec]] [clojure.spec.test.alpha :as st] - [cheshire.core :refer [parse-string generate-string]] - [dda.build.devops :as d] + [cheshire.core :as cs] + [dda.build.devops :as devops] + [dda.build.terragrunt :as tg] + [dda.build.config :as cfg] [dda.build.c4k.domain :as domain] - [dda.build.terragrunt.domain :as tg-domain] [dda.build.infrastructure :as i])) (st/instrument `clean-build-dir!) (def default - (merge d/default {:autoapply false - :c4k-output-filename "c4k-app.yaml" - :c4k-config-filename "c4k-config.yaml" - :c4k-auth-filename "c4k-auth.yaml"})) + (merge devops/default + tf/default + {:c4k-output "c4k-app.yaml" + :c4k-config-input "c4k-config.edn" + :c4k-auth-input "c4k-auth.edn"})) + +(s/def ::c4k (s/merge + ::devops/devops + ::tg/tg + (s/keys :opt-un [::domain/c4k-output ::domain/c4k-config-input ::domain/c4k-auth-input]))) (defn-spec clean-build-dir! nil? - [devops ::d/devops] + [devops ::c4kg] (let [config (merge default devops)] (i/execute! (domain/clean-build-dir-command config) config))) (defn-spec run-c4k-jar! nil? - [devops ::d/devops] + [devops ::c4kg] (let [config (merge default devops)] (doseq [c (domain/c4k-uberjar-command config)] (i/execute! c config)))) -(defn-spec run-c4k-executable! nil? - [devops ::d/devops] +(defn-spec run-c4k-bin! nil? + [devops ::c4kg] (let [config (merge default devops)] (doseq [c (domain/c4k-graalvm-command config)] (i/execute! c config)))) -; TODO: Generate functions assume that files have already been copied, -; which will happen if this is run after terragrunt -; but it is not guaranteed -(defn-spec generate-jar! nil? - "Generates c4k app yaml using 'c4k-{module}-standalone.jar' - Stores the result in 'c4k-app.yaml' - - Defaults: c4k-config.yaml c4k-auth.yaml c4k-app.yaml - can be changed by adding another value for ':c4k-config-filename', ':c4k-auth-filename', ':c4k-output-filename' - " - [devops ::d/devops] - (let [config (merge default devops)] - (run-c4k-jar! config))) - -(defn-spec generate! nil? - "Generates c4k app yaml using 'c4k-{module}' (graalvm executable) - Stores the result in 'c4k-app.yaml' - - Defaults: c4k-config.yaml c4k-auth.yaml c4k-app.yaml - can be changed by adding another value for ':c4k-config-filename', ':c4k-auth-filename', ':c4k-output-filename' - " - [devops ::d/devops] - (let [config (merge default devops)] - (run-c4k-executable! config))) - -(defn-spec insert-tf-out! nil? - "Inserts relevant values from the tf output into the c4k config - - Default: c4k-config.yaml - can be changed by adding another value for ':c4k-config-filename' - " - [devops ::d/devops +(defn-spec write-c4k-objects! nil? + [devops ::c4kg tf-out ::tg-domain/tf-out] (let [config (merge default devops) - default-c4k-config (parse-string (slurp (domain/config-path config)) - (fn [k] (keyword (.toLowerCase k)))) - tf-out-c4k-config (domain/create-c4k-config config tf-out)] - (->> default-c4k-config - (merge tf-out-c4k-config) - (generate-string) - (spit (domain/config-path config))))) - + {:keys [module c4k-auth-input c4k-config-input c4k-output]} config] + (->> (cfg/read-config (domain/config-path config)) + (merge {:fqdn (:fqdn (:value (:out tf-out)))}) + (cs/generate-string) + (spit (domain/config-path config))) + (->> (cfg/read-config (domain/config-auth config)) + (cs/generate-string) + (spit (domain/config-auth config)) + (run-c4k-jar! config))) (st/instrument `clean-build-dir!) (st/instrument `run-c4k-jar!) -(st/instrument `run-c4k-executable!) -(st/instrument `generate-jar!) -(st/instrument `generate!) -(st/instrument `insert-tf-out!) +(st/instrument `run-c4k-bin!) +(st/instrument `write-c4k-objects!) diff --git a/src/dda/build/c4k/domain.clj b/src/dda/build/c4k/domain.clj index 190a1d3..b7f69ca 100644 --- a/src/dda/build/c4k/domain.clj +++ b/src/dda/build/c4k/domain.clj @@ -1,32 +1,30 @@ (ns dda.build.c4k.domain (:require [clojure.spec.alpha :as s] [orchestra.core :refer [defn-spec]] - [dda.build.devops.domain :as d] - [dda.build.terragrunt.domain :as td])) + [dda.build.devops.domain :as d])) -(s/def ::c4k-output-filename string?) -(s/def ::c4k-config-filename string?) -(s/def ::c4k-auth-filename string?) +(s/def ::c4k-output string?) +(s/def ::c4k-config-input string?) +(s/def ::c4k-auth-input string?) (s/def ::config - (s/keys :req-un [::d/name ::d/stage ::d/project-root-path ::d/build-dir-name ::d/debug - ::d/dry-run ::c4k-output-filename ::c4k-config-filename ::c4k-auth-filename] - :opt-un [::d/module])) + (s/merge ::d/devops + (s/keys :req-un [::c4k-output ::c4k-config-input ::c4k-auth-input]))) (defn-spec config-path string? [config ::config] - (let [{:keys [c4k-config-filename]} config] - (str (d/build-path config) "/" c4k-config-filename))) + (let [{:keys [c4k-config-input]} config] + (str (d/build-path config) "/" c4k-config-input))) (defn-spec auth-path string? [config ::config] - (let [{:keys [c4k-auth-filename]} config] - (str (d/build-path config) "/" c4k-auth-filename))) + (let [{:keys [c4k-auth-input]} config] + (str (d/build-path config) "/" c4k-auth-input))) (defn-spec output-path string? [config ::config] - (let [{:keys [c4k-output-filename]} config] - (str (d/build-path config) "/" c4k-output-filename))) + (let [{:keys [c4k-output]} config] + (str (d/build-path config) "/" c4k-output))) (defn-spec clean-build-dir-command seq? [config ::config] @@ -43,11 +41,3 @@ (let [{:keys [module]} config executable-name (str "c4k-" module)] [["bash" "-c" (str executable-name " " (config-path config) " " (auth-path config) " > " (output-path config))]])) - -(defn-spec create-c4k-config map? - [config ::config - tf-out ::td/tf-out] - (let [{:keys [stage]} config - issuer (if (= stage "prod") "prod" "staging") - fqdn (:fqdn (:value (:out tf-out)))] - {:issuer issuer :fqdn fqdn})) diff --git a/src/dda/build/gopass.clj b/src/dda/build/gopass.clj index daf2030..e05a4f4 100644 --- a/src/dda/build/gopass.clj +++ b/src/dda/build/gopass.clj @@ -2,6 +2,7 @@ (:require [orchestra.core :refer [defn-spec]] [clojure.spec.test.alpha :as st] [cheshire.core :refer [parse-string generate-string]] + [aero.core :refer :as aero] [dda.build.devops :as d] [dda.build.gopass.domain :as domain] [dda.build.c4k.domain :as c4k-d] @@ -45,6 +46,13 @@ (generate-string) (spit (c4k-d/auth-path config))))) +(defmethod aero/reader 'gopass + [{:keys [profile] :as opts} tag value] + (i/execute-output! (into ["gopass" "show" "-y" "-o"] value) {})) + +(defn read-config [] + (aero/read-config "config.edn")) + (st/instrument `run-gopass-command!) (st/instrument `resolve-gopass!) diff --git a/src/dda/build/infrastructure.clj b/src/dda/build/infrastructure.clj index e684fb2..53b067b 100644 --- a/src/dda/build/infrastructure.clj +++ b/src/dda/build/infrastructure.clj @@ -21,4 +21,4 @@ (when-not dry-run (->> (t/shell command {:out :string}) :out - clojure.string/trim)))) \ No newline at end of file + clojure.string/trim)))) diff --git a/test/dda/build/c4k/domain_test.clj b/test/dda/build/c4k/domain_test.clj index 646a001..53fc632 100644 --- a/test/dda/build/c4k/domain_test.clj +++ b/test/dda/build/c4k/domain_test.clj @@ -21,9 +21,9 @@ :stage "dev" :debug false :dry-run false - :c4k-config-filename "config.yaml" - :c4k-auth-filename "auth.yaml" - :c4k-output-filename "out.yaml"}))) + :c4k-config-input "config.yaml" + :c4k-auth-input "auth.yaml" + :c4k-output "out.yaml"}))) (is (= "../../target/dda/backup/config.yaml" (cut/config-path {:name "dda" :module "backup" @@ -33,9 +33,9 @@ :stage "dev" :debug false :dry-run false - :c4k-config-filename "config.yaml" - :c4k-auth-filename "auth.yaml" - :c4k-output-filename "out.yaml"})))) + :c4k-config-input "config.yaml" + :c4k-auth-input "auth.yaml" + :c4k-output "out.yaml"})))) (deftest should-calculate-auth-path (is (= "../../target/dda-backup/auth.yaml" @@ -46,9 +46,9 @@ :stage "dev" :debug false :dry-run false - :c4k-config-filename "config.yaml" - :c4k-auth-filename "auth.yaml" - :c4k-output-filename "out.yaml"}))) + :c4k-config-input "config.yaml" + :c4k-auth-input "auth.yaml" + :c4k-output "out.yaml"}))) (is (= "../../target/dda/backup/auth.yaml" (cut/auth-path {:name "dda" :module "backup" @@ -58,9 +58,9 @@ :stage "dev" :debug false :dry-run false - :c4k-config-filename "config.yaml" - :c4k-auth-filename "auth.yaml" - :c4k-output-filename "out.yaml"})))) + :c4k-config-input "config.yaml" + :c4k-auth-input "auth.yaml" + :c4k-output "out.yaml"})))) (deftest should-calculate-output-path @@ -72,9 +72,9 @@ :stage "dev" :debug false :dry-run false - :c4k-config-filename "config.yaml" - :c4k-auth-filename "auth.yaml" - :c4k-output-filename "out.yaml"}))) + :c4k-config-input "config.yaml" + :c4k-auth-input "auth.yaml" + :c4k-output "out.yaml"}))) (is (= "../../target/dda/backup/out.yaml" (cut/output-path {:name "dda" :module "backup" @@ -84,9 +84,9 @@ :stage "dev" :debug false :dry-run false - :c4k-config-filename "config.yaml" - :c4k-auth-filename "auth.yaml" - :c4k-output-filename "out.yaml"})))) + :c4k-config-input "config.yaml" + :c4k-auth-input "auth.yaml" + :c4k-output "out.yaml"})))) (deftest should-calculate-clean-build-dir-command (is (= ["rm" "-rf" "../../target/dda-backup"] @@ -97,33 +97,35 @@ :stage "dev" :debug false :dry-run false - :c4k-config-filename "config.yaml" - :c4k-auth-filename "auth.yaml" - :c4k-output-filename "out.yaml"})))) + :c4k-config-input "config.yaml" + :c4k-auth-input "auth.yaml" + :c4k-output "out.yaml"})))) (deftest should-calculate-c4k-uberjar-command - (is (= ["bash" "-c" "c4k-dda-backup-standalone.jar ../../target/dda-backup/config.yaml ../../target/dda-backup/auth.yaml > ../../target/dda-backup/out.yaml"] + (is (= [["bash" "-c" "c4k-backup-standalone.jar ../../target/dda-backup/backup/config.yaml ../../target/dda-backup/backup/auth.yaml > ../../target/dda-backup/backup/out.yaml"]] (cut/c4k-uberjar-command {:name "dda-backup" + :module "backup" :project-root-path "../.." :build-dir-name "target" :version "4.11.8-dev" :stage "dev" :debug false :dry-run false - :c4k-config-filename "config.yaml" - :c4k-auth-filename "auth.yaml" - :c4k-output-filename "out.yaml"})))) + :c4k-config-input "config.yaml" + :c4k-auth-input "auth.yaml" + :c4k-output "out.yaml"})))) (deftest should-calculate-c4k-graalvm-command - (is (= ["bash" "-c" "c4k-dda-backup ../../target/dda-backup/config.yaml ../../target/dda-backup/auth.yaml > ../../target/dda-backup/out.yaml"] + (is (= [["bash" "-c" "c4k-backup ../../target/dda-backup/backup/config.yaml ../../target/dda-backup/backup/auth.yaml > ../../target/dda-backup/backup/out.yaml"]] (cut/c4k-graalvm-command {:name "dda-backup" + :module "backup" :project-root-path "../.." :build-dir-name "target" :version "4.11.8-dev" :stage "dev" :debug false :dry-run false - :c4k-config-filename "config.yaml" - :c4k-auth-filename "auth.yaml" - :c4k-output-filename "out.yaml"})))) + :c4k-config-input "config.yaml" + :c4k-auth-input "auth.yaml" + :c4k-output "out.yaml"}))))