Skip to content

Commit e59397c

Browse files
authored
Merge pull request #1148 from ReactTooltip/feat/automated-beta-releases
feat: add beta release workflow
2 parents 54aeda9 + b47e870 commit e59397c

File tree

8 files changed

+170
-26
lines changed

8 files changed

+170
-26
lines changed

.github/workflows/beta-release.yaml

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
name: Beta Release
2+
3+
on:
4+
workflow_call:
5+
6+
jobs:
7+
beta_release:
8+
runs-on: ubuntu-latest
9+
env:
10+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
11+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
12+
steps:
13+
- uses: actions/checkout@v4
14+
with:
15+
ref: ${{ github.head_ref }}
16+
- uses: actions/setup-node@v4
17+
with:
18+
node-version: '16.x'
19+
registry-url: 'https://registry.npmjs.org'
20+
cache: 'yarn'
21+
22+
- name: Install dev dependencies
23+
run: yarn install
24+
25+
- name: Setup npm credentials file
26+
run: echo "//registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN" >> .npmrc
27+
28+
- name: Setup git credentials
29+
run: |
30+
git config --global user.name 'Auto Release Bot'
31+
git config --global user.email '[email protected]'
32+
33+
- name: Get current package.json version
34+
run: echo "PACKAGE_VERSION=$(npm pkg get version)" >> $GITHUB_ENV
35+
36+
- name: Setup Beta Release Version
37+
run: node beta-release.js --issue $GITHUB_PR_NUMBER
38+
env:
39+
GITHUB_PR_NUMBER: ${{ github.event.pull_request.number }}
40+
41+
- name: Release a new beta version
42+
run: npm publish --tag beta
43+
env:
44+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
45+
46+
- uses: actions/github-script@v6
47+
with:
48+
script: |
49+
github.rest.issues.createComment({
50+
issue_number: context.issue.number,
51+
owner: context.repo.owner,
52+
repo: context.repo.repo,
53+
body: `Beta version released with the last commit 🚀
54+
55+
\`\`\`
56+
yarn add react-tooltip@${{ env.NEW_VERSION }}
57+
\`\`\`
58+
or
59+
\`\`\`
60+
npm install react-tooltip@${{ env.NEW_VERSION }}
61+
\`\`\`
62+
`
63+
})

.github/workflows/bundlesize.yaml

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Run Bundlesize
1+
name: Bundlesize
22

33
on:
44
workflow_call:
@@ -7,8 +7,8 @@ jobs:
77
bundlesize:
88
runs-on: ubuntu-latest
99
steps:
10-
- uses: actions/checkout@v2
11-
- uses: actions/setup-node@v3
10+
- uses: actions/checkout@v4
11+
- uses: actions/setup-node@v4
1212

1313
- name: Install dev dependencies
1414
run: yarn install
@@ -18,4 +18,3 @@ jobs:
1818

1919
- name: Bundlesize
2020
run: yarn run bundlesize
21-

.github/workflows/lint.yaml

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Run basic linting and testing
1+
name: Lint
22

33
on:
44
workflow_call:
@@ -7,8 +7,8 @@ jobs:
77
lint:
88
runs-on: ubuntu-latest
99
steps:
10-
- uses: actions/checkout@v2
11-
- uses: actions/setup-node@v3
10+
- uses: actions/checkout@v4
11+
- uses: actions/setup-node@v4
1212

1313
- name: Install dev dependencies
1414
run: yarn install
@@ -20,11 +20,11 @@ jobs:
2020
needs: lint
2121
strategy:
2222
matrix:
23-
version: [16, 18]
23+
version: [16, 18, 20]
2424
runs-on: ubuntu-latest
2525
steps:
26-
- uses: actions/checkout@v2
27-
- uses: actions/setup-node@v3
26+
- uses: actions/checkout@v4
27+
- uses: actions/setup-node@v4
2828
with:
2929
node-version: ${{ matrix.version }}
3030

.github/workflows/pull-request.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ jobs:
1616
if: 'github.event.pull_request.draft == false'
1717
uses: ./.github/workflows/bundlesize.yaml
1818

19+
beta_release:
20+
uses: ./.github/workflows/beta-release.yaml
21+
# allow the children job to have access to the secrets of the repository
22+
secrets: inherit
23+
1924
fail_if_pull_request_is_draft:
2025
if: github.event.pull_request.draft == true
2126
runs-on: ubuntu-18.04

.github/workflows/stale.yml

+14-15
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,26 @@ name: Mark stale issues and pull requests
77

88
on:
99
schedule:
10-
- cron: '00 12 * * *'
10+
- cron: '00 12 * * *'
1111

1212
jobs:
1313
stale:
14-
1514
runs-on: ubuntu-latest
1615
permissions:
1716
issues: write
1817
pull-requests: write
1918

