Skip to content

Commit eda142d

Browse files
committed
Setup deployments in CI
1 parent 09cc891 commit eda142d

File tree

7 files changed

+138
-100
lines changed

7 files changed

+138
-100
lines changed

.circleci/config.yml

Lines changed: 58 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -8,37 +8,55 @@ version: 2.1
88

99
# Default settings for executors
1010

11+
env_defaults: &env_defaults
12+
LEIN_ROOT: "true" # we intended to run lein as root
13+
# JVM_OPTS:
14+
# - limit the maximum heap size to prevent out of memory errors
15+
# - print stacktraces to console
16+
JVM_OPTS: >
17+
-Xmx3200m
18+
-Dclojure.main.report=stderr
19+
1120
defaults: &defaults
1221
working_directory: ~/repo
13-
environment:
14-
LEIN_ROOT: "true" # we intended to run lein as root
15-
# JVM_OPTS:
16-
# - limit the maximum heap size to prevent out of memory errors
17-
# - print stacktraces to console
18-
JVM_OPTS: >
19-
-Xmx3200m
20-
-Dclojure.main.report=stderr
2122

2223
# Runners for various OpenJDKs versions.
2324
# NOTE: JDK 16 can be discarded after a few months, given it's not LTS.
2425

2526
executors:
27+
# JDK 8 is preferred for deployments (https://github.com/benedekfazekas/mranderson/issues/57)
28+
# Parallelism is disabled, at least for now (https://github.com/benedekfazekas/mranderson/issues/56)
29+
openjdk8_deploy:
30+
docker:
31+
- image: circleci/clojure:openjdk-8-lein-2.9.1-node
32+
<<: *defaults
33+
environment:
34+
LEIN_JVM_OPTS: -Dmranderson.internal.no-parallelism=true
35+
<<: *env_defaults
2636
openjdk8:
2737
docker:
2838
- image: circleci/clojure:openjdk-8-lein-2.9.1-node
2939
<<: *defaults
40+
environment:
41+
<<: *env_defaults
3042
openjdk11:
3143
docker:
3244
- image: circleci/clojure:openjdk-11-lein-2.9.1-node
3345
<<: *defaults
46+
environment:
47+
<<: *env_defaults
3448
openjdk16:
3549
docker:
3650
- image: circleci/clojure:openjdk-16-lein-2.9.5-buster-node
3751
<<: *defaults
52+
environment:
53+
<<: *env_defaults
3854
openjdk17:
3955
docker:
4056
- image: circleci/clojure:openjdk-17-lein-2.9.5-buster-node
4157
<<: *defaults
58+
environment:
59+
<<: *env_defaults
4260

4361
# Runs a given set of steps, with some standard pre- and post-
4462
# steps, including restoring of cache, saving of cache.
@@ -111,6 +129,14 @@ jobs:
111129
cache_version: "1.10"
112130
steps: << parameters.steps >>
113131

