From e04f82ce2b482124121d8845fcdd8f94b8850d64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ramos?= Date: Thu, 9 Nov 2017 13:18:53 -0800 Subject: [PATCH] Fix website deploys on master Summary: Use newer CircleCI 2.0 environment variable names, being consistent with CircleCI config. Closes https://github.com/facebook/react-native/pull/16778 Differential Revision: D6288751 Pulled By: hramos fbshipit-source-id: 079ffaaea1ed3b715a12b07ed7738750672eee4e --- website/publish-gh-pages.js | 197 +++++++++++++++++++----------------- 1 file changed, 104 insertions(+), 93 deletions(-) diff --git a/website/publish-gh-pages.js b/website/publish-gh-pages.js index d31c683c1..7ceea38eb 100644 --- a/website/publish-gh-pages.js +++ b/website/publish-gh-pages.js @@ -25,6 +25,7 @@ const { const CIRCLE_BRANCH = process.env.CIRCLE_BRANCH; const CIRCLE_PROJECT_USERNAME = process.env.CIRCLE_PROJECT_USERNAME; const CI_PULL_REQUEST = process.env.CI_PULL_REQUEST; +const CIRCLE_PR_USERNAME = process.env.CIRCLE_PR_USERNAME; const GIT_USER = process.env.GIT_USER; const remoteBranch = `https://${GIT_USER}@github.com/facebook/react-native.git`; @@ -33,6 +34,16 @@ if (!which('git')) { exit(1); } +if (CIRCLE_PR_USERNAME) { + echo('Skipping website deployment, this build was triggered from a commit in a pull request.'); + exit(0); +} + +if (CIRCLE_PROJECT_USERNAME !== 'facebook') { + echo('Skipping website deployment, this build was not triggered by a commit on the Facebook org.'); + exit(0); +} + let version; let areVersionlessSectionsToBeDeployed = false; if (CIRCLE_BRANCH.indexOf('-stable') !== -1) { @@ -45,107 +56,107 @@ if (CIRCLE_BRANCH.indexOf('-stable') !== -1) { rm('-rf', 'build'); mkdir('-p', 'build'); // if current commit is tagged "latest" we do a release to gh-pages root +echo('Current commit:'); const currentCommit = exec('git rev-parse HEAD').stdout.trim(); +echo('Searching for commit tagged "latest"...'); const latestTagCommit = exec('git ls-remote origin latest').stdout.split(/\s/)[0]; // pass along which branch contains latest version so that gh-pages root could mark it as latest +echo(`Searching for branch that contains commit ${latestTagCommit}...`); const branchWithLatestTag = exec(`git branch -r --contains ${latestTagCommit}`).stdout.split('/')[1]; let latestVersion = ''; if (branchWithLatestTag.indexOf('-stable') !== -1) { latestVersion = branchWithLatestTag.slice(0, branchWithLatestTag.indexOf('-stable')); } -if (!CI_PULL_REQUEST && CIRCLE_PROJECT_USERNAME === 'facebook') { - echo(`Building branch ${version}, preparing to push to gh-pages`); - // if code is running in a branch in CI, commit changes to gh-pages branch - cd('build'); - rm('-rf', 'react-native-gh-pages'); - - if (exec(`git clone ${remoteBranch} react-native-gh-pages`).code !== 0) { - echo('Error: Git clone failed'); - exit(1); - } - - cd('react-native-gh-pages'); - - if (exec('git checkout origin/gh-pages').code + - exec('git checkout -b gh-pages').code + - exec('git branch --set-upstream-to=origin/gh-pages').code !== 0 - ) { - echo('Error: Git checkout gh-pages failed'); - exit(1); - } - cd('releases'); - let releasesFolders = ls('-d', '*'); - cd('..'); - let versions = releasesFolders.filter(name => name !== 'next'); - if (version !== 'next' && versions.indexOf(version) === -1) { - versions.push(version); - } - - versions.sort(semverCmp).reverse(); - - // generate to releases/XX when branch name indicates that it is some sort of release - if (version) { - echo(`------------ DEPLOYING /releases/${version}`); - rm('-rf', `releases/${version}`); - mkdir('-p', `releases/${version}`); - cd('../..'); - if (exec(`RN_DEPLOYMENT_PATH=releases/${version} RN_VERSION=${version} RN_LATEST_VERSION=${latestVersion} \ - RN_AVAILABLE_DOCS_VERSIONS=${versions.join(',')} node server/generate.js`).code !== 0) { - echo('Error: Generating HTML failed'); - exit(1); - } - cd('build/react-native-gh-pages'); - // blog, showcase, support are copied separately - let toCopy = ls('../react-native') - .filter(file => (file !== 'blog') && (file !== 'showcase.html') && (file !== 'support.html')) - .map(file => `../react-native/${file}`); - cp('-R', toCopy, `releases/${version}`); - // versions.html is located in root of website and updated with every release - cp('../react-native/versions.html', '.'); - } - // generate to root folder when commit is tagged as latest, i.e. stable and needs to be shown at the root of repo - if (currentCommit === latestTagCommit) { - echo('------------ DEPLOYING latest'); - // leave only releases and blog folder - rm('-rf', ls('*').filter(name => (name !== 'releases') && (name !== 'blog') && (name !== 'showcase.html') && (name !== 'support.html'))); - cd('../..'); - if (exec(`RN_VERSION=${version} RN_LATEST_VERSION=${latestVersion} \ - RN_AVAILABLE_DOCS_VERSIONS=${versions} node server/generate.js`).code !== 0) { - echo('Error: Generating HTML failed'); - exit(1); - } - cd('build/react-native-gh-pages'); - // blog, showcase, support are copied separately - let toCopy = ls('../react-native') - .filter(file => (file !== 'blog') && (file !== 'showcase.html') && (file !== 'support.html')) - .map(file => `../react-native/${file}`); - cp('-R', toCopy, '.'); - } - // blog, showcase, support are versionless, we always build them in root file - if (areVersionlessSectionsToBeDeployed) { - echo('------------ COPYING blog'); - rm('-rf', 'blog'); - cp('-R', '../react-native/blog', '.'); - echo('------------ COPYING showcase'); - cp('../react-native/showcase.html', '.'); - echo('------------ COPYING support'); - cp('../react-native/support.html', '.'); - } - if (currentCommit === latestTagCommit || version) { - exec('git status'); - exec('git add -A .'); - if (exec('git diff-index --quiet HEAD --').code !== 0) { - if (exec(`git commit -m "Updated docs for ${version}"`).code !== 0) { - echo('Error: Git commit gh-pages failed'); - exit(1); - } - if (exec('git push origin gh-pages').code !== 0) { - echo('Error: Git push gh-pages failed'); - exit(1); - } - } - echo('------------ gh-pages updated'); - } +echo(`Building static website based on the ${version === 'next' ? 'master' : version} branch, preparing to push assets to GitHub Pages via the 'gh-pages' branch)...`); +// if code is running in a branch in CI, commit changes to gh-pages branch +cd('build'); +rm('-rf', 'react-native-gh-pages'); +if (exec(`git clone ${remoteBranch} react-native-gh-pages`).code !== 0) { + echo('Error: Git clone failed'); + exit(1); +} + +cd('react-native-gh-pages'); + +if (exec('git checkout origin/gh-pages').code + + exec('git checkout -b gh-pages').code + + exec('git branch --set-upstream-to=origin/gh-pages').code !== 0 + ) { + echo('Error: Git checkout gh-pages failed'); + exit(1); +} +cd('releases'); +let releasesFolders = ls('-d', '*'); +cd('..'); +let versions = releasesFolders.filter(name => name !== 'next'); +if (version !== 'next' && versions.indexOf(version) === -1) { + versions.push(version); +} + +versions.sort(semverCmp).reverse(); + +// generate to releases/XX when branch name indicates that it is some sort of release +if (version) { + echo(`------------ DEPLOYING /releases/${version}`); + rm('-rf', `releases/${version}`); + mkdir('-p', `releases/${version}`); + cd('../..'); + if (exec(`RN_DEPLOYMENT_PATH=releases/${version} RN_VERSION=${version} RN_LATEST_VERSION=${latestVersion} \ + RN_AVAILABLE_DOCS_VERSIONS=${versions.join(',')} node server/generate.js`).code !== 0) { + echo('Error: Generating HTML failed'); + exit(1); + } + cd('build/react-native-gh-pages'); + // blog, showcase, support are copied separately + let toCopy = ls('../react-native') + .filter(file => (file !== 'blog') && (file !== 'showcase.html') && (file !== 'support.html')) + .map(file => `../react-native/${file}`); + cp('-R', toCopy, `releases/${version}`); + // versions.html is located in root of website and updated with every release + cp('../react-native/versions.html', '.'); +} +// generate to root folder when commit is tagged as latest, i.e. stable and needs to be shown at the root of repo +if (currentCommit === latestTagCommit) { + echo('------------ DEPLOYING latest'); + // leave only releases and blog folder + rm('-rf', ls('*').filter(name => (name !== 'releases') && (name !== 'blog') && (name !== 'showcase.html') && (name !== 'support.html'))); + cd('../..'); + if (exec(`RN_VERSION=${version} RN_LATEST_VERSION=${latestVersion} \ + RN_AVAILABLE_DOCS_VERSIONS=${versions} node server/generate.js`).code !== 0) { + echo('Error: Generating HTML failed'); + exit(1); + } + cd('build/react-native-gh-pages'); + // blog, showcase, support are copied separately + let toCopy = ls('../react-native') + .filter(file => (file !== 'blog') && (file !== 'showcase.html') && (file !== 'support.html')) + .map(file => `../react-native/${file}`); + cp('-R', toCopy, '.'); +} +// blog, showcase, support are versionless, we always build them in root file +if (areVersionlessSectionsToBeDeployed) { + echo('------------ COPYING blog'); + rm('-rf', 'blog'); + cp('-R', '../react-native/blog', '.'); + echo('------------ COPYING showcase'); + cp('../react-native/showcase.html', '.'); + echo('------------ COPYING support'); + cp('../react-native/support.html', '.'); +} +if (currentCommit === latestTagCommit || version) { + exec('git status'); + exec('git add -A .'); + if (exec('git diff-index --quiet HEAD --').code !== 0) { + if (exec(`git commit -m "Updated docs for ${version}"`).code !== 0) { + echo('Error: Git commit gh-pages failed'); + exit(1); + } + if (exec('git push origin gh-pages').code !== 0) { + echo('Error: Git push gh-pages failed'); + exit(1); + } + } + echo('------------ gh-pages updated'); }