@expo/build-tools 1.0.30 → 1.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builders/custom.js +2 -1
- package/dist/builders/custom.js.map +1 -1
- package/dist/steps/easFunctions.js +4 -2
- package/dist/steps/easFunctions.js.map +1 -1
- package/dist/steps/functions/utils/configureAndroidVersion.d.ts +2 -0
- package/dist/steps/functions/utils/configureAndroidVersion.js +43 -0
- package/dist/steps/functions/utils/configureAndroidVersion.js.map +1 -0
- package/dist/steps/functions/utils/injectAndroidCredentials.d.ts +2 -0
- package/dist/steps/functions/utils/injectAndroidCredentials.js +68 -0
- package/dist/steps/functions/utils/injectAndroidCredentials.js.map +1 -0
- package/dist/steps/utils/android/gradleConfig.d.ts +7 -0
- package/dist/steps/utils/android/gradleConfig.js +83 -0
- package/dist/steps/utils/android/gradleConfig.js.map +1 -0
- package/package.json +3 -3
- package/templates/eas-build-configure-version.gradle.template +27 -0
- package/templates/eas-build-inject-android-credentials.gradle +34 -0
- package/dist/steps/functions/utils/runGradle.d.ts +0 -4
- package/dist/steps/functions/utils/runGradle.js +0 -33
- package/dist/steps/functions/utils/runGradle.js.map +0 -1
package/dist/builders/custom.js
CHANGED
|
@@ -17,10 +17,11 @@ async function runCustomBuildAsync(ctx) {
|
|
|
17
17
|
await (0, projectSources_1.prepareProjectSourcesAsync)(ctx, customBuildCtx.projectSourceDirectory);
|
|
18
18
|
const relativeConfigPath = (0, nullthrows_1.default)((_a = ctx.job.customBuildConfig) === null || _a === void 0 ? void 0 : _a.path, 'Custom build config must be defined for custom builds');
|
|
19
19
|
const configPath = path_1.default.join(ctx.getReactNativeProjectDirectory(customBuildCtx.projectSourceDirectory), relativeConfigPath);
|
|
20
|
-
const globalContext = new steps_1.BuildStepGlobalContext(customBuildCtx, false
|
|
20
|
+
const globalContext = new steps_1.BuildStepGlobalContext(customBuildCtx, false);
|
|
21
21
|
const easFunctions = (0, easFunctions_1.getEasFunctions)(customBuildCtx, ctx);
|
|
22
22
|
const parser = new steps_1.BuildConfigParser(globalContext, {
|
|
23
23
|
externalFunctions: easFunctions,
|
|
24
|
+
configPath,
|
|
24
25
|
});
|
|
25
26
|
const workflow = await ctx.runBuildPhase(eas_build_job_1.BuildPhase.PARSE_CUSTOM_WORKFLOW_CONFIG, async () => {
|
|
26
27
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom.js","sourceRoot":"","sources":["../../src/builders/custom.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,uDAAsD;AACtD,uCAAgF;AAChF,4DAAoC;AAGpC,6DAAsE;AACtE,wDAAwD;AACxD,8DAA2D;AAEpD,KAAK,UAAU,mBAAmB,CAAgB,GAAoB;;IAC3E,MAAM,cAAc,GAAG,IAAI,uCAAkB,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,IAAA,2CAA0B,EAAC,GAAG,EAAE,cAAc,CAAC,sBAAsB,CAAC,CAAC;IAC7E,MAAM,kBAAkB,GAAG,IAAA,oBAAU,EACnC,MAAA,GAAG,CAAC,GAAG,CAAC,iBAAiB,0CAAE,IAAI,EAC/B,uDAAuD,CACxD,CAAC;IACF,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAC1B,GAAG,CAAC,8BAA8B,CAAC,cAAc,CAAC,sBAAsB,CAAC,EACzE,kBAAkB,CACnB,CAAC;IAEF,MAAM,aAAa,GAAG,IAAI,8BAAsB,CAAC,cAAc,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"custom.js","sourceRoot":"","sources":["../../src/builders/custom.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,uDAAsD;AACtD,uCAAgF;AAChF,4DAAoC;AAGpC,6DAAsE;AACtE,wDAAwD;AACxD,8DAA2D;AAEpD,KAAK,UAAU,mBAAmB,CAAgB,GAAoB;;IAC3E,MAAM,cAAc,GAAG,IAAI,uCAAkB,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,IAAA,2CAA0B,EAAC,GAAG,EAAE,cAAc,CAAC,sBAAsB,CAAC,CAAC;IAC7E,MAAM,kBAAkB,GAAG,IAAA,oBAAU,EACnC,MAAA,GAAG,CAAC,GAAG,CAAC,iBAAiB,0CAAE,IAAI,EAC/B,uDAAuD,CACxD,CAAC;IACF,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAC1B,GAAG,CAAC,8BAA8B,CAAC,cAAc,CAAC,sBAAsB,CAAC,EACzE,kBAAkB,CACnB,CAAC;IAEF,MAAM,aAAa,GAAG,IAAI,8BAAsB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,IAAA,8BAAe,EAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,yBAAiB,CAAC,aAAa,EAAE;QAClD,iBAAiB,EAAE,YAAY;QAC/B,UAAU;KACX,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,0BAAU,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC3F,IAAI;YACF,OAAO,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;SAClC;QAAC,OAAO,UAAe,EAAE;YACxB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAClE,IAAI,UAAU,YAAY,cAAM,CAAC,kBAAkB,EAAE;gBACnD,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE;oBACnC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;iBAC3B;aACF;YACD,MAAM,UAAU,CAAC;SAClB;IACH,CAAC,CAAC,CAAC;IACH,IAAI;QACF,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAC;KAC/B;IAAC,OAAO,GAAQ,EAAE;QACjB,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAC9B,MAAM,GAAG,CAAC;KACX;IAED,OAAO,GAAG,CAAC,SAAS,CAAC;AACvB,CAAC;AAvCD,kDAuCC","sourcesContent":["import path from 'path';\n\nimport { BuildPhase, Job } from '@expo/eas-build-job';\nimport { BuildConfigParser, BuildStepGlobalContext, errors } from '@expo/steps';\nimport nullthrows from 'nullthrows';\n\nimport { Artifacts, BuildContext } from '../context';\nimport { prepareProjectSourcesAsync } from '../common/projectSources';\nimport { getEasFunctions } from '../steps/easFunctions';\nimport { CustomBuildContext } from '../customBuildContext';\n\nexport async function runCustomBuildAsync<T extends Job>(ctx: BuildContext<T>): Promise<Artifacts> {\n const customBuildCtx = new CustomBuildContext(ctx);\n await prepareProjectSourcesAsync(ctx, customBuildCtx.projectSourceDirectory);\n const relativeConfigPath = nullthrows(\n ctx.job.customBuildConfig?.path,\n 'Custom build config must be defined for custom builds'\n );\n const configPath = path.join(\n ctx.getReactNativeProjectDirectory(customBuildCtx.projectSourceDirectory),\n relativeConfigPath\n );\n\n const globalContext = new BuildStepGlobalContext(customBuildCtx, false);\n const easFunctions = getEasFunctions(customBuildCtx, ctx);\n const parser = new BuildConfigParser(globalContext, {\n externalFunctions: easFunctions,\n configPath,\n });\n const workflow = await ctx.runBuildPhase(BuildPhase.PARSE_CUSTOM_WORKFLOW_CONFIG, async () => {\n try {\n return await parser.parseAsync();\n } catch (parseError: any) {\n ctx.logger.error('Failed to parse the custom build config file.');\n if (parseError instanceof errors.BuildWorkflowError) {\n for (const err of parseError.errors) {\n ctx.logger.error({ err });\n }\n }\n throw parseError;\n }\n });\n try {\n await workflow.executeAsync();\n } catch (err: any) {\n err.artifacts = ctx.artifacts;\n throw err;\n }\n\n return ctx.artifacts;\n}\n"]}
|
|
@@ -5,11 +5,12 @@ const uploadArtifact_1 = require("./functions/utils/uploadArtifact");
|
|
|
5
5
|
const checkout_1 = require("./functions/eas/checkout");
|
|
6
6
|
const setUpNpmrc_1 = require("./functions/eas/setUpNpmrc");
|
|
7
7
|
const installNodeModules_1 = require("./functions/eas/installNodeModules");
|
|
8
|
-
const runGradle_1 = require("./functions/utils/runGradle");
|
|
9
8
|
const prebuild_1 = require("./functions/eas/prebuild");
|
|
10
9
|
const buildReactNativeApp_1 = require("./functions/eas/buildReactNativeApp");
|
|
11
10
|
const findAndUploadBuildArtifacts_1 = require("./functions/eas/findAndUploadBuildArtifacts");
|
|
12
11
|
const configureExpoUpdatesIfInstalled_1 = require("./functions/eas/configureExpoUpdatesIfInstalled");
|
|
12
|
+
const injectAndroidCredentials_1 = require("./functions/utils/injectAndroidCredentials");
|
|
13
|
+
const configureAndroidVersion_1 = require("./functions/utils/configureAndroidVersion");
|
|
13
14
|
function getEasFunctions(ctx, oldCtx // TODO: remove
|
|
14
15
|
) {
|
|
15
16
|
return [
|
|
@@ -18,10 +19,11 @@ function getEasFunctions(ctx, oldCtx // TODO: remove
|
|
|
18
19
|
(0, setUpNpmrc_1.createSetUpNpmrcBuildFunction)(ctx),
|
|
19
20
|
(0, installNodeModules_1.createInstallNodeModulesBuildFunction)(ctx),
|
|
20
21
|
(0, prebuild_1.createPrebuildBuildFunction)(ctx),
|
|
21
|
-
(0, runGradle_1.createRunGradleBuildFunction)(oldCtx),
|
|
22
22
|
(0, buildReactNativeApp_1.createBuildReactNativeAppBuildFunction)(oldCtx),
|
|
23
23
|
(0, findAndUploadBuildArtifacts_1.createFindAndUploadBuildArtifactsBuildFunction)(ctx),
|
|
24
24
|
(0, configureExpoUpdatesIfInstalled_1.configureEASUpdateIfInstalledFunction)(),
|
|
25
|
+
(0, injectAndroidCredentials_1.injectAndroidCredentialsFunction)(),
|
|
26
|
+
(0, configureAndroidVersion_1.configureAndroidVersionFunction)(),
|
|
25
27
|
];
|
|
26
28
|
}
|
|
27
29
|
exports.getEasFunctions = getEasFunctions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"easFunctions.js","sourceRoot":"","sources":["../../src/steps/easFunctions.ts"],"names":[],"mappings":";;;AAMA,qEAAqF;AACrF,uDAAuE;AACvE,2DAA2E;AAC3E,2EAA2F;AAC3F,
|
|
1
|
+
{"version":3,"file":"easFunctions.js","sourceRoot":"","sources":["../../src/steps/easFunctions.ts"],"names":[],"mappings":";;;AAMA,qEAAqF;AACrF,uDAAuE;AACvE,2DAA2E;AAC3E,2EAA2F;AAC3F,uDAAuE;AACvE,6EAA6F;AAC7F,6FAA6G;AAC7G,qGAAwG;AACxG,yFAA8F;AAC9F,uFAA4F;AAE5F,SAAgB,eAAe,CAC7B,GAAuB,EACvB,MAAyB,CAAC,eAAe;;IAEzC,OAAO;QACL,IAAA,sCAA2B,GAAE;QAC7B,IAAA,kDAAiC,EAAC,GAAG,CAAC;QACtC,IAAA,0CAA6B,EAAC,GAAG,CAAC;QAClC,IAAA,0DAAqC,EAAC,GAAG,CAAC;QAC1C,IAAA,sCAA2B,EAAC,GAAG,CAAC;QAChC,IAAA,4DAAsC,EAAC,MAAM,CAAC;QAC9C,IAAA,4EAA8C,EAAC,GAAG,CAAC;QACnD,IAAA,uEAAqC,GAAE;QACvC,IAAA,2DAAgC,GAAE;QAClC,IAAA,yDAA+B,GAAE;KAClC,CAAC;AACJ,CAAC;AAhBD,0CAgBC","sourcesContent":["import { Job } from '@expo/eas-build-job';\nimport { BuildFunction } from '@expo/steps';\n\nimport { BuildContext } from '../context';\nimport { CustomBuildContext } from '../customBuildContext';\n\nimport { createUploadArtifactBuildFunction } from './functions/utils/uploadArtifact';\nimport { createCheckoutBuildFunction } from './functions/eas/checkout';\nimport { createSetUpNpmrcBuildFunction } from './functions/eas/setUpNpmrc';\nimport { createInstallNodeModulesBuildFunction } from './functions/eas/installNodeModules';\nimport { createPrebuildBuildFunction } from './functions/eas/prebuild';\nimport { createBuildReactNativeAppBuildFunction } from './functions/eas/buildReactNativeApp';\nimport { createFindAndUploadBuildArtifactsBuildFunction } from './functions/eas/findAndUploadBuildArtifacts';\nimport { configureEASUpdateIfInstalledFunction } from './functions/eas/configureExpoUpdatesIfInstalled';\nimport { injectAndroidCredentialsFunction } from './functions/utils/injectAndroidCredentials';\nimport { configureAndroidVersionFunction } from './functions/utils/configureAndroidVersion';\n\nexport function getEasFunctions(\n ctx: CustomBuildContext,\n oldCtx: BuildContext<Job> // TODO: remove\n): BuildFunction[] {\n return [\n createCheckoutBuildFunction(),\n createUploadArtifactBuildFunction(ctx),\n createSetUpNpmrcBuildFunction(ctx),\n createInstallNodeModulesBuildFunction(ctx),\n createPrebuildBuildFunction(ctx),\n createBuildReactNativeAppBuildFunction(oldCtx),\n createFindAndUploadBuildArtifactsBuildFunction(ctx),\n configureEASUpdateIfInstalledFunction(),\n injectAndroidCredentialsFunction(),\n configureAndroidVersionFunction(),\n ];\n}\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.configureAndroidVersionFunction = void 0;
|
|
7
|
+
const steps_1 = require("@expo/steps");
|
|
8
|
+
const semver_1 = __importDefault(require("semver"));
|
|
9
|
+
const gradleConfig_1 = require("../../utils/android/gradleConfig");
|
|
10
|
+
function configureAndroidVersionFunction() {
|
|
11
|
+
return new steps_1.BuildFunction({
|
|
12
|
+
namespace: 'utils',
|
|
13
|
+
id: 'configure_android_version',
|
|
14
|
+
name: 'Configure Android version',
|
|
15
|
+
inputProviders: [
|
|
16
|
+
steps_1.BuildStepInput.createProvider({
|
|
17
|
+
id: 'version_name',
|
|
18
|
+
required: true,
|
|
19
|
+
allowedValueTypeName: steps_1.BuildStepInputValueTypeName.STRING,
|
|
20
|
+
defaultValue: '${ eas.job.version.versionName }',
|
|
21
|
+
}),
|
|
22
|
+
steps_1.BuildStepInput.createProvider({
|
|
23
|
+
id: 'version_code',
|
|
24
|
+
required: true,
|
|
25
|
+
allowedValueTypeName: steps_1.BuildStepInputValueTypeName.NUMBER,
|
|
26
|
+
defaultValue: '${ eas.job.version.versionCode }',
|
|
27
|
+
}),
|
|
28
|
+
],
|
|
29
|
+
fn: async (stepCtx, { inputs }) => {
|
|
30
|
+
const versionCode = inputs.version_code.value;
|
|
31
|
+
const versionName = inputs.version_name.value;
|
|
32
|
+
if (!semver_1.default.valid(versionName)) {
|
|
33
|
+
throw new Error(`Version name provided by the "version_name" input is not a valid semver version: ${versionName}`);
|
|
34
|
+
}
|
|
35
|
+
await (0, gradleConfig_1.injectConfigureVersionGradleConfig)(stepCtx.logger, stepCtx.workingDirectory, {
|
|
36
|
+
versionCode,
|
|
37
|
+
versionName,
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
exports.configureAndroidVersionFunction = configureAndroidVersionFunction;
|
|
43
|
+
//# sourceMappingURL=configureAndroidVersion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configureAndroidVersion.js","sourceRoot":"","sources":["../../../../src/steps/functions/utils/configureAndroidVersion.ts"],"names":[],"mappings":";;;;;;AAAA,uCAAyF;AACzF,oDAA4B;AAE5B,mEAAsF;AAEtF,SAAgB,+BAA+B;IAC7C,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,OAAO;QAClB,EAAE,EAAE,2BAA2B;QAC/B,IAAI,EAAE,2BAA2B;QACjC,cAAc,EAAE;YACd,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,cAAc;gBAClB,QAAQ,EAAE,IAAI;gBACd,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;gBACxD,YAAY,EAAE,kCAAkC;aACjD,CAAC;YACF,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,cAAc;gBAClB,QAAQ,EAAE,IAAI;gBACd,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;gBACxD,YAAY,EAAE,kCAAkC;aACjD,CAAC;SACH;QACD,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAChC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,KAAe,CAAC;YACxD,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,KAAe,CAAC;YACxD,IAAI,CAAC,gBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;gBAC9B,MAAM,IAAI,KAAK,CACb,oFAAoF,WAAW,EAAE,CAClG,CAAC;aACH;YACD,MAAM,IAAA,iDAAkC,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,EAAE;gBACjF,WAAW;gBACX,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAjCD,0EAiCC","sourcesContent":["import { BuildFunction, BuildStepInput, BuildStepInputValueTypeName } from '@expo/steps';\nimport semver from 'semver';\n\nimport { injectConfigureVersionGradleConfig } from '../../utils/android/gradleConfig';\n\nexport function configureAndroidVersionFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'utils',\n id: 'configure_android_version',\n name: 'Configure Android version',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'version_name',\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n defaultValue: '${ eas.job.version.versionName }',\n }),\n BuildStepInput.createProvider({\n id: 'version_code',\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.NUMBER,\n defaultValue: '${ eas.job.version.versionCode }',\n }),\n ],\n fn: async (stepCtx, { inputs }) => {\n const versionCode = inputs.version_code.value as number;\n const versionName = inputs.version_name.value as string;\n if (!semver.valid(versionName)) {\n throw new Error(\n `Version name provided by the \"version_name\" input is not a valid semver version: ${versionName}`\n );\n }\n await injectConfigureVersionGradleConfig(stepCtx.logger, stepCtx.workingDirectory, {\n versionCode,\n versionName,\n });\n },\n });\n}\n"]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.injectAndroidCredentialsFunction = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const uuid_1 = require("uuid");
|
|
9
|
+
const steps_1 = require("@expo/steps");
|
|
10
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
11
|
+
const joi_1 = __importDefault(require("joi"));
|
|
12
|
+
const gradleConfig_1 = require("../../utils/android/gradleConfig");
|
|
13
|
+
const KeystoreSchema = joi_1.default.object({
|
|
14
|
+
dataBase64: joi_1.default.string().required(),
|
|
15
|
+
keystorePassword: joi_1.default.string().allow('').required(),
|
|
16
|
+
keyAlias: joi_1.default.string().required(),
|
|
17
|
+
keyPassword: joi_1.default.string().allow(''),
|
|
18
|
+
});
|
|
19
|
+
const AndroidBuildCredentialsSchema = joi_1.default.object({
|
|
20
|
+
keystore: KeystoreSchema.required(),
|
|
21
|
+
}).required();
|
|
22
|
+
function injectAndroidCredentialsFunction() {
|
|
23
|
+
return new steps_1.BuildFunction({
|
|
24
|
+
namespace: 'utils',
|
|
25
|
+
id: 'inject_android_credentials',
|
|
26
|
+
name: 'Inject Android credentials',
|
|
27
|
+
inputProviders: [
|
|
28
|
+
steps_1.BuildStepInput.createProvider({
|
|
29
|
+
id: 'credentials',
|
|
30
|
+
required: true,
|
|
31
|
+
allowedValueTypeName: steps_1.BuildStepInputValueTypeName.JSON,
|
|
32
|
+
defaultValue: '${ eas.job.secrets.buildCredentials }',
|
|
33
|
+
}),
|
|
34
|
+
],
|
|
35
|
+
fn: async (stepCtx, { inputs }) => {
|
|
36
|
+
const rawCredentialsInput = inputs.credentials.value;
|
|
37
|
+
const { value, error } = AndroidBuildCredentialsSchema.validate(rawCredentialsInput, {
|
|
38
|
+
stripUnknown: true,
|
|
39
|
+
convert: true,
|
|
40
|
+
abortEarly: false,
|
|
41
|
+
});
|
|
42
|
+
if (error) {
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
const credentials = value;
|
|
46
|
+
await restoreCredentials(stepCtx, credentials);
|
|
47
|
+
await (0, gradleConfig_1.injectCredentialsGradleConfig)(stepCtx.logger, stepCtx.workingDirectory);
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
exports.injectAndroidCredentialsFunction = injectAndroidCredentialsFunction;
|
|
52
|
+
async function restoreCredentials(stepsCtx, buildCredentials) {
|
|
53
|
+
stepsCtx.logger.info("Writing secrets to the project's directory");
|
|
54
|
+
const keystorePath = path_1.default.join(stepsCtx.global.projectTargetDirectory, `keystore-${(0, uuid_1.v4)()}`);
|
|
55
|
+
await fs_extra_1.default.writeFile(keystorePath, Buffer.from(buildCredentials.keystore.dataBase64, 'base64'));
|
|
56
|
+
const credentialsJson = {
|
|
57
|
+
android: {
|
|
58
|
+
keystore: {
|
|
59
|
+
keystorePath,
|
|
60
|
+
keystorePassword: buildCredentials.keystore.keystorePassword,
|
|
61
|
+
keyAlias: buildCredentials.keystore.keyAlias,
|
|
62
|
+
keyPassword: buildCredentials.keystore.keyPassword,
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
await fs_extra_1.default.writeFile(path_1.default.join(stepsCtx.global.projectTargetDirectory, 'credentials.json'), JSON.stringify(credentialsJson));
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=injectAndroidCredentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injectAndroidCredentials.js","sourceRoot":"","sources":["../../../../src/steps/functions/utils/injectAndroidCredentials.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,+BAAoC;AACpC,uCAKqB;AACrB,wDAA0B;AAC1B,8CAAsB;AAGtB,mEAAiF;AAEjF,MAAM,cAAc,GAAG,aAAG,CAAC,MAAM,CAAC;IAChC,UAAU,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,gBAAgB,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACnD,QAAQ,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,WAAW,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;CACpC,CAAC,CAAC;AAEH,MAAM,6BAA6B,GAAG,aAAG,CAAC,MAAM,CAAiC;IAC/E,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAEd,SAAgB,gCAAgC;IAC9C,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,OAAO;QAClB,EAAE,EAAE,4BAA4B;QAChC,IAAI,EAAE,4BAA4B;QAClC,cAAc,EAAE;YACd,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,aAAa;gBACjB,QAAQ,EAAE,IAAI;gBACd,oBAAoB,EAAE,mCAA2B,CAAC,IAAI;gBACtD,YAAY,EAAE,uCAAuC;aACtD,CAAC;SACH;QACD,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAChC,MAAM,mBAAmB,GAAG,MAAM,CAAC,WAAW,CAAC,KAA4B,CAAC;YAC5E,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,6BAA6B,CAAC,QAAQ,CAAC,mBAAmB,EAAE;gBACnF,YAAY,EAAE,IAAI;gBAClB,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,KAAK;aAClB,CAAC,CAAC;YACH,IAAI,KAAK,EAAE;gBACT,MAAM,KAAK,CAAC;aACb;YACD,MAAM,WAAW,GAAG,KAAK,CAAC;YAE1B,MAAM,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAC/C,MAAM,IAAA,4CAA6B,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAChF,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AA7BD,4EA6BC;AAED,KAAK,UAAU,kBAAkB,CAC/B,QAA0B,EAC1B,gBAEC;IAED,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,sBAAsB,EAAE,YAAY,IAAA,SAAM,GAAE,EAAE,CAAC,CAAC;IAC/F,MAAM,kBAAE,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9F,MAAM,eAAe,GAAG;QACtB,OAAO,EAAE;YACP,QAAQ,EAAE;gBACR,YAAY;gBACZ,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,CAAC,gBAAgB;gBAC5D,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,CAAC,QAAQ;gBAC5C,WAAW,EAAE,gBAAgB,CAAC,QAAQ,CAAC,WAAW;aACnD;SACF;KACF,CAAC;IACF,MAAM,kBAAE,CAAC,SAAS,CAChB,cAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,EACrE,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAChC,CAAC;AACJ,CAAC","sourcesContent":["import path from 'path';\n\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n BuildFunction,\n BuildStepContext,\n BuildStepInput,\n BuildStepInputValueTypeName,\n} from '@expo/steps';\nimport fs from 'fs-extra';\nimport Joi from 'joi';\nimport { Android } from '@expo/eas-build-job';\n\nimport { injectCredentialsGradleConfig } from '../../utils/android/gradleConfig';\n\nconst KeystoreSchema = Joi.object({\n dataBase64: Joi.string().required(),\n keystorePassword: Joi.string().allow('').required(),\n keyAlias: Joi.string().required(),\n keyPassword: Joi.string().allow(''),\n});\n\nconst AndroidBuildCredentialsSchema = Joi.object<{ keystore: Android.Keystore }>({\n keystore: KeystoreSchema.required(),\n}).required();\n\nexport function injectAndroidCredentialsFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'utils',\n id: 'inject_android_credentials',\n name: 'Inject Android credentials',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'credentials',\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.JSON,\n defaultValue: '${ eas.job.secrets.buildCredentials }',\n }),\n ],\n fn: async (stepCtx, { inputs }) => {\n const rawCredentialsInput = inputs.credentials.value as Record<string, any>;\n const { value, error } = AndroidBuildCredentialsSchema.validate(rawCredentialsInput, {\n stripUnknown: true,\n convert: true,\n abortEarly: false,\n });\n if (error) {\n throw error;\n }\n const credentials = value;\n\n await restoreCredentials(stepCtx, credentials);\n await injectCredentialsGradleConfig(stepCtx.logger, stepCtx.workingDirectory);\n },\n });\n}\n\nasync function restoreCredentials(\n stepsCtx: BuildStepContext,\n buildCredentials: {\n keystore: Android.Keystore;\n }\n): Promise<void> {\n stepsCtx.logger.info(\"Writing secrets to the project's directory\");\n const keystorePath = path.join(stepsCtx.global.projectTargetDirectory, `keystore-${uuidv4()}`);\n await fs.writeFile(keystorePath, Buffer.from(buildCredentials.keystore.dataBase64, 'base64'));\n const credentialsJson = {\n android: {\n keystore: {\n keystorePath,\n keystorePassword: buildCredentials.keystore.keystorePassword,\n keyAlias: buildCredentials.keystore.keyAlias,\n keyPassword: buildCredentials.keystore.keyPassword,\n },\n },\n };\n await fs.writeFile(\n path.join(stepsCtx.global.projectTargetDirectory, 'credentials.json'),\n JSON.stringify(credentialsJson)\n );\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference types="bunyan" />
|
|
2
|
+
import { bunyan } from '@expo/logger';
|
|
3
|
+
export declare function injectCredentialsGradleConfig(logger: bunyan, workingDir: string): Promise<void>;
|
|
4
|
+
export declare function injectConfigureVersionGradleConfig(logger: bunyan, workingDir: string, { versionCode, versionName }: {
|
|
5
|
+
versionCode: number;
|
|
6
|
+
versionName: string;
|
|
7
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.injectConfigureVersionGradleConfig = exports.injectCredentialsGradleConfig = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const config_plugins_1 = require("@expo/config-plugins");
|
|
9
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
|
+
const template_file_1 = __importDefault(require("@expo/template-file"));
|
|
11
|
+
const EAS_BUILD_INJECT_CREDENTIALS_GRADLE_TEMPLATE_PATH = path_1.default.join(__dirname, '../../../../templates/eas-build-inject-android-credentials.gradle');
|
|
12
|
+
const EAS_BUILD_CONFIGURE_VERSION_GRADLE_TEMPLATE_PATH = path_1.default.join(__dirname, '../../../../templates/eas-build-configure-version.gradle.template');
|
|
13
|
+
const APPLY_EAS_BUILD_INJECT_CREDENTIALS_GRADLE_LINE = 'apply from: "./eas-build-inject-android-credentials.gradle"';
|
|
14
|
+
const APPLY_EAS_BUILD_CONFIGURE_VERSION_GRADLE_LINE = 'apply from: "./eas-build-configure-version.gradle"';
|
|
15
|
+
async function injectCredentialsGradleConfig(logger, workingDir) {
|
|
16
|
+
logger.info('Injecting signing config into build.gradle');
|
|
17
|
+
await deleteEasBuildInjectCredentialsGradle(workingDir);
|
|
18
|
+
await createEasBuildInjectCredentialsGradle(workingDir);
|
|
19
|
+
await addApplyInjectCredentialsConfigToBuildGradle(workingDir);
|
|
20
|
+
logger.info('Signing config injected');
|
|
21
|
+
}
|
|
22
|
+
exports.injectCredentialsGradleConfig = injectCredentialsGradleConfig;
|
|
23
|
+
async function injectConfigureVersionGradleConfig(logger, workingDir, { versionCode, versionName }) {
|
|
24
|
+
logger.info('Injecting version config into build.gradle');
|
|
25
|
+
logger.info(`Version code: ${versionCode}`);
|
|
26
|
+
logger.info(`Version name: ${versionName}`);
|
|
27
|
+
await deleteEasBuildConfigureVersionGradle(workingDir);
|
|
28
|
+
await createEasBuildConfigureVersionGradle(workingDir, { versionCode, versionName });
|
|
29
|
+
await addApplyConfigureVersionConfigToBuildGradle(workingDir);
|
|
30
|
+
logger.info('Version config injected');
|
|
31
|
+
}
|
|
32
|
+
exports.injectConfigureVersionGradleConfig = injectConfigureVersionGradleConfig;
|
|
33
|
+
async function deleteEasBuildInjectCredentialsGradle(workingDir) {
|
|
34
|
+
const targetPath = getEasBuildInjectCredentialsGradlePath(workingDir);
|
|
35
|
+
await fs_extra_1.default.remove(targetPath);
|
|
36
|
+
}
|
|
37
|
+
async function deleteEasBuildConfigureVersionGradle(workingDir) {
|
|
38
|
+
const targetPath = getEasBuildConfigureVersionGradlePath(workingDir);
|
|
39
|
+
await fs_extra_1.default.remove(targetPath);
|
|
40
|
+
}
|
|
41
|
+
function getEasBuildInjectCredentialsGradlePath(workingDir) {
|
|
42
|
+
return path_1.default.join(workingDir, 'android/app/eas-build-inject-android-credentials.gradle');
|
|
43
|
+
}
|
|
44
|
+
function getEasBuildConfigureVersionGradlePath(workingDir) {
|
|
45
|
+
return path_1.default.join(workingDir, 'android/app/eas-build-configure-version.gradle');
|
|
46
|
+
}
|
|
47
|
+
async function createEasBuildInjectCredentialsGradle(workingDir) {
|
|
48
|
+
const targetPath = getEasBuildInjectCredentialsGradlePath(workingDir);
|
|
49
|
+
await fs_extra_1.default.copy(EAS_BUILD_INJECT_CREDENTIALS_GRADLE_TEMPLATE_PATH, targetPath);
|
|
50
|
+
}
|
|
51
|
+
async function createEasBuildConfigureVersionGradle(workingDir, { versionCode, versionName }) {
|
|
52
|
+
const targetPath = getEasBuildConfigureVersionGradlePath(workingDir);
|
|
53
|
+
await (0, template_file_1.default)(EAS_BUILD_CONFIGURE_VERSION_GRADLE_TEMPLATE_PATH, {
|
|
54
|
+
VERSION_CODE: versionCode,
|
|
55
|
+
VERSION_NAME: versionName,
|
|
56
|
+
}, targetPath, {
|
|
57
|
+
mustache: false,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async function addApplyInjectCredentialsConfigToBuildGradle(projectRoot) {
|
|
61
|
+
const buildGradlePath = config_plugins_1.AndroidConfig.Paths.getAppBuildGradleFilePath(projectRoot);
|
|
62
|
+
const buildGradleContents = await fs_extra_1.default.readFile(path_1.default.join(buildGradlePath), 'utf8');
|
|
63
|
+
if (hasLine(buildGradleContents, APPLY_EAS_BUILD_INJECT_CREDENTIALS_GRADLE_LINE)) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
await fs_extra_1.default.writeFile(buildGradlePath, `${buildGradleContents.trim()}\n${APPLY_EAS_BUILD_INJECT_CREDENTIALS_GRADLE_LINE}\n`);
|
|
67
|
+
}
|
|
68
|
+
async function addApplyConfigureVersionConfigToBuildGradle(projectRoot) {
|
|
69
|
+
const buildGradlePath = config_plugins_1.AndroidConfig.Paths.getAppBuildGradleFilePath(projectRoot);
|
|
70
|
+
const buildGradleContents = await fs_extra_1.default.readFile(path_1.default.join(buildGradlePath), 'utf8');
|
|
71
|
+
if (hasLine(buildGradleContents, APPLY_EAS_BUILD_CONFIGURE_VERSION_GRADLE_LINE)) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
await fs_extra_1.default.writeFile(buildGradlePath, `${buildGradleContents.trim()}\n${APPLY_EAS_BUILD_CONFIGURE_VERSION_GRADLE_LINE}\n`);
|
|
75
|
+
}
|
|
76
|
+
function hasLine(haystack, needle) {
|
|
77
|
+
return (haystack
|
|
78
|
+
.replace(/\r\n/g, '\n')
|
|
79
|
+
.split('\n')
|
|
80
|
+
// Check for both single and double quotes
|
|
81
|
+
.some((line) => line === needle || line === needle.replace(/"/g, "'")));
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=gradleConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradleConfig.js","sourceRoot":"","sources":["../../../../src/steps/utils/android/gradleConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport { AndroidConfig } from '@expo/config-plugins';\nimport { bunyan } from '@expo/logger';\nimport fs from 'fs-extra';\nimport templateFile from '@expo/template-file';\n\nconst EAS_BUILD_INJECT_CREDENTIALS_GRADLE_TEMPLATE_PATH = path.join(\n __dirname,\n '../../../../templates/eas-build-inject-android-credentials.gradle'\n);\nconst EAS_BUILD_CONFIGURE_VERSION_GRADLE_TEMPLATE_PATH = path.join(\n __dirname,\n '../../../../templates/eas-build-configure-version.gradle.template'\n);\n\nconst APPLY_EAS_BUILD_INJECT_CREDENTIALS_GRADLE_LINE =\n 'apply from: \"./eas-build-inject-android-credentials.gradle\"';\nconst APPLY_EAS_BUILD_CONFIGURE_VERSION_GRADLE_LINE =\n 'apply from: \"./eas-build-configure-version.gradle\"';\n\nexport async function injectCredentialsGradleConfig(\n logger: bunyan,\n workingDir: string\n): Promise<void> {\n logger.info('Injecting signing config into build.gradle');\n await deleteEasBuildInjectCredentialsGradle(workingDir);\n await createEasBuildInjectCredentialsGradle(workingDir);\n await addApplyInjectCredentialsConfigToBuildGradle(workingDir);\n logger.info('Signing config injected');\n}\n\nexport async function injectConfigureVersionGradleConfig(\n logger: bunyan,\n workingDir: string,\n { versionCode, versionName }: { versionCode: number; versionName: string }\n): Promise<void> {\n logger.info('Injecting version config into build.gradle');\n logger.info(`Version code: ${versionCode}`);\n logger.info(`Version name: ${versionName}`);\n await deleteEasBuildConfigureVersionGradle(workingDir);\n await createEasBuildConfigureVersionGradle(workingDir, { versionCode, versionName });\n await addApplyConfigureVersionConfigToBuildGradle(workingDir);\n logger.info('Version config injected');\n}\n\nasync function deleteEasBuildInjectCredentialsGradle(workingDir: string): Promise<void> {\n const targetPath = getEasBuildInjectCredentialsGradlePath(workingDir);\n await fs.remove(targetPath);\n}\n\nasync function deleteEasBuildConfigureVersionGradle(workingDir: string): Promise<void> {\n const targetPath = getEasBuildConfigureVersionGradlePath(workingDir);\n await fs.remove(targetPath);\n}\n\nfunction getEasBuildInjectCredentialsGradlePath(workingDir: string): string {\n return path.join(workingDir, 'android/app/eas-build-inject-android-credentials.gradle');\n}\n\nfunction getEasBuildConfigureVersionGradlePath(workingDir: string): string {\n return path.join(workingDir, 'android/app/eas-build-configure-version.gradle');\n}\n\nasync function createEasBuildInjectCredentialsGradle(workingDir: string): Promise<void> {\n const targetPath = getEasBuildInjectCredentialsGradlePath(workingDir);\n await fs.copy(EAS_BUILD_INJECT_CREDENTIALS_GRADLE_TEMPLATE_PATH, targetPath);\n}\n\nasync function createEasBuildConfigureVersionGradle(\n workingDir: string,\n { versionCode, versionName }: { versionCode: number; versionName: string }\n): Promise<void> {\n const targetPath = getEasBuildConfigureVersionGradlePath(workingDir);\n await templateFile(\n EAS_BUILD_CONFIGURE_VERSION_GRADLE_TEMPLATE_PATH,\n {\n VERSION_CODE: versionCode,\n VERSION_NAME: versionName,\n },\n targetPath,\n {\n mustache: false,\n }\n );\n}\n\nasync function addApplyInjectCredentialsConfigToBuildGradle(projectRoot: string): Promise<void> {\n const buildGradlePath = AndroidConfig.Paths.getAppBuildGradleFilePath(projectRoot);\n const buildGradleContents = await fs.readFile(path.join(buildGradlePath), 'utf8');\n\n if (hasLine(buildGradleContents, APPLY_EAS_BUILD_INJECT_CREDENTIALS_GRADLE_LINE)) {\n return;\n }\n\n await fs.writeFile(\n buildGradlePath,\n `${buildGradleContents.trim()}\\n${APPLY_EAS_BUILD_INJECT_CREDENTIALS_GRADLE_LINE}\\n`\n );\n}\n\nasync function addApplyConfigureVersionConfigToBuildGradle(projectRoot: string): Promise<void> {\n const buildGradlePath = AndroidConfig.Paths.getAppBuildGradleFilePath(projectRoot);\n const buildGradleContents = await fs.readFile(path.join(buildGradlePath), 'utf8');\n\n if (hasLine(buildGradleContents, APPLY_EAS_BUILD_CONFIGURE_VERSION_GRADLE_LINE)) {\n return;\n }\n\n await fs.writeFile(\n buildGradlePath,\n `${buildGradleContents.trim()}\\n${APPLY_EAS_BUILD_CONFIGURE_VERSION_GRADLE_LINE}\\n`\n );\n}\n\nfunction hasLine(haystack: string, needle: string): boolean {\n return (\n haystack\n .replace(/\\r\\n/g, '\\n')\n .split('\\n')\n // Check for both single and double quotes\n .some((line) => line === needle || line === needle.replace(/\"/g, \"'\"))\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/build-tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.32",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"files": [
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@expo/logger": "1.0.30",
|
|
29
29
|
"@expo/package-manager": "^1.0.2",
|
|
30
30
|
"@expo/plist": "^0.0.20",
|
|
31
|
-
"@expo/steps": "1.0.
|
|
31
|
+
"@expo/steps": "1.0.32",
|
|
32
32
|
"@expo/template-file": "1.0.30",
|
|
33
33
|
"@expo/turtle-spawn": "1.0.30",
|
|
34
34
|
"@expo/xcpretty": "^4.2.2",
|
|
@@ -65,5 +65,5 @@
|
|
|
65
65
|
"node": "18.13.0",
|
|
66
66
|
"yarn": "1.22.19"
|
|
67
67
|
},
|
|
68
|
-
"gitHead": "
|
|
68
|
+
"gitHead": "8c5a3b94a25d25af83fd3edd26f0aa0f92899455"
|
|
69
69
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Build integration with EAS
|
|
2
|
+
|
|
3
|
+
import java.nio.file.Paths
|
|
4
|
+
|
|
5
|
+
def versionCodeVal = "<%- VERSION_CODE %>"
|
|
6
|
+
def versionNameVal = "<%- VERSION_NAME %>"
|
|
7
|
+
|
|
8
|
+
android {
|
|
9
|
+
defaultConfig {
|
|
10
|
+
if (versionCodeVal) {
|
|
11
|
+
versionCode = Integer.parseInt(versionCodeVal)
|
|
12
|
+
}
|
|
13
|
+
if (versionNameVal) {
|
|
14
|
+
versionName = versionNameVal
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
applicationVariants.all { variant ->
|
|
18
|
+
variant.outputs.each { output ->
|
|
19
|
+
if (versionCodeVal) {
|
|
20
|
+
output.versionCodeOverride = Integer.parseInt(versionCodeVal)
|
|
21
|
+
}
|
|
22
|
+
if (versionNameVal) {
|
|
23
|
+
output.versionNameOverride = versionNameVal
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Build integration with EAS
|
|
2
|
+
|
|
3
|
+
import java.nio.file.Paths
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
android {
|
|
7
|
+
signingConfigs {
|
|
8
|
+
release {
|
|
9
|
+
def credentialsJson = Paths.get(System.getenv("EAS_BUILD_WORKINGDIR")).resolve("credentials.json").toFile();
|
|
10
|
+
def credentials = new groovy.json.JsonSlurper().parse(credentialsJson)
|
|
11
|
+
def keystorePath = Paths.get(credentials.android.keystore.keystorePath);
|
|
12
|
+
|
|
13
|
+
storeFile keystorePath.toFile()
|
|
14
|
+
storePassword credentials.android.keystore.keystorePassword
|
|
15
|
+
keyAlias credentials.android.keystore.keyAlias
|
|
16
|
+
if (credentials.android.keystore.containsKey("keyPassword")) {
|
|
17
|
+
keyPassword credentials.android.keystore.keyPassword
|
|
18
|
+
} else {
|
|
19
|
+
// key password is required by Gradle, but PKCS keystores don't have one
|
|
20
|
+
// using the keystore password seems to satisfy the requirement
|
|
21
|
+
keyPassword credentials.android.keystore.keystorePassword
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
buildTypes {
|
|
27
|
+
release {
|
|
28
|
+
signingConfig android.signingConfigs.release
|
|
29
|
+
}
|
|
30
|
+
debug {
|
|
31
|
+
signingConfig android.signingConfigs.release
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.createRunGradleBuildFunction = void 0;
|
|
7
|
-
const steps_1 = require("@expo/steps");
|
|
8
|
-
const nullthrows_1 = __importDefault(require("nullthrows"));
|
|
9
|
-
const gradle_1 = require("../../../android/gradle");
|
|
10
|
-
function createRunGradleBuildFunction(ctx) {
|
|
11
|
-
return new steps_1.BuildFunction({
|
|
12
|
-
namespace: 'utils',
|
|
13
|
-
id: 'run_gradle',
|
|
14
|
-
name: 'Run Gradle',
|
|
15
|
-
inputProviders: [
|
|
16
|
-
steps_1.BuildStepInput.createProvider({
|
|
17
|
-
id: 'gradle_command',
|
|
18
|
-
defaultValue: ':app:bundleRelease',
|
|
19
|
-
required: true,
|
|
20
|
-
allowedValueTypeName: steps_1.BuildStepInputValueTypeName.STRING,
|
|
21
|
-
}),
|
|
22
|
-
],
|
|
23
|
-
fn: async (stepsCtx, { inputs }) => {
|
|
24
|
-
await (0, gradle_1.runGradleCommand)(ctx, {
|
|
25
|
-
logger: stepsCtx.logger,
|
|
26
|
-
gradleCommand: (0, nullthrows_1.default)(inputs.gradle_command.value).toString(),
|
|
27
|
-
androidDir: stepsCtx.workingDirectory,
|
|
28
|
-
});
|
|
29
|
-
},
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
exports.createRunGradleBuildFunction = createRunGradleBuildFunction;
|
|
33
|
-
//# sourceMappingURL=runGradle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runGradle.js","sourceRoot":"","sources":["../../../../src/steps/functions/utils/runGradle.ts"],"names":[],"mappings":";;;;;;AACA,uCAAyF;AACzF,4DAAoC;AAGpC,oDAA2D;AAE3D,SAAgB,4BAA4B,CAAgB,GAAoB;IAC9E,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,OAAO;QAClB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,YAAY;QAClB,cAAc,EAAE;YACd,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,gBAAgB;gBACpB,YAAY,EAAE,oBAAoB;gBAClC,QAAQ,EAAE,IAAI;gBACd,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;SACH;QACD,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACjC,MAAM,IAAA,yBAAgB,EAAC,GAAgC,EAAE;gBACvD,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,aAAa,EAAE,IAAA,oBAAU,EAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;gBACjE,UAAU,EAAE,QAAQ,CAAC,gBAAgB;aACtC,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AArBD,oEAqBC","sourcesContent":["import { Android, Job } from '@expo/eas-build-job';\nimport { BuildFunction, BuildStepInput, BuildStepInputValueTypeName } from '@expo/steps';\nimport nullthrows from 'nullthrows';\n\nimport { BuildContext } from '../../../context';\nimport { runGradleCommand } from '../../../android/gradle';\n\nexport function createRunGradleBuildFunction<T extends Job>(ctx: BuildContext<T>): BuildFunction {\n return new BuildFunction({\n namespace: 'utils',\n id: 'run_gradle',\n name: 'Run Gradle',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'gradle_command',\n defaultValue: ':app:bundleRelease',\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n fn: async (stepsCtx, { inputs }) => {\n await runGradleCommand(ctx as BuildContext<Android.Job>, {\n logger: stepsCtx.logger,\n gradleCommand: nullthrows(inputs.gradle_command.value).toString(),\n androidDir: stepsCtx.workingDirectory,\n });\n },\n });\n}\n"]}
|