2019
steps:
21-
- uses: actions/stale@v5
22-
with:
23-
repo-token: ${{ secrets.GITHUB_TOKEN }}
24-
days-before-issue-stale: 90
25-
days-before-issue-close: 30
26-
days-before-pr-stale: 90
27-
days-before-pr-close: 30
28-
stale-issue-message: 'This issue is stale because it has not seen activity in 30 days. Remove the `stale` label or comment within 14 days, or it will be closed.'
29-
stale-pr-message: 'This pull request is stale because it has not seen activity in 30 days. Remove the `stale` label or comment within 14 days, or it will be closed.'
30-
stale-issue-label: 'stale'
31-
stale-pr-label: 'stale'
32-
exempt-issue-labels: 'help-wanted,v6'
33-
exempt-pr-labels: 'help-wanted,v6'
20+
- uses: actions/stale@v5
21+
with:
22+
repo-token: ${{ secrets.GITHUB_TOKEN }}
23+
days-before-issue-stale: 90
24+
days-before-issue-close: 30
25+
days-before-pr-stale: 90
26+
days-before-pr-close: 30
27+
stale-issue-message: 'This issue is stale because it has not seen activity in 30 days. Remove the `stale` label or comment within 14 days, or it will be closed.'
28+
stale-pr-message: 'This pull request is stale because it has not seen activity in 30 days. Remove the `stale` label or comment within 14 days, or it will be closed.'
29+
stale-issue-label: 'stale'
30+
stale-pr-label: 'stale'
31+
exempt-issue-labels: 'help-wanted,v6'
32+
exempt-pr-labels: 'help-wanted,v6'

beta-release.js

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/* eslint-disable @typescript-eslint/no-var-requires */
2+
const util = require('util')
3+
const exec = util.promisify(require('child_process').exec)
4+
const package = require('./package.json')
5+
6+
const args = require('minimist')(process.argv.slice(2))
7+
8+
const issueNumber = args['issue']
9+
10+
console.log(issueNumber)
11+
12+
const runCommand = async (command) => {
13+
return new Promise((resolve) => {
14+
exec(command, (error, stdout, stderr) => {
15+
resolve({ error, stdout, stderr })
16+
})
17+
})
18+
}
19+
20+
const AutoBetaRelease = async () => {
21+
// get all the versions of the package from npm
22+
const { stdout } = await runCommand(`npm view . versions --json`)
23+
24+
// show npm published versions of this package
25+
console.log(stdout)
26+
27+
// check if there is a beta release with the same issue number on published versions
28+
const arrayOfBetaReleases = JSON.parse(stdout).filter((version) =>
29+
version.includes(`${package.version}-beta.${issueNumber}`),
30+
)
31+
32+
let fullLastBetaRelease = null
33+
34+
// if yes, get the latest beta release. Output: 1.0.0-beta.1.rc.0
35+
if (arrayOfBetaReleases.length) {
36+
fullLastBetaRelease = arrayOfBetaReleases[arrayOfBetaReleases.length - 1]
37+
}
38+
39+
console.log('Last Beta Release: ', fullLastBetaRelease)
40+
41+
let nextBetaReleaseVersion = 0
42+
43+
if (fullLastBetaRelease) {
44+
const lastBetaReleaseRCVersionArray = fullLastBetaRelease.match(/rc.+[0-9]+/g)
45+
46+
const lastBetaReleaseRCVersion =
47+
lastBetaReleaseRCVersionArray && lastBetaReleaseRCVersionArray.length
48+
? lastBetaReleaseRCVersionArray[0]
49+
: null
50+
51+
const lastBetaReleaseVersion = lastBetaReleaseRCVersion
52+
? lastBetaReleaseRCVersion.split('.')[1]
53+
: 0
54+
55+
nextBetaReleaseVersion = parseInt(lastBetaReleaseVersion, 10) + 1
56+
}
57+
58+
// next beta release version. Output: 1.0.0-beta.1.rc.1
59+
const nextBetaReleaseVesionFull = `${package.version}-beta.${issueNumber}.rc.${nextBetaReleaseVersion}`
60+
61+
// update the beta version on package.json
62+
const { error } = await runCommand(
63+
`npm version ${nextBetaReleaseVesionFull} --no-git-tag-version`,
64+
)
65+
66+
if (error) {
67+
console.error(error)
68+
return
69+
}
70+
71+
// the beta version is already updated on package.json on the next line
72+
console.log('Next Beta version: ', `${nextBetaReleaseVesionFull}`)
73+
74+
await runCommand(`echo "NEW_VERSION=${nextBetaReleaseVesionFull}" >> $GITHUB_ENV`)
75+
}
76+
77+
AutoBetaRelease()

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
"jest-environment-jsdom": "29.4.3",
8282
"jest-transform-css": "6.0.1",
8383
"lint-staged": "13.1.2",
84+
"minimist": "^1.2.8",
8485
"postcss": "8.4.21",
8586
"prettier": "2.8.4",
8687
"process": "^0.11.10",

yarn.lock

+1-1
Original file line numberDiff line numberDiff line change
@@ -5696,7 +5696,7 @@ [email protected]:
56965696
is-plain-obj "^1.1.0"
56975697
kind-of "^6.0.3"
56985698

5699-
minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6:
5699+
minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8:
57005700
version "1.2.8"
57015701
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
57025702
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==

0 commit comments

Comments
 (0)