154 lines
5.5 KiB
JavaScript
154 lines
5.5 KiB
JavaScript
|
/**
|
||
|
* Copyright (c) 2015-present, Facebook, Inc.
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* This source code is licensed under the BSD-style license found in the
|
||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||
|
*/
|
||
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
* This script publishes a new version of react-native to NPM.
|
||
|
* It is supposed to run in CI environment, not on a developer's machine.
|
||
|
*
|
||
|
* To make it easier for developers it uses some logic to identify with which version to publish the package.
|
||
|
*
|
||
|
* To cut a branch (and release RC):
|
||
|
* - Developer: `git checkout -b 0.XY-stable`
|
||
|
* - Developer: `git tag v0.XY.0-rc` and `git push --tags` to git@github.com:facebook/react-native.git
|
||
|
* - CI: test and deploy to npm (run this script) with version 0.XY.0-rc with tag "next"
|
||
|
*
|
||
|
* To update RC release:
|
||
|
* - Developer: `git checkout 0.XY-stable`
|
||
|
* - Developer: cherry-pick whatever changes needed
|
||
|
* - Developer: `git tag v0.XY.0-rc1` and `git push --tags` to git@github.com:facebook/react-native.git
|
||
|
* - CI: test and deploy to npm (run this script) with version 0.XY.0-rc1 with tag "next"
|
||
|
*
|
||
|
* To publish a release:
|
||
|
* - Developer: `git checkout 0.XY-stable`
|
||
|
* - Developer: cherry-pick whatever changes needed
|
||
|
* - Developer: `git tag latest`
|
||
|
* - Developer: `git tag v0.XY.0`
|
||
|
* - Developer: `git push --tags` to git@github.com:facebook/react-native.git
|
||
|
* - CI: test and deploy to npm (run this script) with version 0.XY.0 with and not tag (latest is implied by npm)
|
||
|
*
|
||
|
* To patch old release:
|
||
|
* - Developer: `git checkout 0.XY-stable`
|
||
|
* - Developer: cherry-pick whatever changes needed
|
||
|
* - Developer: `git tag v0.XY.Z`
|
||
|
* - Developer: `git push` to git@github.com:facebook/react-native.git (or merge as pull request)
|
||
|
* - CI: test and deploy to npm (run this script) with version 0.XY.Z with no tag, npm will not mark it as latest if
|
||
|
* there is a version higher than XY
|
||
|
*
|
||
|
* Important tags:
|
||
|
* If tag v0.XY.0-rcZ is present on the commit then publish to npm with version 0.XY.0-rcZ and tag next
|
||
|
* If tag v0.XY.Z is present on the commit then publish to npm with version 0.XY.Z and no tag (npm will consider it latest)
|
||
|
*/
|
||
|
|
||
|
/*eslint-disable no-undef */
|
||
|
require(`shelljs/global`);
|
||
|
|
||
|
const buildBranch = process.env.CIRCLE_BRANCH;
|
||
|
const requiredJavaVersion = `1.7`;
|
||
|
|
||
|
let branchVersion;
|
||
|
if (buildBranch.indexOf(`-stable`) !== -1) {
|
||
|
branchVersion = buildBranch.slice(0, buildBranch.indexOf(`-stable`));
|
||
|
} else {
|
||
|
echo(`Error: We publish only from stable branches`);
|
||
|
exit(0);
|
||
|
}
|
||
|
|
||
|
// ['latest', 'v0.33.0', 'v0.33.0-rc', 'v0.33.0-rc1', 'v0.33.0-rc2', 'v0.34.0', '']
|
||
|
const tagsWithVersion = exec(`git tag -l --points-at HEAD`).stdout.split(/\s/)
|
||
|
// ['v0.33.0', 'v0.33.0-rc', 'v0.33.0-rc1', 'v0.33.0-rc2', 'v0.34.0']
|
||
|
.filter(version => !!version && version.indexOf(`v${branchVersion}`) === 0)
|
||
|
// ['v0.33.0', 'v0.33.0-rc', 'v0.33.0-rc1', 'v0.33.0-rc2']
|
||
|
.filter(version => version.indexOf(branchVersion) !== -1);
|
||
|
|
||
|
if (tagsWithVersion.length === 0) {
|
||
|
echo(`Error: Can't find version tag in current commit. To deploy to NPM you must add tag v0.XY.Z[-rc] to your commit`);
|
||
|
exit(1);
|
||
|
}
|
||
|
let releaseVersion;
|
||
|
if (tagsWithVersion[0].indexOf(`-rc`) === -1) {
|
||
|
// if first tag on this commit is non -rc then we are making a stable release
|
||
|
// '0.33.0'
|
||
|
releaseVersion = tagsWithVersion[0].slice(1);
|
||
|
} else {
|
||
|
// otherwise pick last -rc tag alphabetically
|
||
|
// 0.33.0-rc2
|
||
|
releaseVersion = tagsWithVersion[tagsWithVersion.length - 1].slice(1);
|
||
|
}
|
||
|
|
||
|
// -------- Generating Android Artifacts with JavaDoc
|
||
|
// Java -version outputs to stderr 0_o
|
||
|
const javaVersion = exec(`java -version`).stderr;
|
||
|
if (javaVersion.indexOf(requiredJavaVersion) === -1) {
|
||
|
echo(`Java version must be 1.7.x in order to generate Javadoc. Check: java -version`);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
if (sed(`-i`, /^VERSION_NAME=[0-9\.]*-SNAPSHOT/, `VERSION_NAME=${releaseVersion}`, `ReactAndroid/gradle.properties`).code) {
|
||
|
echo(`Couldn't update version for Gradle`);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
// Uncomment Javadoc generation
|
||
|
if (sed(`-i`, `// archives androidJavadocJar`, `archives androidJavadocJar`, `ReactAndroid/release.gradle`).code) {
|
||
|
echo(`Couldn't enable Javadoc generation`);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
if (exec(`./gradlew :ReactAndroid:installArchives`).code) {
|
||
|
echo(`Couldn't generate artifacts`);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
echo("Generated artifacts for Maven");
|
||
|
|
||
|
let artifacts = ['-javadoc.jar', '-sources.jar', '.aar', '.pom'].map((suffix) => {
|
||
|
return `react-native-${releaseVersion}${suffix}`;
|
||
|
});
|
||
|
|
||
|
artifacts.forEach((name) => {
|
||
|
if (!test(`-e`, `./android/com/facebook/react/react-native/${releaseVersion}/${name}`)) {
|
||
|
echo(`file ${name} was not generated`);
|
||
|
exit(1);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// ----------- Reverting changes to local files
|
||
|
|
||
|
exec(`git checkout ReactAndroid/gradle.properties`);
|
||
|
exec(`git checkout ReactAndroid/release.gradle`);
|
||
|
|
||
|
|
||
|
if (exec(`npm version --no-git-tag-version ${releaseVersion}`).code) {
|
||
|
echo(`Couldn't update version for npm`);
|
||
|
exit(1);
|
||
|
}
|
||
|
if (sed(`-i`, `s.version = "0.0.1-master"`, `s.version = \"${releaseVersion}\"`, `React.podspec`).code) {
|
||
|
echo(`Couldn't update version for React.podspec`);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
// shrinkwrapping without dev dependencies
|
||
|
exec(`npm shrinkwrap`);
|
||
|
if (releaseVersion.indexOf(`-rc`) === -1) {
|
||
|
// release, package will be installed by default
|
||
|
exec(`npm publish`);
|
||
|
} else {
|
||
|
// RC release, package will be installed only if users specifically do it
|
||
|
exec(`npm publish --tag next`);
|
||
|
}
|
||
|
|
||
|
exec(`git checkout package.json`);
|
||
|
exec(`git checkout React.podspec`);
|
||
|
|
||
|
echo(`Published to npm ${releaseVersion}`);
|
||
|
|
||
|
exit(0);
|
||
|
/*eslint-enable no-undef */
|