diff --git a/.deployment.config.json b/.deployment.config.json index d48def71665..592bd08afb9 100644 --- a/.deployment.config.json +++ b/.deployment.config.json @@ -190,7 +190,8 @@ "no_endpoint": true }, "package_rollout": { - "only_consider_changesets_after": "b244fe702d8e96d016a52715e92c8131acfde3ba" + "only_consider_changesets_after": "b244fe702d8e96d016a52715e92c8131acfde3ba", + "disabled": $[STOP_AT_DEV] }, "deployment_config_version": 7 } diff --git a/.github/workflows/masterbot.yml b/.github/workflows/masterbot.yml index 63ea20a1555..e41bb8fd1da 100644 --- a/.github/workflows/masterbot.yml +++ b/.github/workflows/masterbot.yml @@ -3,6 +3,7 @@ on: push: branches: - master + - 'prerelease/**' jobs: build: name: 'Build' diff --git a/Jenkinsfile b/Jenkinsfile index 47c15776e84..3faf3493cdf 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,10 +1,17 @@ +def parseSemanticVersion(String version) { + def semanticVersionRegex = /^(((([0-9]+)\.[0-9]+)\.[0-9]+)(?:\-.+)?)$/ + def (_, prerelease, patch, minor, major) = (version =~ semanticVersionRegex)[0] + return [major, minor, patch, prerelease] +} + node('heavy && linux && docker') { checkout scm def tag = sh(script: "git tag --contains", returnStdout: true).trim() def isBump = !!tag - def isMaster = env.BRANCH_NAME == 'master' + def isOnReleaseBranch = env.BRANCH_NAME == 'master' + def isOnPrereleaseBranch = env.BRANCH_NAME.startsWith('prerelease/') - if (!isMaster) { + if (!isOnReleaseBranch && !isOnPrereleaseBranch) { return } @@ -32,12 +39,14 @@ node('heavy && linux && docker') { sh 'git clean -f' } - withDockerContainer(image: 'node:16', args: '-u=root -e HOME=/tmp -e NPM_CONFIG_PREFIX=/tmp/.npm') { - stage('Npm publish') { - withCredentials([ - string(credentialsId: 'NPM_TOKEN', variable: 'NPM_TOKEN')]) { - sh "echo //registry.npmjs.org/:_authToken=${NPM_TOKEN} > ~/.npmrc" - sh 'npm run npm:publish:alpha || true' + if (isOnReleaseBranch) { + withDockerContainer(image: 'node:16', args: '-u=root -e HOME=/tmp -e NPM_CONFIG_PREFIX=/tmp/.npm') { + stage('Npm publish') { + withCredentials([ + string(credentialsId: 'NPM_TOKEN', variable: 'NPM_TOKEN')]) { + sh "echo //registry.npmjs.org/:_authToken=${NPM_TOKEN} > ~/.npmrc" + sh 'npm run npm:publish:alpha || true' + } } } } @@ -48,23 +57,22 @@ node('heavy && linux && docker') { headless = readJSON file: 'packages/headless/package.json' atomic = readJSON file: 'packages/atomic/package.json' atomicReact = readJSON file: 'packages/atomic-react/package.json' - semanticVersionRegex = /^([^\.]*)\.[^\.]*/ - - (headlessMinor, headlessMajor) = (headless.version =~ semanticVersionRegex)[0] - (atomicMinor, atomicMajor) = (atomic.version =~ semanticVersionRegex)[0] - (atomicReactMinor, atomicReactMajor) = (atomicReact.version =~ semanticVersionRegex)[0] + (headlessMajor, headlessMinor, headlessPatch) = parseSemanticVersion(headless.version) + (atomicMajor, atomicMinor, atomicPatch) = parseSemanticVersion(atomic.version) + (atomicReactMajor, atomicReactMinor, atomicReactPatch) = parseSemanticVersion(atomicReact) sh "deployment-package package create --with-deploy \ --resolve HEADLESS_MAJOR_VERSION=${headlessMajor} \ --resolve HEADLESS_MINOR_VERSION=${headlessMinor} \ - --resolve HEADLESS_PATCH_VERSION=${headless.version} \ + --resolve HEADLESS_PATCH_VERSION=${headlessPatch} \ --resolve ATOMIC_MAJOR_VERSION=${atomicMajor} \ --resolve ATOMIC_MINOR_VERSION=${atomicMinor} \ - --resolve ATOMIC_PATCH_VERSION=${atomic.version} \ + --resolve ATOMIC_PATCH_VERSION=${atomicPatch} \ --resolve ATOMIC_REACT_MAJOR_VERSION=${atomicReactMajor} \ --resolve ATOMIC_REACT_MINOR_VERSION=${atomicReactMinor} \ - --resolve ATOMIC_REACT_PATCH_VERSION=${atomicReact.version} \ + --resolve ATOMIC_REACT_PATCH_VERSION=${atomicReactPatch} \ + --resolve STOP_AT_DEV=${!isOnReleaseBranch} \ || true" } } diff --git a/scripts/deploy/bump-version.js b/scripts/deploy/bump-version.js index 1d543f86a2b..9f895120b08 100644 --- a/scripts/deploy/bump-version.js +++ b/scripts/deploy/bump-version.js @@ -1,26 +1,23 @@ const {promisify} = require('util'); const exec = promisify(require('child_process').exec); - -async function getHeadCommitHash() { - const {stdout} = await exec('git rev-parse HEAD'); - return stdout; -} - -async function getHeadCommitTag() { - const {stdout} = await exec('git tag --points-at HEAD'); - return stdout; -} - -async function checkoutLatestMaster() { - await exec('git checkout master'); - await exec('git pull origin master'); -} +const { + isOnReleaseBranch, + getHowManyCommitsBehind, + getHeadCommitTag, +} = require('../git'); async function bumpVersionAndPush() { try { - await exec( - `npx --no-install lerna version --conventional-commits --conventional-graduate --no-private --yes --exact` - ); + const flags = [ + '--conventional-commits', + (await isOnReleaseBranch()) + ? '--conventional-graduate' + : '--conventional-prerelease', + '--no-private', + '--yes', + '--exact', + ]; + await exec(`npx --no-install lerna version ${flags.join(' ')}`); } catch (e) { console.error( 'Failed to bump version. Exiting to not publish local changes.', @@ -32,13 +29,9 @@ async function bumpVersionAndPush() { async function main() { try { - const buildCommitHash = await getHeadCommitHash(); - await checkoutLatestMaster(); - const masterCommitHash = await getHeadCommitHash(); - - if (buildCommitHash !== masterCommitHash) { + if ((await getHowManyCommitsBehind()) !== 0) { console.log( - 'Build commit does not match latest master commit. Skipping version bump.' + 'Build commit does not match latest commit. Skipping version bump.' ); return; } diff --git a/scripts/git.js b/scripts/git.js new file mode 100644 index 00000000000..add488a69dc --- /dev/null +++ b/scripts/git.js @@ -0,0 +1,25 @@ +const {promisify} = require('util'); +const exec = promisify(require('child_process').exec); + +const releaseBranch = 'master'; + +async function getBranchName() { + const {stdout} = await exec('git branch --show-current'); + return stdout; +} + +async function isOnReleaseBranch() { + return (await getBranchName()) === releaseBranch; +} + +async function getHowManyCommitsBehind() { + const {stdout} = await exec('git rev-list --count HEAD..@{u}'); + return parseInt(stdout); +} + +async function getHeadCommitTag() { + const {stdout} = await exec('git tag --points-at HEAD'); + return stdout; +} + +module.exports = {isOnReleaseBranch, getHowManyCommitsBehind, getHeadCommitTag}; diff --git a/scripts/packages.js b/scripts/packages.js index 9d95aae1eb2..b4048e7964d 100644 --- a/scripts/packages.js +++ b/scripts/packages.js @@ -5,13 +5,9 @@ const packageDirsNpmTag = [ 'headless', 'atomic-react', 'atomic-angular/projects/atomic-angular', - 'quantic' + 'quantic', ]; -const packageDirsSnyk = [ - 'headless', - 'atomic', -]; +const packageDirsSnyk = ['headless', 'atomic']; -exports.packageDirsNpmTag = packageDirsNpmTag; -exports.packageDirsSnyk = packageDirsSnyk; +module.exports = {packageDirsNpmTag, packageDirsSnyk};