Skip to content

Commit

Permalink
Add scripts and pipeline to poll for maven
Browse files Browse the repository at this point in the history
  • Loading branch information
cipolleschi committed Aug 12, 2023
1 parent fe804b8 commit 9817f8a
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 0 deletions.
17 changes: 17 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1564,6 +1564,19 @@ jobs:
-d "{\"event_type\": \"publish\", \"client_payload\": { \"version\": \"${CIRCLE_TAG:1}\" }}"
# END: Stable releases

poll_maven:
docker:
- image: cimg/node:current
resource_class: small
steps:
- checkout_code_with_cache
- run_yarn
- run:
name: Poll Maven for Artifacts
command: |
node scripts/circleci/poll-maven.js
# -------------------------
# JOBS: Nightly
# -------------------------
Expand Down Expand Up @@ -1900,6 +1913,9 @@ workflows:
- build_hermesc_linux
- build_hermes_macos
- build_hermesc_windows
- poll_maven:
requires:
- build_and_publish_npm_package

package_and_publish_release_dryrun:
when:
Expand Down Expand Up @@ -1941,6 +1957,7 @@ workflows:
- equal: [ false, << pipeline.parameters.run_release_workflow >> ]
- equal: [ false, << pipeline.parameters.run_nightly_workflow >> ]
jobs:
- poll_maven
# Run lints on every commit
- analyze_code

Expand Down
68 changes: 68 additions & 0 deletions scripts/circleci/poll-maven.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/

const fetch = require('node-fetch');
const fs = require('fs');

const baseMavenRepo = 'https://repo1.maven.org/maven2/com/facebook/react';
const artifacts = [
'react-native-artifacts',
'react-android',
'hermes-android',
];
const humanNames = {
'react-native-artifacts': 'Hermes for iOS',
'react-android': 'React Native for Android',
'hermes-android': 'Hermes for Android',
};
const ping_minutes = 5;
const max_hours = 5;
const ping_interval = ping_minutes * 60 * 1000; // 5 minutes
const max_wait = max_hours * 60 * 60 * 1000; // 5 hours

const startTime = Date.now();

async function pingMaven(artifact, rnVersion) {
const url = `${baseMavenRepo}/${artifact}/${rnVersion}`;
const response = await fetch(url, {method: "HEAD"});
if (response.status === 200) {
console.log(`Found artifact for ${humanNames[artifact]}\n`);
return;
} else if (response.status !== 404) {
throw new Error(`Unexpected response code ${response.status} for ${humanNames[artifact]}`);
}

const elapsedTime = Date.now() - startTime;
if (elapsedTime > max_wait) {
throw new Error(`${max_hours} hours has passed. Exiting.`);
}
// Wait a bit
console.log(`${humanNames[artifact]} not available yet. Waiting ${ping_minutes} minutes.\n`);
await new Promise(resolve => setTimeout(resolve, ping_interval));
await pingMaven(url);
}

async function main() {
const package = JSON.parse(fs.readFileSync('packages/react-native/package.json', 'utf8'));
const rnVersion = package.version;

if (rnVersion === '1000.0.0') {
console.log("We are not on a release branch when a release has been initiated. Exiting.");
return;
}

console.log(`Checking artifacts for React Native version ${rnVersion}\n`);

for (const artifact of artifacts) {
console.log(`Start pinging for ${humanNames[artifact]}`)
await pingMaven(artifact, rnVersion);
};
}

main();

0 comments on commit 9817f8a

Please sign in to comment.