Fe 通常你使用“develop”,但今天你想使用“patchXYZ”......在不改变管道的情况下,有没有办法提示用户输入分支名称?如果不是,此流程的 Concourse 最佳实践是什么?
1 回答
您不能从 Web UI 更改分支名称,我认为这实际上是一个好主意,管道应该始终代表同一个分支。
我的建议是为给定项目提供两种类型的管道:
- 主管道。它有一个规范的名称,例如
projectA-main
,它遵循 repo 的主分支(main、master、develop,...)。它是长寿的。 - 每个功能分支的管道。这是短暂的。按照您的示例,它的名称可能类似于
projectA-patchXYZ
.
我们现在需要一种方法来避免手动维护不同管道的痛苦(和错误)。这实际上很容易做到,使用 Concourse ((vars))
(参见文档)。
您仍然只有一个管道文件,但使用这些((vars))
. 对于您的带有 git 分支名称的示例:
resources:
- name: repo
type: git
icon: git
source:
uri: https://github.com/marco-m/concourse-pipelines.git
branch: ((branch))
然后,您将使用 fly 设置管道,扩展该变量:
$ BRANCH=$(git branch --show-current) \
fly -t ci set-pipeline \
-p projectA-$BRANCH -c ... \
-y branch=$BRANCH
(请参阅 fly 文档-y
)。
完成后,您应该记住销毁该分支管道,否则它们会堆积起来,吞噬资源。
或者您可以继续重置相同的分支管道,从而有效地获得您想要的。在这种情况下,管道名称应该保持不变,例如
$ BRANCH=$(git branch --show-current) \
fly -t ci set-pipeline \
-p projectA-branch -c ... \
-y branch=$BRANCH
最后一点:当给定项目有多个管道时,还必须考虑副作用:在管道之外可见的效果。
经典示例是将工件推送到 S3。两条管道(主管道和分支管道)会将内容放在同一个地方,这可能不是您想要的。
在这种情况下,((branch))
可以在 S3 资源的正则表达式中使用相同的技巧。
您可以在marco-m/concourse-pipelines查看我的示例管道,您可能会发现我的marco-m/concourse-in-a-box很有用,这是一个基于 Docker Compose 的一体化 Concourse CI/CD 系统,具有与 Minio S3 兼容的存储和 HashiCorp Vault 机密管理器。这样可以在简单而完整的环境中从头开始学习 Concourse 管道。