GitLab CI/CD 如何生成流水线运行之间的变更日志

75次阅读
没有评论

问题描述

正在使用 GitLab CI/CD 结合 Fastlane 在构建机上执行每晚的 iOS 应用构建,并在完成后将构建推送到 TestFlight。目前一切顺利,但是用户被要求生成每晚构建中所包含的新提交的变更日志。

用户想知道是否可以获取当前流水线运行的不仅是 CI_COMMIT_SHA,还有流水线上一次运行的前一个提交的 SHA。这样,用户就可以生成当前流水线运行中的新内容的变更日志了。用户在 Gitlab.com 的文档中搜索了一下,但没有找到相关的信息。

用户还提到,作为流水线的一部分,他们还生成了一个包含构建所使用的当前提交 SHA 的构建清单,并将其保存为一个 artifact。因此,如果可以下载最近的 artifacts,用户也可以查看该清单。但是,用户也没有找到相关的方法。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据 GitLab 的文档,你可以使用 Pipelines API 来获取流水线的变量。具体来说,你可以使用 GET /projects/:id/pipelines/:pipeline_id/variables 接口来获取流水线的变量。

以下是一个示例请求的响应:

[
  {
    "key": "RUN_NIGHTLY_BUILD",
    "variable_type": "env_var",
    "value": "true"
  },
  {
    "key": "foo",
    "value": "bar"
  }
]

在响应中,你可以找到与流水线创建响应示例中显示的变量相对应的变量。其中,你可能会对以下变量感兴趣:

"id": 61,
"sha": "384c444e840a515b23f21915ee5766b87068a70d",
"before_sha": "0000000000000000000000000000000000000000"

如果你想要获取当前流水线的 before_sha,你可以直接使用该变量。如果不是,你可以通过当前流水线的 ID(使用 CI_PIPELINE_ID 环境变量,参考预定义环境变量)来获取前一个流水线的 sha。我假设流水线的 ID 是连续的。

方案2

正如你提到的,保存构建的 artifact 来保存构建所使用的当前提交 SHA 是一个理想的方法。后续运行相同的工作流可以使用 dawidd6/action-download-artifact action 来下载从另一个工作流运行生成的 artifact。

以下是上传 artifact 的示例:

- name: Upload artifacts
  uses: actions/upload-artifact@v2
  with:
    name: nightly-build
    path: ./COMMIT_SHA

以下是从另一个工作流运行中下载最新 artifact 的示例:

- name: Download artifacts
  uses: dawidd6/action-download-artifact@v2
  with:
    workflow: nightly.yml
    name: nightly-build
    path: .

方案3

如果你只想生成变更日志而不是完整的发布对象(包括 artifact 等),你可以使用 semantic-releasesemantic-release 是一个基于提交消息的正式语法,可以在流水线执行期间由 semantic-release 处理。

使用 changelog 插件可以生成变更日志,使用 Lodash 模板进行格式化。你可以在 semantic-release 返回的 result 对象中访问相关的提交数据。

你可以在 semantic-releaseGitlab CI 示例中找到一个示例配置。

希望这些解决方案能对你有所帮助!

正文完