Skip to content

Commit e87fe91

Browse files
committed
feat(workflow-files): leveraged workflows-core loader and dropeed direct js-yaml dependency
1 parent 3f61c7f commit e87fe91

File tree

5 files changed

+54
-59
lines changed

5 files changed

+54
-59
lines changed

package-lock.json

Lines changed: 11 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,9 @@
6363
"dependencies": {
6464
"@form8ion/config-file": "^1.0.1",
6565
"@form8ion/core": "^4.6.1",
66-
"@form8ion/github-workflows-core": "^5.1.0",
66+
"@form8ion/github-workflows-core": "^5.3.0",
6767
"@form8ion/javascript-core": "^11.0.0",
68-
"deepmerge": "^4.2.2",
69-
"js-yaml": "^4.1.0"
68+
"deepmerge": "^4.2.2"
7069
},
7170
"devDependencies": {
7271
"@babel/register": "7.24.6",
@@ -89,6 +88,7 @@
8988
"gherkin-lint": "4.2.4",
9089
"husky": "9.1.5",
9190
"jest-when": "3.6.0",
91+
"js-yaml": "4.1.0",
9292
"lockfile-lint": "4.14.0",
9393
"ls-engines": "0.9.3",
9494
"mocha": "10.7.3",

src/semantic-release/ci-providers/github-workflows/experimental-release-workflow/lifter.js

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {promises as fs} from 'fs';
2-
import {load} from 'js-yaml';
3-
import {fileExists} from '@form8ion/core';
2+
import {loadWorkflowFile, workflowFileExists} from '@form8ion/github-workflows-core';
43

54
import scaffolder from './scaffolder.js';
65

@@ -10,26 +9,34 @@ function workflowPermissionsAreMinimal(existingContents) {
109
&& 'read' === existingContents.permissions.contents;
1110
}
1211

13-
async function contentsNeedToBeUpdated(pathToReleaseWorkflowFile) {
14-
const existingContents = load(await fs.readFile(pathToReleaseWorkflowFile, 'utf-8'));
12+
async function contentsNeedToBeUpdated({projectRoot, name}) {
13+
const existingContents = await loadWorkflowFile({projectRoot, name});
1514

1615
return existingContents.on.workflow_dispatch || !workflowPermissionsAreMinimal(existingContents);
1716
}
1817

19-
async function releaseWorkflowShouldBeScaffolded(pathToReleaseWorkflowFile) {
20-
return !await fileExists(pathToReleaseWorkflowFile) || contentsNeedToBeUpdated(pathToReleaseWorkflowFile);
18+
async function releaseWorkflowShouldBeScaffolded({projectRoot, name}) {
19+
return !await workflowFileExists({projectRoot, name}) || contentsNeedToBeUpdated({projectRoot, name});
2120
}
2221

23-
export default async function ({projectRoot, nodeVersion}) {
22+
async function renameLegacyReleaseWorkflow(projectRoot, experimentalReleaseWorkflowName) {
2423
const workflowsDirectory = `${projectRoot}/.github/workflows`;
25-
const pathToExperimentalReleaseWorkflowFile = `${workflowsDirectory}/experimental-release.yml`;
26-
const pathToLegacyReleaseWorkflowFile = `${workflowsDirectory}/release.yml`;
24+
const legacyReleaseWorkflowName = 'release';
2725

28-
if (await fileExists(pathToLegacyReleaseWorkflowFile)) {
29-
await fs.rename(pathToLegacyReleaseWorkflowFile, pathToExperimentalReleaseWorkflowFile);
26+
if (await workflowFileExists({projectRoot, name: legacyReleaseWorkflowName})) {
27+
await fs.rename(
28+
`${workflowsDirectory}/${legacyReleaseWorkflowName}.yml`,
29+
`${workflowsDirectory}/${experimentalReleaseWorkflowName}.yml`
30+
);
3031
}
32+
}
33+
34+
export default async function ({projectRoot, nodeVersion}) {
35+
const experimentalReleaseWorkflowName = 'experimental-release';
36+
37+
await renameLegacyReleaseWorkflow(projectRoot, experimentalReleaseWorkflowName);
3138

32-
if (await releaseWorkflowShouldBeScaffolded(pathToExperimentalReleaseWorkflowFile)) {
39+
if (await releaseWorkflowShouldBeScaffolded({projectRoot, name: experimentalReleaseWorkflowName})) {
3340
return scaffolder({projectRoot, nodeVersion});
3441
}
3542

src/semantic-release/ci-providers/github-workflows/lifter.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
import {promises as fs} from 'fs';
2-
import {load} from 'js-yaml';
3-
import {writeWorkflowFile} from '@form8ion/github-workflows-core';
1+
import {loadWorkflowFile, writeWorkflowFile} from '@form8ion/github-workflows-core';
42

53
import determineTriggerNeedsFrom from './release-trigger-needs.js';
64
import {lift as liftReleaseWorkflow} from './experimental-release-workflow/index.js';
@@ -17,11 +15,11 @@ function removeCycjimmyActionFrom(otherJobs) {
1715
}
1816

1917
export default async function ({projectRoot, nodeVersion}) {
20-
const workflowsDirectory = `${projectRoot}/.github/workflows`;
18+
const ciWorkflowName = 'node-ci';
2119

2220
await liftReleaseWorkflow({projectRoot, nodeVersion});
2321

24-
const parsedVerificationWorkflowDetails = load(await fs.readFile(`${workflowsDirectory}/node-ci.yml`, 'utf-8'));
22+
const parsedVerificationWorkflowDetails = await loadWorkflowFile({projectRoot, name: ciWorkflowName});
2523

2624
parsedVerificationWorkflowDetails.on.push.branches = [
2725
...parsedVerificationWorkflowDetails.on.push.branches.filter(branch => 'alpha' !== branch),
@@ -48,7 +46,7 @@ export default async function ({projectRoot, nodeVersion}) {
4846

4947
await writeWorkflowFile({
5048
projectRoot,
51-
name: 'node-ci',
49+
name: ciWorkflowName,
5250
config: parsedVerificationWorkflowDetails
5351
});
5452
}

test/integration/features/step_definitions/github-workflows-steps.js

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
import {promises as fs} from 'fs';
2-
import {fileExists} from '@form8ion/core';
2+
import {loadWorkflowFile, workflowFileExists} from '@form8ion/github-workflows-core';
33

44
import {Given, Then} from '@cucumber/cucumber';
55
import {assert} from 'chai';
6-
import {load} from 'js-yaml';
76

8-
async function loadReleaseWorkflowDefinition() {
7+
const experimentalReleaseWorkflowName = 'experimental-release';
8+
const legacyReleaseWorkflowName = 'release';
9+
const ciWorkflowName = 'node-ci';
10+
11+
async function loadReleaseWorkflowDefinition({projectRoot}) {
912
assert.isTrue(
10-
await fileExists(`${process.cwd()}/.github/workflows/experimental-release.yml`),
11-
'Release workflow is missing'
13+
await workflowFileExists({projectRoot, name: experimentalReleaseWorkflowName}),
14+
'Experimental-Release workflow is missing'
1215
);
1316

14-
const {on: triggers, jobs} = load(
15-
await fs.readFile(`${process.cwd()}/.github/workflows/experimental-release.yml`, 'utf-8')
16-
);
17+
const {on: triggers, jobs} = await loadWorkflowFile({projectRoot, name: experimentalReleaseWorkflowName});
1718

1819
return {triggers, jobs};
1920
}
@@ -85,21 +86,21 @@ Given('no conventional verification workflow is defined', async function () {
8586
});
8687

8788
Then('the experimental release workflow calls the reusable workflow for alpha branches', async function () {
88-
const {triggers, jobs} = await loadReleaseWorkflowDefinition();
89+
const {triggers, jobs} = await loadReleaseWorkflowDefinition({projectRoot: this.projectRoot});
8990

9091
assert.isUndefined(triggers.workflow_dispatch);
9192
assert.deepEqual(triggers.push.branches, ['alpha']);
9293
assert.equal(jobs.release.uses, 'form8ion/.github/.github/workflows/release-package.yml@master');
9394
});
9495

9596
Then('the legacy experimental release workflow has been renamed', async function () {
96-
assert.isFalse(await fileExists(`${process.cwd()}/.github/workflows/release.yml`));
97+
assert.isFalse(await workflowFileExists({projectRoot: this.projectRoot, name: legacyReleaseWorkflowName}));
9798
});
9899

99100
Then(
100101
'the experimental release workflow calls the reusable workflow for semantic-release v19 for alpha branches',
101102
async function () {
102-
const {triggers, jobs} = await loadReleaseWorkflowDefinition();
103+
const {triggers, jobs} = await loadReleaseWorkflowDefinition({projectRoot: this.projectRoot});
103104

104105
assert.isUndefined(triggers.workflow_dispatch);
105106
assert.deepEqual(triggers.push.branches, ['alpha']);
@@ -111,14 +112,11 @@ Then(
111112
);
112113

113114
Then('the release workflow is not defined', async function () {
114-
assert.isFalse(await fileExists(`${process.cwd()}/.github/workflows/release.yml`));
115+
assert.isFalse(await workflowFileExists({projectRoot: this.projectRoot, name: experimentalReleaseWorkflowName}));
115116
});
116117

117118
Then('the verification workflow calls the reusable release workflow', async function () {
118-
const verificationWorkflowDefinition = load(await fs.readFile(
119-
`${process.cwd()}/.github/workflows/node-ci.yml`,
120-
'utf-8'
121-
));
119+
const verificationWorkflowDefinition = await loadWorkflowFile({projectRoot: this.projectRoot, name: ciWorkflowName});
122120
const branchTriggers = verificationWorkflowDefinition.on.push.branches;
123121

124122
assert.include(branchTriggers, 'master');
@@ -148,10 +146,7 @@ Then('the verification workflow calls the reusable release workflow', async func
148146
});
149147

150148
Then('the verification workflow calls the reusable release workflow for semantic-release v19', async function () {
151-
const verificationWorkflowDefinition = load(await fs.readFile(
152-
`${process.cwd()}/.github/workflows/node-ci.yml`,
153-
'utf-8'
154-
));
149+
const verificationWorkflowDefinition = await loadWorkflowFile({projectRoot: this.projectRoot, name: ciWorkflowName});
155150
const branchTriggers = verificationWorkflowDefinition.on.push.branches;
156151

157152
assert.include(branchTriggers, 'master');
@@ -172,19 +167,13 @@ Then('the verification workflow calls the reusable release workflow for semantic
172167
});
173168

174169
Then('the verification workflow does not trigger the release workflow', async function () {
175-
const verificationWorkflowDefinition = load(await fs.readFile(
176-
`${process.cwd()}/.github/workflows/node-ci.yml`,
177-
'utf-8'
178-
));
170+
const verificationWorkflowDefinition = await loadWorkflowFile({projectRoot: this.projectRoot, name: ciWorkflowName});
179171

180172
assert.isUndefined(verificationWorkflowDefinition.jobs['trigger-release']);
181173
});
182174

183175
Then('the release is not called until verification completes', async function () {
184-
const verificationWorkflowDefinition = load(await fs.readFile(
185-
`${process.cwd()}/.github/workflows/node-ci.yml`,
186-
'utf-8'
187-
));
176+
const verificationWorkflowDefinition = await loadWorkflowFile({projectRoot: this.projectRoot, name: ciWorkflowName});
188177
const triggerReleaseJob = verificationWorkflowDefinition.jobs.release;
189178

190179
assert.include(triggerReleaseJob.needs, 'verify');

0 commit comments

Comments
 (0)