目前我有一个本机应用程序,我遇到的问题是在每次构建或提交时更新版本都非常耗时 .
此外,我启用了Sentry,所以每次构建时,一些构建都会获得相同的版本,因此一些崩溃很难确定它们来自何处 .
最后,手动更新版本容易出错 .
如何设置构建以在每次构建时生成自动版本并忘记所有这些手动任务?
由于我在这几天工作,我决定与大家分享我是如何做到的,因为它可以帮助其他人 .
使用的工具:
GitVersion:我们将使用GitVersion自动生成一个语义版本,具体取决于当前分支,标签,提交等许多因素.toold做得很好,你可以忘记命名你的版本 . 当然,如果您将标记设置为提交,它将使用该标记作为名称 .
PowerShell:由Microsoft构建的此命令行操作系统可以从Mac,Linux或Windows运行,我之所以选择它,是因为构建可以与操作系统版本无关 . 例如,我在Windows上开发,但构建机器有MacOS .
应用程序gradle只需要在其末尾添加一行 . 在我的情况下,我有谷歌播放服务gradle,之后我添加了它 .
apply from: 'version.gradle'
此文件应与您的应用程序gradle位于同一文件夹中,这是内容:
task updatePackage(type: Exec, description: 'Updating package.json') { commandLine 'powershell', ' -command ' , '$semver=(gitversion /showvariable Semver); Set-Content -path version.properties -value semver=$semver; npm version --no-git-tag-version --allow-same-version $semver' } preBuild.dependsOn updatePackage task setVariantVersion { doLast { if (plugins.hasPlugin('android') || plugins.hasPlugin('android-library')) { def autoIncrementVariant = { variant -> variant.mergedFlavor.versionName = calculateVersionName() } if (plugins.hasPlugin('android')){ //Fails without putting android. first android.applicationVariants.all { variant -> autoIncrementVariant(variant) } } if (plugins.hasPlugin('android-library')) { //Probably needs android-library before libraryVariants. Needs testing libraryVariants.all { variant -> autoIncrementVariant(variant) } } } } } preBuild.dependsOn setVariantVersion setVariantVersion.mustRunAfter updatePackage ext { versionFile = new File('version.properties') calculateVersionName = { def version = readVersion() def semver = "Unknown" if (version != null){ semver = version.getProperty('semver') } return semver } } Properties readVersion() { //It gets called once for every variant but all get the same version def version = new Properties() try { file(versionFile).withInputStream { version.load(it) } } catch (Exception error) { version = null } return version }
现在,让我们回顾一下脚本实际在做什么:
updatePackage:此任务在构建的最开始(实际上在preBuild之前)运行,并执行gitversion以获取当前版本,然后创建一个version.properties文件,稍后由gradle读取该文件以获取该版本 .
setVariantVersion:在每个变体上调用afterEvaluate . 这意味着如果您有多个构建,如debug,release,qa,staging等,则所有版本都将获得相同的版本 . 对于我的用例,这很好,但你可能想要调整它 .
任务顺序:困扰我的一件事是版本在文件生成之前运行 . 这是通过使用mustRunAfter标记来解决的 .
这是首先运行的脚本 . 让我们回顾一下在做什么:
$semver=(gitversion /showvariable Semver); Set-Content -path props.properties -value semver=$semver; npm version --no-git-tag-version --allow-same-version $semver
第1行:gitversion有多种类型的版本 . 如果你在没有任何参数的情况下运行它,你将获得一个包含许多变体的json文件 . 我们在这里说我们只想要SemVer . (另见FullSemVer)
第2行:PowerShell创建文件并将内容保存到其中的方法 . 这也可以用>但我有编码问题,并且没有读取属性文件 .
第3行:此行更新package.json版本 . 默认情况下,它会使用新版本保存对git的提交 . --no-git-tag-version确保你不要覆盖它 .
就是这样 . 现在,每次进行构建时,都应自动生成版本,更新package.json,并且构建应具有该特定版本名称 .
由于我使用App Center进行构建,我将告诉您如何在Build机器中使用它 . 您只需要使用自定义脚本 .
#!/usr/bin/env sh #Installing GitVersion OS=$(uname -s) if [[ $OS == *"W64"* ]]; then echo "Installing GitVersion with Choco" choco install GitVersion.Portable -y else echo "Installing GitVersion with Homebrew" brew install --ignore-dependencies gitversion fi
这是必需的,因为GitVersion目前不是构建机器的一部分 . 此外,您需要在安装时忽略单声道依赖项,否则当brew尝试链接文件时会出现错误 .
1 回答
由于我在这几天工作,我决定与大家分享我是如何做到的,因为它可以帮助其他人 .
使用的工具:
GitVersion:我们将使用GitVersion自动生成一个语义版本,具体取决于当前分支,标签,提交等许多因素.toold做得很好,你可以忘记命名你的版本 . 当然,如果您将标记设置为提交,它将使用该标记作为名称 .
PowerShell:由Microsoft构建的此命令行操作系统可以从Mac,Linux或Windows运行,我之所以选择它,是因为构建可以与操作系统版本无关 . 例如,我在Windows上开发,但构建机器有MacOS .
编辑App build.gradle
应用程序gradle只需要在其末尾添加一行 . 在我的情况下,我有谷歌播放服务gradle,之后我添加了它 .
version.gradle
此文件应与您的应用程序gradle位于同一文件夹中,这是内容:
现在,让我们回顾一下脚本实际在做什么:
updatePackage:此任务在构建的最开始(实际上在preBuild之前)运行,并执行gitversion以获取当前版本,然后创建一个version.properties文件,稍后由gradle读取该文件以获取该版本 .
setVariantVersion:在每个变体上调用afterEvaluate . 这意味着如果您有多个构建,如debug,release,qa,staging等,则所有版本都将获得相同的版本 . 对于我的用例,这很好,但你可能想要调整它 .
任务顺序:困扰我的一件事是版本在文件生成之前运行 . 这是通过使用mustRunAfter标记来解决的 .
PowerShell脚本说明
这是首先运行的脚本 . 让我们回顾一下在做什么:
第1行:gitversion有多种类型的版本 . 如果你在没有任何参数的情况下运行它,你将获得一个包含许多变体的json文件 . 我们在这里说我们只想要SemVer . (另见FullSemVer)
第2行:PowerShell创建文件并将内容保存到其中的方法 . 这也可以用>但我有编码问题,并且没有读取属性文件 .
第3行:此行更新package.json版本 . 默认情况下,它会使用新版本保存对git的提交 . --no-git-tag-version确保你不要覆盖它 .
就是这样 . 现在,每次进行构建时,都应自动生成版本,更新package.json,并且构建应具有该特定版本名称 .
App Center
由于我使用App Center进行构建,我将告诉您如何在Build机器中使用它 . 您只需要使用自定义脚本 .
app-center-pre-build.sh
这是必需的,因为GitVersion目前不是构建机器的一部分 . 此外,您需要在安装时忽略单声道依赖项,否则当brew尝试链接文件时会出现错误 .