@codedependant/semantic-release-docker 3.0.1 → 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 (53) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +38 -11
  3. package/lib/build-config.js +6 -4
  4. package/lib/docker/image.js +1 -1
  5. package/lib/handlebars/helpers/endswith.js +10 -0
  6. package/lib/handlebars/helpers/eq.js +7 -0
  7. package/lib/handlebars/helpers/gt.js +7 -0
  8. package/lib/handlebars/helpers/gte.js +7 -0
  9. package/lib/handlebars/helpers/includes.js +9 -0
  10. package/lib/handlebars/helpers/index.js +17 -0
  11. package/lib/handlebars/helpers/lower.js +8 -0
  12. package/lib/handlebars/helpers/lt.js +7 -0
  13. package/lib/handlebars/helpers/lte.js +7 -0
  14. package/lib/handlebars/helpers/neq.js +9 -0
  15. package/lib/handlebars/helpers/pick.js +13 -0
  16. package/lib/handlebars/helpers/split.js +5 -0
  17. package/lib/handlebars/helpers/startswith.js +10 -0
  18. package/lib/handlebars/helpers/upper.js +9 -0
  19. package/lib/handlebars/index.js +10 -0
  20. package/lib/lang/array/index.js +5 -0
  21. package/lib/lang/array/to-array.js +9 -0
  22. package/lib/lang/string/template.js +9 -7
  23. package/lib/prepare.js +1 -0
  24. package/lib/publish.js +1 -0
  25. package/lib/verify.js +3 -1
  26. package/package.json +18 -31
  27. package/test/common/git/add.js +0 -9
  28. package/test/common/git/commit.js +0 -11
  29. package/test/common/git/head.js +0 -10
  30. package/test/common/git/index.js +0 -13
  31. package/test/common/git/init-origin.js +0 -13
  32. package/test/common/git/init-remote.js +0 -16
  33. package/test/common/git/init.js +0 -20
  34. package/test/common/git/push.js +0 -9
  35. package/test/common/git/tag.js +0 -13
  36. package/test/common/git/tags.js +0 -14
  37. package/test/fixture/docker/Dockerfile.prepare +0 -4
  38. package/test/fixture/docker/Dockerfile.publish +0 -4
  39. package/test/fixture/docker/Dockerfile.test +0 -4
  40. package/test/fixture/package.json +0 -4
  41. package/test/fixture/pkg/one/package.json +0 -5
  42. package/test/fixture/pkg/two/package.json +0 -0
  43. package/test/integration/prepare.js +0 -74
  44. package/test/integration/publish.js +0 -60
  45. package/test/integration/release.js +0 -92
  46. package/test/integration/verify.js +0 -205
  47. package/test/unit/build-config.js +0 -166
  48. package/test/unit/build-template-vars.js +0 -63
  49. package/test/unit/docker/image.js +0 -289
  50. package/test/unit/lang/object.js +0 -45
  51. package/test/unit/lang/string.js +0 -37
  52. package/test/unit/parse-pkg-name.js +0 -27
  53. package/test/unit/read-pkg.js +0 -36
@@ -1,63 +0,0 @@
1
- 'use strict'
2
-
3
- const {test, threw} = require('tap')
4
- const buildConfig = require('../../lib/build-config.js')
5
- const buildTemplateVars = require('../../lib/build-template-vars.js')
6
-
7
- test('buildTemplateVars', async (t) => {
8
- const cwd = t.testdir({
9
- 'package.json': JSON.stringify({
10
- name: 'template-vars'
11
- })
12
- })
13
- const context = {
14
- cwd
15
- , nextRelease: {
16
- version: '1.0.0'
17
- , gitTag: 'v1.0.0'
18
- , gitHead: 'abcdefgh'
19
- , type: 'major'
20
- , notes: 'test it'
21
- }
22
- }
23
- const opts = await buildConfig('abacadaba', {
24
- dockerArgs: {
25
- TEMPLATE_VALUE: '{type}.{version}'
26
- , BOOLEAN_VALUE: true
27
- , NULL_VALUE: null
28
- }
29
- }, context)
30
-
31
- const vars = buildTemplateVars(opts, context)
32
- t.match(vars, {
33
- release_type: 'major'
34
- , release_notes: 'test it'
35
- , version: '1.0.0'
36
- , git_sha: 'abcdefgh'
37
- , git_tag: 'v1.0.0'
38
- , pkg: {name: 'template-vars'}
39
- , major: 1
40
- , minor: 0
41
- , patch: 0
42
- , version: '1.0.0'
43
- , next: {
44
- major: 1
45
- , minor: 0
46
- , patch: 0
47
- , version: '1.0.0'
48
- }
49
- , args: {
50
- SRC_DIRECTORY: String
51
- , TARGET_PATH: String
52
- , NPM_PACKAGE_NAME: 'template-vars'
53
- , NPM_PACKAGE_SCOPE: null
54
- , CONFIG_NAME: String
55
- , CONFIG_PROJECT: null
56
- , GIT_SHA: 'abcdefgh'
57
- , GIT_TAG: 'v1.0.0'
58
- , TEMPLATE_VALUE: '{type}.{version}'
59
- , BOOLEAN_VALUE: true
60
- , NULL_VALUE: null
61
- }
62
- }, 'expected template values')
63
- }).catch(threw)
@@ -1,289 +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, '.', '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
- , '.'
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
- }).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)