在 Semver 更改时触发任务:触发作业或订单

Triggering tasks on Semver change: triggers jobs out or order

这是我想要实现的目标:

我有一个包含二进制版本构建作业的项目。二进制文件需要一段时间才能为每个平台交叉编译,所以我只想在标记发布时发布要完成的构建,但我希望本地本地版本构建并测试 运行 每个检查-在版本中。

基于飞行学校演示...到目前为止,我的管道配置如下所示:

resources:
  - name: flight-school
    type: git
    source:
      uri: https://github.com/nbering/flight-school
      branch: master

  - name: flight-school-version
    type: semver
    source:
      driver: git
      uri: https://github.com/nbering/flight-school
      branch: master
      file: version

jobs:
  - name: test-app
    plan:
      - get: flight-school
        trigger: true
      - task: tests
        file: flight-school/build.yml

  - name: release-build
    plan:
      - aggregate:
        - get: flight-school-version
          trigger: true
        - get: flight-school
          passed: [test-app]
      - task: release-build
        file: flight-school/ci/release.yml

这会在网络中生成一个管道 UI,如下所示:

问题是,当我更新 git 存储库中的 "release" 文件时,semver 资源 "flight-school-version" 可以在 git 资源 "flight-school",导致从分配给之前签入的 git 版本处理发布版本。

我想要一种解决此问题的方法,以便发布版本显示为一个单独的任务,但仅在版本升级时触发。

到目前为止我想到的一些事情

创建一个单独的 git 资源并设置 tag_filter 以便当 semver 标签被推送到 master

时它仅 运行s

使用结帐中的 git 历史记录作为构建脚本的一部分添加对 semver 标签的条件检查(或更改文件上的差异)

手动触发发布构建

当检测到版本更改时,使用 API 在测试完成时触发暂停构建步骤

git 资源和 semver 资源发生变化时,我还没有找到触发任务的方法。

我正在寻找解决上述示例中的并发问题的答案,或者会产生类似发布工作流程的替代模式。

在我看来,您应该手动单击 release-build 按钮,然后让其他一切自动进行。我假设您是手动修改版本号,但将手动干预转移到发布似乎更好。

我会做的是在 release-build 的末尾放置会影响您的次要版本。类似于:

- put: flight-school-version
  params:
    bump: minor

这样你就永远在正确的版本上,一旦你发布0.0.1,你就永远结束了,你只能继续前进。

总结

这是我根据 Concourse CI slack 频道的建议提出的解决方案。

我添加了一个平行的 "release" 轨道,它过滤类似于 semantic versioning 版本的标签。两条轨道共享任务配置文件和构建脚本。

标签过滤

git 资源支持 tag_filter 选项。来自自述文件:

tag_filter: Optional. If specified, the resource will only detect commits that have a tag matching the expression that have been made against the branch. Patterns are glob(7) compatible (as in, bash compatible).

我使用了一个简单的 glob 模式来匹配我的 semver 标签(比如 v0.0.1):

v[0-9]*

起初我尝试了一个 "extglob" 模式,完全匹配语义版本,像这样:

v+([0-9]).+([0-9]).+([0-9])?(\-+([-A-Za-z0-9.]))?(\++([-A-Za-z0-9.]))

那没有用,因为 git 资源没有使用 extglob shell 选项。

最终结果是一个如下所示的资源:

resource:
  - name: flight-school-release
    type: git
    source:
      uri: https://github.com/nbering/flight-school
      branch: master
      tag_filter: 'v[0-9]*'

Re-Using 任务定义

我面临的下一个挑战是避免 re-writing 我的发布轨道测试定义文件。我必须这样做,因为所有文件路径都使用资源名称,而且我现在有一个用于发布和开发的资源。我的解决方案是在 get 任务上用一个选项覆盖资源。

jobs:
  - name: test-app-release
    plan:
      - get: flight-school
        resource: flight-school-release
        trigger: true
      - task: tests
        file: flight-school/build.yml

Build.yml 以上是 flight school 教程中的标准示例。

综合考虑

我生成的管道如下所示:

我的完整管道配置如下所示:

resources:
  - name: flight-school-master
    type: git
    source:
      uri: https://github.com/nbering/flight-school
      branch: master

  - name: flight-school-release
    type: git
    source:
      uri: https://github.com/nbering/flight-school
      branch: master
      tag_filter: 'v[0-9]*'

jobs:
  - name: test-app-dev
    plan:
      - get: flight-school
        resource: flight-school-master
        trigger: true
      - task: tests
        file: flight-school/build.yml

  - name: test-app-release
    plan:
      - get: flight-school
        resource: flight-school-release
        trigger: true
      - task: tests
        file: flight-school/build.yml

  - name: build-release
    plan:
      - get: flight-school
        resource: flight-school-release
        trigger: true
        passed: [test-app-release]
      - task: release-build
        file: flight-school/ci/release.yml