diff --git a/scripts/circle-ci-artifacts-utils.js b/scripts/circle-ci-artifacts-utils.js index 3a9d9d2a0c83f1..48d02327b088ba 100644 --- a/scripts/circle-ci-artifacts-utils.js +++ b/scripts/circle-ci-artifacts-utils.js @@ -140,8 +140,11 @@ async function _findUrlForJob(jobName, artifactPath) { _throwIfJobIsUnsuccessful(job); const artifacts = await _getJobsArtifacts(job.job_number); - return artifacts.find(artifact => artifact.path.indexOf(artifactPath) > -1) - .url; + let artifact = artifacts.find(a => a.path.indexOf(artifactPath) > -1); + if (!artifact) { + throw new Error(`I could not find the artifact with path ${artifactPath}`); + } + return artifact.url; } function _throwIfJobIsNull(job) { @@ -168,6 +171,17 @@ async function artifactURLForMavenLocal() { return _findUrlForJob('build_and_publish_npm_package-2', 'maven-local.zip'); } +async function artifactURLForReactNative() { + let shortCommit = exec('git rev-parse HEAD', {silent: true}) + .toString() + .trim() + .slice(0, 9); + return _findUrlForJob( + 'build_npm_package', + `react-native-1000.0.0-${shortCommit}.tgz`, + ); +} + async function artifactURLForHermesRNTesterAPK(emulatorArch) { return _findUrlForJob( 'test_android', @@ -194,5 +208,6 @@ module.exports = { artifactURLForHermesRNTesterAPK, artifactURLForMavenLocal, artifactURLHermesDebug, + artifactURLForReactNative, baseTmpPath, }; diff --git a/scripts/test-e2e-local.js b/scripts/test-e2e-local.js index 0be3c7bb6a4950..3d23322931ca18 100644 --- a/scripts/test-e2e-local.js +++ b/scripts/test-e2e-local.js @@ -20,7 +20,6 @@ const {exec, pushd, popd, pwd, cd} = require('shelljs'); const updateTemplatePackage = require('./update-template-package'); const yargs = require('yargs'); const path = require('path'); -const fs = require('fs'); const { checkPackagerRunning, @@ -184,20 +183,16 @@ async function testRNTestProject(circleCIArtifacts) { // create the local npm package to feed the CLI // base setup required (specular to publish-npm.js) - const baseVersion = require('../packages/react-native/package.json').version; // in local testing, 1000.0.0 mean we are on main, every other case means we are // working on a release version - const buildType = baseVersion !== '1000.0.0' ? 'release' : 'dry-run'; + const shortCommit = exec('git rev-parse HEAD', {silent: true}) + .toString() + .trim() + .slice(0, 9); - // we need to add the unique timestamp to avoid npm/yarn to use some local caches - const dateIdentifier = new Date() - .toISOString() - .slice(0, -8) - .replace(/[-:]/g, '') - .replace(/[T]/g, '-'); - - const releaseVersion = `${baseVersion}-${dateIdentifier}`; + const releaseVersion = `1000.0.0-${shortCommit}`; + const buildType = 'dry-run'; // Prepare some variables for later use const repoRoot = pwd(); @@ -206,8 +201,9 @@ async function testRNTestProject(circleCIArtifacts) { const mavenLocalPath = circleCIArtifacts != null - ? path.join(circleCIArtifacts.baseTmpPath(), 'maven-local.zip') + ? path.join(circleCIArtifacts.baseTmpPath(), 'maven-local') : '/private/tmp/maven-local'; + const hermesPath = await prepareArtifacts( circleCIArtifacts, mavenLocalPath, @@ -218,52 +214,51 @@ async function testRNTestProject(circleCIArtifacts) { ); updateTemplatePackage({ - 'react-native': `file:${localNodeTGZPath}`, + 'react-native': `file://${localNodeTGZPath}`, }); - // create locally the node module - exec('npm pack --pack-destination ', {cwd: reactNativePackagePath}); - - // node pack does not creates a version of React Native with the right name on main. - // Let's add some defensive programming checks: - if (!fs.existsSync(localNodeTGZPath)) { - const tarfile = fs - .readdirSync(reactNativePackagePath) - .find(name => name.startsWith('react-native-') && name.endsWith('.tgz')); - if (!tarfile) { - throw new Error("Couldn't find a zipped version of react-native"); - } - exec( - `cp ${path.join(reactNativePackagePath, tarfile)} ${localNodeTGZPath}`, - ); - } - pushd('/tmp/'); // need to avoid the pod install step - we'll do it later exec( - `node ${reactNativePackagePath}/cli.js init RNTestProject --template ${localNodeTGZPath} --skip-install`, + `node ${reactNativePackagePath}/cli.js init RNTestProject --template ${reactNativePackagePath} --skip-install`, ); cd('RNTestProject'); exec('yarn install'); + // When using CircleCI artifacts, the CI will zip maven local into a + // /tmp/maven-local subfolder struct. + // When we generate the project manually, there is no such structure. + const expandedMavenLocal = + circleCIArtifacts == null + ? mavenLocalPath + : `${mavenLocalPath}/tmp/maven-local`; // need to do this here so that Android will be properly setup either way exec( - `echo "REACT_NATIVE_MAVEN_LOCAL_REPO=${mavenLocalPath}" >> android/gradle.properties`, + `echo "REACT_NATIVE_MAVEN_LOCAL_REPO=${expandedMavenLocal}" >> android/gradle.properties`, ); - // doing the pod install here so that it's easier to play around RNTestProject - cd('ios'); - exec('bundle install'); - exec( - `HERMES_ENGINE_TARBALL_PATH=${hermesPath} USE_HERMES=${ - argv.hermes ? 1 : 0 - } bundle exec pod install --ansi`, - ); - - cd('..'); + // Update gradle properties to set Hermes as false + if (!argv.hermes) { + sed( + '-i', + 'hermesEnabled=true', + 'hermesEnabled=false', + 'android/gradle.properties', + ); + } if (argv.platform === 'iOS') { + // doing the pod install here so that it's easier to play around RNTestProject + cd('ios'); + exec('bundle install'); + exec( + `HERMES_ENGINE_TARBALL_PATH=${hermesPath} USE_HERMES=${ + argv.hermes ? 1 : 0 + } bundle exec pod install --ansi`, + ); + + cd('..'); exec('yarn ios'); } else { // android diff --git a/scripts/testing-utils.js b/scripts/testing-utils.js index b48d1a85d25d29..b10a322bc9dc73 100644 --- a/scripts/testing-utils.js +++ b/scripts/testing-utils.js @@ -170,16 +170,21 @@ async function downloadArtifactsFromCircleCI( ) { const mavenLocalURL = await circleCIArtifacts.artifactURLForMavenLocal(); const hermesURL = await circleCIArtifacts.artifactURLHermesDebug(); + const reactNativeURL = await circleCIArtifacts.artifactURLForReactNative(); const hermesPath = path.join( circleCIArtifacts.baseTmpPath(), 'hermes-ios-debug.tar.gz', ); - console.info('[Download] Maven Local Artifacts'); - circleCIArtifacts.downloadArtifact(mavenLocalURL, mavenLocalPath); + console.info(`[Download] Maven Local Artifacts from ${mavenLocalURL}`); + const mavenLocalZipPath = `${mavenLocalPath}.zip`; + circleCIArtifacts.downloadArtifact(mavenLocalURL, mavenLocalZipPath); + exec(`unzip -oq ${mavenLocalZipPath} -d ${mavenLocalPath}`); console.info('[Download] Hermes'); circleCIArtifacts.downloadArtifact(hermesURL, hermesPath); + console.info(`[Download] React Native from ${reactNativeURL}`); + circleCIArtifacts.downloadArtifact(reactNativeURL, localNodeTGZPath); return hermesPath; }