我正在使用 Gitlab 管道来构建和发布我的应用程序。我们在 AssemblyInfo.Version.cs 文件中指定我们的版本:
[assembly: AssemblyVersion("1.0.1")]
[assembly: AssemblyFileVersion("1.0.1")]
[assembly: AssemblyInformationalVersion("1.0.1")]
我正在寻找一种将 Gitlab 管道 ID 附加到此版本字符串末尾的方法。所以,发布后,生成的DLL的版本将变成:
1.0.1.7226532
如果可能,这只能使用 msbuild 命令行工具来完成,因此不要导入目标文件或任何内容。
我已经从 Gitlab 找到了环境变量,我可以在其中读取管道 id:
CI_PIPELINE_IID
现在我只需使用 msbuild 将其附加到现有版本号即可。
我不确定
msbuild
,但由于它只是一个文件,您可以使用 sed
执行搜索和替换。
假设示例中的版本来自管道可以使用变量的内容(例如 git 标签、每次版本更改时更新的 CI 变量等),您可以在
AssemblyInfo.Version.cs
文件中搜索该值,然后替换它:
# ...
script:
- sed -i "s/${CI_COMMIT_TAG}/${CI_COMMIT_TAG}.${CI_PIPELINE_ID}/g" AssemblyInfo.Version.cs
分解
sed
命令:
-i
标志表示就地编辑文件。注意:在 BSD 系统上,-i
的工作方式略有不同s
告诉 sed
我们想要进行 替换,然后将参数之间的分隔符设置为 /
(如果存在冲突,您可以将其更改为另一个字符)。${CI_COMMIT_TAG}
${CI_COMMIT_TAG}.${CI_PIPELINE_ID}
/g
表示替换文件中搜索字符串的所有实例,而不仅仅是第一个顺便说一句,我建议不要使用
$CI_PIPELINE_IID
变量,因为它是特定于项目的 ID,而不是 $CI_PIPELINE_ID
,它是实例范围的管道 ID。在 GitLab 的某些项目中,您希望使用 IID
版本,例如合并请求、问题等,因为 IID 是 UI 中显示的内容。例如,对于一个问题,它既有实例范围的 ISSUE_ID
又有项目特定的 ISSUE_IID
。由于 IID
显示在 UI 中,用户将很快能够直观地将这两者映射在一起。
然而,GitLab 对管道的做法恰恰相反:实例范围的 CI_PIPELINE_ID
显示在 UI 中,不是特定于项目的
CI_PIPELINE_IID
。在用例中使用
$CI_PIPELINE_IID
可能会导致一些混乱,因为您可能正在查看
AssemblyInfo.Version.cs
文件,查看 ID,但在管道列表中找不到它。