Skip to content

Fix nightlies artefacts download #52041

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

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 13 additions & 28 deletions packages/react-native/scripts/ios-prebuild/hermes.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const {createLogger} = require('./utils');
const {computeNightlyTarballURL, createLogger} = require('./utils');
const {execSync} = require('child_process');
const fs = require('fs');
const path = require('path');
Expand Down Expand Up @@ -188,29 +188,18 @@ function getTarballUrl(
return `${mavenRepoUrl}/${namespace}/react-native-artifacts/${version}/react-native-artifacts-${version}-hermes-ios-${buildType.toLowerCase()}.tar.gz`;
}

function getNightlyTarballUrl(
async function getNightlyTarballUrl(
version /*: string */,
buildType /*: BuildFlavor */,
) /*: string */ {
const params = `r=snapshots&g=com.facebook.react&a=react-native-artifacts&c=hermes-ios-${buildType.toLowerCase()}&e=tar.gz&v=${version}-SNAPSHOT`;
return `https://oss.sonatype.org/service/local/artifact/maven/redirect?${params}`;
}

/**
* Resolves URL redirects using fetch instead of curl
*/
async function resolveUrlRedirects(url /*: string */) /*: Promise<string> */ {
try {
const response /*: Response */ = await fetch(url, {
method: 'HEAD',
redirect: 'follow',
});

return response.url;
} catch (e) {
hermesLog(`Failed to resolve URL redirects\n${e}`, 'error');
return url;
}
) /*: Promise<string> */ {
const artifactCoordinate = 'react-native-artifacts';
const artifactName = `hermes-ios-${buildType.toLowerCase()}.tar.gz`;
return await computeNightlyTarballURL(
version,
buildType,
artifactCoordinate,
artifactName,
);
}

/**
Expand Down Expand Up @@ -249,9 +238,7 @@ async function hermesSourceType(
}

// For nightly tarball, we need to resolve redirects first
const nightlyUrl = await resolveUrlRedirects(
getNightlyTarballUrl(version, buildType),
);
const nightlyUrl = await getNightlyTarballUrl(version, buildType);
if (await hermesArtifactExists(nightlyUrl)) {
hermesLog('Using download prebuild nightly tarball');
return HermesEngineSourceTypes.DOWNLOAD_PREBUILT_NIGHTLY_TARBALL;
Expand Down Expand Up @@ -313,9 +300,7 @@ async function downloadPrebuiltNightlyTarball(
buildType /*: BuildFlavor */,
artifactsPath /*: string*/,
) /*: Promise<string> */ {
const url = await resolveUrlRedirects(
getNightlyTarballUrl(version, buildType),
);
const url = await getNightlyTarballUrl(version, buildType);
hermesLog(`Using nightly tarball from URL: ${url}`);
return downloadHermesTarball(url, version, buildType, artifactsPath);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

/*:: import type {BuildFlavor} from './types'; */

const {createLogger} = require('./utils');
const {computeNightlyTarballURL, createLogger} = require('./utils');
const {execSync} = require('child_process');
const fs = require('fs');
const path = require('path');
Expand Down Expand Up @@ -184,29 +184,19 @@ function getTarballUrl(
return `${mavenRepoUrl}/${namespace}/react-native-artifacts/${version}/react-native-artifacts-${version}-reactnative-dependencies-${buildType.toLowerCase()}.tar.gz`;
}

function getNightlyTarballUrl(
async function getNightlyTarballUrl(
version /*: string */,
buildType /*: BuildFlavor */,
) /*: string */ {
const params = `r=snapshots&g=com.facebook.react&a=react-native-artifacts&c=reactnative-dependencies-${buildType.toLowerCase()}&e=tar.gz&v=${version}-SNAPSHOT`;
return `https://oss.sonatype.org/service/local/artifact/maven/redirect?${params}`;
}

/**
* Resolves URL redirects using fetch instead of curl
*/
async function resolveUrlRedirects(url /*: string */) /*: Promise<string> */ {
try {
const response /*: Response */ = await fetch(url, {
method: 'HEAD',
redirect: 'follow',
});
) /*: Promise<string> */ {
const coordinate = 'react-native-artifacts';
const artifactName = `reactnative-dependencies-${buildType.toLowerCase()}.tar.gz`;

return response.url;
} catch (e) {
dependencyLog(`Failed to resolve URL redirects\n${e}`, 'error');
return url;
}
return await computeNightlyTarballURL(
version,
buildType,
coordinate,
artifactName,
);
}

/**
Expand Down Expand Up @@ -240,9 +230,7 @@ async function reactNativeDependenciesSourceType(
}

// For nightly tarball, we need to resolve redirects first
const nightlyUrl = await resolveUrlRedirects(
getNightlyTarballUrl(version, buildType),
);
const nightlyUrl = await getNightlyTarballUrl(version, buildType);
if (await reactNativeDependenciesArtifactExists(nightlyUrl)) {
dependencyLog('Using download prebuild nightly tarball');
return ReactNativeDependenciesEngineSourceTypes.DOWNLOAD_PREBUILT_NIGHTLY_TARBALL;
Expand Down Expand Up @@ -292,9 +280,7 @@ async function downloadPrebuiltNightlyTarball(
buildType /*: BuildFlavor */,
artifactsPath /*: string*/,
) /*: Promise<string> */ {
const url = await resolveUrlRedirects(
getNightlyTarballUrl(version, buildType),
);
const url = await getNightlyTarballUrl(version, buildType);
dependencyLog(`Using nightly tarball from URL: ${url}`);
return downloadReactNativeDependenciesTarball(
url,
Expand Down
45 changes: 45 additions & 0 deletions packages/react-native/scripts/ios-prebuild/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
* @format
*/

/*:: import type {BuildFlavor} from './types'; */

const {execSync} = require('child_process');
const fs = require('fs');

Expand Down Expand Up @@ -57,8 +59,51 @@ function createLogger(
};
}

async function computeNightlyTarballURL(
version /*: string */,
buildType /*: BuildFlavor */,
artifactCoordinate /*: string */,
artifactName /*: string */,
) /*: Promise<string> */ {
const xmlUrl = `https://central.sonatype.com/repository/maven-snapshots/com/facebook/react/${artifactCoordinate}/${version}-SNAPSHOT/maven-metadata.xml`;

const response = await fetch(xmlUrl);
if (!response.ok) {
return '';
}
const xmlText = await response.text();

// Extract the <snapshot> block
const snapshotMatch = xmlText.match(/<snapshot>([\s\S]*?)<\/snapshot>/);
if (!snapshotMatch) {
return '';
}
const snapshotContent = snapshotMatch[1];

// Extract <timestamp> from the snapshot block
const timestampMatch = snapshotContent.match(/<timestamp>(.*?)<\/timestamp>/);
if (!timestampMatch) {
return '';
}
const timestamp = timestampMatch[1];

// Extract <buildNumber> from the snapshot block
const buildNumberMatch = snapshotContent.match(
/<buildNumber>(.*?)<\/buildNumber>/,
);
if (!buildNumberMatch) {
return '';
}
const buildNumber = buildNumberMatch[1];

const fullVersion = `${version}-${timestamp}-${buildNumber}`;
const finalUrl = `https://central.sonatype.com/repository/maven-snapshots/com/facebook/react/${artifactCoordinate}/${version}-SNAPSHOT/${artifactCoordinate}-${fullVersion}-${artifactName}`;
return finalUrl;
}

module.exports = {
createFolderIfNotExists,
throwIfOnEden,
createLogger,
computeNightlyTarballURL,
};
Loading