Codemagic CI:从 Git 标签获取 android 版本
Codemagic CI: Get android version from Git Tag
我有一个 Flutter 应用程序,我正在 运行 通过 CI 使用 Codemagic 将应用程序构建到 iOS 和 Android。 CI 的很大一部分是语义版本控制,它接受我的 git 提交并将我的版本构建为 gitlab 中的标签。当创建这些标签时,这会触发构建 CI,它应该采用标签并在构建时设置版本。
对于 iOS 这不是问题,因为在我的预构建脚本中我可以获得版本并使用 agvtools
进行设置
echo "getting latest version..."
export NEW_VERSION_NAME=$((git describe --tags) | cut -c 2-)
NEW_IOS_VERSION_NAME=$((git describe --tags) | cut -c 2-6)
echo $NEW_VERSION_NAME
echo "VERSION_NAME=$NEW_VERSION_NAME" > app/version.properties
...
echo "updating ios version"
agvtool new-marketing-version $NEW_IOS_VERSION_NAME
但是使用 Android 我在让它工作时遇到了更多麻烦,因为 Android Studio 中没有任何工具可以更新预构建版本。 CI 中的唯一选项是将 $NEW_VERSION_NAME
传递到 flutter build apk --release --build-name=$NEW_VERSION_NAME
中,因为变量似乎不会在脚本之间传递。
相反,我从 Codemagic (https://github.com/codemagic-ci-cd/android-versioning-example) 中找到了 android 版本控制的示例回购,而是在 app/build.gradle 中操作版本。
在本地,我得到了以下工作,我在 kotlin 函数中从 exec {}
获取标签,然后 return 字符串:
def gitVersionName = { ->
try {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'describe', '--tags',
standardOutput = stdout
}
println("Git Version: ${stdout.toString().trim()}")
return stdout.toString().trim()
}
catch (ignored) {
return null;
}
}
...
android {
defaultConfig {
applicationId "XXX"
minSdkVersion 21
targetSdkVersion 30
versionCode flutterVersionCode.toInteger()
versionName gitVersionName() ?: flutterVersionName
}
...
这在本地有效,但是当我尝试在 Codemagic CI 中 运行 时,我在 Android Build 中打印了 fatal: Not a valid object name
。我只能假设这意味着终端不在 git 存储库中,因此没有 returning 任何 git 命令。
如果有人知道如何在 kotlin exec 中 CD 到正确的目录,那么我可以继续这个方法。或者,如果有人有其他方法从 git 标签获取版本,那就更好了!
我建议使用与 iOS 构建相同的方法。你只需要保存
$NEW_VERSION_NAME
到脚本末尾的特殊 $CM_ENV
文件,如
echo "NEW_VERSION_NAME=$NEW_VERSION_NAME" >> $CM_ENV
并且它允许您将变量用于 flutter build
命令
您可以在此处找到更多信息和示例
https://docs.codemagic.io/variables/using-environment-variables/#setting-an-environment-variable-on-macos-and-linux
我有一个 Flutter 应用程序,我正在 运行 通过 CI 使用 Codemagic 将应用程序构建到 iOS 和 Android。 CI 的很大一部分是语义版本控制,它接受我的 git 提交并将我的版本构建为 gitlab 中的标签。当创建这些标签时,这会触发构建 CI,它应该采用标签并在构建时设置版本。
对于 iOS 这不是问题,因为在我的预构建脚本中我可以获得版本并使用 agvtools
进行设置echo "getting latest version..."
export NEW_VERSION_NAME=$((git describe --tags) | cut -c 2-)
NEW_IOS_VERSION_NAME=$((git describe --tags) | cut -c 2-6)
echo $NEW_VERSION_NAME
echo "VERSION_NAME=$NEW_VERSION_NAME" > app/version.properties
...
echo "updating ios version"
agvtool new-marketing-version $NEW_IOS_VERSION_NAME
但是使用 Android 我在让它工作时遇到了更多麻烦,因为 Android Studio 中没有任何工具可以更新预构建版本。 CI 中的唯一选项是将 $NEW_VERSION_NAME
传递到 flutter build apk --release --build-name=$NEW_VERSION_NAME
中,因为变量似乎不会在脚本之间传递。
相反,我从 Codemagic (https://github.com/codemagic-ci-cd/android-versioning-example) 中找到了 android 版本控制的示例回购,而是在 app/build.gradle 中操作版本。
在本地,我得到了以下工作,我在 kotlin 函数中从 exec {}
获取标签,然后 return 字符串:
def gitVersionName = { ->
try {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'describe', '--tags',
standardOutput = stdout
}
println("Git Version: ${stdout.toString().trim()}")
return stdout.toString().trim()
}
catch (ignored) {
return null;
}
}
...
android {
defaultConfig {
applicationId "XXX"
minSdkVersion 21
targetSdkVersion 30
versionCode flutterVersionCode.toInteger()
versionName gitVersionName() ?: flutterVersionName
}
...
这在本地有效,但是当我尝试在 Codemagic CI 中 运行 时,我在 Android Build 中打印了 fatal: Not a valid object name
。我只能假设这意味着终端不在 git 存储库中,因此没有 returning 任何 git 命令。
如果有人知道如何在 kotlin exec 中 CD 到正确的目录,那么我可以继续这个方法。或者,如果有人有其他方法从 git 标签获取版本,那就更好了!
我建议使用与 iOS 构建相同的方法。你只需要保存
$NEW_VERSION_NAME
到脚本末尾的特殊 $CM_ENV
文件,如
echo "NEW_VERSION_NAME=$NEW_VERSION_NAME" >> $CM_ENV
并且它允许您将变量用于 flutter build
命令
您可以在此处找到更多信息和示例 https://docs.codemagic.io/variables/using-environment-variables/#setting-an-environment-variable-on-macos-and-linux