@codedependant/semantic-release-docker 3.1.1 → 4.1.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.
- package/CHANGELOG.md +51 -0
- package/README.md +82 -35
- package/lib/build-config.js +5 -2
- package/lib/docker/image.js +18 -3
- package/lib/handlebars/helpers/endswith.js +10 -0
- package/lib/handlebars/helpers/eq.js +7 -0
- package/lib/handlebars/helpers/gt.js +7 -0
- package/lib/handlebars/helpers/gte.js +7 -0
- package/lib/handlebars/helpers/includes.js +9 -0
- package/lib/handlebars/helpers/index.js +17 -0
- package/lib/handlebars/helpers/lower.js +8 -0
- package/lib/handlebars/helpers/lt.js +7 -0
- package/lib/handlebars/helpers/lte.js +7 -0
- package/lib/handlebars/helpers/neq.js +9 -0
- package/lib/handlebars/helpers/pick.js +13 -0
- package/lib/handlebars/helpers/split.js +5 -0
- package/lib/handlebars/helpers/startswith.js +10 -0
- package/lib/handlebars/helpers/upper.js +9 -0
- package/lib/handlebars/index.js +10 -0
- package/lib/lang/string/template.js +9 -7
- package/lib/prepare.js +1 -0
- package/lib/publish.js +1 -0
- package/lib/verify.js +51 -36
- package/package.json +21 -34
- package/test/common/git/add.js +0 -9
- package/test/common/git/commit.js +0 -11
- package/test/common/git/head.js +0 -10
- package/test/common/git/index.js +0 -13
- package/test/common/git/init-origin.js +0 -13
- package/test/common/git/init-remote.js +0 -16
- package/test/common/git/init.js +0 -20
- package/test/common/git/push.js +0 -9
- package/test/common/git/tag.js +0 -13
- package/test/common/git/tags.js +0 -14
- package/test/fixture/docker/Dockerfile.prepare +0 -4
- package/test/fixture/docker/Dockerfile.publish +0 -4
- package/test/fixture/docker/Dockerfile.test +0 -4
- package/test/fixture/package.json +0 -4
- package/test/fixture/pkg/one/package.json +0 -5
- package/test/fixture/pkg/two/package.json +0 -0
- package/test/integration/prepare.js +0 -74
- package/test/integration/publish.js +0 -60
- package/test/integration/release.js +0 -92
- package/test/integration/verify.js +0 -205
- package/test/unit/build-config.js +0 -167
- package/test/unit/build-template-vars.js +0 -63
- package/test/unit/docker/image.js +0 -289
- package/test/unit/lang/array.js +0 -34
- package/test/unit/lang/object.js +0 -45
- package/test/unit/lang/string.js +0 -37
- package/test/unit/parse-pkg-name.js +0 -27
- package/test/unit/read-pkg.js +0 -36
package/lib/verify.js
CHANGED
|
@@ -4,12 +4,13 @@ const {promises: fs} = require('fs')
|
|
|
4
4
|
const execa = require('execa')
|
|
5
5
|
const debug = require('debug')('semantic-release:semantic-release-docker:verify')
|
|
6
6
|
const SemanticError = require('@semantic-release/error')
|
|
7
|
+
const prepare = require('./prepare.js')
|
|
7
8
|
const docker = require('./docker/index.js')
|
|
8
9
|
|
|
9
10
|
module.exports = verify
|
|
10
11
|
|
|
11
12
|
async function verify(opts, context) {
|
|
12
|
-
const {env,
|
|
13
|
+
const {env, cwd} = context
|
|
13
14
|
const PASSWORD = env.DOCKER_REGISTRY_PASSWORD || env.GITHUB_TOKEN
|
|
14
15
|
const USERNAME = env.DOCKER_REGISTRY_USER
|
|
15
16
|
|
|
@@ -17,7 +18,8 @@ async function verify(opts, context) {
|
|
|
17
18
|
const error = new SemanticError(
|
|
18
19
|
'Docker image name not found'
|
|
19
20
|
, 'EINVAL'
|
|
20
|
-
, 'Image name parsed from package.json name if possible.
|
|
21
|
+
, 'Image name parsed from package.json name if possible. '
|
|
22
|
+
+ 'Or via the "dockerImage" option.'
|
|
21
23
|
)
|
|
22
24
|
throw error
|
|
23
25
|
}
|
|
@@ -29,6 +31,7 @@ async function verify(opts, context) {
|
|
|
29
31
|
, dockerfile: opts.dockerfile
|
|
30
32
|
, build_id: opts.build
|
|
31
33
|
, cwd: cwd
|
|
34
|
+
, context: opts.context
|
|
32
35
|
})
|
|
33
36
|
|
|
34
37
|
debug('docker options', opts)
|
|
@@ -49,47 +52,59 @@ async function verify(opts, context) {
|
|
|
49
52
|
debug('image to build', image.repo)
|
|
50
53
|
if (!USERNAME && !PASSWORD) {
|
|
51
54
|
debug('No docker credentials found. Skipping login')
|
|
52
|
-
|
|
55
|
+
} else {
|
|
56
|
+
await doLogin({...opts, USERNAME, PASSWORD}, context)
|
|
53
57
|
}
|
|
54
58
|
|
|
59
|
+
if (!opts.verifycmd) return true
|
|
60
|
+
|
|
61
|
+
const img = await prepare(opts, context)
|
|
62
|
+
const output = await img.run(opts.verifycmd)
|
|
63
|
+
if (opts.dryRun) await img.clean()
|
|
64
|
+
return output
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function doLogin(opts, context) {
|
|
68
|
+
const {USERNAME, PASSWORD} = opts
|
|
69
|
+
const {logger} = context
|
|
70
|
+
|
|
55
71
|
if (opts.login === false) {
|
|
56
72
|
debug('docker login === false. Skipping login')
|
|
57
|
-
|
|
58
|
-
|
|
73
|
+
} else {
|
|
74
|
+
let set = 0
|
|
75
|
+
if (USERNAME) set += 1
|
|
76
|
+
if (PASSWORD) set += 1
|
|
59
77
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
78
|
+
if (set !== 2) {
|
|
79
|
+
const error = new SemanticError(
|
|
80
|
+
'Docker authentication failed'
|
|
81
|
+
, 'EAUTH'
|
|
82
|
+
, 'Both ENV vars DOCKER_REGISTRY_USER and DOCKER_REGISTRY_PASSWORD must be set'
|
|
83
|
+
)
|
|
84
|
+
throw error
|
|
85
|
+
}
|
|
63
86
|
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
'
|
|
67
|
-
, '
|
|
68
|
-
, '
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const passwd = execa('echo', [PASSWORD])
|
|
74
|
-
const login = execa('docker', [
|
|
75
|
-
'login'
|
|
76
|
-
, opts.registry || ''
|
|
77
|
-
, '-u', USERNAME
|
|
78
|
-
, '--password-stdin'
|
|
79
|
-
])
|
|
87
|
+
const passwd = execa('echo', [PASSWORD])
|
|
88
|
+
const login = execa('docker', [
|
|
89
|
+
'login'
|
|
90
|
+
, opts.registry || ''
|
|
91
|
+
, '-u', USERNAME
|
|
92
|
+
, '--password-stdin'
|
|
93
|
+
])
|
|
80
94
|
|
|
81
|
-
|
|
95
|
+
passwd.stdout.pipe(login.stdin)
|
|
82
96
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
97
|
+
try {
|
|
98
|
+
await login
|
|
99
|
+
} catch (err) {
|
|
100
|
+
logger.fatal(err)
|
|
101
|
+
const error = new SemanticError(
|
|
102
|
+
'Docker authentication failed'
|
|
103
|
+
, 'EAUTH'
|
|
104
|
+
, `Authentication to ${opts.registry || 'dockerhub'} failed`
|
|
105
|
+
)
|
|
106
|
+
throw error
|
|
107
|
+
}
|
|
108
|
+
logger.success('docker login successful')
|
|
92
109
|
}
|
|
93
|
-
logger.success('docker login successful')
|
|
94
|
-
return true
|
|
95
110
|
}
|
package/package.json
CHANGED
|
@@ -1,16 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codedependant/semantic-release-docker",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "4.1.0",
|
|
5
5
|
"description": "docker package",
|
|
6
6
|
"main": "index.js",
|
|
7
|
+
"files": [
|
|
8
|
+
"lib/",
|
|
9
|
+
"README.md",
|
|
10
|
+
"CHANGELOG.md",
|
|
11
|
+
"LICENSE",
|
|
12
|
+
"package.json",
|
|
13
|
+
"index.js"
|
|
14
|
+
],
|
|
7
15
|
"scripts": {
|
|
8
|
-
"test": "docker-compose -f compose/base.yml -f compose/test.yml up --exit-code-from semantic-release --force-recreate --remove-orphans",
|
|
16
|
+
"test": "docker-compose -f compose/base.yml -f compose/test.yml up --exit-code-from semantic-release --force-recreate --remove-orphans --build",
|
|
9
17
|
"start": "docker-compose -f compose/base.yml -f compose/dev.yml up --force-recreate --remove-orphans --build",
|
|
10
18
|
"stop": "docker-compose -f compose/base.yml -f compose/dev.yml down",
|
|
11
19
|
"tap": "tap",
|
|
12
20
|
"lint": "eslint .",
|
|
13
21
|
"lint:fix": "npm run lint -- --fix",
|
|
22
|
+
"local": "env $(cat env/local.env)",
|
|
14
23
|
"pretap": "npm run lint",
|
|
15
24
|
"release": "semantic-release"
|
|
16
25
|
},
|
|
@@ -26,33 +35,7 @@
|
|
|
26
35
|
"type": "git",
|
|
27
36
|
"url": "git+ssh://git@github.com/esatterwhite/semantic-release-docker.git"
|
|
28
37
|
},
|
|
29
|
-
"eslintConfig": {
|
|
30
|
-
"root": true,
|
|
31
|
-
"extends": "codedependant",
|
|
32
|
-
"ignorePatterns": [
|
|
33
|
-
"node_modules/",
|
|
34
|
-
"test/fixture/",
|
|
35
|
-
"coverage/",
|
|
36
|
-
".nyc_output/",
|
|
37
|
-
"env/",
|
|
38
|
-
"doc/"
|
|
39
|
-
],
|
|
40
|
-
"rules": {
|
|
41
|
-
"object-shorthand": 0,
|
|
42
|
-
"no-unused-vars": [
|
|
43
|
-
"error",
|
|
44
|
-
{
|
|
45
|
-
"varsIgnorePattern": "_"
|
|
46
|
-
}
|
|
47
|
-
],
|
|
48
|
-
"quote-props": [
|
|
49
|
-
2,
|
|
50
|
-
"as-needed"
|
|
51
|
-
]
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
38
|
"tap": {
|
|
55
|
-
"esm": false,
|
|
56
39
|
"ts": false,
|
|
57
40
|
"jsx": false,
|
|
58
41
|
"timeout": 60,
|
|
@@ -70,29 +53,33 @@
|
|
|
70
53
|
"text",
|
|
71
54
|
"text-summary",
|
|
72
55
|
"json",
|
|
56
|
+
"json-summary",
|
|
73
57
|
"html"
|
|
74
58
|
],
|
|
75
59
|
"nyc-arg": [
|
|
76
60
|
"--exclude=coverage/",
|
|
77
61
|
"--exclude=test/",
|
|
62
|
+
"--exclude=.eslintrc.js",
|
|
63
|
+
"--exclude=release.config.js",
|
|
78
64
|
"--all"
|
|
79
65
|
]
|
|
80
66
|
},
|
|
81
67
|
"devDependencies": {
|
|
82
|
-
"@codedependant/release-config-npm": "^1.0.
|
|
68
|
+
"@codedependant/release-config-npm": "^1.0.4",
|
|
83
69
|
"@semantic-release/changelog": "^5.0.1",
|
|
84
70
|
"@semantic-release/git": "^9.0.0",
|
|
85
71
|
"@semantic-release/github": "^7.0.7",
|
|
86
|
-
"eslint": "^
|
|
87
|
-
"eslint-config-codedependant": "^
|
|
72
|
+
"eslint": "^8.5.0",
|
|
73
|
+
"eslint-config-codedependant": "^3.0.0",
|
|
74
|
+
"semantic-release": "17",
|
|
88
75
|
"sinon": "^9.0.2",
|
|
89
|
-
"tap": "^
|
|
76
|
+
"tap": "^16.0.0"
|
|
90
77
|
},
|
|
91
78
|
"dependencies": {
|
|
92
|
-
"@semantic-release/error": "^
|
|
79
|
+
"@semantic-release/error": "^3.0.0",
|
|
93
80
|
"debug": "^4.1.1",
|
|
94
81
|
"execa": "^4.0.2",
|
|
95
|
-
"
|
|
82
|
+
"handlebars": "^4.7.7",
|
|
96
83
|
"semver": "^7.3.2"
|
|
97
84
|
}
|
|
98
85
|
}
|
package/test/common/git/add.js
DELETED
package/test/common/git/head.js
DELETED
package/test/common/git/index.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
module.exports = {
|
|
4
|
-
add: require('./add.js')
|
|
5
|
-
, commit: require('./commit.js')
|
|
6
|
-
, head: require('./head.js')
|
|
7
|
-
, initOrigin: require('./init-origin.js')
|
|
8
|
-
, initRemote: require('./init-remote.js')
|
|
9
|
-
, init: require('./init.js')
|
|
10
|
-
, push: require('./push.js')
|
|
11
|
-
, tag: require('./tag.js')
|
|
12
|
-
, tags: require('./tags.js')
|
|
13
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const execa = require('execa')
|
|
4
|
-
const initRemote = require('./init-remote.js')
|
|
5
|
-
|
|
6
|
-
module.exports = initOrigin
|
|
7
|
-
|
|
8
|
-
async function initOrigin(cwd) {
|
|
9
|
-
const origin = await initRemote()
|
|
10
|
-
await execa('git', ['remote', 'add', 'origin', origin], {cwd: cwd})
|
|
11
|
-
await execa('git', ['push', '--all', 'origin'], {cwd: cwd})
|
|
12
|
-
return origin
|
|
13
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const path = require('path')
|
|
4
|
-
const os = require('os')
|
|
5
|
-
const {promises: fs} = require('fs')
|
|
6
|
-
const execa = require('execa')
|
|
7
|
-
|
|
8
|
-
module.exports = initRemote
|
|
9
|
-
|
|
10
|
-
async function initRemote(branch = 'main') {
|
|
11
|
-
const cwd = await fs.mkdtemp(path.join(os.tmpdir(), path.sep))
|
|
12
|
-
await execa('git', [
|
|
13
|
-
'init', '--bare', `--initial-branch=${branch}`
|
|
14
|
-
], {cwd: cwd})
|
|
15
|
-
return `file://${cwd}`
|
|
16
|
-
}
|
package/test/common/git/init.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const path = require('path')
|
|
4
|
-
const os = require('os')
|
|
5
|
-
const {promises: fs} = require('fs')
|
|
6
|
-
const execa = require('execa')
|
|
7
|
-
|
|
8
|
-
module.exports = init
|
|
9
|
-
|
|
10
|
-
async function init(dir, branch = 'main') {
|
|
11
|
-
const cwd = dir || await fs.mkdtemp(path.join(os.tmpdir(), path.sep))
|
|
12
|
-
await execa('git', ['init', cwd])
|
|
13
|
-
await execa('git', ['checkout', '-b', branch], {cwd: cwd})
|
|
14
|
-
await execa('git', ['config', '--add', 'commit.gpgsign', false])
|
|
15
|
-
await execa('git', ['config', '--add', 'pull.default', 'current'], {cwd})
|
|
16
|
-
await execa('git', ['config', '--add', 'push.default', 'current'], {cwd})
|
|
17
|
-
await execa('git', ['config', '--add', 'user.name', 'secretsquirrel'], {cwd})
|
|
18
|
-
await execa('git', ['config', '--add', 'user.email', 'secret@mail.com'], {cwd})
|
|
19
|
-
return cwd
|
|
20
|
-
}
|
package/test/common/git/push.js
DELETED
package/test/common/git/tag.js
DELETED
package/test/common/git/tags.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const os = require('os')
|
|
4
|
-
const execa = require('execa')
|
|
5
|
-
|
|
6
|
-
module.exports = tags
|
|
7
|
-
|
|
8
|
-
async function tags(cwd, hash) {
|
|
9
|
-
const cmd = hash
|
|
10
|
-
? ['describe', '--tags', '--exact-match', hash]
|
|
11
|
-
: ['tag', '-l', '--sort', 'v:refname']
|
|
12
|
-
const {stdout} = await execa('git', cmd, {cwd: cwd})
|
|
13
|
-
return stdout.split(os.EOL).filter(Boolean)
|
|
14
|
-
}
|
|
File without changes
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const path = require('path')
|
|
4
|
-
const crypto = require('crypto')
|
|
5
|
-
const sinon = require('sinon')
|
|
6
|
-
const execa = require('execa')
|
|
7
|
-
const {test, threw} = require('tap')
|
|
8
|
-
const buildConfig = require('../../lib/build-config.js')
|
|
9
|
-
const verify = require('../../lib/verify.js')
|
|
10
|
-
const prepare = require('../../lib/prepare.js')
|
|
11
|
-
const DOCKER_REGISTRY_HOST = process.env.TEST_DOCKER_REGISTRY || 'localhost:5000'
|
|
12
|
-
const fixturedir = path.join(__dirname, '..', 'fixture')
|
|
13
|
-
const DATE_REGEX = new RegExp(
|
|
14
|
-
'^[\\d]{4}-[\\d]{2}-[\\d]{2}T[\\d]{2}:[\\d]{2}:[\\d]{2}'
|
|
15
|
-
+ '(\.[\\d]{1,6})?(Z|[\\+\\-][\\d]{2}:[\\d]{2})$' // eslint-disable-line no-useless-escape
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
test('steps::prepare', async (t) => {
|
|
19
|
-
t.test('build image created', async (tt) => {
|
|
20
|
-
const build_id = crypto.randomBytes(5).toString('hex')
|
|
21
|
-
const context = {
|
|
22
|
-
env: {
|
|
23
|
-
...process.env
|
|
24
|
-
, DOCKER_REGISTRY_USER: 'iamweasel'
|
|
25
|
-
, DOCKER_REGISTRY_PASSWORD: 'secretsquirrel'
|
|
26
|
-
}
|
|
27
|
-
, cwd: fixturedir
|
|
28
|
-
, nextRelease: {
|
|
29
|
-
version: '2.1.2'
|
|
30
|
-
, gitTag: 'v2.1.2'
|
|
31
|
-
, gitHead: 'abacadaba'
|
|
32
|
-
}
|
|
33
|
-
, logger: {
|
|
34
|
-
success: sinon.stub()
|
|
35
|
-
, info: sinon.stub()
|
|
36
|
-
, debug: sinon.stub()
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const config = await buildConfig(build_id, {
|
|
41
|
-
dockerRegistry: DOCKER_REGISTRY_HOST
|
|
42
|
-
, dockerProject: 'docker-prepare'
|
|
43
|
-
, dockerImage: 'fake'
|
|
44
|
-
, dockerArgs: {
|
|
45
|
-
MY_VARIABLE: '1'
|
|
46
|
-
, TAG_TEMPLATE: '{git_tag}'
|
|
47
|
-
, MAJOR_TEMPLATE: '{major}'
|
|
48
|
-
, GIT_REF: '{git_sha}'
|
|
49
|
-
, BUILD_DATE: '{now}'
|
|
50
|
-
}
|
|
51
|
-
, dockerFile: 'docker/Dockerfile.prepare'
|
|
52
|
-
}, context)
|
|
53
|
-
|
|
54
|
-
const auth = await verify(config, context)
|
|
55
|
-
tt.ok(auth, `authentication to ${DOCKER_REGISTRY_HOST} suceeds`)
|
|
56
|
-
|
|
57
|
-
const image = await prepare(config, context)
|
|
58
|
-
|
|
59
|
-
tt.on('end', () => {
|
|
60
|
-
image.clean()
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
tt.equal(image.opts.args.get('TAG_TEMPLATE'), 'v2.1.2', 'TAG_TEMPLATE value')
|
|
64
|
-
tt.equal(image.opts.args.get('MAJOR_TEMPLATE'), '2', 'MAJOR_TEMPLATE value')
|
|
65
|
-
tt.equal(image.opts.args.get('GIT_REF'), 'abacadaba', 'GIT_REF value')
|
|
66
|
-
tt.match(image.opts.args.get('BUILD_DATE'), DATE_REGEX, 'BUILD_DATE value')
|
|
67
|
-
|
|
68
|
-
const {stdout} = await execa('docker', [
|
|
69
|
-
'images', image.name
|
|
70
|
-
, '-q', '--format={{ .Tag }}'
|
|
71
|
-
])
|
|
72
|
-
tt.equal(stdout, build_id, 'build image fully built')
|
|
73
|
-
})
|
|
74
|
-
}).catch(threw)
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const crypto = require('crypto')
|
|
4
|
-
const path = require('path')
|
|
5
|
-
const sinon = require('sinon')
|
|
6
|
-
const execa = require('execa')
|
|
7
|
-
const {test, threw} = require('tap')
|
|
8
|
-
const buildConfig = require('../../lib/build-config.js')
|
|
9
|
-
const verify = require('../../lib/verify.js')
|
|
10
|
-
const prepare = require('../../lib/prepare.js')
|
|
11
|
-
const publish = require('../../lib/publish.js')
|
|
12
|
-
const DOCKER_REGISTRY_HOST = process.env.TEST_DOCKER_REGISTRY || 'localhost:5000'
|
|
13
|
-
const fixturedir = path.join(__dirname, '..', 'fixture')
|
|
14
|
-
|
|
15
|
-
test('steps::publish', async (t) => {
|
|
16
|
-
t.test('publish multi tags', async (tt) => {
|
|
17
|
-
const build_id = crypto.randomBytes(5).toString('hex')
|
|
18
|
-
const context = {
|
|
19
|
-
env: {
|
|
20
|
-
...process.env
|
|
21
|
-
, DOCKER_REGISTRY_USER: 'iamweasel'
|
|
22
|
-
, DOCKER_REGISTRY_PASSWORD: 'secretsquirrel'
|
|
23
|
-
}
|
|
24
|
-
, cwd: fixturedir
|
|
25
|
-
, nextRelease: {version: '2.0.0'}
|
|
26
|
-
, lastRelease: {version: '1.5.0'}
|
|
27
|
-
, logger: {
|
|
28
|
-
success: sinon.stub()
|
|
29
|
-
, info: sinon.stub()
|
|
30
|
-
, debug: sinon.stub()
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const config = await buildConfig(build_id, {
|
|
35
|
-
dockerRegistry: DOCKER_REGISTRY_HOST
|
|
36
|
-
, dockerProject: 'docker-publish'
|
|
37
|
-
, dockerImage: 'real'
|
|
38
|
-
, dockerTags: ['{previous.major}-previous', '{major}-foobar', '{version}']
|
|
39
|
-
, dockerFile: 'docker/Dockerfile.publish'
|
|
40
|
-
}, context)
|
|
41
|
-
|
|
42
|
-
const auth = await verify(config, context)
|
|
43
|
-
tt.ok(auth, `authentication to ${DOCKER_REGISTRY_HOST} suceeds`)
|
|
44
|
-
|
|
45
|
-
const image = await prepare(config, context)
|
|
46
|
-
tt.on('end', () => {
|
|
47
|
-
image.clean()
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
// removes images when done
|
|
51
|
-
await publish(config, context)
|
|
52
|
-
|
|
53
|
-
const tags = ['1-previous', '2-foobar', '2.0.0']
|
|
54
|
-
for (const tag of tags) {
|
|
55
|
-
const expected = `${image.repo}:${tag}`
|
|
56
|
-
const {stdout} = await execa('docker', ['pull', expected, '-q'])
|
|
57
|
-
tt.equal(expected, stdout, `${expected} successfully published`)
|
|
58
|
-
}
|
|
59
|
-
})
|
|
60
|
-
}).catch(threw)
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const execa = require('execa')
|
|
4
|
-
const {test, threw} = require('tap')
|
|
5
|
-
const git = require('../common/git/index.js')
|
|
6
|
-
const DOCKER_REGISTRY_HOST = process.env.TEST_DOCKER_REGISTRY || 'localhost:5000'
|
|
7
|
-
|
|
8
|
-
const stringify = JSON.stringify
|
|
9
|
-
|
|
10
|
-
test('docker release', async (t) => {
|
|
11
|
-
const cwd = t.testdir({
|
|
12
|
-
'package.json': stringify({
|
|
13
|
-
name: 'service-meta-package'
|
|
14
|
-
, version: '0.0.0-development'
|
|
15
|
-
, scripts: {
|
|
16
|
-
'test-release': 'semantic-release'
|
|
17
|
-
}
|
|
18
|
-
, release: {
|
|
19
|
-
ci: true
|
|
20
|
-
, npmPublish: false
|
|
21
|
-
, branches: ['main']
|
|
22
|
-
, dockerRegistry: DOCKER_REGISTRY_HOST
|
|
23
|
-
, dockerProject: 'docker-release'
|
|
24
|
-
, dockerImage: 'fake'
|
|
25
|
-
, dockerArgs: {
|
|
26
|
-
SAMPLE_THING: '{type}.{version}'
|
|
27
|
-
, GIT_REF: '{git_sha}-{git_tag}'
|
|
28
|
-
, BUILD_DATE: '{now}'
|
|
29
|
-
}
|
|
30
|
-
, plugins: [
|
|
31
|
-
'@semantic-release/commit-analyzer'
|
|
32
|
-
, '@semantic-release/release-notes-generator'
|
|
33
|
-
, '@semantic-release/npm'
|
|
34
|
-
, '@codedependant/semantic-release-docker'
|
|
35
|
-
]
|
|
36
|
-
}
|
|
37
|
-
, devDependencies: {
|
|
38
|
-
'semantic-release': '*'
|
|
39
|
-
, '@semantic-release/commit-analyzer': '*'
|
|
40
|
-
, '@semantic-release/release-notes-generator': '*'
|
|
41
|
-
, '@semantic-release/npm': '*'
|
|
42
|
-
, '@codedependant/semantic-release-docker': 'file:../../../'
|
|
43
|
-
}
|
|
44
|
-
})
|
|
45
|
-
, Dockerfile: 'FROM debian:buster-slim\n\nRUN ls -alh'
|
|
46
|
-
, '.gitignore': 'node_modules/'
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
await git.init(cwd)
|
|
50
|
-
t.comment('git repo initialized')
|
|
51
|
-
await git.add(cwd)
|
|
52
|
-
await git.commit(cwd, 'feat: initial release')
|
|
53
|
-
|
|
54
|
-
const origin = await git.initOrigin(cwd)
|
|
55
|
-
t.comment(`repository: ${cwd}`)
|
|
56
|
-
t.comment(`origin: ${origin}`)
|
|
57
|
-
|
|
58
|
-
{
|
|
59
|
-
const stream = execa('npm', [
|
|
60
|
-
'install'
|
|
61
|
-
], {
|
|
62
|
-
cwd: cwd
|
|
63
|
-
, env: {
|
|
64
|
-
BRANCH_NAME: 'main'
|
|
65
|
-
, CI_BRANCH: 'main'
|
|
66
|
-
, CI: 'true'
|
|
67
|
-
, GITHUB_REF: 'refs/heads/main'
|
|
68
|
-
, DOCKER_REGISTRY_USER: 'iamweasel'
|
|
69
|
-
, DOCKER_REGISTRY_PASSWORD: 'secretsquirrel'
|
|
70
|
-
}
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
stream.stdout.pipe(process.stdout)
|
|
74
|
-
await stream
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const stream = execa('npm', [
|
|
78
|
-
'run'
|
|
79
|
-
, 'test-release'
|
|
80
|
-
, `--repositoryUrl=${origin}`], {
|
|
81
|
-
cwd: cwd
|
|
82
|
-
, env: {
|
|
83
|
-
BRANCH_NAME: 'main'
|
|
84
|
-
, CI_BRANCH: 'main'
|
|
85
|
-
, CI: 'true'
|
|
86
|
-
, GITHUB_REF: 'refs/heads/main'
|
|
87
|
-
}
|
|
88
|
-
})
|
|
89
|
-
stream.stdout.pipe(process.stdout)
|
|
90
|
-
await stream
|
|
91
|
-
|
|
92
|
-
}).catch(threw)
|