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

问题描述 投票:0回答:1

我正在使用 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 将其附加到现有版本号即可。

.net gitlab msbuild gitlab-ci versioning
1个回答
1
投票

我不确定

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

© www.soinside.com 2019 - 2024. All rights reserved.