132+
deploy:
133+
executor: openjdk8_deploy
134+
steps:
135+
- checkout
136+
- run:
137+
name: Deploy
138+
command: |
139+
lein with-profile -user,+deploy run -m deploy-release make deploy
114140
115141
test_code:
116142
description: |
@@ -125,6 +151,7 @@ jobs:
125151
executor: << parameters.jdk_version >>
126152
environment:
127153
VERSION: << parameters.clojure_version >>
154+
PROJECT_VERSION: 999.99.9
128155
steps:
129156
- checkout
130157
- with_cache:
@@ -165,71 +192,22 @@ workflows:
165192
ci-test-matrix:
166193
jobs:
167194
- test_code:
168-
name: Java 8, Clojure 1.8
169-
clojure_version: "1.8"
170-
jdk_version: openjdk8
171-
- test_code:
172-
name: Java 8, Clojure 1.9
173-
clojure_version: "1.9"
174-
jdk_version: openjdk8
175-
- test_code:
176-
name: Java 8, Clojure 1.10
177-
clojure_version: "1.10"
178-
jdk_version: openjdk8
179-
- test_code:
180-
name: Java 8, Clojure master
181-
clojure_version: "master"
182-
jdk_version: openjdk8
183-
- test_code:
184-
name: Java 11, Clojure 1.8
185-
clojure_version: "1.8"
186-
jdk_version: openjdk11
187-
- test_code:
188-
name: Java 11, Clojure 1.9
189-
clojure_version: "1.9"
190-
jdk_version: openjdk11
191-
- test_code:
192-
name: Java 11, Clojure 1.10
193-
clojure_version: "1.10"
194-
jdk_version: openjdk11
195-
- test_code:
196-
name: Java 11, Clojure master
197-
clojure_version: "master"
198-
jdk_version: openjdk11
199-
- test_code:
200-
name: Java 16, Clojure 1.8
201-
clojure_version: "1.8"
202-
jdk_version: openjdk16
203-
- test_code:
204-
name: Java 16, Clojure 1.9
205-
clojure_version: "1.9"
206-
jdk_version: openjdk16
207-
- test_code:
208-
name: Java 16, Clojure 1.10
209-
clojure_version: "1.10"
210-
jdk_version: openjdk16
211-
- test_code:
212-
name: Java 16, Clojure master
213-
clojure_version: "master"
214-
jdk_version: openjdk16
215-
- test_code:
216-
name: Java 17, Clojure 1.8
217-
clojure_version: "1.8"
218-
jdk_version: openjdk17
219-
- test_code:
220-
name: Java 17, Clojure 1.9
221-
clojure_version: "1.9"
222-
jdk_version: openjdk17
223-
- test_code:
224-
name: Java 17, Clojure 1.10
225-
clojure_version: "1.10"
226-
jdk_version: openjdk17
227-
- test_code:
228-
name: Java 17, Clojure master
229-
clojure_version: "master"
230-
jdk_version: openjdk17
195+
matrix:
196+
parameters:
197+
clojure_version: ["1.8", "1.9", "1.10", "master"]
198+
jdk_version: [openjdk8, openjdk11, openjdk16, openjdk17]
199+
filters:
200+
branches:
201+
only: /.*/
202+
tags:
203+
only: /^v\d+\.\d+\.\d+(-alpha\d+)?$/
231204
- util_job:
232205
name: Code Linting
206+
filters:
207+
branches:
208+
only: /.*/
209+
tags:
210+
only: /^v\d+\.\d+\.\d+(-alpha\d+)?$/
233211
steps:
234212
- run:
235213
name: Running cljfmt
@@ -243,3 +221,12 @@ workflows:
243221
name: Running Eastwood
244222
command: |
245223
make eastwood
224+
- deploy:
225+
requires:
226+
- test_code
227+
- "Code Linting"
228+
filters:
229+
branches:
230+
ignore: /.*/
231+
tags:
232+
only: /^v\d+\.\d+\.\d+(-alpha\d+)?$/
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
(ns deploy-release
2+
(:require
3+
[clojure.java.io :as io]
4+
[clojure.java.shell :refer [sh]]
5+
[clojure.string :as str]))
6+
7+
(def release-marker "v")
8+
9+
(defn make-version [tag]
10+
(str/replace-first tag release-marker ""))
11+
12+
(defn log-result [m]
13+
(println m)
14+
m)
15+
16+
(defn -main [& _]
17+
(let [tag (System/getenv "CIRCLE_TAG")]
18+
(if-not tag
19+
(do
20+
(println "No CIRCLE_TAG found.")
21+
(System/exit 1))
22+
(if-not (re-find (re-pattern release-marker) tag)
23+
(do
24+
(println (format "The `%s` marker was not found in %s." release-marker tag))
25+
(System/exit 1))
26+
(let [version (make-version tag)
27+
version-file (io/file "resources" "cider" "nrepl" "version.edn")]
28+
(assert (.exists version-file))
29+
(spit version-file (pr-str version))
30+
(apply println "Executing" *command-line-args*)
31+
(->> [:env (-> {}
32+
(into (System/getenv))
33+
(assoc "PROJECT_VERSION" version)
34+
(dissoc "CLASSPATH"))]
35+
(into (vec *command-line-args*))
36+
(apply sh)
37+
log-result
38+
:exit
39+
(System/exit)))))))

Makefile

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.PHONY: test eastwood cljfmt install smoketest release deploy clean detect_timeout
1+
.PHONY: test eastwood cljfmt install smoketest deploy clean detect_timeout
22

33
CLOJURE_VERSION ?= 1.10
44

@@ -21,15 +21,15 @@ tools-deps-test: clean install
2121
cd tools-deps-testing; clojure -M:test
2222

2323
eastwood:
24-
lein with-profile -user,-dev,+$(CLOJURE_VERSION),+eastwood eastwood
24+
lein with-profile -user,-dev,+$(CLOJURE_VERSION),+deploy,+eastwood eastwood
2525

2626
cljfmt:
2727
lein with-profile -user,-dev,+$(CLOJURE_VERSION),+cljfmt cljfmt check
2828

2929
kondo:
30-
lein with-profile -user,-dev,+clj-kondo run -m clj-kondo.main --lint src
30+
lein with-profile -user,-dev,+clj-kondo run -m clj-kondo.main --lint src .circleci/deploy
3131

