将 Gitlab 管道 ID 追加到 .Net 管道中的版本



我正在使用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命令:

  1. -i标志显示就地编辑文件。注意:在 BSD 系统上,-i的工作方式略有不同
  2. 参数开头的s告诉sed我们要进行替换,然后将参数之间的分隔符设置为/(如果冲突,您可以将其更改为另一个字符)。
  3. 我们正在搜索第一个参数,${CI_COMMIT_TAG}
  4. 并用${CI_COMMIT_TAG}.${CI_PIPELINE_ID}代替它
  5. 末尾的/g说要替换文件中搜索字符串的所有实例,而不仅仅是第一个
  6. 最后,我们提供要搜索/替换的文件

顺便说一下,我建议不要使用$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,但在管道列表中找不到它。

最新更新