问题描述
正在使用 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-release
。semantic-release
是一个基于提交消息的正式语法,可以在流水线执行期间由 semantic-release
处理。
使用 changelog
插件可以生成变更日志,使用 Lodash 模板进行格式化。你可以在 semantic-release
返回的 result
对象中访问相关的提交数据。
你可以在 semantic-release
的Gitlab CI 示例中找到一个示例配置。
希望这些解决方案能对你有所帮助!