Skip to content

Commit bee950a

Browse files
committed
label workflow
1 parent deb22b5 commit bee950a

2 files changed

Lines changed: 106 additions & 0 deletions

File tree

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#!/usr/bin/env node
2+
import { mkdir, readdir, rm, writeFile } from 'node:fs/promises';
3+
import path from 'node:path';
4+
import process from 'node:process';
5+
import { fileURLToPath } from 'node:url';
6+
7+
const __filename = fileURLToPath(import.meta.url);
8+
const __dirname = path.dirname(__filename);
9+
const repoRoot = path.resolve(__dirname, '..', '..');
10+
const changesetDir = path.join(repoRoot, '.changeset');
11+
12+
const prNumber = process.env.PR_NUMBER?.trim() ?? 'unknown';
13+
const prTitle = process.env.PR_TITLE?.trim() ?? '';
14+
const prBody = process.env.PR_BODY?.trim() ?? '';
15+
const labelName = process.env.LABEL_NAME?.trim().toLowerCase() ?? '';
16+
17+
if (!prTitle) {
18+
console.error('PR title is required.');
19+
process.exit(1);
20+
}
21+
22+
if (!['add-changeset', 'add-changeset-major'].includes(labelName)) {
23+
console.log(`Skipping changeset creation because label ${labelName || 'unknown'} was not handled.`);
24+
process.exit(0);
25+
}
26+
27+
const message = [prTitle, prBody].filter(Boolean).join('\n');
28+
29+
let releaseType = 'patch';
30+
31+
if (labelName === 'add-changeset-major') {
32+
releaseType = 'major';
33+
} else if (/^(feat|feature)(\([^)]+\))?!?:/i.test(message)) {
34+
releaseType = 'minor';
35+
} else if (/^(fix|perf|refactor|build|ci|chore|docs|style|test|revert)(\([^)]+\))?!?:/i.test(message)) {
36+
releaseType = 'patch';
37+
} else if (/\bbreaking change\b|!:/i.test(message)) {
38+
releaseType = 'major';
39+
}
40+
41+
const fileName = `pr-${prNumber}.md`;
42+
const filePath = path.join(changesetDir, fileName);
43+
44+
const existingFiles = await readdir(changesetDir);
45+
await Promise.all(
46+
existingFiles
47+
.filter((name) => name.startsWith(`pr-${prNumber}`) && name.endsWith('.md'))
48+
.map((name) => rm(path.join(changesetDir, name), { force: true }))
49+
);
50+
51+
const packages = ["react-docgen", "react-docgen-cli"];
52+
const frontmatter = packages.map((pkg) => `"${pkg}": ${releaseType}`).join('\n');
53+
const content = `---\n${frontmatter}\n---\n\n${prTitle}\n`;
54+
55+
await mkdir(changesetDir, { recursive: true });
56+
await writeFile(filePath, content, 'utf8');
57+
58+
console.log(`Created changeset ${path.relative(repoRoot, filePath)} with release type ${releaseType}.`);
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
name: Add changeset from PR label
2+
3+
on:
4+
pull_request_target:
5+
types:
6+
- labeled
7+
8+
permissions:
9+
contents: write
10+
pull-requests: read
11+
12+
jobs:
13+
create-changeset:
14+
if: github.event.label.name == 'add-changeset' || github.event.label.name == 'add-changeset-major'
15+
runs-on: ubuntu-latest
16+
17+
steps:
18+
- name: Checkout PR branch
19+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
20+
with:
21+
repository: ${{ github.event.pull_request.head.repo.full_name }}
22+
ref: ${{ github.event.pull_request.head.ref }}
23+
fetch-depth: 0
24+
25+
- name: Setup Node.js
26+
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
27+
with:
28+
node-version: 22
29+
30+
- name: Create changeset file
31+
env:
32+
PR_NUMBER: ${{ github.event.pull_request.number }}
33+
PR_TITLE: ${{ github.event.pull_request.title }}
34+
PR_BODY: ${{ github.event.pull_request.body }}
35+
LABEL_NAME: ${{ github.event.label.name }}
36+
run: node .github/scripts/create-changeset-from-pr.mjs
37+
38+
- name: Commit changeset
39+
run: |
40+
git config user.name "github-actions[bot]"
41+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
42+
git add .changeset
43+
if git diff --cached --quiet; then
44+
echo "No changeset changes to commit."
45+
exit 0
46+
fi
47+
git commit -m "Add changeset for PR #${{ github.event.pull_request.number }}"
48+
git push origin HEAD:${{ github.event.pull_request.head.ref }}

0 commit comments

Comments
 (0)