@codedependant/semantic-release-docker 3.1.2 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +38 -11
  3. package/lib/build-config.js +1 -1
  4. package/lib/handlebars/helpers/endswith.js +10 -0
  5. package/lib/handlebars/helpers/eq.js +7 -0
  6. package/lib/handlebars/helpers/gt.js +7 -0
  7. package/lib/handlebars/helpers/gte.js +7 -0
  8. package/lib/handlebars/helpers/includes.js +9 -0
  9. package/lib/handlebars/helpers/index.js +17 -0
  10. package/lib/handlebars/helpers/lower.js +8 -0
  11. package/lib/handlebars/helpers/lt.js +7 -0
  12. package/lib/handlebars/helpers/lte.js +7 -0
  13. package/lib/handlebars/helpers/neq.js +9 -0
  14. package/lib/handlebars/helpers/pick.js +13 -0
  15. package/lib/handlebars/helpers/split.js +5 -0
  16. package/lib/handlebars/helpers/startswith.js +10 -0
  17. package/lib/handlebars/helpers/upper.js +9 -0
  18. package/lib/handlebars/index.js +10 -0
  19. package/lib/lang/string/template.js +9 -7
  20. package/package.json +18 -31
  21. package/test/common/git/add.js +0 -9
  22. package/test/common/git/commit.js +0 -11
  23. package/test/common/git/head.js +0 -10
  24. package/test/common/git/index.js +0 -13
  25. package/test/common/git/init-origin.js +0 -13
  26. package/test/common/git/init-remote.js +0 -16
  27. package/test/common/git/init.js +0 -20
  28. package/test/common/git/push.js +0 -9
  29. package/test/common/git/tag.js +0 -13
  30. package/test/common/git/tags.js +0 -14
  31. package/test/fixture/docker/Dockerfile.prepare +0 -4
  32. package/test/fixture/docker/Dockerfile.publish +0 -4
  33. package/test/fixture/docker/Dockerfile.test +0 -4
  34. package/test/fixture/package.json +0 -4
  35. package/test/fixture/pkg/one/package.json +0 -5
  36. package/test/fixture/pkg/two/package.json +0 -0
  37. package/test/integration/prepare.js +0 -76
  38. package/test/integration/publish.js +0 -60
  39. package/test/integration/release.js +0 -92
  40. package/test/integration/verify.js +0 -206
  41. package/test/unit/build-config.js +0 -167
  42. package/test/unit/build-template-vars.js +0 -63
  43. package/test/unit/docker/image.js +0 -303
  44. package/test/unit/lang/array.js +0 -34
  45. package/test/unit/lang/object.js +0 -45
  46. package/test/unit/lang/string.js +0 -37
  47. package/test/unit/parse-pkg-name.js +0 -27
  48. package/test/unit/read-pkg.js +0 -36
