@samitouri / QOS-React-1 / commits / 51ffd3564f

Build: use content hash for facebook-react-native build (#27577)

Similar to #26734, this switches the RN builds for Meta to a content hash instead of git commit number to make the builds reproducible and avoid creating sync commits if the bundled content didn't change.

Jan Kassens committed Oct 25, 2023 at 09:50 UTC 51ffd3564f97b58737df395d30628a27fa71a39d
1 file changed +25 -7
scripts/rollup/build-all-release-channels.js
+25 -7
@@ -8,6 +8,7 @@ const fse = require('fs-extra');
8 const {spawnSync} = require('child_process');
9 const path = require('path');
10 const tmp = require('tmp');
11 +const glob = require('glob');
12
13 const {
14 ReactVersion,
@@ -235,19 +236,28 @@ function processExperimental(buildDir, version) {
236 );
237 }
238
238 - if (fs.existsSync(buildDir + '/facebook-www')) {
239 - const hash = crypto.createHash('sha1');
240 - for (const fileName of fs.readdirSync(buildDir + '/facebook-www').sort()) {
241 - const filePath = buildDir + '/facebook-www/' + fileName;
239 + const facebookWwwDir = path.join(buildDir, 'facebook-www');
240 + if (fs.existsSync(facebookWwwDir)) {
241 + for (const fileName of fs.readdirSync(facebookWwwDir).sort()) {
242 + const filePath = path.join(facebookWwwDir, fileName);
243 const stats = fs.statSync(filePath);
244 if (!stats.isDirectory()) {
244 - hash.update(fs.readFileSync(filePath));
245 fs.renameSync(filePath, filePath.replace('.js', '.modern.js'));
246 }
247 }
248 + const contentHash = hashJSFilesInDirectory(facebookWwwDir);
249 updatePlaceholderReactVersionInCompiledArtifacts(
249 - buildDir + '/facebook-www',
250 - ReactVersion + '-www-modern-' + hash.digest('hex').slice(0, 8)
250 + facebookWwwDir,
251 + ReactVersion + '-www-modern-' + contentHash
252 + );
253 + }
254 +
255 + const facebookReactNativeDir = path.join(buildDir, 'facebook-react-native');
256 + if (fs.existsSync(facebookReactNativeDir)) {
257 + const contentHash = hashJSFilesInDirectory(facebookReactNativeDir);
258 + updatePlaceholderReactVersionInCompiledArtifacts(
259 + facebookReactNativeDir,
260 + ReactVersion + '-react-native-' + contentHash
261 );
262 }
263
@@ -346,6 +356,14 @@ function updatePackageVersions(
356 }
357 }
358
359 +function hashJSFilesInDirectory(directory) {
360 + const hash = crypto.createHash('sha1');
361 + for (const filePath of glob.sync(directory + '/**/*.js').sort()) {
362 + hash.update(fs.readFileSync(filePath));
363 + }
364 + return hash.digest('hex').slice(0, 8);
365 +}
366 +
367 function updatePlaceholderReactVersionInCompiledArtifacts(
368 artifactsDirectory,
369 newVersion