0

这是我想要实现的目标:

我有一个带有二进制版本的构建作业的项目。二进制文件需要一段时间才能针对每个平台进行交叉编译,因此我只想在标记发布时发布构建,但我希望构建本​​地本地版本并为每个签入版本运行测试。

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

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

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

大厅管道示例

问题是当我更新git存储库中的“release”文件时,semver资源“flight-school-version”可以在git资源“flight-school”之前检查,导致从git处理release构建分配给上次签入的版本。

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

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

使用集合创建一个单独的 git 资源,tag_filter以便它仅在将 semver 标签推送到 master 时运行

  • Pro:作业仅在推送标签时运行
  • 缺点:与上面基于 semver 的示例具有相同的测试断开继承问题

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

  • 优点:基本上会做我想做的事,而不会与 Concourse 过多的摔跤
  • 缺点:如果不实际读取构建输出,则看不到 UI 中的差异
  • 缺点:难以与其他任务和资源类型组合使用二进制版本来做某事

手动触发发布构建

  • 优点:设置简单
  • 缺点:需要人工干预。

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

  • 缺点:还没有看到其他人这样做的任何例子,看起来真的很复杂。

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

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

4

2 回答 2

1

概括

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

我添加了一个并行的“发布”轨道,它过滤类似于语义版本控制版本的标签。这两个轨道共享任务配置文件和构建脚本。

标签过滤

git资源支持一个tag_filter选项。从自述文件:

tag_filter:可选。如果指定,资源将仅检测具有与针对branch. 模式与glob(7) 兼容(如 bash 兼容)。

我使用了一个简单的 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 资源没有使用extglobshell 选项。

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

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

重用任务定义

我面临的下一个挑战是避免为发布轨道重写我的测试定义文件。我必须这样做,因为所有文件路径都使用资源名称,而且我现在有一个用于发布和开发的资源。我的解决方案是使用 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 是飞行学校教程中的标准示例。

把它们放在一起

我生成的管道如下所示:

具有平行轨道的大厅管道

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

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
于 2018-02-24T22:47:10.920 回答
0

在我看来,您应该手动单击release-build按钮,并让其他一切自动化。我假设您正在手动调整版本号,但将手动干预转移到发布似乎更好。

我要做的就是把release-build你的次要版本放在最后。就像是:

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

这样,您将始终使用正确的版本,一旦发布0.0.1,您将永远完成它,您只能继续前进。

于 2018-02-24T01:17:30.787 回答