name: Commit Artifacts for Meta WWW and fbsource
on:
push:
branches: [main, meta-www, meta-fbsource]
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 }}
steps:
- uses: actions/checkout@v3
- 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"- name: Download and unzip artifacts
uses: actions/github-script@v6
env:
CIRCLECI_TOKEN: ${{secrets.CIRCLECI_TOKEN_DIFFTRAIN}}
with:
script: |
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;}- 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: |
mkdir -p ./compiledmkdir -p ./compiled/facebook-wwwmkdir -p ./compiled/babel-plugin-react-refresh# Copy the facebook-www folder into compiledmv build/facebook-www ./compiled# Copy WARNINGS to facebook-wwwmv build/WARNINGS ./compiled/facebook-www/WARNINGS# Copy eslint-plugin-react-hooks into facebook-wwwmv build/oss-experimental/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js \./compiled/facebook-www/eslint-plugin-react-hooks.js# Copy unstable_server-external-runtime.js into facebook-wwwmv build/oss-stable/react-dom/unstable_server-external-runtime.js \./compiled/facebook-www/unstable_server-external-runtime.js# Copy react-refresh-babel.development.js into babel-plugin-react-refreshmv build/oss-experimental/react-refresh/cjs/react-refresh-babel.development.js \./compiled/babel-plugin-react-refresh/index.jsls -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/{scheduler,react,react-is,react-test-renderer}/# Move React Native renderermv 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/scheduler/mv build/facebook-react-native/react/cjs/ $BASE_FOLDER/RKJSModules/vendor/react/mv build/facebook-react-native/react-is/cjs/ $BASE_FOLDER/RKJSModules/vendor/react-is/mv build/facebook-react-native/react-test-renderer/cjs/ $BASE_FOLDER/RKJSModules/vendor/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}.jsrm $RENDERER_FOLDER/ReactNativeRenderer-{dev,prod,profiling}.jsls -R ./compiled- name: Add REVISION file
run: |
echo ${{ github.sha }} >> ./compiled/facebook-www/REVISIONecho ${{ github.sha }} >> ./compiled-rn/facebook-fbsource/xplat/js/react-native-github/Libraries/Renderer/REVISION- 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@v3
with:
ref: builds/facebook-www
- name: Ensure clean directory
run: rm -rf compiled
- uses: actions/download-artifact@v3
with:
name: compiled
path: compiled/
- run: git status -u
- name: Check if only the REVISION file has changed
id: check_should_commit
run: |
if git status --porcelain | grep -qv '/REVISION$'; thenecho "should_commit=true" >> "$GITHUB_OUTPUT"elseecho "should_commit=false" >> "$GITHUB_OUTPUT"fi- 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.head_commit.message }}DiffTrain build for [${{ github.sha }}](https://github.com/facebook/react/commit/${{ github.sha }})branch: builds/facebook-www
commit_user_name: ${{ github.actor }}
commit_user_email: ${{ github.actor }}@users.noreply.github.com
create_branch: true
commit_fbsource_artifacts:
needs: download_artifacts
runs-on: ubuntu-latest
if: ${{ (github.ref == 'refs/heads/main' && needs.download_artifacts.outputs.fbsource_branch_count == '0') || github.ref == 'refs/heads/meta-fbsource' }}
steps:
- uses: actions/checkout@v3
with:
ref: main
repository: facebook/react-fbsource-import
token: ${{secrets.FBSOURCE_SYNC_PUSH_TOKEN}}
- name: Ensure clean directory
run: rm -rf compiled-rn
- uses: actions/download-artifact@v3
with:
name: compiled-rn
path: compiled-rn/
- run: git status -u
- name: Check if only the REVISION file has changed
id: check_should_commit
run: |
if git status --porcelain | grep -qv '/REVISION$'; thenecho "should_commit=true" >> "$GITHUB_OUTPUT"elseecho "should_commit=false" >> "$GITHUB_OUTPUT"fi- 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.head_commit.message }}DiffTrain build for commit https://github.com/facebook/react/commit/${{ github.sha }}.commit_user_name: ${{ github.actor }}
commit_user_email: ${{ github.actor }}@users.noreply.github.com