-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild.clj
More file actions
105 lines (95 loc) · 2.95 KB
/
build.clj
File metadata and controls
105 lines (95 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
(ns build
"Build this thing."
(:require [clojure.tools.build.api :as b]
[clojure.java.process :as process]
[clojure.data.json :as json]
[clojure.java.io :as io]))
(def defaults
"The defaults to configure a build."
{:class-dir "target/classes"
:java-opts ["-Dclojure.main.report=stderr"]
:main 'appender
:path "target"
:project "deps.edn"
:target-dir "target/classes"
:uber-file "target/app.jar"
:exclude [#"META-INF/license.*"]})
(defn uber
"Throw or make an uberjar from source."
[_]
(let [{:keys [paths] :as basis} (b/create-basis defaults)
project (assoc defaults :basis basis)]
(b/delete project)
(b/copy-dir (assoc project :src-dirs paths))
(b/compile-clj (assoc project
:src-dirs ["src"]
:ns-compile ['appender]))
(b/uber project)))
(def app-name "kafka-topic-appender")
(defn image-tag []
(str
"us-east1-docker.pkg.dev/"
"clingen-dx/"
"genegraph-prod/"
app-name
":v"
(b/git-count-revs {})))
(defn docker-push
[_]
(process/exec
{:err :stdout}
"docker"
"buildx"
"build"
"."
"--platform"
"linux/arm64"
"-t"
(image-tag)
"--push"))
(defn kubernetes-deployment []
{:apiVersion "apps/v1"
:kind "Deployment"
:metadata {:name app-name}
:spec
{:selector {:matchLabels {:app app-name}}
:template
{:metadata {:labels {:app app-name}}
:spec
{:containers
[{:name app-name
:image (image-tag)
:env [{:name "GENEGRAPH_PLATFORM" :value "prod"}]
:ports [{:name "genegraph-port" :containerPort 8888}]
:readinessProbe {:httpGet {:path "/ready" :port "genegraph-port"}}
:resources {:requests {:memory "1Gi" :cpu "100m"}
:limits {:memory "1Gi"}}}]
:tolerations [{:key "kubernetes.io/arch"
:operator "Equal"
:value "arm64"
:effect "NoSchedule"}]
:affinity {:nodeAffinity {:requiredDuringSchedulingIgnoredDuringExecution
{:nodeSelectorTerms
[{:matchExpressions
[{:key "kubernetes.io/arch"
:operator "In"
:values ["arm64"]}]}]}}}}}}})
(defn kubernetes-apply
[_]
(let [p (process/start {:err :inherit} "kubectl" "apply" "-f" "-")
captured (process/io-task #(slurp (process/stdout p)))
exit (process/exit-ref p)]
(with-open [w (io/writer (process/stdin p))]
(run! #(json/write (%) w)
[kubernetes-deployment]))
(if (zero? @(process/exit-ref p))
(println @captured)
(println "non-zero exit code"))))
(defn deploy
[_]
(uber nil)
(docker-push nil)
(kubernetes-apply nil))
(defn destroy
[_]
(process/exec {:err :stdout} "kubectl" "delete" "deployment" app-name))