Skip to content

Commit 5ea8639

Browse files
committed
Fix post-release recovery failures
1 parent 8bb110d commit 5ea8639

5 files changed

Lines changed: 35 additions & 16 deletions

File tree

.github/workflows/bump-podfile-lock.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ on:
1212

1313
jobs:
1414
bump-podfile-lock:
15-
runs-on: macos-latest
15+
runs-on: macos-15
1616
steps:
1717
- name: Checkout
1818
uses: actions/checkout@v6

.github/workflows/create-draft-release.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ on:
99
checkoutRef:
1010
required: false
1111
type: string
12+
releaseId:
13+
required: false
14+
type: string
1215
hermesVersion:
1316
required: false
1417
type: string
@@ -37,6 +40,7 @@ jobs:
3740
git config --local user.email "bot@reactnative.dev"
3841
git config --local user.name "React Native Bot"
3942
- name: Create draft release
43+
if: inputs.releaseId == ''
4044
uses: actions/github-script@v8
4145
id: create-draft-release
4246
with:
@@ -49,7 +53,7 @@ jobs:
4953
- name: Upload release assets for DotSlash
5054
uses: actions/github-script@v8
5155
env:
52-
RELEASE_ID: ${{ steps.create-draft-release.outputs.result }}
56+
RELEASE_ID: ${{ inputs.releaseId || steps.create-draft-release.outputs.result }}
5357
with:
5458
script: |
5559
const {uploadReleaseAssetsForDotSlashFiles} = require('./scripts/releases/upload-release-assets-for-dotslash.js');

.github/workflows/publish-npm.yml

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ on:
2828
description: Tag whose successful publish needs post-release recovery
2929
required: false
3030
type: string
31+
draft-release-id:
32+
description: Existing draft release ID when resuming post-release recovery
33+
required: false
34+
type: string
3135
# nightly build @ 2:15 AM UTC
3236
schedule:
3337
- cron: '15 2 * * *'
@@ -48,6 +52,7 @@ jobs:
4852
- id: mode
4953
env:
5054
RECOVERY_RELEASE_TAG: ${{ inputs.release-tag }}
55+
RECOVERY_DRAFT_RELEASE_ID: ${{ inputs.draft-release-id }}
5156
run: |
5257
if [[ "${{ github.ref_type }}" == "tag" ]]; then
5358
echo "mode=release" >> $GITHUB_OUTPUT
@@ -58,6 +63,10 @@ jobs:
5863
echo "Invalid release tag: $RECOVERY_RELEASE_TAG" >&2
5964
exit 1
6065
fi
66+
if [[ -n "$RECOVERY_DRAFT_RELEASE_ID" && ! "$RECOVERY_DRAFT_RELEASE_ID" =~ ^[0-9]+$ ]]; then
67+
echo "Invalid draft release ID: $RECOVERY_DRAFT_RELEASE_ID" >&2
68+
exit 1
69+
fi
6170
echo "mode=post-release" >> $GITHUB_OUTPUT
6271
echo "release-type=" >> $GITHUB_OUTPUT
6372
echo "release-tag=$RECOVERY_RELEASE_TAG" >> $GITHUB_OUTPUT
@@ -234,7 +243,7 @@ jobs:
234243
always() &&
235244
needs.determine_mode.result == 'success' &&
236245
((needs.determine_mode.outputs.mode == 'release' && needs.publish_react_native.result == 'success') ||
237-
needs.determine_mode.outputs.mode == 'post-release')
246+
(needs.determine_mode.outputs.mode == 'post-release' && inputs.draft-release-id == ''))
238247
env:
239248
REACT_NATIVE_BOT_GITHUB_TOKEN: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }}
240249
steps:
@@ -294,7 +303,7 @@ jobs:
294303
always() &&
295304
needs.determine_mode.result == 'success' &&
296305
((needs.determine_mode.outputs.mode == 'release' && needs.publish_react_native.result == 'success') ||
297-
needs.determine_mode.outputs.mode == 'post-release')
306+
(needs.determine_mode.outputs.mode == 'post-release' && inputs.draft-release-id == ''))
298307
uses: ./.github/workflows/generate-changelog.yml
299308
secrets: inherit
300309
with:
@@ -319,13 +328,15 @@ jobs:
319328
if: |
320329
always() &&
321330
needs.determine_mode.result == 'success' &&
322-
needs.generate_changelog.result == 'success' &&
323331
needs.set_hermes_versions.result == 'success' &&
324-
(needs.determine_mode.outputs.mode == 'release' || needs.determine_mode.outputs.mode == 'post-release')
332+
((needs.determine_mode.outputs.mode == 'release' && needs.generate_changelog.result == 'success') ||
333+
(needs.determine_mode.outputs.mode == 'post-release' &&
334+
(needs.generate_changelog.result == 'success' || inputs.draft-release-id != '')))
325335
uses: ./.github/workflows/create-draft-release.yml
326336
secrets: inherit
327337
with:
328338
releaseVersion: ${{ needs.determine_mode.outputs.release-tag }}
329339
checkoutRef: ${{ needs.determine_mode.outputs.release-tag }}
340+
releaseId: ${{ inputs.draft-release-id }}
330341
hermesVersion: ${{ needs.set_hermes_versions.outputs.HERMES_VERSION }}
331342
hermesV1Version: ${{ needs.set_hermes_versions.outputs.HERMES_V1_VERSION }}

