diff --git a/.changeset/tidy-singers-carry.md b/.changeset/tidy-singers-carry.md
new file mode 100644
index 00000000000..8b12cede991
--- /dev/null
+++ b/.changeset/tidy-singers-carry.md
@@ -0,0 +1,7 @@
+---
+"app-builder-lib": minor
+"electron-builder": minor
+"builder-util": patch
+---
+
+Allow explicit `buildNumber` in config. `buildNumber` will take precedence over any environment variables (#6945)
diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md
index ad076af76e5..7840161ede8 100644
--- a/docs/configuration/configuration.md
+++ b/docs/configuration/configuration.md
@@ -92,11 +92,14 @@ Env file `electron-builder.env` in the current dir ([example](https://github.com
npmRebuild
= true
Boolean - Whether to rebuild native dependencies before starting to package the app.
+
+buildNumber
String | “undefined” - The build number. Maps to the --iteration
flag for builds using FPM on Linux. If not defined, then it will fallback to BUILD_NUMBER
or TRAVIS_BUILD_NUMBER
or APPVEYOR_BUILD_NUMBER
or CIRCLE_BUILD_NUM
or BUILD_BUILDNUMBER
or CI_PIPELINE_IID
env.
+
-
-
buildVersion
String | “undefined” - The build version. Maps to the CFBundleVersion
on macOS, and FileVersion
metadata property on Windows. Defaults to the version
. If TRAVIS_BUILD_NUMBER
or APPVEYOR_BUILD_NUMBER
or CIRCLE_BUILD_NUM
or BUILD_NUMBER
or bamboo.buildNumber
or CI_PIPELINE_IID
env defined, it will be used as a build version (version.build_number
).
+buildVersion
String | “undefined” - The build version. Maps to the CFBundleVersion
on macOS, and FileVersion
metadata property on Windows. Defaults to the version
. If buildVersion
is not defined and buildNumber
(or one of the buildNumber
envs) is defined, it will be used as a build version (version.buildNumber
).
-
electronCompile
Boolean - Whether to use electron-compile to compile app. Defaults to true
if electron-compile
in the dependencies. And false
if in the devDependencies
or doesn’t specified.
diff --git a/packages/app-builder-lib/scheme.json b/packages/app-builder-lib/scheme.json
index dbc5d32e200..da77cf37202 100644
--- a/packages/app-builder-lib/scheme.json
+++ b/packages/app-builder-lib/scheme.json
@@ -6315,8 +6315,15 @@
"description": "Whether to build the application native dependencies from source.",
"type": "boolean"
},
+ "buildNumber": {
+ "description": "The build number. Maps to the `--iteration` flag for builds using FPM on Linux. If not defined then will fallback to `BUILD_NUMBER` or `TRAVIS_BUILD_NUMBER` or `APPVEYOR_BUILD_NUMBER` or `CIRCLE_BUILD_NUM` or `BUILD_BUILDNUMBER` or `CI_PIPELINE_IID` env.",
+ "type": [
+ "null",
+ "string"
+ ]
+ },
"buildVersion": {
- "description": "The build version. Maps to the `CFBundleVersion` on macOS, and `FileVersion` metadata property on Windows. Defaults to the `version`.\nIf `TRAVIS_BUILD_NUMBER` or `APPVEYOR_BUILD_NUMBER` or `CIRCLE_BUILD_NUM` or `BUILD_NUMBER` or `bamboo.buildNumber` or `CI_PIPELINE_IID` env defined, it will be used as a build version (`version.build_number`).",
+ "description": "The build version. Maps to the `CFBundleVersion` on macOS, and `FileVersion` metadata property on Windows. Defaults to the `version`.\nIf `buildVersion` is not defined and `buildNumber` (or one of the `buildNumber envs) is defined, it will be used as a build version (`version.buildNumber`).",
"type": [
"null",
"string"
diff --git a/packages/app-builder-lib/src/appInfo.ts b/packages/app-builder-lib/src/appInfo.ts
index 344494ec5e6..e9615015c99 100644
--- a/packages/app-builder-lib/src/appInfo.ts
+++ b/packages/app-builder-lib/src/appInfo.ts
@@ -39,13 +39,14 @@ export class AppInfo {
buildVersion = info.config.buildVersion
}
- this.buildNumber =
+ const buildNumberEnvs =
process.env.BUILD_NUMBER ||
process.env.TRAVIS_BUILD_NUMBER ||
process.env.APPVEYOR_BUILD_NUMBER ||
process.env.CIRCLE_BUILD_NUM ||
process.env.BUILD_BUILDNUMBER ||
process.env.CI_PIPELINE_IID
+ this.buildNumber = info.config.buildNumber || buildNumberEnvs
if (buildVersion == null) {
buildVersion = this.version
if (!isEmptyOrSpaces(this.buildNumber)) {
diff --git a/packages/app-builder-lib/src/configuration.ts b/packages/app-builder-lib/src/configuration.ts
index d7efc312101..7171643e5a8 100644
--- a/packages/app-builder-lib/src/configuration.ts
+++ b/packages/app-builder-lib/src/configuration.ts
@@ -129,9 +129,15 @@ export interface Configuration extends PlatformSpecificBuildOptions {
*/
readonly npmRebuild?: boolean
+ /**
+ * The build number. Maps to the `--iteration` flag for builds using FPM on Linux.
+ * If not defined, then it will fallback to `BUILD_NUMBER` or `TRAVIS_BUILD_NUMBER` or `APPVEYOR_BUILD_NUMBER` or `CIRCLE_BUILD_NUM` or `BUILD_BUILDNUMBER` or `CI_PIPELINE_IID` env.
+ */
+ readonly buildNumber?: string | null
+
/**
* The build version. Maps to the `CFBundleVersion` on macOS, and `FileVersion` metadata property on Windows. Defaults to the `version`.
- * If `TRAVIS_BUILD_NUMBER` or `APPVEYOR_BUILD_NUMBER` or `CIRCLE_BUILD_NUM` or `BUILD_NUMBER` or `bamboo.buildNumber` or `CI_PIPELINE_IID` env defined, it will be used as a build version (`version.build_number`).
+ * If `buildVersion` is not defined and `buildNumber` (or one of the `buildNumber` envs) is defined, it will be used as a build version (`version.buildNumber`).
*/
readonly buildVersion?: string | null
diff --git a/packages/app-builder-lib/src/targets/fpm.ts b/packages/app-builder-lib/src/targets/fpm.ts
index 18e53b75b52..1158b510314 100644
--- a/packages/app-builder-lib/src/targets/fpm.ts
+++ b/packages/app-builder-lib/src/targets/fpm.ts
@@ -180,10 +180,17 @@ export default class FpmTarget extends Target {
}
}
- use(packager.info.metadata.license, it => args.push("--license", it!))
- use(appInfo.buildNumber, it => args.push("--iteration", it!))
-
- use(options.fpm, it => args.push(...(it as any)))
+ use(packager.info.metadata.license, it => args.push("--license", it))
+ use(appInfo.buildNumber, it =>
+ args.push(
+ "--iteration",
+ // dashes are not supported for iteration in older versions of fpm
+ // https://github.com/jordansissel/fpm/issues/1833
+ it.split("-").join("_")
+ )
+ )
+
+ use(options.fpm, it => args.push(...it))
args.push(`${appOutDir}/=${installPrefix}/${appInfo.sanitizedProductName}`)
for (const icon of await this.helper.icons) {
diff --git a/packages/app-builder-lib/src/winPackager.ts b/packages/app-builder-lib/src/winPackager.ts
index 677c50dc83e..cb8aebb082a 100644
--- a/packages/app-builder-lib/src/winPackager.ts
+++ b/packages/app-builder-lib/src/winPackager.ts
@@ -297,7 +297,7 @@ export class WinPackager extends PlatformPackager {
}
use(appInfo.companyName, it => args.push("--set-version-string", "CompanyName", it))
- use(this.platformSpecificBuildOptions.legalTrademarks, it => args.push("--set-version-string", "LegalTrademarks", it!))
+ use(this.platformSpecificBuildOptions.legalTrademarks, it => args.push("--set-version-string", "LegalTrademarks", it))
const iconPath = await this.getIconPath()
use(iconPath, it => {
files.push(it)
diff --git a/packages/builder-util/src/util.ts b/packages/builder-util/src/util.ts
index ebfbc7575f6..d14f42685d5 100644
--- a/packages/builder-util/src/util.ts
+++ b/packages/builder-util/src/util.ts
@@ -265,7 +265,8 @@ export class ExecError extends Error {
}
}
-export function use(value: T | null, task: (it: T) => R): R | null {
+type Nullish = null | undefined
+export function use(value: T | Nullish, task: (value: T) => R): R | null {
return value == null ? null : task(value)
}
diff --git a/packages/electron-builder/src/cli/install-app-deps.ts b/packages/electron-builder/src/cli/install-app-deps.ts
index 59f510d0b6e..13e565e671d 100644
--- a/packages/electron-builder/src/cli/install-app-deps.ts
+++ b/packages/electron-builder/src/cli/install-app-deps.ts
@@ -50,7 +50,7 @@ export async function installAppDeps(args: any) {
const [appDir, version] = await Promise.all([
computeDefaultAppDirectory(
projectDir,
- use(config.directories, it => it!.app)
+ use(config.directories, it => it.app)
),
getElectronVersion(projectDir, config, packageMetadata),
])