1+ name : Release and publish packages
2+
3+ on :
4+ push :
5+ branches :
6+ - main
7+ paths :
8+ - lerna.json
9+
10+ workflow_dispatch :
11+ inputs :
12+ version :
13+ description : " Version to release"
14+ required : true
15+
16+ jobs :
17+ check-version-change :
18+ outputs :
19+ changed : ${{ steps.check-version.outputs.result }}
20+
21+ runs-on : ubuntu-latest
22+
23+ permissions :
24+ contents : read
25+
26+ steps :
27+ - uses : actions/checkout@v3
28+ - name : Check if version has changed
29+ id : check-version
30+ uses : actions/github-script@v6
31+ with :
32+ script : |
33+ const version = '${{ inputs.version }}' || require('./lerna.json').version;
34+ // Find a release for that version
35+ const release = await github.rest.repos.getReleaseByTag({
36+ owner: context.repo.owner,
37+ repo: context.repo.repo,
38+ tag: `release-v${version}`,
39+ }).catch(() => null);
40+
41+ // If the release exists, the version has not changed
42+ if (release) {
43+ console.log(`Version ${version} has an existing release`);
44+ console.log(release.data.html_url);
45+ core.summary.addLink(`Release v${version}`, release.data.html_url);
46+ await core.summary.write();
47+ return "false";
48+ }
49+ console.log(`Version ${version} does not have a release`);
50+ return true;
51+
52+ release :
53+ environment : publish
54+
55+ needs : check-version-change
56+ if : ${{ needs.check-version-change.outputs.changed == 'true' }}
57+
58+ runs-on : ubuntu-latest
59+
60+ permissions :
61+ contents : write
62+ packages : write
63+
64+ env :
65+ PKG_VERSION : " " # will be set in the workflow
66+
67+ steps :
68+ - uses : actions/checkout@v3
69+
70+ - uses : actions/setup-node@v3
71+ with :
72+ node-version : 16.x
73+ cache : " npm"
74+ scope : ' @actions'
75+
76+ - name : Parse version from lerna.json
77+ run : |
78+ echo "PKG_VERSION=$(node -p -e "require('./lerna.json').version")" >> $GITHUB_ENV
79+
80+ - run : npm ci
81+
82+ - name : Create release
83+ uses : actions/github-script@v6
84+ with :
85+ script : |
86+ const fs = require("fs");
87+
88+ const release = await github.rest.repos.createRelease({
89+ owner: context.repo.owner,
90+ repo: context.repo.repo,
91+ tag_name: "release-v${{ env.PKG_VERSION }}",
92+ name: "v${{ env.PKG_VERSION }}",
93+ draft: false,
94+ prerelease: false
95+ });
96+
97+ core.summary.addLink(`Release v${{ env.PKG_VERSION }}`, release.data.html_url);
98+ await core.summary.write();
99+
100+ - name : setup authentication
101+ run : echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" >> .npmrc
102+ env :
103+ NPM_TOKEN : ${{ secrets.NPM_TOKEN }}
104+
105+ - name : Publish packages
106+ run : |
107+ lerna publish ${{ env.PKG_VERSION }} --yes --no-git-reset --no-git-tag-version
108+ env :
109+ NPM_TOKEN : ${{ secrets.NPM_TOKEN }}
0 commit comments