@@ -10,7 +10,42 @@ concurrency:
1010 cancel-in-progress : false
1111
1212jobs :
13+ prepare-release :
14+ runs-on : ubuntu-latest
15+ permissions :
16+ contents : write
17+ steps :
18+ - name : Get app token
19+ id : app-token
20+ uses : getsentry/action-github-app-token@d4b5da6c5e37703f8c3b3e43abb5705b46e159cc # v3.0.0
21+ with :
22+ app_id : ${{ secrets.GH_APP_ARRAY_RELEASER_APP_ID }}
23+ private_key : ${{ secrets.GH_APP_ARRAY_RELEASER_PRIVATE_KEY }}
24+
25+ - name : Extract version from tag
26+ id : version
27+ run : |
28+ TAG_VERSION="${GITHUB_REF#refs/tags/v}"
29+ echo "version=$TAG_VERSION" >> "$GITHUB_OUTPUT"
30+
31+ - name : Create draft release if absent
32+ env :
33+ GH_TOKEN : ${{ steps.app-token.outputs.token }}
34+ APP_VERSION : ${{ steps.version.outputs.version }}
35+ run : |
36+ # Pre-create a single draft release so every parallel publish job uploads
37+ # into the same release. Without this, electron-forge's GitHub publisher
38+ # creates-if-missing from each job at once, producing multiple releases for
39+ # one tag and scattering assets (the orphans get left as drafts).
40+ if gh release view "v$APP_VERSION" --repo PostHog/code >/dev/null 2>&1; then
41+ echo "Release v$APP_VERSION already exists — reusing it"
42+ else
43+ gh release create "v$APP_VERSION" --repo PostHog/code --draft \
44+ --title "v$APP_VERSION" --notes "Release v$APP_VERSION (build in progress)"
45+ fi
46+
1347 publish-macos :
48+ needs : [prepare-release]
1449 strategy :
1550 fail-fast : false
1651 matrix :
@@ -164,6 +199,7 @@ jobs:
164199 run : pnpm --filter code exec electron-forge publish --from-dry-run
165200
166201 publish-windows :
202+ needs : [prepare-release]
167203 runs-on : windows-latest
168204 permissions :
169205 id-token : write
@@ -245,6 +281,7 @@ jobs:
245281 run : pnpm --filter code run publish
246282
247283 publish-linux :
284+ needs : [prepare-release]
248285 strategy :
249286 fail-fast : false
250287 matrix :
0 commit comments