Skip to content

Commit 5a5a7ef

Browse files
committed
feat(workflow): update alpha release workflow when permissions are not restrive
1 parent 0feae08 commit 5a5a7ef

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

src/semantic-release/ci-providers/github-workflows/release-workflow-for-alpha/lifter-test.js

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,41 @@ suite('release workflow lifter', () => {
4646
assert.calledWith(scaffolder.default, {projectRoot, nodeVersion});
4747
});
4848

49-
test('that the scaffolder is not called when a modern release workflow already exists', async () => {
49+
test('that the scaffolder is re-run when the release workflow does not restrict permissions', async () => {
5050
core.fileExists.withArgs(pathToReleaseWorkflowFile).resolves(true);
5151
fs.readFile.withArgs(pathToReleaseWorkflowFile, 'utf-8').resolves(existingWorkflowContents);
5252
jsYaml.load.withArgs(existingWorkflowContents).returns({on: {}});
5353

54+
await lift({projectRoot, nodeVersion});
55+
56+
assert.calledWith(scaffolder.default, {projectRoot, nodeVersion});
57+
});
58+
59+
test('that the scaffolder is re-run when the release workflow does not restrict permissions enough', async () => {
60+
core.fileExists.withArgs(pathToReleaseWorkflowFile).resolves(true);
61+
fs.readFile.withArgs(pathToReleaseWorkflowFile, 'utf-8').resolves(existingWorkflowContents);
62+
jsYaml.load.withArgs(existingWorkflowContents).returns({on: {}, permissions: any.simpleObject()});
63+
64+
await lift({projectRoot, nodeVersion});
65+
66+
assert.calledWith(scaffolder.default, {projectRoot, nodeVersion});
67+
});
68+
69+
test('that the scaffolder is re-run when the workflow does not properly restrict contents permission', async () => {
70+
core.fileExists.withArgs(pathToReleaseWorkflowFile).resolves(true);
71+
fs.readFile.withArgs(pathToReleaseWorkflowFile, 'utf-8').resolves(existingWorkflowContents);
72+
jsYaml.load.withArgs(existingWorkflowContents).returns({on: {}, permissions: {contents: 'write'}});
73+
74+
await lift({projectRoot, nodeVersion});
75+
76+
assert.calledWith(scaffolder.default, {projectRoot, nodeVersion});
77+
});
78+
79+
test('that the scaffolder is not called when a modern release workflow already exists', async () => {
80+
core.fileExists.withArgs(pathToReleaseWorkflowFile).resolves(true);
81+
fs.readFile.withArgs(pathToReleaseWorkflowFile, 'utf-8').resolves(existingWorkflowContents);
82+
jsYaml.load.withArgs(existingWorkflowContents).returns({on: {}, permissions: {contents: 'read'}});
83+
5484
await lift({projectRoot});
5585

5686
assert.notCalled(scaffolder.default);

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,20 @@ import {fileExists} from '@form8ion/core';
44

55
import scaffolder from './scaffolder';
66

7+
function workflowPermissionsAreMinimal(existingContents) {
8+
return existingContents.permissions
9+
&& existingContents.permissions.contents
10+
&& 'read' === existingContents.permissions.contents;
11+
}
12+
13+
async function contentsNeedToBeUpdated(pathToReleaseWorkflowFile) {
14+
const existingContents = load(await fs.readFile(pathToReleaseWorkflowFile, 'utf-8'));
15+
16+
return existingContents.on.workflow_dispatch || !workflowPermissionsAreMinimal(existingContents);
17+
}
18+
719
async function releaseWorkflowShouldBeScaffolded(pathToReleaseWorkflowFile) {
8-
return !await fileExists(pathToReleaseWorkflowFile)
9-
|| load(await fs.readFile(pathToReleaseWorkflowFile, 'utf-8')).on.workflow_dispatch;
20+
return !await fileExists(pathToReleaseWorkflowFile) || contentsNeedToBeUpdated(pathToReleaseWorkflowFile);
1021
}
1122

1223
export default async function ({projectRoot, nodeVersion}) {

0 commit comments

Comments
 (0)