Azure DevOps发布至App Center后所有版本均显示为1.0(1)问题
.NET Maui Android应用Azure DevOps CI/CD版本不一致问题
问题现象
用.NET Maui开发的Android应用,在Azure DevOps上配置了CI/CD流水线。CD执行成功后,App Center里显示的所有版本都是同一个,和CI流水线设置的版本对不上。用来更新版本信息的Bash脚本执行时提示AndroidManifest.xml文件不存在,但AssemblyInfo.cs的版本号已经更新成功。
原脚本内容
ANDROID_MANIFEST_FILE="AndroidManifest.xml" if [[ ${{ parameters.SetVersionCodeInManifest }} == True ]] then VERSION_CODE="$(Azure_DevOps_BUILD_ID)" echo "Updating Android build information. New version code $VERSION_CODE" sed -i '' -e 's/versionCode="1"/versionCode="'$VERSION_CODE'"/' $ANDROID_MANIFEST_FILE fi VERSION_NAME=$(App_BUILD_NUMBER) echo "Updating Android build information. New version name $VERSION_NAME" sed -i '' -e 's/versionName="[0-9.]*"/versionName="'$VERSION_NAME'"/' $ANDROID_MANIFEST_FILE cat $ANDROID_MANIFEST_FILE # Set AssemblyInfo assemblyInfoPath='assemblyinfo.cs' echo "assemblyInfoPath: $assemblyInfoPath" sed -i '' -e 's/"[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"/"'$(App_BUILD_NUMBER)'"/' "$assemblyInfoPath" cat $assemblyInfoPath
脚本执行结果
Updating Android build information. New version code 72719 sed: can't read : No such file or directory sed: can't read /Platforms/Android/AndroidManifest.xml: No such file or directory Updating Android build information. New version name 1.0.0.7184 sed: can't read : No such file or directory sed: can't read /Platforms/Android/AndroidManifest.xml: No such file or directory cat: /Platforms/Android/AndroidManifest.xml: No such file or directory assemblyInfoPath: Properties/assemblyinfo.cs sed: can't read : No such file or directory //------------------------------------------------------------------------------ using System; using System.Reflection; [assembly: System.Reflection.AssemblyMetadataAttribute("Microsoft.Maui.ApplicationModel.AppInfo.PackageName", "3486d78e-ccd6-4b01-8805-f784dfd27193")] [assembly: System.Reflection.AssemblyMetadataAttribute("Microsoft.Maui.ApplicationModel.AppInfo.PublisherName", "User Name")] [assembly: System.Reflection.AssemblyMetadataAttribute("Microsoft.Maui.ApplicationModel.AppInfo.Name", "My.App")] [assembly: System.Reflection.AssemblyMetadataAttribute("Microsoft.Maui.ApplicationModel.AppInfo.Version", "1.0.0.7184")] [assembly: System.Reflection.AssemblyCompanyAttribute("My.App")] [assembly: System.Reflection.AssemblyConfigurationAttribute("")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.7184")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+99823c39b76e2e934d222f88f256c57b37f1c3a0")] [assembly: System.Reflection.AssemblyProductAttribute("My.App")] [assembly: System.Reflection.AssemblyTitleAttribute("My.App")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.7184")] [assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows10.0.22000.0")] [assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows10.0.17763.0")] // Generated by the MSBuild WriteCodeFragment class.
错误原因分析
- 文件路径错误:脚本里
ANDROID_MANIFEST_FILE只写了文件名,没指定完整相对路径。.NET Maui项目中AndroidManifest.xml的实际路径是Platforms/Android/AndroidManifest.xml,流水线工作目录下找不到该文件。 - Sed命令参数不兼容:
sed -i ''是macOS系统的写法,但Azure DevOps默认用Ubuntu代理,Linux环境下sed -i不需要空引号,空引号会被当成无效文件路径,导致sed: can't read : No such file or directory错误。 - 变量引用错误:脚本里
Azure_DevOps_BUILD_ID和App_BUILD_NUMBER的引用方式不对,Azure DevOps流水线变量应该用$(Build.BuildId)(内置构建ID变量)和$(App_BUILD_NUMBER)(自定义变量)的格式。
修复方案
1. 修正文件路径
把ANDROID_MANIFEST_FILE设置为完整相对路径:
ANDROID_MANIFEST_FILE="Platforms/Android/AndroidManifest.xml"
2. 适配Linux环境的Sed命令
移除sed -i后面的空引号,改成Linux兼容的写法:
# 修改versionCode的sed命令 sed -i -e 's/versionCode="1"/versionCode="'$VERSION_CODE'"/' $ANDROID_MANIFEST_FILE # 修改versionName的sed命令 sed -i -e 's/versionName="[0-9.]*"/versionName="'$VERSION_NAME'"/' $ANDROID_MANIFEST_FILE
3. 修正变量引用方式
使用Azure DevOps正确的变量格式:
VERSION_CODE="$(Build.BuildId)" VERSION_NAME="$(App_BUILD_NUMBER)"
4. 可选:添加文件存在检查
在操作文件前先检查文件是否存在,避免报错中断流水线:
if [[ ! -f $ANDROID_MANIFEST_FILE ]]; then echo "Error: $ANDROID_MANIFEST_FILE not found in current directory!" exit 1 fi
完整修复后的脚本
ANDROID_MANIFEST_FILE="Platforms/Android/AndroidManifest.xml" # 检查文件是否存在 if [[ ! -f $ANDROID_MANIFEST_FILE ]]; then echo "Error: $ANDROID_MANIFEST_FILE not found!" exit 1 fi if [[ ${{ parameters.SetVersionCodeInManifest }} == True ]] then VERSION_CODE="$(Build.BuildId)" echo "Updating Android build information. New version code $VERSION_CODE" sed -i -e 's/versionCode="1"/versionCode="'$VERSION_CODE'"/' $ANDROID_MANIFEST_FILE fi VERSION_NAME="$(App_BUILD_NUMBER)" echo "Updating Android build information. New version name $VERSION_NAME" sed -i -e 's/versionName="[0-9.]*"/versionName="'$VERSION_NAME'"/' $ANDROID_MANIFEST_FILE cat $ANDROID_MANIFEST_FILE # Set AssemblyInfo assemblyInfoPath='Properties/assemblyinfo.cs' echo "assemblyInfoPath: $assemblyInfoPath" # 同样适配sed参数 sed -i -e 's/"[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"/"'$(App_BUILD_NUMBER)'"/' "$assemblyInfoPath" cat $assemblyInfoPath
内容的提问来源于stack exchange,提问作者Mina Maras
相关产品推荐
相关产品推荐

