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