88
99jobs :
1010 check_conditions :
11- name : Check conditions to create & release
11+ name : Check conditions to create & publish a release
1212 runs-on : ubuntu-latest
1313 permissions :
1414 contents : read
1515 outputs :
16- do_release : ${{ steps.check_create_release_suffix.outputs.do_release }}
17- do_release_changelog_generation : ${{ steps.check_create_release_suffix.outputs.do_release_changelog_generation }}
18- do_release_version_bump : ${{ steps.check_create_release_suffix.outputs.do_release_version_bump }}
19- do_release_version_bump_force_version : ${{ steps.check_create_release_suffix.outputs.do_release_version_bump_force_version }}
16+ success : ${{ steps.check_workflow_conditions.outputs.success }}
17+ appVersion : ${{ steps.check_workflow_conditions.outputs.appVersion }}
2018 steps :
2119 - name : Checkout the Codebase
2220 uses : actions/checkout@v4
2321 with :
24- ref : main # branch to checkout
22+ # ref: main # branch to checkout, but we use the provided branch by the event
2523 fetch-depth : 0
2624
27- - name : Check first line of commit message and search for commands `[rel-TYPE-CHANGELOG]`
28- id : check_create_release_suffix
25+ # - name: Get `package.json` version
26+ # id: get_package_version
27+ # run: echo appVersion=$(node -p "require('./package.json').version") >> $GITHUB_OUTPUT
28+
29+ - name : Check workflow conditions to create a release on the current commit
30+ id : check_workflow_conditions
2931 uses : actions/github-script@v7
3032 with :
3133 script : |
32- // context.sha === context.payload.head_commit.id
34+ const fs = require('fs').promises
35+
36+ const versionRegex = "\\d+\\.\\d+\\.\\d+(-rc\\.\\d+)?" // allowed: `1.0.0`, `1.0.0-rc.1`
37+
38+ // set default output that may be overwritten later
39+ setOutput("success", 0) // default: false
40+
41+ // helper function to set output with logging
42+ function setOutput(key, value) {
43+ console.dir(`:: set output: ${key}=${value}`)
44+ core.setOutput(key, value)
45+ }
46+
47+ // ==== commit message ====
3348
3449 // Get first line of last commit message
35- const lastCommitMessage = context.payload.head_commit.message;
36- const lastCommitMessageFirstLine = lastCommitMessage.split('\n')[0];
37-
38- let do_release = "false";
39- let do_release_version_bump = "false";
40- let do_release_version_bump_force_version = "";
41- let do_release_changelog_generation = "false";
42-
43- const allowedTypes = [
44- "none",
45- // --------
46- "auto",
47- // --------
48- "major",
49- "minor",
50- "patch",
51- "premajor",
52- "preminor",
53- "prepatch",
54- "prerelease",
55- ];
56-
57- const allowedChangelog = [
58- "y",
59- "n",
60- ];
61-
62- const regex = /\[rel-([a-z]+)-([a-z]+)\]/;
63- const match = lastCommitMessageFirstLine.match(regex);
64-
65- if (match) {
66- do_release = "true";
67-
68- const cmdType = match[1];
69- const cmdChangelog = match[2];
70-
71- if(!allowedTypes.includes(cmdType)){
72- throw new Error(`Invalid release TYPE: ${cmdType}`);
73- }
74- if(!allowedChangelog.includes(cmdChangelog)){
75- throw new Error(`Invalid release CHANGELOG: ${cmdChangelog}`);
76- }
77-
78- if(cmdType !== "none"){
79- do_release_version_bump = "true";
80- if(cmdType !== "auto"){
81- do_release_version_bump_force_version = `--${cmdType}`;
82- }
83- }
84-
85- if(cmdChangelog === "y"){
86- do_release_changelog_generation = "true";
87- }
50+ const lastCommitMessage = context?.payload?.head_commit.message ?? context?.payload?.commits[0]?.message
51+ const lastCommitMessageFirstLine = lastCommitMessage?.split('\n')[0] ?? ''
52+
53+ const regex_commitMessage = new RegExp(`^chore\\(release\\): v(?<version>${versionRegex}) \\(#\\d+\\)$`, "s")
54+ const match_commitMessage = lastCommitMessageFirstLine.match(regex_commitMessage)
55+
56+ if (!match_commitMessage || !match_commitMessage.groups?.version) {
57+ console.dir(`Invalid commit message: ${lastCommitMessageFirstLine}`)
58+ return
8859 }
8960
90- console.dir(`Set output: do_release=${do_release}`);
91- core.setOutput("do_release", do_release);
61+ const version_byCommitMessage = match_commitMessage.groups.version
9262
93- console.dir(`Set output: do_release_version_bump=${do_release_version_bump}`);
94- core.setOutput("do_release_version_bump", do_release_version_bump);
63+ // ==== version in `package.json` ====
64+
65+ const packageJson = await fs.readFile('package.json', 'utf8')
66+ const { version: version_byPackageJson } = JSON.parse(packageJson)
67+
68+ const regex_packageJson = new RegExp(`^(${versionRegex})$`, "s")
69+ const match_packageJson = version_byPackageJson.match(regex_packageJson)
70+
71+ if (!match_packageJson) {
72+ console.dir(`Invalid version in package.json: ${version_byPackageJson}`)
73+ return
74+ }
75+
76+ // ==== compare all versions ====
77+
78+ if (version_byCommitMessage !== version_byPackageJson) {
79+ console.dir(`Versions are not equal: ${version_byCommitMessage} (commit message) !== ${version_byPackageJson} (package.json)`)
80+ return
81+ }
9582
96- console.dir(`Set output: do_release_version_bump_force_version=${do_release_version_bump_force_version}`);
97- core.setOutput("do_release_version_bump_force_version", do_release_version_bump_force_version);
83+ // the versions are equal, so just take one of them
84+ const appVersion = version_byCommitMessage
9885
99- console.dir(`Set output: do_release_changelog_generation=${do_release_changelog_generation}`);
100- core.setOutput("do_release_changelog_generation", do_release_changelog_generation);
86+ // ==== set outputs ====
87+
88+ setOutput("appVersion", appVersion)
89+ setOutput("success", 1)
10190
10291 dependence-lint :
10392 name : Depend on Lint
10796 needs :
10897 - check_conditions
10998 - dependence-lint
110- if : needs.check_conditions.outputs.do_release == 'true'
99+ # only run if the conditions are met, and bc booleans are not supported, we use integers (false=0, true=1)
100+ if : needs.check_conditions.outputs.success == 1
111101 name : Create GitHub Release & NPM Publish
112102 runs-on : ubuntu-latest
113103 permissions :
@@ -116,7 +106,7 @@ jobs:
116106 - name : Checkout the Codebase
117107 uses : actions/checkout@v4
118108 with :
119- ref : main # branch to checkout
109+ # ref: main # branch to checkout, but the workflow already only runs on `main`
120110 fetch-depth : 0
121111
122112 - name : Setup Node.js
@@ -134,54 +124,29 @@ jobs:
134124 git config --global user.name "github-actions[bot]"
135125 git config --global user.email "no-reply@todde.tv"
136126
127+ # do all code related stuff early to catch if something is wrong and it fails
128+ # TODO create a workflow like `Lint` to test install by lockfile and build
129+
137130 - name : Install dependencies
138131 run : pnpm install --frozen-lockfile
139132
140- # - name: Get old `package.json` version
141- # id: get_package_version_old
142- # run: echo version=$(node -p "require('./package.json').version") >> $GITHUB_OUTPUT
143-
144- - name : Bump `package.json` version depending on given TYPE from commit message
145- if : needs.check_conditions.outputs.do_release_version_bump == 'true'
146- # -from "v${{ steps.get_package_version_old.outputs.version }}"
147- run : pnpm changelogen --bump ${{ needs.check_conditions.outputs.do_release_version_bump_force_version }} --no-commit --no-tag
148- env :
149- GITHUB_TOKEN : ${{secrets.GITHUB_TOKEN}}
150-
151- - name : Get new `package.json` version
152- id : get_package_version_new
153- run : echo version=$(node -p "require('./package.json').version") >> $GITHUB_OUTPUT
154-
155- - name : Generate changelog from conventional commits
156- if : needs.check_conditions.outputs.do_release_changelog_generation == 'true'
157- # -from "v${{ steps.get_package_version_old.outputs.version }}"
158- run : pnpm changelogen --output CHANGELOG.md -r "${{ steps.get_package_version_new.outputs.version }}" --no-commit --no-tag
159- env :
160- GITHUB_TOKEN : ${{secrets.GITHUB_TOKEN}}
161-
162- - name : Git add, commit & push changes made to `main` (potentially `package.json` & `CHANGELOG.md`)
163- if : needs.check_conditions.outputs.do_release_version_bump == 'true' || needs.check_conditions.outputs.do_release_changelog_generation == 'true'
164- run : |
165- git add .
166- git commit -m "chore(release): v${{ steps.get_package_version_new.outputs.version }}"
167- git push origin main
133+ - name : Build the project
134+ run : pnpm run build
168135
169136 - name : Create a tag
170137 run : |
171- git tag -a "v${{ steps.get_package_version_new .outputs.version }}" -m "Release v${{ steps.get_package_version_new .outputs.version }}"
138+ git tag -a "v${{ needs.check_conditions .outputs.appVersion }}" -m "Release v${{ needs.check_conditions .outputs.appVersion }}"
172139 git push origin --tags
173140
174141 - name : Sync tags with GitHub releases & create the new release
175142 # run: pnpm changelogen gh release all
176- run : pnpm changelogen gh release "v${{ steps.get_package_version_new .outputs.version }}"
143+ run : pnpm changelogen gh release "v${{ needs.check_conditions .outputs.appVersion }}"
177144 env :
178145 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
179146
180- # - name: Install dependencies
181- # run: pnpm install --frozen-lockfile
182-
183- - name : Build the project
184- run : pnpm run build
147+ # # pack the project in a archive for publishing, e.g. `todde.tv-gltf-type-toolkit-1.0.0.tgz`
148+ # - name: Pack the project
149+ # run: pnpm pack
185150
186151 # - name: Publish package to NPM
187152 # if: github.ref == 'refs/heads/main'
0 commit comments