Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LOCAL] Add script poll maven #38980

Merged
merged 1 commit into from Aug 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 16 additions & 0 deletions .circleci/config.yml
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
72 changes: 72 additions & 0 deletions scripts/circleci/poll-maven.js
@@ -0,0 +1,72 @@
/**
* 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();