在 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
- 专业版:推送标签时仅工作 运行
- 缺点:与上面基于 semver 的示例具有相同的测试断开继承问题
使用结帐中的 git 历史记录作为构建脚本的一部分添加对 semver 标签的条件检查(或更改文件上的差异)
- 专业人士:基本上会做我想做的事,而无需与 Concourse 做太多的斗争
- 缺点:如果不实际阅读构建输出
,则无法看到 UI 中的差异
- 缺点:难以与其他任务和资源类型组合以使用二进制版本做某事
手动触发发布构建
- 专业版:设置简单
- 缺点:需要人工干预。
当检测到版本更改时,使用 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
这是我想要实现的目标:
我有一个包含二进制版本构建作业的项目。二进制文件需要一段时间才能为每个平台交叉编译,所以我只想在标记发布时发布要完成的构建,但我希望本地本地版本构建并测试 运行 每个检查-在版本中。
基于飞行学校演示...到目前为止,我的管道配置如下所示:
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
- 专业版:推送标签时仅工作 运行
- 缺点:与上面基于 semver 的示例具有相同的测试断开继承问题
使用结帐中的 git 历史记录作为构建脚本的一部分添加对 semver 标签的条件检查(或更改文件上的差异)
- 专业人士:基本上会做我想做的事,而无需与 Concourse 做太多的斗争
- 缺点:如果不实际阅读构建输出 ,则无法看到 UI 中的差异
- 缺点:难以与其他任务和资源类型组合以使用二进制版本做某事
手动触发发布构建
- 专业版:设置简单
- 缺点:需要人工干预。
当检测到版本更改时,使用 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 thebranch
. 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