Skip to content

Commit fae3d43

Browse files
committed
ci: add canary releases on PRs
Fixes #3466 Fixes #3383
1 parent f597c69 commit fae3d43

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

.github/workflows/canary.yaml

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
name: Canary Release
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- main
7+
8+
env:
9+
NODE_VERSION_USED_FOR_DEVELOPMENT: 17
10+
jobs:
11+
publish-canary:
12+
name: Publish Canary
13+
runs-on: ubuntu-latest
14+
steps:
15+
- name: Checkout Main
16+
uses: actions/checkout@v2
17+
with:
18+
fetch-depth: 0
19+
persist-credentials: false
20+
21+
- name: Setup Node.js
22+
uses: actions/setup-node@v2
23+
with:
24+
cache: npm
25+
node-version: ${{ env.NODE_VERSION_USED_FOR_DEVELOPMENT }}
26+
# 'registry-url' is required for 'npm publish'
27+
registry-url: 'https://registry.npmjs.org'
28+
29+
- name: Install Dependencies
30+
run: npm ci --ignore-scripts
31+
32+
- name: Build NPM package
33+
run: npm run build:npm
34+
35+
- name: Modify NPM package to be canary release
36+
uses: actions/github-script@v5
37+
with:
38+
script: |
39+
const assert = require('assert');
40+
const { readFileSync, writeFileSync } = require('fs');
41+
42+
const prNumber = context.issue.number;
43+
const prSHA = context.sha;
44+
45+
const packageJSONPath = './npmDist/package.json';
46+
const packageJSON = JSON.parse(readFileSync(packageJSONPath, 'utf-8'));
47+
48+
assert(packageJSON.scripts != null, 'No scripts allowed for security reasons!');
49+
50+
let { version } = packageJSON;
51+
assert(!version.includes('+'), 'Can not append after metadata');
52+
version += packageJSON.version.includes('-') ? '.' : '-';
53+
version += `canary.pr.${prNumber}.${prSHA}`;
54+
55+
const tag = `canary-pr-${prNumber}`;
56+
57+
packageJSON.version = version;
58+
packageJSON.publishConfig.tag = `canary-pr-${prNumber}`;
59+
writeFileSync(packageJSONPath, JSON.stringify(packageJSON, null, 2), 'utf-8');
60+
61+
core.exportVariable('NPM_VERSION', version);
62+
core.exportVariable('NPM_TAG', tag);
63+
64+
- name: Publish NPM package
65+
run: npm publish ./npmDist
66+
env:
67+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
68+
69+
- name: Add deprecate message on NPM package
70+
run: |
71+
npm deprecate "graphql@$NPM_VERSION" \
72+
"You are using canary version build from $PR_URL, no gurantees provided so please use your own discretion."
73+
env:
74+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
75+
PR_URL: ${{github.event.pull_request.url}}
76+
77+
- name: Add comment on PR
78+
uses: actions/github-script@v5
79+
with:
80+
github-token: ${{secrets.GITHUB_TOKEN}}
81+
script: |
82+
const npmTag = process.env.NPM_TAG;
83+
const npmVersion = process.env.NPM_VERSION;
84+
const npmURL = 'https://www.npmjs.com/package/graphql/v/' + npmVersion;
85+
github.rest.issues.createComment({
86+
issue_number: context.issue.number,
87+
owner: context.repo.owner,
88+
repo: context.repo.repo,
89+
body:
90+
`The latest changes of this PR are available as ['graphql@${npmVersion}'](${npmURL}) on NPM.\n` +
91+
'**Note: no gurantees provided so please use your own discretion.**\n\n' +
92+
`Also you can depend on latest version built from this PR: \`npm install --save graphql@${npmTag}\`.`,
93+
})

0 commit comments

Comments
 (0)