[ci] Add commit steps to new runtime_commit_artifacts_v2
Adds back the missing steps with a few tweaks to where previously some `github` context value was referenced, I changed it to read from the triggering workflow_run (ie the build on `main`) instead. ghstack-source-id: 4b0fa135f059ba925647b12972fa67ae2a49f2db Pull Request resolved: https://github.com/facebook/react/pull/30476
Lauren Tan committed
Jul 26, 2024 at 11:24 UTC
417e93ca193e3a5d5a09ecef38be0862f8e90126
1 file changed
+246
-4
.github/workflows/runtime_commit_artifacts_v2.yml
+246
-4
@@ -64,12 +64,13 @@ jobs:
64
path: "**/node_modules"
65
key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock', 'scripts/release/yarn.lock') }}
66
- run: yarn install --frozen-lockfile
67
+ name: yarn install (react)
68
- run: yarn install --frozen-lockfile
69
+ name: yarn install (scripts/release)
70
working-directory: scripts/release
71
- name: Download artifacts for base revision
72
run: |
71
- git fetch origin main
72
- GH_TOKEN=${{ github.token }} scripts/release/download-experimental-build-ghaction.js --commit=$(git rev-parse origin/main)
73
+ GH_TOKEN=${{ github.token }} scripts/release/download-experimental-build-ghaction.js --commit=${{ github.event.workflow_run.head_sha }}
74
- name: Display structure of build
75
run: ls -R build
76
- name: Strip @license from eslint plugin and react-refresh
@@ -126,9 +127,9 @@ jobs:
127
ls -R ./compiled-rn
128
- name: Add REVISION files
129
run: |
129
- echo ${{ github.sha }} >> ./compiled/facebook-www/REVISION
130
+ echo ${{ github.event.workflow_run.head_sha }} >> ./compiled/facebook-www/REVISION
131
cp ./compiled/facebook-www/REVISION ./compiled/facebook-www/REVISION_TRANSFORMS
131
- echo ${{ github.sha }} >> ./compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/REVISION
132
+ echo ${{ github.event.workflow_run.head_sha}} >> ./compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/REVISION
133
- name: "Get current version string"
134
id: get_current_version
135
run: |
@@ -149,3 +150,244 @@ jobs:
150
with:
151
name: compiled-rn
152
path: compiled-rn/
153
+
154
+ commit_www_artifacts:
155
+ needs: download_artifacts
156
+ if: ${{ (github.ref == 'refs/heads/main' && needs.download_artifacts.outputs.www_branch_count == '0') || github.ref == 'refs/heads/meta-www' }}
157
+ runs-on: ubuntu-latest
158
+ steps:
159
+ - uses: actions/checkout@v4
160
+ with:
161
+ ref: builds/facebook-www
162
+ - name: Ensure clean directory
163
+ run: rm -rf compiled
164
+ - uses: actions/download-artifact@v3
165
+ with:
166
+ name: compiled
167
+ path: compiled/
168
+ - name: Revert version changes
169
+ if: needs.download_artifacts.outputs.last_version_classic != '' && needs.download_artifacts.outputs.last_version_modern != ''
170
+ env:
171
+ CURRENT_VERSION_CLASSIC: ${{ needs.download_artifacts.outputs.current_version_classic }}
172
+ CURRENT_VERSION_MODERN: ${{ needs.download_artifacts.outputs.current_version_modern }}
173
+ LAST_VERSION_CLASSIC: ${{ needs.download_artifacts.outputs.last_version_classic }}
174
+ LAST_VERSION_MODERN: ${{ needs.download_artifacts.outputs.last_version_modern }}
175
+ run: |
176
+ echo "Reverting $CURRENT_VERSION_CLASSIC to $LAST_VERSION_CLASSIC"
177
+ grep -rl "$CURRENT_VERSION_CLASSIC" ./compiled || echo "No files found with $CURRENT_VERSION_CLASSIC"
178
+ grep -rl "$CURRENT_VERSION_CLASSIC" ./compiled | xargs -r sed -i -e "s/$CURRENT_VERSION_CLASSIC/$LAST_VERSION_CLASSIC/g"
179
+ grep -rl "$CURRENT_VERSION_CLASSIC" ./compiled || echo "Classic version reverted"
180
+ echo "===================="
181
+ echo "Reverting $CURRENT_VERSION_MODERN to $LAST_VERSION_MODERN"
182
+ grep -rl "$CURRENT_VERSION_MODERN" ./compiled || echo "No files found with $CURRENT_VERSION_MODERN"
183
+ grep -rl "$CURRENT_VERSION_MODERN" ./compiled | xargs -r sed -i -e "s/$CURRENT_VERSION_MODERN/$LAST_VERSION_MODERN/g"
184
+ grep -rl "$CURRENT_VERSION_MODERN" ./compiled || echo "Modern version reverted"
185
+ - name: Check for changes
186
+ id: check_should_commit
187
+ run: |
188
+ echo "Full git status"
189
+ git add .
190
+ git status
191
+ echo "===================="
192
+ if git status --porcelain | grep -qv '/REVISION'; then
193
+ echo "Changes detected"
194
+ echo "===== Changes ====="
195
+ git --no-pager diff -U0 | grep '^[+-]' | head -n 50
196
+ echo "==================="
197
+ echo "should_commit=true" >> "$GITHUB_OUTPUT"
198
+ else
199
+ echo "No Changes detected"
200
+ echo "should_commit=false" >> "$GITHUB_OUTPUT"
201
+ fi
202
+ - name: Re-apply version changes
203
+ if: steps.check_should_commit.outputs.should_commit == 'true' && needs.download_artifacts.outputs.last_version_classic != '' && needs.download_artifacts.outputs.last_version_modern != ''
204
+ env:
205
+ CURRENT_VERSION_CLASSIC: ${{ needs.download_artifacts.outputs.current_version_classic }}
206
+ CURRENT_VERSION_MODERN: ${{ needs.download_artifacts.outputs.current_version_modern }}
207
+ LAST_VERSION_CLASSIC: ${{ needs.download_artifacts.outputs.last_version_classic }}
208
+ LAST_VERSION_MODERN: ${{ needs.download_artifacts.outputs.last_version_modern }}
209
+ run: |
210
+ echo "Re-applying $LAST_VERSION_CLASSIC to $CURRENT_VERSION_CLASSIC"
211
+ grep -rl "$LAST_VERSION_CLASSIC" ./compiled || echo "No files found with $LAST_VERSION_CLASSIC"
212
+ grep -rl "$LAST_VERSION_CLASSIC" ./compiled | xargs -r sed -i -e "s/$LAST_VERSION_CLASSIC/$CURRENT_VERSION_CLASSIC/g"
213
+ grep -rl "$LAST_VERSION_CLASSIC" ./compiled || echo "Classic version re-applied"
214
+ echo "===================="
215
+ echo "Re-applying $LAST_VERSION_MODERN to $CURRENT_VERSION_MODERN"
216
+ grep -rl "$LAST_VERSION_MODERN" ./compiled || echo "No files found with $LAST_VERSION_MODERN"
217
+ grep -rl "$LAST_VERSION_MODERN" ./compiled | xargs -r sed -i -e "s/$LAST_VERSION_MODERN/$CURRENT_VERSION_MODERN/g"
218
+ grep -rl "$LAST_VERSION_MODERN" ./compiled || echo "Classic version re-applied"
219
+ - name: Will commit these changes
220
+ if: steps.check_should_commit.outputs.should_commit == 'true'
221
+ run: |
222
+ echo ":"
223
+ git status -u
224
+ - name: Commit changes to branch
225
+ if: steps.check_should_commit.outputs.should_commit == 'true'
226
+ uses: stefanzweifel/git-auto-commit-action@v4
227
+ with:
228
+ commit_message: |
229
+ ${{ github.event.workflow_run.head_commit.message }}
230
+
231
+ DiffTrain build for [${{ github.event.workflow_run.head_sha }}](https://github.com/facebook/react/commit/${{ github.event.workflow_run.head_sha }})
232
+ branch: builds/facebook-www
233
+ commit_user_name: ${{ github.event.workflow_run.actor.name }}
234
+ commit_user_email: ${{ github.event.workflow_run.actor.email || format('{0}@users.noreply.github.com', github.event.workflow_run.actor.name) }}
235
+ create_branch: true
236
+
237
+ commit_fbsource_artifacts:
238
+ needs: download_artifacts
239
+ if: ${{ (github.ref == 'refs/heads/main' && needs.download_artifacts.outputs.fbsource_branch_count == '0') || github.ref == 'refs/heads/meta-fbsource' }}
240
+ runs-on: ubuntu-latest
241
+ steps:
242
+ - uses: actions/checkout@v4
243
+ with:
244
+ ref: builds/facebook-fbsource
245
+ - name: Ensure clean directory
246
+ run: rm -rf compiled-rn
247
+ - uses: actions/download-artifact@v3
248
+ with:
249
+ name: compiled-rn
250
+ path: compiled-rn/
251
+ - name: Revert version changes
252
+ if: needs.download_artifacts.outputs.last_version_rn != ''
253
+ env:
254
+ CURRENT_VERSION: ${{ needs.download_artifacts.outputs.current_version_rn }}
255
+ LAST_VERSION: ${{ needs.download_artifacts.outputs.last_version_rn }}
256
+ run: |
257
+ echo "Reverting $CURRENT_VERSION to $LAST_VERSION"
258
+ grep -rl "$CURRENT_VERSION" ./compiled-rn || echo "No files found with $CURRENT_VERSION"
259
+ grep -rl "$CURRENT_VERSION" ./compiled-rn | xargs -r sed -i -e "s/$CURRENT_VERSION/$LAST_VERSION/g"
260
+ grep -rl "$CURRENT_VERSION" ./compiled-rn || echo "Version reverted"
261
+ - name: Check for changes
262
+ id: check_should_commit
263
+ run: |
264
+ echo "Full git status"
265
+ git add .
266
+ git --no-pager diff -U0 --cached | grep '^[+-]' | head -n 100
267
+ echo "===================="
268
+ # Ignore REVISION or lines removing @generated headers.
269
+ if git diff --cached ':(exclude)*REVISION' | grep -vE "^(@@|diff|index|\-\-\-|\+\+\+|\- \* @generated SignedSource)" | grep "^[+-]" > /dev/null; then
270
+ echo "Changes detected"
271
+ echo "===== Changes ====="
272
+ git --no-pager diff --cached ':(exclude)*REVISION' | grep -vE "^(@@|diff|index|\-\-\-|\+\+\+|\- \* @generated SignedSource)" | grep "^[+-]" | head -n 50
273
+ echo "==================="
274
+ echo "should_commit=true" >> "$GITHUB_OUTPUT"
275
+ else
276
+ echo "No Changes detected"
277
+ echo "should_commit=false" >> "$GITHUB_OUTPUT"
278
+ fi
279
+ - name: Re-apply version changes
280
+ if: steps.check_should_commit.outputs.should_commit == 'true' && needs.download_artifacts.outputs.last_version_rn != ''
281
+ env:
282
+ CURRENT_VERSION: ${{ needs.download_artifacts.outputs.current_version_rn }}
283
+ LAST_VERSION: ${{ needs.download_artifacts.outputs.last_version_rn }}
284
+ run: |
285
+ echo "Re-applying $LAST_VERSION to $CURRENT_VERSION"
286
+ grep -rl "$LAST_VERSION" ./compiled-rn || echo "No files found with $LAST_VERSION"
287
+ grep -rl "$LAST_VERSION" ./compiled-rn | xargs -r sed -i -e "s/$LAST_VERSION/$CURRENT_VERSION/g"
288
+ grep -rl "$LAST_VERSION" ./compiled-rn || echo "Version re-applied"
289
+ - name: Add files for signing
290
+ if: steps.check_should_commit.outputs.should_commit == 'true'
291
+ run: |
292
+ echo ":"
293
+ git add .
294
+ - name: Signing files
295
+ if: steps.check_should_commit.outputs.should_commit == 'true'
296
+ uses: actions/github-script@v6
297
+ with:
298
+ script: |
299
+ // TODO: Move this to a script file.
300
+ // We currently can't call scripts from the repo because
301
+ // at this point in the workflow, we're on the compiled
302
+ // artifact branch (so the scripts don't exist).
303
+ // We can fix this with a composite action in the main repo.
304
+ // This script is duplicated above.
305
+ const fs = require('fs');
306
+ const crypto = require('crypto');
307
+ const {execSync} = require('child_process');
308
+
309
+ // TODO: when we move this to a script, we can use this from npm.
310
+ // Copy of signedsource since we can't install deps on this branch.
311
+ const GENERATED = '@' + 'generated';
312
+ const NEWTOKEN = '<<SignedSource::*O*zOeWoEQle#+L!plEphiEmie@IsG>>';
313
+ const PATTERN = new RegExp(`${GENERATED} (?:SignedSource<<([a-f0-9]{32})>>)`);
314
+
315
+ const TokenNotFoundError = new Error(
316
+ `SignedSource.signFile(...): Cannot sign file without token: ${NEWTOKEN}`
317
+ );
318
+
319
+ function hash(data, encoding) {
320
+ const md5sum = crypto.createHash('md5');
321
+ md5sum.update(data, encoding);
322
+ return md5sum.digest('hex');
323
+ }
324
+
325
+ const SignedSource = {
326
+ getSigningToken() {
327
+ return `${GENERATED} ${NEWTOKEN}`;
328
+ },
329
+ isSigned(data) {
330
+ return PATTERN.exec(data) != null;
331
+ },
332
+ signFile(data) {
333
+ if (!data.includes(NEWTOKEN)) {
334
+ if (SignedSource.isSigned(data)) {
335
+ // Signing a file that was previously signed.
336
+ data = data.replace(PATTERN, SignedSource.getSigningToken());
337
+ } else {
338
+ throw TokenNotFoundError;
339
+ }
340
+ }
341
+ return data.replace(NEWTOKEN, `SignedSource<<${hash(data, 'utf8')}>>`);
342
+ },
343
+ };
344
+
345
+ const directory = './compiled-rn';
346
+ console.log('Signing files in directory:', directory);
347
+ try {
348
+ const result = execSync(`git status --porcelain ${directory}`, {encoding: 'utf8'});
349
+
350
+ // Parse the git status output to get file paths
351
+ const files = result.split('\n').filter(file => file.endsWith('.js'));
352
+
353
+ if (files.length === 0) {
354
+ throw new Error(
355
+ 'git status returned no files to sign. this job should not have run.'
356
+ );
357
+ } else {
358
+ files.forEach(line => {
359
+ const file = line.slice(3).trim();
360
+ if (file) {
361
+ console.log(' Signing file:', file);
362
+ const originalContents = fs.readFileSync(file, 'utf8');
363
+ const signedContents = SignedSource.signFile(
364
+ originalContents
365
+ // Need to add the header in, since it's not inserted at build time.
366
+ .replace(' */\n', ` * ${SignedSource.getSigningToken()}\n */\n`)
367
+ );
368
+
369
+ fs.writeFileSync(file, signedContents, 'utf8');
370
+ }
371
+ });
372
+ }
373
+ } catch (e) {
374
+ process.exitCode = 1;
375
+ console.error('Error signing files:', e);
376
+ }
377
+ - name: Will commit these changes
378
+ if: steps.check_should_commit.outputs.should_commit == 'true'
379
+ run: |
380
+ git add .
381
+ git status
382
+ - name: Commit changes to branch
383
+ if: steps.check_should_commit.outputs.should_commit == 'true'
384
+ uses: stefanzweifel/git-auto-commit-action@v4
385
+ with:
386
+ commit_message: |
387
+ ${{ github.event.workflow_run.head_commit.message }}
388
+
389
+ DiffTrain build for commit https://github.com/facebook/react/commit/${{ github.event.workflow_run.head_sha }}.
390
+ branch: builds/facebook-fbsource
391
+ commit_user_name: ${{ github.event.workflow_run.actor.name }}
392
+ commit_user_email: ${{ github.event.workflow_run.actor.email || format('{0}@users.noreply.github.com', github.event.workflow_run.actor.name) }}
393
+ create_branch: true