我正在使用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,但在管道列表中找不到它。