32-
install: .inline-deps
32+
install: check-install-env .inline-deps
3333
lein with-profile -user,-dev,+$(CLOJURE_VERSION),+plugin.mranderson/config install
3434

3535
smoketest: install
@@ -44,22 +44,27 @@ smoketest: install
4444
detect_timeout:
4545
(bin/ci_detect_timeout &)
4646

47-
# When releasing, the BUMP variable controls which field in the
48-
# version string will be incremented in the *next* snapshot
49-
# version. Typically this is either "major", "minor", or "patch".
50-
51-
BUMP ?= patch
52-
53-
release:
54-
lein with-profile -user,-dev,+$(CLOJURE_VERSION) release $(BUMP)
55-
56-
# Deploying requires the caller to set environment variables as
57-
# specified in project.clj to provide a login and password to the
58-
# artifact repository.
59-
60-
deploy: .inline-deps
47+
# Deployment is performed via CI by creating a git tag prefixed with "v".
48+
# Please do not deploy locally as it skips various measures (particularly around mranderson).
49+
deploy: check-env .inline-deps
6150
lein with-profile -user,+$(CLOJURE_VERSION),+plugin.mranderson/config deploy clojars
6251

52+
check-env:
53+
ifndef CLOJARS_USERNAME
54+
$(error CLOJARS_USERNAME is undefined)
55+
endif
56+
ifndef CLOJARS_PASSWORD
57+
$(error CLOJARS_PASSWORD is undefined)
58+
endif
59+
ifndef CIRCLE_TAG
60+
$(error CIRCLE_TAG is undefined. Please only perform deployments by publishing git tags. CI will do the rest.)
61+
endif
62+
63+
check-install-env:
64+
ifndef PROJECT_VERSION
65+
$(error Please set PROJECT_VERSION as an env var beforehand.)
66+
endif
67+
6368
clean:
6469
lein clean
6570
cd test/smoketest && lein clean

README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,14 @@ lein with-profile plugin.mranderson/config install
9999
Release to [clojars](https://clojars.org/):
100100

101101
```
102-
lein with-profile plugin.mranderson/config deploy clojars
102+
git tag -a v0.28.1 -m "0.28.1"
103+
git push --tags
103104
```
104105

105106
Or you can use the `Makefile` as:
106107

107108
```
108-
make clean
109-
make install
110-
make deploy
109+
PROJECT_VERSION=0.28.1 make install
111110
```
112111

113112
## Hall of Fame

project.clj

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
(defproject cider/cider-nrepl "0.28.1"
1+
(defproject cider/cider-nrepl (or (not-empty (System/getenv "PROJECT_VERSION"))
2+
"0.0.0")
23
:description "A collection of nREPL middleware designed to enhance Clojure editors."
34
:url "https://github.com/clojure-emacs/cider-nrepl"
45
:license {:name "Eclipse Public License"
@@ -143,8 +144,10 @@
143144
{:dependencies [[clj-kondo "2021.12.01"]]}]
144145

145146
:eastwood [:test
146-
{:plugins [[jonase/eastwood "1.1.0"]]
147+
{:plugins [[jonase/eastwood "1.2.2"]]
147148
:eastwood {:config-files ["eastwood.clj"]
148149
:exclude-namespaces [cider.nrepl.middleware.test-filter-tests]
149150
:ignored-faults {:unused-ret-vals-in-try {cider.nrepl.middleware.profile-test [{:line 25}]}
150-
:suspicious-test {cider.nrepl.middleware.profile-test [{:line 25}]}}}}]})
151+
:suspicious-test {cider.nrepl.middleware.profile-test [{:line 25}]}}}}]
152+
153+
:deploy {:source-paths [".circleci/deploy"]}})

resources/cider/nrepl/version.edn

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
;; This file is automatically overwriten from .circleci/deploy/deploy_release.clj,
2+
;; whenever we perform a deployment.
3+
"0.0.0"

src/cider/nrepl/version.clj

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44

55
(def version-string
66
"The current version for cider-nrepl as a string."
7-
(-> (or (io/resource "cider/cider-nrepl/project.clj")
8-
"project.clj")
7+
(-> (io/resource "cider/nrepl/version.edn")
98
slurp
10-
read-string
11-
(nth 2)))
9+
read-string))
10+
11+
(assert (seq version-string))
12+
13+
(assert (string? version-string))
1214

1315
(def version
1416
"Current version of CIDER nREPL as a map.

0 commit comments

Comments
 (0)