scripts/releases/__tests__/__snapshots__/upload-release-assets-for-dotslash-test.js.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ Array [
2828
Array [
2929
Object {
3030
"asset_id": "1",
31-
"owner": "facebook",
31+
"owner": "react",
3232
"repo": "react-native",
3333
},
3434
],
@@ -47,7 +47,7 @@ Array [
4747
"content-type": "text/plain",
4848
},
4949
"name": "test.tar.gz",
50-
"owner": "facebook",
50+
"owner": "react",
5151
"release_id": "1",
5252
"repo": "react-native",
5353
},
@@ -114,7 +114,7 @@ Array [
114114
"content-type": "text/plain",
115115
},
116116
"name": "test.tar.gz",
117-
"owner": "facebook",
117+
"owner": "react",
118118
"release_id": "1",
119119
"repo": "react-native",
120120
},
@@ -194,7 +194,7 @@ Array [
194194
"content-type": "text/plain",
195195
},
196196
"name": "test.tar.gz",
197-
"owner": "facebook",
197+
"owner": "react",
198198
"release_id": "1",
199199
"repo": "react-native",
200200
},

scripts/releases/upload-release-assets-for-dotslash.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ const nullthrows = require('nullthrows');
2525
const path = require('path');
2626
const {parseArgs} = require('util');
2727

28+
// Upload POSTs are not preserved when GitHub redirects from the former owner.
29+
const GITHUB_OWNER = 'react';
30+
const GITHUB_REPO = 'react-native';
31+
2832
/*::
2933
import type {DotSlashProvider, DotSlashHttpProvider, DotSlashArtifactInfo} from './utils/dotslash-utils';
3034
import type {IOctokit} from './utils/octokit-utils';
@@ -138,8 +142,8 @@ async function getReleaseAssetMap(
138142
octokit /*: IOctokit */,
139143
) /*: Promise<ReleaseAssetMap> */ {
140144
const existingAssets = await octokit.repos.listReleaseAssets({
141-
owner: 'facebook',
142-
repo: 'react-native',
145+
owner: GITHUB_OWNER,
146+
repo: GITHUB_REPO,
143147
release_id: releaseId,
144148
});
145149
return new Map(existingAssets.data.map(asset => [asset.name, asset]));
@@ -305,8 +309,8 @@ async function maybeDeleteExistingReleaseAsset(
305309
}
306310
console.log(`[${name}] Deleting existing release asset...`);
307311
await octokit.repos.deleteReleaseAsset({
308-
owner: 'facebook',
309-
repo: 'react-native',
312+
owner: GITHUB_OWNER,
313+
repo: GITHUB_REPO,
310314
asset_id: existingAsset.id,
311315
});
312316
}
@@ -360,8 +364,8 @@ async function uploadAndVerifyReleaseAsset(
360364
const {
361365
data: {browser_download_url},
362366
} = await octokit.repos.uploadReleaseAsset({
363-
owner: 'facebook',
364-
repo: 'react-native',
367+
owner: GITHUB_OWNER,
368+
repo: GITHUB_REPO,
365369
release_id: releaseId,
366370
name,
367371
data,

0 commit comments

Comments
 (0)