Skip to content

Commit dba7caf

Browse files
committed
refactor: reorganize CI workflows and actions
- Removed deprecated ci-setup action and replaced it with setup-bun for better clarity and modularity. - Updated CI workflow to utilize the new setup-bun action for Bun environment setup. - Introduced a new setup-node action for Node.js environment setup. - Added a preview release workflow triggered by successful CI runs. - Enhanced release workflow to handle pre-releases and improved tagging logic. - Deleted obsolete test workflow.
1 parent 51f25aa commit dba7caf

File tree

8 files changed

+262
-135
lines changed

8 files changed

+262
-135
lines changed

.github/actions/ci-setup/action.yml

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
name: Setup Bun
2+
description: Setup Bun environment
3+
4+
inputs:
5+
bun-version:
6+
description: Bun version
7+
required: false
8+
default: latest
9+
10+
runs:
11+
using: composite
12+
steps:
13+
- name: Setup Bun ${{ inputs.bun-version }}
14+
uses: oven-sh/setup-bun@v2
15+
with:
16+
bun-version: ${{ inputs.bun-version }}
17+
18+
- name: Install dependencies
19+
shell: bash
20+
run: bun install --frozen-lockfile
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
name: Setup Node
2+
description: Setup Node.js environment
3+
4+
inputs:
5+
node-version:
6+
description: Node version
7+
required: false
8+
default: lts/*
9+
registry-url:
10+
description: npm registry URL
11+
required: false
12+
default: https://registry.npmjs.org
13+
14+
runs:
15+
using: composite
16+
steps:
17+
- name: Setup Node ${{ inputs.node-version }}
18+
uses: actions/setup-node@v6
19+
with:
20+
node-version: ${{ inputs.node-version }}
21+
registry-url: ${{ inputs.registry-url }}

.github/workflows/ci.yml

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,36 @@
11
name: CI
22

33
on:
4-
pull_request:
5-
push:
6-
branches: [main]
4+
pull_request:
5+
push:
6+
branches: [main]
77

88
permissions:
9-
contents: read
9+
contents: read
1010

1111
concurrency:
12-
group: ci-${{ github.ref }}
13-
cancel-in-progress: true
12+
group: ci-${{ github.ref }}
13+
cancel-in-progress: true
1414

1515
jobs:
16-
typecheck:
17-
name: Typecheck
18-
runs-on: ubuntu-latest
19-
timeout-minutes: 20
20-
steps:
21-
- uses: actions/checkout@v6
22-
- uses: ./.github/actions/ci-setup
23-
with:
24-
bun-version: latest
25-
26-
- name: Typecheck
27-
run: bun run check-types
28-
29-
30-
lint:
31-
name: Lint & Format
32-
runs-on: ubuntu-latest
33-
steps:
34-
- uses: actions/checkout@v6
35-
- uses: ./.github/actions/ci-setup
36-
with:
37-
bun-version: latest
38-
39-
- name: Run Ultracite
40-
run: bunx ultracite check
16+
typecheck:
17+
name: Typecheck
18+
runs-on: ubuntu-latest
19+
timeout-minutes: 5
20+
steps:
21+
- uses: actions/checkout@v6
22+
- uses: ./.github/actions/setup-bun
23+
24+
- name: Typecheck
25+
run: bun run check-types
26+
27+
lint:
28+
name: Lint & Format
29+
runs-on: ubuntu-latest
30+
timeout-minutes: 5
31+
steps:
32+
- uses: actions/checkout@v6
33+
- uses: ./.github/actions/setup-bun
34+
35+
- name: Run Ultracite
36+
run: bunx ultracite check

.github/workflows/preview.yml

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
name: Preview Release
2+
3+
on:
4+
workflow_run:
5+
workflows: [CI]
6+
types: [completed]
7+
branches-ignore: [main]
8+
9+
permissions: {}
10+
11+
concurrency:
12+
group: preview-${{ github.event.workflow_run.head_sha }}
13+
cancel-in-progress: true
14+
15+
jobs:
16+
preview:
17+
name: Preview Release
18+
if: >-
19+
github.event.workflow_run.conclusion == 'success' &&
20+
github.event.workflow_run.event == 'pull_request'
21+
runs-on: ubuntu-latest
22+
timeout-minutes: 5
23+
permissions:
24+
pull-requests: write
25+
actions: read
26+
steps:
27+
- name: Check for source changes
28+
id: check
29+
uses: actions/github-script@v8
30+
with:
31+
script: |
32+
const { data: prs } = await github.rest.repos.listPullRequestsAssociatedWithCommit({
33+
owner: context.repo.owner,
34+
repo: context.repo.repo,
35+
commit_sha: context.payload.workflow_run.head_sha,
36+
});
37+
const open = prs.find((pr) => pr.state === 'open');
38+
if (!open) {
39+
core.info('No open PR found — skipping');
40+
return;
41+
}
42+
core.setOutput('pr-number', String(open.number));
43+
44+
const files = await github.paginate(github.rest.pulls.listFiles, {
45+
owner: context.repo.owner,
46+
repo: context.repo.repo,
47+
pull_number: open.number,
48+
});
49+
const hasCodeChanges = files.some((f) => f.filename.startsWith('src/'));
50+
core.setOutput('has-code-changes', String(hasCodeChanges));
51+
core.info(`Code changes detected: ${hasCodeChanges}`);
52+
53+
- uses: actions/checkout@v6
54+
if: steps.check.outputs.has-code-changes == 'true'
55+
with:
56+
ref: ${{ github.event.workflow_run.head_sha }}
57+
- uses: ./.github/actions/setup-bun
58+
if: steps.check.outputs.has-code-changes == 'true'
59+
60+
- name: Build
61+
if: steps.check.outputs.has-code-changes == 'true'
62+
run: bun run build
63+
64+
- name: Publish preview
65+
if: steps.check.outputs.has-code-changes == 'true'
66+
run: bunx pkg-pr-new publish --comment=off --json output.json --packageManager=bun
67+
68+
- name: Comment on PR
69+
if: steps.check.outputs.has-code-changes == 'true'
70+
uses: actions/github-script@v8
71+
with:
72+
script: |
73+
const fs = require('fs');
74+
const output = JSON.parse(fs.readFileSync('output.json', 'utf8'));
75+
const url = output.packages[0].url;
76+
const prNumber = parseInt('${{ steps.check.outputs.pr-number }}', 10);
77+
const headSha = '${{ github.event.workflow_run.head_sha }}';
78+
const repoUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}`;
79+
const commitUrl = `${repoUrl}/commit/${headSha}`;
80+
81+
const body = [
82+
'**Preview published** — install with:',
83+
'',
84+
'**bun**',
85+
'```sh',
86+
`bun add ${url}`,
87+
'```',
88+
'',
89+
'**npm**',
90+
'```sh',
91+
`npm install ${url}`,
92+
'```',
93+
'',
94+
`<sub>Built from [${headSha.slice(0, 7)}](${commitUrl})</sub>`,
95+
].join('\n');
96+
97+
const identifier = '**Preview published**';
98+
const { data: comments } = await github.rest.issues.listComments({
99+
owner: context.repo.owner,
100+
repo: context.repo.repo,
101+
issue_number: prNumber,
102+
});
103+
const existing = comments.find((c) => c.body.includes(identifier));
104+
105+
const params = {
106+
owner: context.repo.owner,
107+
repo: context.repo.repo,
108+
};
109+
110+
if (existing) {
111+
await github.rest.issues.updateComment({ ...params, comment_id: existing.id, body });
112+
} else {
113+
await github.rest.issues.createComment({ ...params, issue_number: prNumber, body });
114+
}

.github/workflows/release.yml

Lines changed: 76 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,90 @@
11
name: Release
22

33
on:
4-
push:
5-
branches: [main]
4+
workflow_run:
5+
workflows: [CI]
6+
types: [completed]
7+
branches: [main]
68

79
concurrency:
8-
group: release-${{ github.ref }}
9-
cancel-in-progress: false
10+
group: release
11+
cancel-in-progress: false
1012

1113
jobs:
12-
release:
13-
name: Release
14-
runs-on: ubuntu-latest
15-
permissions:
16-
contents: write
17-
pull-requests: write
18-
id-token: write
19-
steps:
20-
- uses: actions/checkout@v6
21-
- uses: ./.github/actions/ci-setup
22-
with:
23-
bun-version: latest
14+
release:
15+
name: Release
16+
if: github.event.workflow_run.conclusion == 'success'
17+
runs-on: ubuntu-latest
18+
timeout-minutes: 5
19+
permissions:
20+
contents: write
21+
pull-requests: write
22+
id-token: write
23+
steps:
24+
- uses: actions/checkout@v6
25+
with:
26+
ref: ${{ github.event.workflow_run.head_sha }}
27+
- uses: ./.github/actions/setup-bun
2428

25-
- name: Create release PR
26-
id: changesets
27-
uses: changesets/action@v1
28-
with:
29-
version: bun run version
30-
title: "chore: version packages"
31-
commit: "chore: version packages"
32-
env:
33-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
29+
- name: Create release PR
30+
id: changesets
31+
uses: changesets/action@v1
32+
with:
33+
version: bun run version
34+
title: "chore: version packages"
35+
commit: "chore: version packages"
36+
env:
37+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
3438

35-
- name: Check if release needed
36-
id: check-release
37-
if: steps.changesets.outputs.hasChangesets == 'false'
38-
run: |
39-
VERSION=$(jq -r '.version' package.json)
40-
TAG="v${VERSION}"
39+
- name: Check if release needed
40+
id: check-release
41+
if: steps.changesets.outputs.hasChangesets == 'false'
42+
run: |
43+
VERSION=$(jq -r '.version' package.json)
44+
TAG="v${VERSION}"
4145
42-
if git ls-remote --tags origin "$TAG" | grep -q "$TAG"; then
43-
echo "Tag $TAG already exists on remote, skipping"
44-
echo "should-release=false" >> "$GITHUB_OUTPUT"
45-
else
46-
echo "should-release=true" >> "$GITHUB_OUTPUT"
47-
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
48-
fi
46+
if git ls-remote --exit-code --tags origin "refs/tags/$TAG" &>/dev/null; then
47+
echo "Tag $TAG already exists on remote, skipping"
48+
echo "should_release=false" >> "$GITHUB_OUTPUT"
49+
else
50+
echo "should_release=true" >> "$GITHUB_OUTPUT"
51+
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
52+
fi
4953
50-
- name: Build
51-
if: steps.check-release.outputs.should-release == 'true'
52-
run: bun run build
54+
- name: Detect pre-release
55+
id: pre-release
56+
if: steps.check-release.outputs.should_release == 'true'
57+
run: |
58+
if [ -f ".changeset/pre.json" ]; then
59+
echo "npm_tag=$(jq -r '.tag' .changeset/pre.json)" >> "$GITHUB_OUTPUT"
60+
echo "is_pre=true" >> "$GITHUB_OUTPUT"
61+
else
62+
echo "npm_tag=latest" >> "$GITHUB_OUTPUT"
63+
echo "is_pre=false" >> "$GITHUB_OUTPUT"
64+
fi
5365
54-
- uses: actions/setup-node@v6
55-
if: steps.check-release.outputs.should-release == 'true'
56-
with:
57-
node-version: lts/*
58-
registry-url: https://registry.npmjs.org
66+
- name: Build
67+
if: steps.check-release.outputs.should_release == 'true'
68+
run: bun run build
5969

60-
- name: Publish to npm
61-
if: steps.check-release.outputs.should-release == 'true'
62-
run: npm publish --provenance --access public
70+
# Node required for npm publish --provenance (OIDC-based trusted publishing)
71+
- uses: ./.github/actions/setup-node
72+
if: steps.check-release.outputs.should_release == 'true'
6373

64-
- name: Create GitHub Release
65-
if: steps.check-release.outputs.should-release == 'true'
66-
run: |
67-
TAG="${{ steps.check-release.outputs.tag }}"
68-
git tag "$TAG"
69-
git push origin "$TAG"
70-
gh release create "$TAG" --generate-notes --title "$TAG"
71-
env:
72-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
74+
- name: Publish to npm
75+
if: steps.check-release.outputs.should_release == 'true'
76+
run: npm publish --provenance --tag ${{ steps.pre-release.outputs.npm_tag }}
77+
78+
- name: Create GitHub Release
79+
if: steps.check-release.outputs.should_release == 'true'
80+
run: |
81+
TAG="${{ steps.check-release.outputs.tag }}"
82+
FLAGS=(--generate-notes --title "$TAG" --target "${{ github.event.workflow_run.head_sha }}")
83+
84+
if [ "${{ steps.pre-release.outputs.is_pre }}" = "true" ]; then
85+
FLAGS+=(--prerelease)
86+
fi
87+
88+
gh release create "$TAG" "${FLAGS[@]}"
89+
env:
90+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

0 commit comments

Comments
 (0)