-
Notifications
You must be signed in to change notification settings - Fork 0
163 lines (141 loc) · 5.78 KB
/
release.yml
File metadata and controls
163 lines (141 loc) · 5.78 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
name: Release
# Manual-only release for v0.x. Pick patch / minor / major from the Actions UI.
# Auto-triggers (cron + repository_dispatch) are commented out until the
# pipeline is proven across a few manual releases.
on:
workflow_dispatch:
inputs:
version_bump:
description: 'patch | minor | major'
required: false
default: 'patch'
# repository_dispatch:
# types: [openapi-updated]
# schedule:
# - cron: '0 6 * * *'
jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
id-token: write
steps:
- uses: actions/checkout@v6
with:
token: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/setup-node@v6
with:
node-version: '24'
registry-url: 'https://registry.npmjs.org'
- uses: oven-sh/setup-bun@v2
- run: bun install --frozen-lockfile
- name: Regenerate types from spec
run: bun run generate
- name: Spec drift gate
run: |
if ! git diff --exit-code -- specs/openapi.json packages/ui/src/types/; then
echo "OpenAPI spec or generated types are stale relative to live API. Local must be in sync before release."
exit 1
fi
- name: Sync docs from spec
run: bun run docs:sync
- name: Check if spec changed
id: diff
run: |
OLD=$(git show HEAD:specs/openapi.json 2>/dev/null | jq -cS '{paths, components}' || echo '')
NEW=$(jq -cS '{paths, components}' specs/openapi.json)
if [ "$OLD" = "$NEW" ]; then
echo "changed=false" >> $GITHUB_OUTPUT
else
echo "changed=true" >> $GITHUB_OUTPUT
fi
- name: Lint
if: steps.diff.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
run: bun run check
- name: Typecheck
if: steps.diff.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
run: bun run typecheck
- name: Build
if: steps.diff.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
run: bun run build
- name: Unit tests
if: steps.diff.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
run: bun run test
- name: Install Playwright browsers
if: steps.diff.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
run: bunx playwright install --with-deps chromium firefox webkit
- name: E2E tests
if: steps.diff.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
run: bun run test:e2e
- name: UI audit (no [object Object], no empty-state drift)
if: steps.diff.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
run: |
bun run preview &
PREVIEW_PID=$!
for i in $(seq 1 30); do
curl -sf http://localhost:3001 > /dev/null && break
sleep 1
done
bun run audit
AUDIT_EXIT=$?
kill $PREVIEW_PID 2>/dev/null || true
exit $AUDIT_EXIT
- name: Bump versions and rebuild
id: bump
if: steps.diff.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
run: |
BUMP="${{ github.event.inputs.version_bump || 'patch' }}"
bump() {
local file="$1/package.json"
local current new
current=$(jq -r '.version' "$file")
IFS='.' read -r MA MI PA <<< "$current"
case "$BUMP" in
major) MA=$((MA+1)); MI=0; PA=0 ;;
minor) MI=$((MI+1)); PA=0 ;;
*) PA=$((PA+1)) ;;
esac
new="$MA.$MI.$PA"
jq --arg v "$new" '.version = $v' "$file" > "$file.tmp" && mv "$file.tmp" "$file"
echo "$1 -> $new"
}
bump packages/ui
bump packages/ui-react
VERSION=$(jq -r '.version' packages/ui/package.json)
echo "version=$VERSION" >> $GITHUB_OUTPUT
bun run build
- name: Publish @roxyapi/ui
if: steps.diff.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
run: |
npm install -g npm@latest
(cd packages/ui && npm publish --access public --provenance)
- name: Publish @roxyapi/ui-react
if: steps.diff.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
run: |
(cd packages/ui-react && npm publish --access public --provenance)
- name: Commit, tag, push
if: steps.diff.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
VERSION=$(node -p "require('./packages/ui/package.json').version")
git add packages/ packages/ui/dist packages/ui-react/dist registry/ apps/docs/manifest.js README.md AGENTS.md
git commit -m "release: v$VERSION"
git tag "v$VERSION"
git push --follow-tags
- name: Pack npm tarballs for release assets
if: steps.diff.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
run: |
mkdir -p .release-assets
(cd packages/ui && npm pack --pack-destination ../../.release-assets)
(cd packages/ui-react && npm pack --pack-destination ../../.release-assets)
ls -la .release-assets/
- name: Create GitHub release
if: steps.diff.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
uses: softprops/action-gh-release@v3
with:
tag_name: v${{ steps.bump.outputs.version }}
generate_release_notes: true
make_latest: 'true'
files: |
.release-assets/*.tgz