@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.
Files changed (52) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +82 -35
  3. package/lib/build-config.js +5 -2
  4. package/lib/docker/image.js +18 -3
  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/string/template.js +9 -7
  21. package/lib/prepare.js +1 -0
  22. package/lib/publish.js +1 -0
  23. package/lib/verify.js +51 -36
  24. package/package.json +21 -34
  25. package/test/common/git/add.js +0 -9
  26. package/test/common/git/commit.js +0 -11
  27. package/test/common/git/head.js +0 -10
  28. package/test/common/git/index.js +0 -13
  29. package/test/common/git/init-origin.js +0 -13
  30. package/test/common/git/init-remote.js +0 -16
  31. package/test/common/git/init.js +0 -20
  32. package/test/common/git/push.js +0 -9
  33. package/test/common/git/tag.js +0 -13
  34. package/test/common/git/tags.js +0 -14
  35. package/test/fixture/docker/Dockerfile.prepare +0 -4
  36. package/test/fixture/docker/Dockerfile.publish +0 -4
  37. package/test/fixture/docker/Dockerfile.test +0 -4
  38. package/test/fixture/package.json +0 -4
  39. package/test/fixture/pkg/one/package.json +0 -5
  40. package/test/fixture/pkg/two/package.json +0 -0
  41. package/test/integration/prepare.js +0 -74
  42. package/test/integration/publish.js +0 -60
  43. package/test/integration/release.js +0 -92
  44. package/test/integration/verify.js +0 -205
  45. package/test/unit/build-config.js +0 -167
  46. package/test/unit/build-template-vars.js +0 -63
  47. package/test/unit/docker/image.js +0 -289
  48. package/test/unit/lang/array.js +0 -34
  49. package/test/unit/lang/object.js +0 -45
  50. package/test/unit/lang/string.js +0 -37
  51. package/test/unit/parse-pkg-name.js +0 -27
  52. 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, logger, cwd} = context
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. Or via the "image" option.'
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
- return false
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
- return false
58
- }
73
+ } else {
74
+ let set = 0
75
+ if (USERNAME) set += 1
76
+ if (PASSWORD) set += 1
59
77
 
60
- let set = 0
61
- if (USERNAME) set += 1
62
- if (PASSWORD) set += 1
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
- if (set !== 2) {
65
- const error = new SemanticError(
66
- 'Docker authentication failed'
67
- , 'EAUTH'
68
- , 'Both ENV vars DOCKER_REGISTRY_USER and DOCKER_REGISTRY_PASSWORD must be set'
69
- )
70
- throw error
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
- passwd.stdout.pipe(login.stdin)
95
+ passwd.stdout.pipe(login.stdin)
82
96
 
83
- try {
84
- await login
85
- } catch (err) {
86
- const error = new SemanticError(
87
- 'Docker authentication failed'
88
- , 'EAUTH'
89
- , `Authentication to ${opts.registry || 'dockerhub'} failed`
90
- )
91
- throw error
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": "3.1.1",
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.1",
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": "^7.4.0",
87
- "eslint-config-codedependant": "^2.1.6",
72
+ "eslint": "^8.5.0",
73
+ "eslint-config-codedependant": "^3.0.0",
74
+ "semantic-release": "17",
88
75
  "sinon": "^9.0.2",
89
- "tap": "^14.10.7"
76
+ "tap": "^16.0.0"
90
77
  },
91
78
  "dependencies": {
92
- "@semantic-release/error": "^2.2.0",
79
+ "@semantic-release/error": "^3.0.0",
93
80
  "debug": "^4.1.1",
94
81
  "execa": "^4.0.2",
95
- "semantic-release": "^17.1.1",
82
+ "handlebars": "^4.7.7",
96
83
  "semver": "^7.3.2"
97
84
  }
98
85
  }
@@ -1,9 +0,0 @@
1
- 'use strict'
2
-
3
- const execa = require('execa')
4
-
5
- module.exports = add
6
-
7
- async function add(cwd, file = '.') {
8
- await execa('git', ['add', file], {cwd: cwd})
9
- }
@@ -1,11 +0,0 @@
1
- 'use strict'
2
-
3
- const execa = require('execa')
4
- const head = require('./head.js')
5
-
6
- module.exports = commit
7
-
8
- async function commit(cwd, message) {
9
- await execa('git', ['commit', '-m', message], {cwd: cwd})
10
- return head(cwd)
11
- }
@@ -1,10 +0,0 @@
1
- 'use strict'
2
-
3
- const execa = require('execa')
4
-
5
- module.exports = head
6
-
7
- async function head(cwd) {
8
- const {stdout} = await execa('git', ['rev-parse', 'HEAD'], {cwd: cwd})
9
- return stdout
10
- }
@@ -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
- }
@@ -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
- }
@@ -1,9 +0,0 @@
1
- 'use strict'
2
-
3
- const execa = require('execa')
4
-
5
- module.exports = push
6
-
7
- async function push(cwd, remote = 'origin', branch = 'main') {
8
- await execa('git', ['push', '--tags', remote, `HEAD:${branch}`], {cwd: cwd})
9
- }
@@ -1,13 +0,0 @@
1
- 'use strict'
2
-
3
- const execa = require('execa')
4
-
5
- module.exports = tag
6
-
7
- async function tag(cwd, name, hash) {
8
- const args = hash
9
- ? ['tag', '-f', name, hash]
10
- : ['tag', name]
11
-
12
- await execa('git', args, {cwd: cwd})
13
- }
@@ -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
- }
@@ -1,4 +0,0 @@
1
- FROM debian:buster-slim
2
- COPY . /opt/prepare
3
- WORKDIR /opt/prepare
4
- CMD ["echo", "$PWD"]
@@ -1,4 +0,0 @@
1
- FROM debian:buster-slim
2
- COPY . /opt/whizbang
3
- WORKDIR /opt/whizbang
4
- CMD ["echo", "$PWD"]
@@ -1,4 +0,0 @@
1
- FROM debian:buster-slim
2
- COPY . /opt/app
3
- WORKDIR /opt/app
4
- RUN ls -alh
@@ -1,4 +0,0 @@
1
- {
2
- "name": "@fake-scope/whizbangs"
3
- , "version": "0.0.0"
4
- }
@@ -1,5 +0,0 @@
1
- {
2
- "name": "@fixture/one",
3
- "version": "0.0.0",
4
- "private": true
5
- }
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)