-
-
Notifications
You must be signed in to change notification settings - Fork 2
225 lines (192 loc) · 6.41 KB
/
Copy pathpipeline.yml
File metadata and controls
225 lines (192 loc) · 6.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
name: Pipeline
on:
push:
branches: [main]
paths:
- 'package.json'
- 'pnpm-lock.yaml'
- 'pnpm-workspace.yaml'
- 'turbo.json'
- 'packages/**/src/**'
- 'packages/**/package.json'
- '.changeset/**'
- '.github/workflows/pipeline.yml'
pull_request:
branches: [main]
types: [opened, synchronize, reopened]
paths:
- 'package.json'
- 'pnpm-lock.yaml'
- 'pnpm-workspace.yaml'
- 'turbo.json'
- 'packages/**/src/**'
- 'packages/**/package.json'
- '.changeset/**'
- '.github/workflows/pipeline.yml'
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
# Cancel in-progress runs on PRs (new push makes old run irrelevant)
# but never cancel on main (could interrupt a release)
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
build:
name: Building
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: ./.github/actions/node
- name: Build all packages
run: pnpm build
- name: Upload dist artifacts
uses: actions/upload-artifact@v4
with:
name: dist
path: packages/*/dist/
retention-days: 1
check:
name: Type Checking
needs: [build]
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: ./.github/actions/node
- name: Download dist artifacts
uses: actions/download-artifact@v4
with:
name: dist
path: packages
- name: Run the type checker
run: pnpm check --filter "./packages/*"
lint:
name: Linting
needs: [build]
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: ./.github/actions/node
- name: Download dist artifacts
uses: actions/download-artifact@v4
with:
name: dist
path: packages
- name: Run the linter
run: pnpm lint
test:
name: Testing
needs: [build]
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: ./.github/actions/node
- name: Download dist artifacts
uses: actions/download-artifact@v4
with:
name: dist
path: packages
- name: Run tests with coverage
run: pnpm coverage
# Single upload of the merged report, tagged with every package flag.
# Each flag's `paths:` in codecov.yml slices the report server-side, so
# one upload feeds all the per-package coverage badges.
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v7
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: .coverage/lcov.info
flags: config,format-po,integration,integration-carbon,integration-react,plugin-babel,plugin-unplugin,transform-js,transform-jsx
- name: Upload coverage artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: coverage
path: .coverage/
retention-days: 7
process:
name: Processing Changesets
needs: [check, lint, test]
runs-on: ubuntu-latest
outputs:
hasChangesets: ${{ steps.changesets.outputs.hasChangesets }}
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
permissions:
contents: write
id-token: write
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: ./.github/actions/node
# Only maintains the version PR. Publishing is done below so that a
# release produces one tag and one GitHub release for the whole
# workspace, rather than one of each per package.
- name: Process changesets
id: changesets
uses: changesets/action@v1
with:
version: pnpm run release:version
title: 'Pending Releases'
commit: 'Update changelog and release'
# `changeset publish` skips anything already on the registry, so this is
# safe to re-run: a rerun after a partial failure publishes the remainder.
- name: Publish packages
if: ${{ steps.changesets.outputs.hasChangesets == 'false' }}
run: pnpm run release:publish
- name: Build release notes
id: notes
if: ${{ steps.changesets.outputs.hasChangesets == 'false' }}
run: node scripts/release-notes.mjs
# Driven by the version on disk rather than by whether this run happened
# to publish, so a rerun can finish a release whose tag or GitHub release
# was left behind by an earlier failure. Both are no-ops once they exist.
- name: Tag and create release
if: ${{ steps.changesets.outputs.hasChangesets == 'false' }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ steps.notes.outputs.version }}
run: |
if [ -z "$VERSION" ]; then
echo 'No shared version to release.'
exit 0
fi
if git ls-remote --exit-code --tags origin "v$VERSION" >/dev/null 2>&1; then
echo "Tag v$VERSION already exists."
else
git tag "v$VERSION"
git push origin "v$VERSION"
fi
if gh release view "v$VERSION" >/dev/null 2>&1; then
echo "Release v$VERSION already exists."
else
gh release create "v$VERSION" \
--title "v$VERSION" \
--notes-file RELEASE_NOTES.md
fi
snapshot:
name: Releasing Snapshot
needs: [process]
runs-on: ubuntu-latest
# Betas exist to preview changes that are waiting on a release, so this
# keys off pending changesets rather than off whether a publish happened.
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && needs.process.outputs.hasChangesets == 'true' }}
permissions:
contents: read
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: ./.github/actions/node
- name: Publish snapshot version
run: |
pnpm run release:snapshot:version
pnpm run release:snapshot:publish