【问题标题】:Triggering tasks on Semver change: triggers jobs out or order在 Semver 更改时触发任务:触发作业或排序
【发布时间】:2018-08-01 19:35:39
【问题描述】:

这是我想要实现的目标:

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

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

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”之前检查,导致release build被处理从分配给上次签到的 git 版本。

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

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

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

  • 专业版:仅在推送标签时运行作业
  • Con:与上面基于 semver 的示例一样,测试存在相同的断开继承问题

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

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

手动触发发布构建

  • 专业版:设置简单
  • 缺点:需要人工干预。

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

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

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

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

【问题讨论】:

    标签: concourse concourse-git-resource


    【解决方案1】:

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

    我要做的是在release-build 的末尾加上你的次要版本。比如:

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

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

    【讨论】:

    • 感谢您的回答。根据 Concourse CI slack 频道中某人的建议,我想我将决定拥有一个并行的作业链,在 master 上运行,并在 Semver 格式的标签上进行过滤。我希望避免这种情况,因为它需要复制粘贴类型的重复作业和资源,但它似乎最适合我的工作流程。我可能会完全放弃 semver 资源。一旦我用飞行学校实施了一个例子,我会更新一个关于我如何做到这一点的答案。
    【解决方案2】:

    总结

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

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

    标签过滤

    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 资源没有使用 extglob shell 选项。

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

    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 是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
    

    【讨论】:

    • 您应该查看 Concourse CI 即将推出的功能...github.com/concourse/concourse/issues/1707
    • @DwayneForde 我会关注这个新功能的更新日志。当它命中时,我会尝试更新我的管道以使用它,如果成功,我会更新我的答案。
    猜你喜欢
    • 2021-12-09
    • 2017-11-13
    • 2014-07-30
    • 2020-05-17
    • 2010-11-04
    • 2020-10-22
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多