@@ -1,303 +0,0 @@
1
- 'use strict'
2
-
3
- const os = require('os')
4
- const path = require('path')
5
- const crypto = require('crypto')
6
- const execa = require('execa')
7
- const {test, threw} = require('tap')
8
- const docker = require('../../../lib/docker/index.js')
9
-
10
- function random() {
11
- return crypto.randomBytes(5).toString('hex')
12
- }
13
-
14
- const fixturedir = path.join(__dirname, '..', '..', 'fixture')
15
- test('exports', async (tt) => {
16
- tt.match(docker, {
17
- Image: Function
18
- }, 'expected exports')
19
- })
20
-
21
- test('Image', async (t) => {
22
- const build_id = random()
23
- t.throws(() => {
24
- return new docker.Image()
25
- }, /docker image "name" is required and must be a string/gi)
26
-
27
- t.test('image defaults', async (tt) => {
28
- const img = new docker.Image({name: 'test'})
29
- tt.notOk(img.sha, 'No default sha generated')
30
- tt.match(img.opts, {
31
- build_id: String
32
- , registry: null
33
- , project: null
34
- , name: 'test'
35
- , dockerfile: 'Dockerfile'
36
- , cwd: process.cwd()
37
- , args: Map
38
- }, 'default image options')
39
- })
40
-
41
- test('image overrides', async (tt) => {
42
- const img = new docker.Image({
43
- name: 'test'
44
- , build_id: 'abc123'
45
- , registry: 'quay.io'
46
- , project: 'esatterwhite'
47
- , name: 'test'
48
- , dockerfile: 'Dockerfile.test'
49
- , cwd: path.join(__dirname, 'build')
50
- , sha: 'hello'
51
- })
52
- tt.equal(img.sha, 'hello')
53
- tt.match(img.opts, {
54
- build_id: 'abc123'
55
- , registry: 'quay.io'
56
- , project: 'esatterwhite'
57
- , name: 'test'
58
- , dockerfile: 'Dockerfile.test'
59
- , cwd: path.join(__dirname, 'build')
60
- , args: Map
61
- }, 'default image options')
62
-
63
- tt.equal(img.context, path.join(__dirname, 'build', '.'), 'default image context')
64
- img.context = __dirname
65
- tt.equal(img.context, __dirname, 'context override')
66
- tt.equal(
67
- img.dockerfile
68
- , path.join(__dirname, 'build', 'Dockerfile.test')
69
- , 'docker file path'
70
- )
71
- })
72
-
73
- t.test('dockerfile location resolution', async (t) => {
74
- t.test('relative location', async (t) => {
75
- const img = new docker.Image({
76
- name: 'test'
77
- , build_id: 'abc123'
78
- , registry: 'quay.io'
79
- , project: 'esatterwhite'
80
- , name: 'test'
81
- , dockerfile: '../../Dockerfile.test'
82
- , cwd: path.join(__dirname, 'build')
83
- , sha: 'hello'
84
- })
85
- t.equal(
86
- img.dockerfile
87
- , path.join(__dirname, '..', 'Dockerfile.test')
88
- , 'docker file path'
89
- )
90
- })
91
-
92
- t.test('absolute path', async (t) => {
93
- const img = new docker.Image({
94
- name: 'test'
95
- , build_id: 'abc123'
96
- , registry: 'quay.io'
97
- , project: 'esatterwhite'
98
- , name: 'test'
99
- , dockerfile: '/var/opt/Dockerfile.test'
100
- , cwd: path.join(__dirname, 'build')
101
- , sha: 'hello'
102
- })
103
- t.equal(
104
- img.dockerfile
105
- , '/var/opt/Dockerfile.test'
106
- , 'docker file path'
107
- )
108
- })
109
- })
110
-
111
- t.test('image#id()', async (tt) => {
112
- {
113
- const img = new docker.Image({
114
- name: 'test'
115
- , build_id: 'abc123'
116
- })
117
-
118
- tt.equal(img.id, 'test:abc123')
119
- }
120
-
121
- {
122
- const img = new docker.Image({
123
- name: 'test'
124
- , sha: 'abcdefg123456'
125
- , registry: 'quay.io'
126
- , project: 'esatterwhite'
127
- , build_id: 'abacadaba'
128
- })
129
-
130
- tt.equal(img.id, 'abcdefg123456', 'sha value used as image id')
131
- }
132
- })
133
-
134
- t.test('image#repo', async (tt) => {
135
- {
136
- const img = new docker.Image({
137
- name: 'test'
138
- })
139
-
140
- tt.equal(img.repo, 'test')
141
- }
142
-
143
- {
144
- const img = new docker.Image({
145
- name: 'foobar'
146
- , registry: 'us.gcr.io'
147
- })
148
-
149
- tt.equal(img.repo, 'us.gcr.io/foobar')
150
- }
151
-
152
- {
153
- const img = new docker.Image({
154
- name: 'test'
155
- , registry: 'quay.io'
156
- , project: 'esatterwhite'
157
- })
158
-
159
- tt.equal(img.repo, 'quay.io/esatterwhite/test', 'generated repo name')
160
- }
161
- })
162
-
163
- t.test('image#build_cmd', async (tt) => {
164
- {
165
- const img = new docker.Image({
166
- name: 'test'
167
- , registry: 'quay.io'
168
- , project: 'esatterwhite'
169
- , build_id: 'abacadaba'
170
- })
171
-
172
- tt.deepEqual(img.build_cmd, [
173
- 'build'
174
- , '--quiet'
175
- , '--tag'
176
- , 'quay.io/esatterwhite/test:abacadaba'
177
- , '-f'
178
- , path.join(process.cwd(), 'Dockerfile')
179
- , process.cwd()
180
- ], 'build command')
181
- }
182
-
183
- {
184
- const img = new docker.Image({
185
- name: 'foobar'
186
- , registry: 'us.gcr.io'
187
- , project: 'esatterwhite'
188
- , build_id: '1010101'
189
- , cwd: __dirname
190
- , context: path.join(__dirname, 'fake')
191
- })
192
-
193
- tt.deepEqual(img.build_cmd, [
194
- 'build'
195
- , '--quiet'
196
- , '--tag'
197
- , 'us.gcr.io/esatterwhite/foobar:1010101'
198
- , '-f'
199
- , path.join(__dirname, 'Dockerfile')
200
- , path.join(__dirname, 'fake')
201
- ], 'build command')
202
- }
203
-
204
- {
205
- const img = new docker.Image({
206
- name: 'foobar'
207
- , registry: 'us.gcr.io'
208
- , project: 'esatterwhite'
209
- , build_id: '1010101'
210
- , cwd: __dirname
211
- , context: path.join(__dirname, 'fake')
212
- })
213
-
214
- img.arg('ARG_1', 'yes')
215
- img.arg('VALUE_FROM_ENV', true)
216
- tt.deepEqual(img.build_cmd, [
217
- 'build'
218
- , '--quiet'
219
- , '--tag'
220
- , 'us.gcr.io/esatterwhite/foobar:1010101'
221
- , '--build-arg'
222
- , 'ARG_1=yes'
223
- , '--build-arg'
224
- , 'VALUE_FROM_ENV'
225
- , '-f'
226
- , path.join(__dirname, 'Dockerfile')
227
- , path.join(__dirname, 'fake')
228
- ], 'build command')
229
- }
230
- })
231
-
232
- t.test('image#build()', async (tt) => {
233
- const img = new docker.Image({
234
- name: 'test'
235
- , registry: 'quay.io'
236
- , project: 'esatterwhite'
237
- , build_id: build_id
238
- , cwd: fixturedir
239
- , dockerfile: path.join('docker', 'Dockerfile.test')
240
- , context: path.join(fixturedir, 'docker')
241
- })
242
-
243
- tt.notOk(img.sha, 'no show before build')
244
- const sha = await img.build()
245
- tt.equal(sha, img.sha, 'image sha set after build')
246
- const {stdout} = await execa('docker', ['run', '--rm', img.name, 'ls', '-1'])
247
- tt.deepEqual(
248
- stdout.split(os.EOL).sort()
249
- , ['Dockerfile.test', 'Dockerfile.publish', 'Dockerfile.prepare'].sort()
250
- , 'files in image context')
251
- })
252
-
253
- t.test('image#tag()', async (tt) => {
254
- const img = new docker.Image({
255
- name: 'test'
256
- , registry: 'quay.io'
257
- , project: 'esatterwhite'
258
- , build_id: build_id
259
- , cwd: __dirname
260
- , dockerfile: path.join(fixturedir, 'docker', 'Dockerfile.test')
261
- , context: path.join(__dirname, 'fixture')
262
- })
263
- await img.tag('1.0.0', false)
264
- const {stdout} = await execa('docker', [
265
- 'images', img.repo
266
- , '-q', '--format={{ .Tag }}'
267
- ])
268
- const tags = stdout.split(os.EOL)
269
- tt.deepEqual(tags.sort(), [build_id, '1.0.0'].sort(), 'image tags')
270
- })
271
-
272
- t.test('image#clean()', async (tt) => {
273
- const img = new docker.Image({
274
- name: 'test'
275
- , registry: 'quay.io'
276
- , project: 'esatterwhite'
277
- , build_id: build_id
278
- , cwd: __dirname
279
- , dockerfile: path.join('fixture', 'Dockerfile.test')
280
- })
281
- await img.clean()
282
- const {stdout} = await execa('docker', [
283
- 'images', img.repo
284
- , '-q', '--format={{ .Tag }}'
285
- ])
286
- tt.deepEqual(stdout, '', 'all tags removed')
287
- })
288
-
289
- t.test('image.context', async (tt) => {
290
- const img = new docker.Image({
291
- name: 'test'
292
- , registry: 'quay.io'
293
- , project: 'esatterwhite'
294
- , build_id: build_id
295
- , cwd: __dirname
296
- , dockerfile: path.join('fixture', 'Dockerfile.test')
297
- , context: 'fixture'
298
- })
299
-
300
- tt.equal(img.context, path.join(__dirname, 'fixture'), 'expected image context')
301
- })
302
-
303
- }).catch(threw)
@@ -1,34 +0,0 @@
1
- 'use strict'
2
-
3
- const {test, threw} = require('tap')
4
- const array = require('../../../lib/lang/array/index.js')
5
-
6
- test('array', async (t) => {
7
- t.test('toArray', async (t) => {
8
- const cases = [
9
- {value: undefined, expected: [], message: 'toArray(undefined) == []'}
10
- , {value: null, expected: [], message: 'toArray(null) == []'}
11
- , {value: 1, expected: [1], message: 'toArray(1) == [1]'}
12
- , {value: '', expected: [], message: 'toArray(\'\') == []'}
13
- , {value: 'test', expected: ['test']}
14
- , {value: '1,2,3', expected: ['1', '2', '3']}
15
- , {value: '1, 2, 3', expected: ['1', '2', '3']}
16
- , {value: '1, 2, 3', expected: ['1', ' 2', ' 3'], sep: ','}
17
- , {value: '1|2|3', expected: ['1', '2', '3'], sep: '|'}
18
- , {value: [1, 2, 3], expected: [1, 2, 3]}
19
- , {value: new Set([1, null, 'test']), expected: [1, null, 'test']}
20
- ]
21
- for (const current of cases) {
22
- const args = [current.value]
23
- if (current.sep) {
24
- args.push(current.sep)
25
- }
26
-
27
- t.deepEqual(
28
- array.toArray(...args)
29
- , current.expected
30
- , current.message || `toArray(${current.value}) == ${current.expected}`
31
- )
32
- }
33
- })
34
- }).catch(threw)
@@ -1,45 +0,0 @@
1
- 'use strict'
2
-
3
- const {test, threw} = require('tap')
4
- const object = require('../../../lib/lang/object/index.js')
5
-
6
- test('object', async (t) => {
7
- const obj = {
8
- foo: {
9
- bar: {
10
- baz: {
11
- key: 'value'
12
- , test: null
13
- }
14
- }
15
- , value: 'foobar'
16
- , array: [1, 2, 3]
17
- }
18
- , bar: 0
19
- , baz: false
20
- , biff: null
21
- }
22
-
23
- t.test('get', async (tt) => {
24
- tt.match(object.get(obj, 'foo.bar'), {
25
- baz: {
26
- key: 'value'
27
- , test: null
28
- }
29
- })
30
- tt.deepEqual(object.get(obj, 'foo.array'), [1, 2, 3], 'foo.array')
31
- tt.equal(object.get(obj, 'foo.bar.baz.key'), 'value', 'foo.bar.baz.key')
32
- tt.equal(object.get(obj, 'foo|bar|baz|key', '|'), 'value', 'foo.bar.baz.key')
33
- tt.equal(object.get(obj, 'does.not.exist'), undefined, 'does.not.exist')
34
- tt.strictEqual(object.get(obj, 'foo.bar.baz.test'), null, 'foo.bar.baz.test')
35
- tt.strictEqual(object.get(null, 'foo.bar.baz'), null, 'null input')
36
- })
37
-
38
- t.test('has', async (t) => {
39
- t.ok(object.has(obj, 'bar'), 'key found')
40
- t.ok(object.has(obj, 'biff'), 'has key w/ null value')
41
- t.false(object.has(obj, 'whizbang'), 'key not found')
42
- t.false(object.has(undefined, 'whizbang'), 'undefined object')
43
-
44
- })
45
- }).catch(threw)
@@ -1,37 +0,0 @@
1
- 'use strict'
2
-
3
- const {test, threw} = require('tap')
4
- const string = require('../../../lib/lang/string/index.js')
5
-
6
- test('string', async (t) => {
7
- t.test('template', async (tt) => {
8
- const cases = [
9
- {
10
- input: 'hello {value}'
11
- , values: {value: 'world'}
12
- , expected: 'hello world'
13
- , message: 'single value lookup'
14
- }, {
15
- input: 'hello {value}'
16
- , values: {}
17
- , expected: 'hello {value}'
18
- , message: 'missing imput values'
19
- }, {
20
- input: 'hello {place.name}'
21
- , values: {place: {name: 'boston'}}
22
- , expected: 'hello boston'
23
- , message: 'nested values'
24
- }, {
25
- input: null
26
- , values: {place: {name: 'boston'}}
27
- , expected: null
28
- , message: 'non string value returns value'
29
- }
30
- ]
31
-
32
- for (const tcase of cases) {
33
- const tpl = string.template(tcase.input)
34
- tt.equal(tpl(tcase.values), tcase.expected, tcase.message)
35
- }
36
- })
37
- }).catch(threw)
@@ -1,27 +0,0 @@
1
- 'use strict'
2
-
3
- const {test, threw} = require('tap')
4
- const parsePkgName = require('../../lib/parse-pkg-name.js')
5
-
6
- test('parsePkgName', async (t) => {
7
- t.deepEqual(parsePkgName('test'), {
8
- scope: null
9
- , name: 'test'
10
- }, 'non-scoped package name')
11
-
12
- t.deepEqual(parsePkgName('@namespace/foobar'), {
13
- scope: 'namespace'
14
- , name: 'foobar'
15
- }, 'scoped package name')
16
-
17
- t.deepEqual(parsePkgName('nampace/foobar'), {
18
- name: null
19
- , scope: null
20
- }, 'invalid package name')
21
-
22
- t.deepEqual(parsePkgName(), {
23
- name: null
24
- , scope: null
25
- }, 'no package name')
26
-
27
- }).catch(threw)
@@ -1,36 +0,0 @@
1
- 'use strict'
2
-
3
- const path = require('path')
4
- const {test, threw} = require('tap')
5
- const readPkg = require('../../lib/read-pkg.js')
6
-
7
- const fixturedir = path.join(__dirname, '..', 'fixture')
8
- test('read-pkg', async (t) => {
9
- t.test('reads cwd by default', async (tt) => {
10
- const pkg = await readPkg()
11
- tt.match(pkg, {
12
- name: '@codedependant/semantic-release-docker'
13
- , version: String
14
- })
15
- })
16
-
17
- t.test('reads specified directories', async (tt) => {
18
- const cwd = path.join(fixturedir, 'pkg', 'one')
19
- const pkg = await readPkg({cwd})
20
- tt.match(pkg, {
21
- name: '@fixture/one'
22
- , version: '0.0.0'
23
- , private: true
24
- })
25
- })
26
-
27
- t.test('throws on invalid json', async (tt) => {
28
- const cwd = path.join(fixturedir, 'pkg', 'two')
29
- tt.rejects(readPkg({cwd}), /unexpected end of json input/ig)
30
- })
31
-
32
- t.test('throws if no package.json', async (tt) => {
33
- const cwd = path.join(fixturedir, 'pkg', 'three')
34
- tt.rejects(readPkg({cwd}), {code: 'ENOENT'})
35
- })
36
- }).catch(threw)