-
Notifications
You must be signed in to change notification settings - Fork 347
243 lines (228 loc) · 10.6 KB
/
Copy pathchangesets_release.yml
File metadata and controls
243 lines (228 loc) · 10.6 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
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
name: Changesets
on:
push:
branches:
- main
concurrency: ${{ github.workflow }}-${{ github.ref }}
permissions:
id-token: write # Required for OIDC
contents: write # Required to push tags and create releases
pull-requests: write # Required for changesets to create PRs
issues: write # Required for changesets to comment on issues about the release in which they were fixed
jobs:
changesets:
name: Make a PR or publish
runs-on: ubuntu-latest
outputs:
published: ${{ steps.changesets.outputs.published }}
sync_service_release_tag: ${{ steps.sync_service_release_tag.outputs.tag }}
agent_server_release_tag: ${{ steps.agent_server_release_tag.outputs.tag }}
desktop_release_version: ${{ steps.desktop_release.outputs.version }}
desktop_release_tag: ${{ steps.desktop_release.outputs.tag }}
mobile_release_version: ${{ steps.mobile_release.outputs.version }}
mobile_release_tag: ${{ steps.mobile_release.outputs.tag }}
server_rust_needs_release: ${{ steps.server_rust_release.outputs.needs_release }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version-file: '.tool-versions'
- uses: erlef/setup-beam@v1
with:
version-type: strict
version-file: '.tool-versions'
- run: pnpm install --frozen-lockfile
- run: pnpm run -r --filter './packages/**' build
- name: Create Release Pull Request or Publish
id: changesets
uses: changesets/action@v1
with:
version: pnpm ci:version
publish: pnpm ci:publish
title: 'chore: publish new package versions'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
HEX_API_KEY: ${{ secrets.HEX_API_KEY }}
- name: Capture the new sync-service release as an output (if any)
id: sync_service_release_tag
if: steps.changesets.outputs.published == 'true'
run: |
# Assign publishedPackages to a variable first to avoid any interpretation of JSON special chars by the shell
PUBLISHED_PACKAGES='${{ steps.changesets.outputs.publishedPackages }}'
# Use jq to pick the relevant package from the JSON array and format it into a <package>@<version> output
TAGS=$(echo "$PUBLISHED_PACKAGES" | jq -r '.[] | select(.name == "@core/sync-service") | .name + "@" + .version')
echo "tag=$TAGS" >> "$GITHUB_OUTPUT"
- name: Capture the new agents-server release as an output (if any)
id: agent_server_release_tag
if: steps.changesets.outputs.published == 'true'
run: |
PUBLISHED_PACKAGES='${{ steps.changesets.outputs.publishedPackages }}'
TAGS=$(echo "$PUBLISHED_PACKAGES" | jq -r '.[] | select(.name == "@electric-ax/agents-server") | .name + "@" + .version')
echo "tag=$TAGS" >> "$GITHUB_OUTPUT"
- name: Capture the new agents-desktop release as an output (if any)
id: desktop_release
if: steps.changesets.outputs.published == 'true'
run: |
PUBLISHED_PACKAGES='${{ steps.changesets.outputs.publishedPackages }}'
VERSION=$(echo "$PUBLISHED_PACKAGES" | jq -r '.[] | select(.name == "@electric-ax/agents-desktop") | .version' | head -n 1)
if [ -n "$VERSION" ]; then
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "tag=@electric-ax/agents-desktop@$VERSION" >> "$GITHUB_OUTPUT"
fi
- name: Capture the new agents-mobile release as an output (if any)
id: mobile_release
if: steps.changesets.outputs.published == 'true'
run: |
PUBLISHED_PACKAGES='${{ steps.changesets.outputs.publishedPackages }}'
VERSION=$(echo "$PUBLISHED_PACKAGES" | jq -r '.[] | select(.name == "@electric-ax/agents-mobile") | .version' | head -n 1)
if [ -n "$VERSION" ]; then
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "tag=@electric-ax/agents-mobile@$VERSION" >> "$GITHUB_OUTPUT"
fi
- name: Detect a server-rust release (private anchor → idempotent crates.io check)
id: server_rust_release
if: steps.changesets.outputs.published == 'true'
run: |
# @electric-ax/durable-streams-server-rust is `private: true` (changesets
# bumps it but never publishes it), so it is not in publishedPackages.
# The npm packages are disabled, so the crate is what actually publishes —
# check crates.io (the published artifact) for idempotency. Publish only if
# this version is not already on crates.io: idempotent across re-runs (and
# across unrelated releases that leave the server-rust version unchanged),
# and correct on the first run. The crate version is synced to this anchor
# at publish time by sync-cargo-version.mjs.
VERSION="$(node -p "require('./packages/durable-streams-rust/package.json').version")"
if curl -sf -H 'User-Agent: electric-sql-release-ci' "https://crates.io/api/v1/crates/durable-streams/$VERSION" >/dev/null 2>&1; then
echo "needs_release=false" >> "$GITHUB_OUTPUT"
else
echo "needs_release=true" >> "$GITHUB_OUTPUT"
fi
- name: Add latest tag to published packages
if: steps.changesets.outputs.published == 'true'
run: node scripts/tag-latest.mjs
- name: Comment on PRs about release
if: steps.changesets.outputs.published == 'true'
run: node scripts/comment-on-release.mjs
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PUBLISHED_PACKAGES: ${{ steps.changesets.outputs.publishedPackages }}
publish-to-dockerhub:
needs: changesets
if: ${{ needs.changesets.outputs.published == 'true' && needs.changesets.outputs.sync_service_release_tag != '' }}
uses: ./.github/workflows/sync_service_dockerhub_image.yml
secrets: inherit
with:
git_ref: ${{ needs.changesets.outputs.sync_service_release_tag }}
publish-agent-server-to-dockerhub:
needs: changesets
if: ${{ needs.changesets.outputs.published == 'true' && needs.changesets.outputs.agent_server_release_tag != '' }}
uses: ./.github/workflows/agent_server_dockerhub_image.yml
secrets: inherit
with:
git_ref: ${{ needs.changesets.outputs.agent_server_release_tag }}
publish-server-rust:
needs: changesets
# Publishes the `durable-streams` crate (crates.io); the npm packages are
# disabled inside server_rust_publish.yml. crates.io Trusted Publishing is
# configured for the crate.
if: ${{ needs.changesets.outputs.published == 'true' && needs.changesets.outputs.server_rust_needs_release == 'true' }}
uses: ./.github/workflows/server_rust_publish.yml
secrets: inherit
with:
git_ref: ${{ github.sha }}
publish-server-rust-to-dockerhub:
needs: [changesets, publish-server-rust]
if: ${{ needs.changesets.outputs.published == 'true' && needs.changesets.outputs.server_rust_needs_release == 'true' }}
uses: ./.github/workflows/server_rust_dockerhub_image.yml
secrets: inherit
with:
git_ref: ${{ github.sha }}
update-cloud-agents-server:
name: Update Agents Server version used by Cloud
runs-on: ubuntu-latest
needs: changesets
if: ${{ needs.changesets.outputs.published == 'true' && needs.changesets.outputs.agent_server_release_tag != '' }}
steps:
- name: Get Agents Server version
id: agents_server
run: |
RELEASE_TAG='${{ needs.changesets.outputs.agent_server_release_tag }}'
VERSION="${RELEASE_TAG##*@}"
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
- name: Trigger cloud agents server update
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ secrets.CROSSREPO_PAT }}
repository: electric-sql/stratovolt
event-type: update-agents-server
client-payload: |
{
"electric_commit_sha": "${{ github.sha }}",
"agents_server_release_tag": "${{ needs.changesets.outputs.agent_server_release_tag }}",
"agents_server_version": "${{ steps.agents_server.outputs.version }}"
}
publish-agents-desktop:
needs: changesets
if: ${{ needs.changesets.outputs.published == 'true' && needs.changesets.outputs.desktop_release_tag != '' }}
uses: ./.github/workflows/agents_desktop_build.yml
permissions:
contents: write
secrets: inherit
with:
channel: stable
version: ${{ needs.changesets.outputs.desktop_release_version }}
git_ref: ${{ needs.changesets.outputs.desktop_release_tag }}
publish: true
sign: false
release_tag: ${{ needs.changesets.outputs.desktop_release_tag }}
release_name: Electric Agents Desktop v${{ needs.changesets.outputs.desktop_release_version }}
publish-agents-mobile:
needs: changesets
if: ${{ needs.changesets.outputs.published == 'true' && needs.changesets.outputs.mobile_release_tag != '' }}
uses: ./.github/workflows/agents_mobile_build.yml
# The reusable workflow declares PR-comment permissions even when the stable
# release channel skips those steps. GitHub validates declared permissions
# before evaluating those conditions.
permissions:
actions: read
contents: read
issues: write
pull-requests: write
secrets: inherit
with:
channel: stable
version: ${{ needs.changesets.outputs.mobile_release_version }}
git_ref: ${{ needs.changesets.outputs.mobile_release_tag }}
platform: android
profile: production
submit: true
release_tag: ${{ needs.changesets.outputs.mobile_release_tag }}
release_name: Electric Agents Mobile v${{ needs.changesets.outputs.mobile_release_version }}
update-cloud:
name: Update Electric version used by Cloud
runs-on: ubuntu-latest
needs: changesets
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
# Get the Electric version of the Docker image
- name: Get Electric version
id: sync_version
run: |
VERSION=$(jq -r '.version' packages/sync-service/package.json)
echo "version=${VERSION}" >> $GITHUB_OUTPUT
- name: Trigger cloud update
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ secrets.CROSSREPO_PAT }}
repository: electric-sql/stratovolt
event-type: update-electric
client-payload: |
{
"electric_commit_sha": "${{ github.sha }}",
"electric_docker_version": "${{ steps.sync_version.outputs.version }}"
}