Skip to content

Commit fe964f9

Browse files
Jakub Piaseckifacebook-github-bot
authored andcommitted
Update release processes to update the Hermes versions independently from React Native
Summary: TODO Differential Revision: D82438054
1 parent e639070 commit fe964f9

File tree

20 files changed

+473
-13
lines changed

20 files changed

+473
-13
lines changed

.github/actions/create-release/action.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ inputs:
44
version:
55
description: "The version of React Native we want to release. For example 0.75.0-rc.0"
66
required: true
7+
hermes-version:
8+
description: "The version of Hermes to be used in this release. For example 0.14.0"
9+
required: true
10+
hermes-v1-version:
11+
description: "The version of Hermes V1 to be used in this release. For example 250829098.0.0"
12+
required: true
713
is-latest-on-npm:
814
description: "Whether we want to tag this release as latest on NPM"
915
required: true
@@ -28,6 +34,8 @@ runs:
2834
run: |
2935
node scripts/releases/create-release-commit.js \
3036
--reactNativeVersion "${{ inputs.version }}" \
37+
--hermesVersion "${{ inputs.hermes-version }}" \
38+
--hermesV1Version "${{ inputs.hermes-v1-version }}" \
3139
--tagAsLatestRelease "${{ inputs.is-latest-on-npm }}" \
3240
--dryRun "${{ inputs.dry-run }}"
3341
GIT_PAGER=cat git show HEAD

.github/workflows/create-release.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ on:
77
description: "The version of React Native we want to release. For example 0.75.0-rc.0"
88
required: true
99
type: string
10+
hermes-version:
11+
description: "The version of Hermes to be used in this release. For example 0.14.0"
12+
required: true
13+
hermes-v1-version:
14+
description: "The version of Hermes V1 to be used in this release. For example 250829098.0.0"
15+
required: true
1016
is-latest-on-npm:
1117
description: "Whether we want to tag this release as latest on NPM"
1218
required: true
@@ -53,5 +59,7 @@ jobs:
5359
uses: ./.github/actions/create-release
5460
with:
5561
version: ${{ inputs.version }}
62+
hermes-version: ${{ inputs.hermes-version }}
63+
hermes-v1-version: ${{ inputs.hermes-v1-version }}
5664
is-latest-on-npm: ${{ inputs.is-latest-on-npm }}
5765
dry-run: ${{ inputs.dry-run }}

packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/DependencyUtils.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ internal object DependencyUtils {
192192
)
193193
)
194194
} else if (hermesV1Enabled) {
195+
// TODO: remove this?
195196
dependencySubstitution.add(
196197
Triple(
197198
"com.facebook.react:hermes-android",

packages/react-native/scripts/hermes/__tests__/hermes-utils-test.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const {
2222
getHermesTagSHA,
2323
getHermesTarballDownloadPath,
2424
readHermesTag,
25+
readHermesV1Tag,
2526
setHermesTag,
2627
shouldUsePrebuiltHermesC,
2728
} = require('../hermes-utils');
@@ -31,6 +32,7 @@ const os = require('os');
3132

3233
const hermesTag =
3334
'hermes-2022-04-28-RNv0.69.0-15d07c2edd29a4ea0b8f15ab0588a0c1adb1200f';
35+
const hermesV1Tag = '250829098.0.0';
3436
const tarballContents = 'dummy string';
3537
const hermescContents = 'dummy string';
3638
const hermesTagSha = '5244f819b2f3949ca94a3a1bf75d54a8ed59d94a';
@@ -183,17 +185,25 @@ describe('hermes-utils', () => {
183185

184186
describe('setHermesTag', () => {
185187
it('should write tag to .hermesversion file', () => {
186-
setHermesTag(hermesTag);
188+
setHermesTag(hermesTag, hermesV1Tag);
187189
expect(
188190
fs.readFileSync(path.join(SDKS_DIR, '.hermesversion'), {
189191
encoding: 'utf8',
190192
flag: 'r',
191193
}),
192194
).toEqual(hermesTag);
195+
196+
expect(
197+
fs.readFileSync(path.join(SDKS_DIR, '.hermesv1version'), {
198+
encoding: 'utf8',
199+
flag: 'r',
200+
}),
201+
).toEqual(hermesV1Tag);
193202
});
194203
it('should set Hermes tag and read it back', () => {
195-
setHermesTag(hermesTag);
204+
setHermesTag(hermesTag, hermesV1Tag);
196205
expect(readHermesTag()).toEqual(hermesTag);
206+
expect(readHermesV1Tag()).toEqual(hermesV1Tag);
197207
});
198208
});
199209

packages/react-native/scripts/hermes/bump-hermes-version.js

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,37 @@ const inquirer = require('inquirer');
2121
const {exit} = require('shelljs');
2222
const yargs = require('yargs');
2323

24-
let argv = yargs.option('t', {
25-
alias: 'tag',
26-
describe:
27-
'Hermes release tag to use for this React Native release, ex. hermes-2022-02-21-RNv0.68.0',
28-
required: true,
29-
}).argv;
24+
let argv = yargs
25+
.option('t', {
26+
alias: 'tag',
27+
describe:
28+
'Hermes release tag to use for this React Native release, ex. hermes-2022-02-21-RNv0.68.0',
29+
required: true,
30+
})
31+
.option('s', {
32+
alias: 'v1Tag',
33+
describe:
34+
'Hermes V1 release tag to use for this React Native release, ex. 250829098.0.0',
35+
required: true,
36+
}).argv;
3037

3138
async function main() {
3239
// $FlowFixMe[prop-missing]
3340
const hermesTag = argv.tag;
41+
// $FlowFixMe[prop-missing]
42+
const hermesV1Tag = argv.v1Tag;
3443
const {confirmHermesTag} = await inquirer.prompt({
3544
type: 'confirm',
3645
name: 'confirmHermesTag',
37-
message: `Do you want to use the Hermes release tagged "${hermesTag}"?`,
46+
message: `Do you want to use the Hermes release tagged "${hermesTag}" and Hermes V1 release tagged "${hermesV1Tag}"?`,
3847
});
3948

4049
if (!confirmHermesTag) {
4150
console.log('Aborting.');
4251
return;
4352
}
4453

45-
setHermesTag(hermesTag);
54+
setHermesTag(hermesTag, hermesV1Tag);
4655
}
4756

4857
void main().then(() => {

packages/react-native/scripts/hermes/hermes-utils.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ type BuildType = 'dry-run' | 'release' | 'nightly';
2222
const SDKS_DIR = path.normalize(path.join(__dirname, '..', '..', 'sdks'));
2323
const HERMES_DIR = path.join(SDKS_DIR, 'hermes');
2424
const HERMES_TAG_FILE_PATH = path.join(SDKS_DIR, '.hermesversion');
25+
const HERMES_V1_TAG_FILE_PATH = path.join(SDKS_DIR, '.hermesv1version');
2526
const HERMES_SOURCE_TARBALL_BASE_URL =
2627
'https://github.com/facebook/hermes/tarball/';
2728
const HERMES_TARBALL_DOWNLOAD_DIR = path.join(SDKS_DIR, 'download');
@@ -66,7 +67,27 @@ function readHermesTag() /*: string */ {
6667
return 'main';
6768
}
6869

69-
function setHermesTag(hermesTag /*: string */) {
70+
function readHermesV1Tag() /*: string */ {
71+
if (fs.existsSync(HERMES_V1_TAG_FILE_PATH)) {
72+
const data = fs
73+
.readFileSync(HERMES_V1_TAG_FILE_PATH, {
74+
encoding: 'utf8',
75+
flag: 'r',
76+
})
77+
.trim();
78+
79+
if (data.length > 0) {
80+
return data;
81+
} else {
82+
throw new Error('[Hermes] .hermesv1version file is empty.');
83+
}
84+
}
85+
86+
// TODO: what should be the default here?
87+
return 'main';
88+
}
89+
90+
function setHermesTag(hermesTag /*: string */, hermesV1Tag /*: string */) {
7091
if (readHermesTag() === hermesTag) {
7192
// No need to update.
7293
return;
@@ -76,6 +97,7 @@ function setHermesTag(hermesTag /*: string */) {
7697
fs.mkdirSync(SDKS_DIR, {recursive: true});
7798
}
7899
fs.writeFileSync(HERMES_TAG_FILE_PATH, hermesTag.trim());
100+
fs.writeFileSync(HERMES_V1_TAG_FILE_PATH, hermesV1Tag.trim());
79101
console.log('Hermes tag has been updated. Please commit your changes.');
80102
}
81103

@@ -337,6 +359,7 @@ module.exports = {
337359
getHermesTarballDownloadPath,
338360
getHermesPrebuiltArtifactsTarballName,
339361
readHermesTag,
362+
readHermesV1Tag,
340363
setHermesTag,
341364
shouldBuildHermesFromSource,
342365
shouldUsePrebuiltHermesC,
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
HERMES_VERSION_NAME=1000.0.0
12
HERMES_V1_VERSION_NAME=250829098.0.0

scripts/releases-ci/__tests__/publish-npm-test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const publishPackageMock = jest.fn();
2020
const getNpmInfoMock = jest.fn();
2121
const generateAndroidArtifactsMock = jest.fn();
2222
const getPackagesMock = jest.fn();
23+
const updateHermesVersionsToNightlyMock = jest.fn();
2324

2425
const {REPO_ROOT} = require('../../shared/consts');
2526
const {publishNpm} = require('../publish-npm');
@@ -53,6 +54,9 @@ describe('publish-npm', () => {
5354
...jest.requireActual('../../releases/utils/npm-utils'),
5455
publishPackage: publishPackageMock,
5556
getNpmInfo: getNpmInfoMock,
57+
}))
58+
.mock('../../releases/utils/hermes-utils', () => ({
59+
updateHermesVersionsToNightly: updateHermesVersionsToNightlyMock,
5660
}));
5761
});
5862

@@ -98,6 +102,7 @@ describe('publish-npm', () => {
98102

99103
await publishNpm('dry-run');
100104

105+
expect(updateHermesVersionsToNightlyMock).toHaveBeenCalled();
101106
expect(setVersionMock).not.toBeCalled();
102107
expect(updateReactNativeArtifactsMock).toBeCalledWith(version, 'dry-run');
103108

@@ -155,6 +160,8 @@ describe('publish-npm', () => {
155160
// Generate Android artifacts is now delegate to build_android entirely
156161
expect(generateAndroidArtifactsMock).not.toHaveBeenCalled();
157162

163+
expect(updateHermesVersionsToNightlyMock).toHaveBeenCalled();
164+
158165
expect(publishPackageMock.mock.calls).toEqual([
159166
[
160167
'path/to/monorepo/pkg-a',

scripts/releases-ci/publish-npm.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ const {
1818
updateReactNativeArtifacts,
1919
} = require('../releases/set-rn-artifacts-version');
2020
const {setVersion} = require('../releases/set-version');
21+
const {
22+
updateHermesVersionsToNightly,
23+
} = require('../releases/utils/hermes-utils');
2124
const {getNpmInfo, publishPackage} = require('../releases/utils/npm-utils');
2225
const {
2326
publishAndroidArtifactsToMaven,
@@ -95,6 +98,9 @@ async function publishNpm(buildType /*: BuildType */) /*: Promise<void> */ {
9598

9699
// For stable releases, ci job `prepare_package_for_release` handles this
97100
if (['dry-run', 'nightly'].includes(buildType)) {
101+
// Set hermes versions to latest available
102+
await updateHermesVersionsToNightly();
103+
98104
if (buildType === 'nightly') {
99105
// Set same version for all monorepo packages
100106
await setVersion(version);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"name": "@react-native/monorepo",
3+
"private": true,
4+
"version": "1000.0.0"
5+
}

0 commit comments

Comments
 (0)