From 2883d28b2d6b62f8a887364662dac35848053476 Mon Sep 17 00:00:00 2001 From: Lauren Tan Date: Fri, 26 Jul 2024 11:24:11 -0400 Subject: [PATCH] [ci] Unfork runtime_commit_artifacts Promotes v2 to the primary workflow file so that we don't double write to the protected branches. Note: this may break DiffTrain temporarily, I will fix forward if so ghstack-source-id: f6505a72f2edcf73aadf827d3a41e34d2a3227ba Pull Request resolved: https://github.com/facebook/react/pull/30477 --- .../workflows/runtime_commit_artifacts.yml | 144 ++----- .../workflows/runtime_commit_artifacts_v2.yml | 393 ------------------ 2 files changed, 36 insertions(+), 501 deletions(-) delete mode 100644 .github/workflows/runtime_commit_artifacts_v2.yml diff --git a/.github/workflows/runtime_commit_artifacts.yml b/.github/workflows/runtime_commit_artifacts.yml index c665f9b1bd40e..410cc3000ca33 100644 --- a/.github/workflows/runtime_commit_artifacts.yml +++ b/.github/workflows/runtime_commit_artifacts.yml @@ -1,8 +1,11 @@ -name: (Runtime) Commit Artifacts for Meta WWW and fbsource +name: (Runtime) Commit Artifacts for Meta WWW and fbsource V2 on: - push: - branches: [main, meta-www, meta-fbsource] + workflow_run: + workflows: ["(Runtime) Build and Test"] + types: [completed] + branches: + - main env: TZ: /usr/share/zoneinfo/America/Los_Angeles @@ -49,102 +52,27 @@ jobs: run: | echo "www_branch_count=$(git ls-remote --heads origin "refs/heads/meta-www" | wc -l)" >> "$GITHUB_OUTPUT" echo "fbsource_branch_count=$(git ls-remote --heads origin "refs/heads/meta-fbsource" | wc -l)" >> "$GITHUB_OUTPUT" - - name: Download and unzip artifacts - uses: actions/github-script@v6 - env: - CIRCLECI_TOKEN: ${{secrets.CIRCLECI_TOKEN_DIFFTRAIN}} + - uses: actions/setup-node@v4 with: - script: | - // TODO: Move this to a script file. - const cp = require('child_process'); - - function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - function execHelper(command, options, streamStdout = false) { - return new Promise((resolve, reject) => { - const proc = cp.exec( - command, - options, - (error, stdout) => (error ? reject(error) : resolve(stdout.trim())), - ); - if (streamStdout) { - proc.stdout.pipe(process.stdout); - } - }); - } - - let artifactsUrl = null; - // This is a temporary, dirty hack to avoid needing a GitHub auth token in the circleci - // workflow to notify this GitHub action. Sorry! - let iter = 0; - spinloop: while (iter < 15) { - const res = await github.rest.repos.listCommitStatusesForRef({ - owner: context.repo.owner, - repo: context.repo.repo, - ref: context.sha - }); - for (const status of res.data) { - if (/process_artifacts_combined/.test(status.context)) { - switch (status.state) { - case 'pending': { - console.log(`${status.context} is still pending`); - break; - } - case 'failure': - case 'error': { - throw new Error(`${status.context} has failed or errored`); - } - case 'success': { - // The status does not include a build ID, but we can extract it - // from the URL. I couldn't find a better way to do this. - const ciBuildId = /\/facebook\/react\/([0-9]+)/.exec( - status.target_url, - )[1]; - if (Number.parseInt(ciBuildId, 10) + '' === ciBuildId) { - artifactsUrl = - `https://circleci.com/api/v1.1/project/github/facebook/react/${ciBuildId}/artifacts`; - console.log(`Found artifactsUrl: ${artifactsUrl}`); - break spinloop; - } else { - throw new Error(`${ciBuildId} isn't a number`); - } - break; - } - default: { - throw new Error(`Unhandled status state: ${status.state}`); - break; - } - } - } - } - iter++; - console.log("Sleeping for 60s..."); - await sleep(60_000); - } - if (artifactsUrl != null) { - const {CIRCLECI_TOKEN} = process.env; - const res = await fetch(artifactsUrl, { - headers: { - 'Circle-Token': CIRCLECI_TOKEN - } - }); - const data = await res.json(); - if (!Array.isArray(data) && data.message != null) { - throw `CircleCI returned: ${data.message}`; - } - for (const artifact of data) { - if (artifact.path === 'build.tgz') { - console.log(`Downloading and unzipping ${artifact.url}`); - await execHelper( - `curl -L ${artifact.url} -H "Circle-Token: ${CIRCLECI_TOKEN}" | tar -xvz` - ); - } - } - } else { - process.exitCode = 1; - } + node-version: 18.20.1 + cache: yarn + cache-dependency-path: yarn.lock + - name: Restore cached node_modules + uses: actions/cache@v4 + id: node_modules + with: + path: "**/node_modules" + key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock', 'scripts/release/yarn.lock') }} + - run: yarn install --frozen-lockfile + name: yarn install (react) + - run: yarn install --frozen-lockfile + name: yarn install (scripts/release) + working-directory: scripts/release + - name: Download artifacts for base revision + run: | + GH_TOKEN=${{ github.token }} scripts/release/download-experimental-build-ghaction.js --commit=${{ github.event.workflow_run.head_sha }} + - name: Display structure of build + run: ls -R build - name: Strip @license from eslint plugin and react-refresh run: | sed -i -e 's/ @license React*//' \ @@ -199,9 +127,9 @@ jobs: ls -R ./compiled-rn - name: Add REVISION files run: | - echo ${{ github.sha }} >> ./compiled/facebook-www/REVISION + echo ${{ github.event.workflow_run.head_sha }} >> ./compiled/facebook-www/REVISION cp ./compiled/facebook-www/REVISION ./compiled/facebook-www/REVISION_TRANSFORMS - echo ${{ github.sha }} >> ./compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/REVISION + echo ${{ github.event.workflow_run.head_sha}} >> ./compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/REVISION - name: "Get current version string" id: get_current_version run: | @@ -298,12 +226,12 @@ jobs: uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: | - ${{ github.event.head_commit.message }} + ${{ github.event.workflow_run.head_commit.message }} - DiffTrain build for [${{ github.sha }}](https://github.com/facebook/react/commit/${{ github.sha }}) + DiffTrain build for [${{ github.event.workflow_run.head_sha }}](https://github.com/facebook/react/commit/${{ github.event.workflow_run.head_sha }}) branch: builds/facebook-www - commit_user_name: ${{ github.actor }} - commit_user_email: ${{ github.actor }}@users.noreply.github.com + commit_user_name: ${{ github.event.workflow_run.actor.name }} + commit_user_email: ${{ github.event.workflow_run.actor.email || format('{0}@users.noreply.github.com', github.event.workflow_run.actor.name) }} create_branch: true commit_fbsource_artifacts: @@ -456,10 +384,10 @@ jobs: uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: | - ${{ github.event.head_commit.message }} + ${{ github.event.workflow_run.head_commit.message }} - DiffTrain build for commit https://github.com/facebook/react/commit/${{ github.sha }}. + DiffTrain build for commit https://github.com/facebook/react/commit/${{ github.event.workflow_run.head_sha }}. branch: builds/facebook-fbsource - commit_user_name: ${{ github.actor }} - commit_user_email: ${{ github.actor }}@users.noreply.github.com + commit_user_name: ${{ github.event.workflow_run.actor.name }} + commit_user_email: ${{ github.event.workflow_run.actor.email || format('{0}@users.noreply.github.com', github.event.workflow_run.actor.name) }} create_branch: true diff --git a/.github/workflows/runtime_commit_artifacts_v2.yml b/.github/workflows/runtime_commit_artifacts_v2.yml deleted file mode 100644 index 410cc3000ca33..0000000000000 --- a/.github/workflows/runtime_commit_artifacts_v2.yml +++ /dev/null @@ -1,393 +0,0 @@ -name: (Runtime) Commit Artifacts for Meta WWW and fbsource V2 - -on: - workflow_run: - workflows: ["(Runtime) Build and Test"] - types: [completed] - branches: - - main - -env: - TZ: /usr/share/zoneinfo/America/Los_Angeles - -jobs: - download_artifacts: - runs-on: ubuntu-latest - outputs: - www_branch_count: ${{ steps.check_branches.outputs.www_branch_count }} - fbsource_branch_count: ${{ steps.check_branches.outputs.fbsource_branch_count }} - last_version_classic: ${{ steps.get_last_version_www.outputs.last_version_classic }} - last_version_modern: ${{ steps.get_last_version_www.outputs.last_version_modern }} - last_version_rn: ${{ steps.get_last_version_rn.outputs.last_version_rn }} - current_version_classic: ${{ steps.get_current_version.outputs.current_version_classic }} - current_version_modern: ${{ steps.get_current_version.outputs.current_version_modern }} - current_version_rn: ${{ steps.get_current_version.outputs.current_version_rn }} - steps: - - uses: actions/checkout@v4 - with: - ref: builds/facebook-www - - name: "Get last version string for www" - id: get_last_version_www - run: | - # Empty checks only needed for backwards compatibility,can remove later. - VERSION_CLASSIC=$( [ -f ./compiled/facebook-www/VERSION_CLASSIC ] && cat ./compiled/facebook-www/VERSION_CLASSIC || echo '' ) - VERSION_MODERN=$( [ -f ./compiled/facebook-www/VERSION_MODERN ] && cat ./compiled/facebook-www/VERSION_MODERN || echo '' ) - echo "Last classic version is $VERSION_CLASSIC" - echo "Last modern version is $VERSION_MODERN" - echo "last_version_classic=$VERSION_CLASSIC" >> "$GITHUB_OUTPUT" - echo "last_version_modern=$VERSION_MODERN" >> "$GITHUB_OUTPUT" - - uses: actions/checkout@v4 - with: - ref: builds/facebook-fbsource - - name: "Get last version string for rn" - id: get_last_version_rn - run: | - # Empty checks only needed for backwards compatibility,can remove later. - VERSION_NATIVE_FB=$( [ -f ./compiled-rn/VERSION_NATIVE_FB ] && cat ./compiled-rn/VERSION_NATIVE_FB || echo '' ) - echo "Last rn version is $VERSION_NATIVE_FB" - echo "last_version_rn=$VERSION_NATIVE_FB" >> "$GITHUB_OUTPUT" - - uses: actions/checkout@v4 - - name: "Check branches" - id: check_branches - run: | - echo "www_branch_count=$(git ls-remote --heads origin "refs/heads/meta-www" | wc -l)" >> "$GITHUB_OUTPUT" - echo "fbsource_branch_count=$(git ls-remote --heads origin "refs/heads/meta-fbsource" | wc -l)" >> "$GITHUB_OUTPUT" - - uses: actions/setup-node@v4 - with: - node-version: 18.20.1 - cache: yarn - cache-dependency-path: yarn.lock - - name: Restore cached node_modules - uses: actions/cache@v4 - id: node_modules - with: - path: "**/node_modules" - key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock', 'scripts/release/yarn.lock') }} - - run: yarn install --frozen-lockfile - name: yarn install (react) - - run: yarn install --frozen-lockfile - name: yarn install (scripts/release) - working-directory: scripts/release - - name: Download artifacts for base revision - run: | - GH_TOKEN=${{ github.token }} scripts/release/download-experimental-build-ghaction.js --commit=${{ github.event.workflow_run.head_sha }} - - name: Display structure of build - run: ls -R build - - name: Strip @license from eslint plugin and react-refresh - run: | - sed -i -e 's/ @license React*//' \ - build/oss-experimental/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js \ - build/oss-experimental/react-refresh/cjs/react-refresh-babel.development.js - - name: Move relevant files for React in www into compiled - run: | - # Move the facebook-www folder into compiled - mkdir ./compiled - mv build/facebook-www ./compiled - - # Move ReactAllWarnings.js to facebook-www - mkdir ./compiled/facebook-www/__test_utils__ - mv build/__test_utils__/ReactAllWarnings.js ./compiled/facebook-www/__test_utils__/ReactAllWarnings.js - - # Move eslint-plugin-react-hooks into facebook-www - mv build/oss-experimental/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js \ - ./compiled/facebook-www/eslint-plugin-react-hooks.js - - # Move unstable_server-external-runtime.js into facebook-www - mv build/oss-experimental/react-dom/unstable_server-external-runtime.js \ - ./compiled/facebook-www/unstable_server-external-runtime.js - - # Move react-refresh-babel.development.js into babel-plugin-react-refresh - mkdir ./compiled/babel-plugin-react-refresh - mv build/oss-experimental/react-refresh/cjs/react-refresh-babel.development.js \ - ./compiled/babel-plugin-react-refresh/index.js - - ls -R ./compiled - - name: Move relevant files for React in fbsource into compiled-rn - run: | - BASE_FOLDER='compiled-rn/facebook-fbsource/xplat/js' - mkdir -p ${BASE_FOLDER}/react-native-github/Libraries/Renderer/ - mkdir -p ${BASE_FOLDER}/RKJSModules/vendor/react/{scheduler,react,react-is,react-test-renderer}/ - - # Move React Native renderer - mv build/react-native/implementations/ $BASE_FOLDER/react-native-github/Libraries/Renderer/ - mv build/react-native/shims/ $BASE_FOLDER/react-native-github/Libraries/Renderer/ - mv build/facebook-react-native/scheduler/cjs/ $BASE_FOLDER/RKJSModules/vendor/react/scheduler/ - mv build/facebook-react-native/react/cjs/ $BASE_FOLDER/RKJSModules/vendor/react/react/ - mv build/facebook-react-native/react-is/cjs/ $BASE_FOLDER/RKJSModules/vendor/react/react-is/ - mv build/facebook-react-native/react-test-renderer/cjs/ $BASE_FOLDER/RKJSModules/vendor/react/react-test-renderer/ - - # Delete OSS renderer. OSS renderer is synced through internal script. - RENDERER_FOLDER=$BASE_FOLDER/react-native-github/Libraries/Renderer/implementations/ - rm $RENDERER_FOLDER/ReactFabric-{dev,prod,profiling}.js - rm $RENDERER_FOLDER/ReactNativeRenderer-{dev,prod,profiling}.js - - # Move React Native version file - mv build/facebook-react-native/VERSION_NATIVE_FB ./compiled-rn/VERSION_NATIVE_FB - - ls -R ./compiled-rn - - name: Add REVISION files - run: | - echo ${{ github.event.workflow_run.head_sha }} >> ./compiled/facebook-www/REVISION - cp ./compiled/facebook-www/REVISION ./compiled/facebook-www/REVISION_TRANSFORMS - echo ${{ github.event.workflow_run.head_sha}} >> ./compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/REVISION - - name: "Get current version string" - id: get_current_version - run: | - VERSION_CLASSIC=$(cat ./compiled/facebook-www/VERSION_CLASSIC) - VERSION_MODERN=$(cat ./compiled/facebook-www/VERSION_MODERN) - VERSION_NATIVE_FB=$(cat ./compiled-rn/VERSION_NATIVE_FB) - echo "Current classic version is $VERSION_CLASSIC" - echo "Current modern version is $VERSION_MODERN" - echo "Current rn version is $VERSION_NATIVE_FB" - echo "current_version_classic=$VERSION_CLASSIC" >> "$GITHUB_OUTPUT" - echo "current_version_modern=$VERSION_MODERN" >> "$GITHUB_OUTPUT" - echo "current_version_rn=$VERSION_NATIVE_FB" >> "$GITHUB_OUTPUT" - - uses: actions/upload-artifact@v3 - with: - name: compiled - path: compiled/ - - uses: actions/upload-artifact@v3 - with: - name: compiled-rn - path: compiled-rn/ - - commit_www_artifacts: - needs: download_artifacts - if: ${{ (github.ref == 'refs/heads/main' && needs.download_artifacts.outputs.www_branch_count == '0') || github.ref == 'refs/heads/meta-www' }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: builds/facebook-www - - name: Ensure clean directory - run: rm -rf compiled - - uses: actions/download-artifact@v3 - with: - name: compiled - path: compiled/ - - name: Revert version changes - if: needs.download_artifacts.outputs.last_version_classic != '' && needs.download_artifacts.outputs.last_version_modern != '' - env: - CURRENT_VERSION_CLASSIC: ${{ needs.download_artifacts.outputs.current_version_classic }} - CURRENT_VERSION_MODERN: ${{ needs.download_artifacts.outputs.current_version_modern }} - LAST_VERSION_CLASSIC: ${{ needs.download_artifacts.outputs.last_version_classic }} - LAST_VERSION_MODERN: ${{ needs.download_artifacts.outputs.last_version_modern }} - run: | - echo "Reverting $CURRENT_VERSION_CLASSIC to $LAST_VERSION_CLASSIC" - grep -rl "$CURRENT_VERSION_CLASSIC" ./compiled || echo "No files found with $CURRENT_VERSION_CLASSIC" - grep -rl "$CURRENT_VERSION_CLASSIC" ./compiled | xargs -r sed -i -e "s/$CURRENT_VERSION_CLASSIC/$LAST_VERSION_CLASSIC/g" - grep -rl "$CURRENT_VERSION_CLASSIC" ./compiled || echo "Classic version reverted" - echo "====================" - echo "Reverting $CURRENT_VERSION_MODERN to $LAST_VERSION_MODERN" - grep -rl "$CURRENT_VERSION_MODERN" ./compiled || echo "No files found with $CURRENT_VERSION_MODERN" - grep -rl "$CURRENT_VERSION_MODERN" ./compiled | xargs -r sed -i -e "s/$CURRENT_VERSION_MODERN/$LAST_VERSION_MODERN/g" - grep -rl "$CURRENT_VERSION_MODERN" ./compiled || echo "Modern version reverted" - - name: Check for changes - id: check_should_commit - run: | - echo "Full git status" - git add . - git status - echo "====================" - if git status --porcelain | grep -qv '/REVISION'; then - echo "Changes detected" - echo "===== Changes =====" - git --no-pager diff -U0 | grep '^[+-]' | head -n 50 - echo "===================" - echo "should_commit=true" >> "$GITHUB_OUTPUT" - else - echo "No Changes detected" - echo "should_commit=false" >> "$GITHUB_OUTPUT" - fi - - name: Re-apply version changes - if: steps.check_should_commit.outputs.should_commit == 'true' && needs.download_artifacts.outputs.last_version_classic != '' && needs.download_artifacts.outputs.last_version_modern != '' - env: - CURRENT_VERSION_CLASSIC: ${{ needs.download_artifacts.outputs.current_version_classic }} - CURRENT_VERSION_MODERN: ${{ needs.download_artifacts.outputs.current_version_modern }} - LAST_VERSION_CLASSIC: ${{ needs.download_artifacts.outputs.last_version_classic }} - LAST_VERSION_MODERN: ${{ needs.download_artifacts.outputs.last_version_modern }} - run: | - echo "Re-applying $LAST_VERSION_CLASSIC to $CURRENT_VERSION_CLASSIC" - grep -rl "$LAST_VERSION_CLASSIC" ./compiled || echo "No files found with $LAST_VERSION_CLASSIC" - grep -rl "$LAST_VERSION_CLASSIC" ./compiled | xargs -r sed -i -e "s/$LAST_VERSION_CLASSIC/$CURRENT_VERSION_CLASSIC/g" - grep -rl "$LAST_VERSION_CLASSIC" ./compiled || echo "Classic version re-applied" - echo "====================" - echo "Re-applying $LAST_VERSION_MODERN to $CURRENT_VERSION_MODERN" - grep -rl "$LAST_VERSION_MODERN" ./compiled || echo "No files found with $LAST_VERSION_MODERN" - grep -rl "$LAST_VERSION_MODERN" ./compiled | xargs -r sed -i -e "s/$LAST_VERSION_MODERN/$CURRENT_VERSION_MODERN/g" - grep -rl "$LAST_VERSION_MODERN" ./compiled || echo "Classic version re-applied" - - name: Will commit these changes - if: steps.check_should_commit.outputs.should_commit == 'true' - run: | - echo ":" - git status -u - - name: Commit changes to branch - if: steps.check_should_commit.outputs.should_commit == 'true' - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: | - ${{ github.event.workflow_run.head_commit.message }} - - DiffTrain build for [${{ github.event.workflow_run.head_sha }}](https://github.com/facebook/react/commit/${{ github.event.workflow_run.head_sha }}) - branch: builds/facebook-www - commit_user_name: ${{ github.event.workflow_run.actor.name }} - commit_user_email: ${{ github.event.workflow_run.actor.email || format('{0}@users.noreply.github.com', github.event.workflow_run.actor.name) }} - create_branch: true - - commit_fbsource_artifacts: - needs: download_artifacts - if: ${{ (github.ref == 'refs/heads/main' && needs.download_artifacts.outputs.fbsource_branch_count == '0') || github.ref == 'refs/heads/meta-fbsource' }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: builds/facebook-fbsource - - name: Ensure clean directory - run: rm -rf compiled-rn - - uses: actions/download-artifact@v3 - with: - name: compiled-rn - path: compiled-rn/ - - name: Revert version changes - if: needs.download_artifacts.outputs.last_version_rn != '' - env: - CURRENT_VERSION: ${{ needs.download_artifacts.outputs.current_version_rn }} - LAST_VERSION: ${{ needs.download_artifacts.outputs.last_version_rn }} - run: | - echo "Reverting $CURRENT_VERSION to $LAST_VERSION" - grep -rl "$CURRENT_VERSION" ./compiled-rn || echo "No files found with $CURRENT_VERSION" - grep -rl "$CURRENT_VERSION" ./compiled-rn | xargs -r sed -i -e "s/$CURRENT_VERSION/$LAST_VERSION/g" - grep -rl "$CURRENT_VERSION" ./compiled-rn || echo "Version reverted" - - name: Check for changes - id: check_should_commit - run: | - echo "Full git status" - git add . - git --no-pager diff -U0 --cached | grep '^[+-]' | head -n 100 - echo "====================" - # Ignore REVISION or lines removing @generated headers. - if git diff --cached ':(exclude)*REVISION' | grep -vE "^(@@|diff|index|\-\-\-|\+\+\+|\- \* @generated SignedSource)" | grep "^[+-]" > /dev/null; then - echo "Changes detected" - echo "===== Changes =====" - git --no-pager diff --cached ':(exclude)*REVISION' | grep -vE "^(@@|diff|index|\-\-\-|\+\+\+|\- \* @generated SignedSource)" | grep "^[+-]" | head -n 50 - echo "===================" - echo "should_commit=true" >> "$GITHUB_OUTPUT" - else - echo "No Changes detected" - echo "should_commit=false" >> "$GITHUB_OUTPUT" - fi - - name: Re-apply version changes - if: steps.check_should_commit.outputs.should_commit == 'true' && needs.download_artifacts.outputs.last_version_rn != '' - env: - CURRENT_VERSION: ${{ needs.download_artifacts.outputs.current_version_rn }} - LAST_VERSION: ${{ needs.download_artifacts.outputs.last_version_rn }} - run: | - echo "Re-applying $LAST_VERSION to $CURRENT_VERSION" - grep -rl "$LAST_VERSION" ./compiled-rn || echo "No files found with $LAST_VERSION" - grep -rl "$LAST_VERSION" ./compiled-rn | xargs -r sed -i -e "s/$LAST_VERSION/$CURRENT_VERSION/g" - grep -rl "$LAST_VERSION" ./compiled-rn || echo "Version re-applied" - - name: Add files for signing - if: steps.check_should_commit.outputs.should_commit == 'true' - run: | - echo ":" - git add . - - name: Signing files - if: steps.check_should_commit.outputs.should_commit == 'true' - uses: actions/github-script@v6 - with: - script: | - // TODO: Move this to a script file. - // We currently can't call scripts from the repo because - // at this point in the workflow, we're on the compiled - // artifact branch (so the scripts don't exist). - // We can fix this with a composite action in the main repo. - // This script is duplicated above. - const fs = require('fs'); - const crypto = require('crypto'); - const {execSync} = require('child_process'); - - // TODO: when we move this to a script, we can use this from npm. - // Copy of signedsource since we can't install deps on this branch. - const GENERATED = '@' + 'generated'; - const NEWTOKEN = '<>'; - const PATTERN = new RegExp(`${GENERATED} (?:SignedSource<<([a-f0-9]{32})>>)`); - - const TokenNotFoundError = new Error( - `SignedSource.signFile(...): Cannot sign file without token: ${NEWTOKEN}` - ); - - function hash(data, encoding) { - const md5sum = crypto.createHash('md5'); - md5sum.update(data, encoding); - return md5sum.digest('hex'); - } - - const SignedSource = { - getSigningToken() { - return `${GENERATED} ${NEWTOKEN}`; - }, - isSigned(data) { - return PATTERN.exec(data) != null; - }, - signFile(data) { - if (!data.includes(NEWTOKEN)) { - if (SignedSource.isSigned(data)) { - // Signing a file that was previously signed. - data = data.replace(PATTERN, SignedSource.getSigningToken()); - } else { - throw TokenNotFoundError; - } - } - return data.replace(NEWTOKEN, `SignedSource<<${hash(data, 'utf8')}>>`); - }, - }; - - const directory = './compiled-rn'; - console.log('Signing files in directory:', directory); - try { - const result = execSync(`git status --porcelain ${directory}`, {encoding: 'utf8'}); - - // Parse the git status output to get file paths - const files = result.split('\n').filter(file => file.endsWith('.js')); - - if (files.length === 0) { - throw new Error( - 'git status returned no files to sign. this job should not have run.' - ); - } else { - files.forEach(line => { - const file = line.slice(3).trim(); - if (file) { - console.log(' Signing file:', file); - const originalContents = fs.readFileSync(file, 'utf8'); - const signedContents = SignedSource.signFile( - originalContents - // Need to add the header in, since it's not inserted at build time. - .replace(' */\n', ` * ${SignedSource.getSigningToken()}\n */\n`) - ); - - fs.writeFileSync(file, signedContents, 'utf8'); - } - }); - } - } catch (e) { - process.exitCode = 1; - console.error('Error signing files:', e); - } - - name: Will commit these changes - if: steps.check_should_commit.outputs.should_commit == 'true' - run: | - git add . - git status - - name: Commit changes to branch - if: steps.check_should_commit.outputs.should_commit == 'true' - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: | - ${{ github.event.workflow_run.head_commit.message }} - - DiffTrain build for commit https://github.com/facebook/react/commit/${{ github.event.workflow_run.head_sha }}. - branch: builds/facebook-fbsource - commit_user_name: ${{ github.event.workflow_run.actor.name }} - commit_user_email: ${{ github.event.workflow_run.actor.email || format('{0}@users.noreply.github.com', github.event.workflow_run.actor.name) }} - create_branch: true