在 Concourse 中,是否可以在 Web UI 或 fly CLI 中以交互方式 select 一个 git 资源分支?

In Concourse, is it possible AT ALL to select a git resource branch interactively in web UI or fly CLI?

F.e。通常你使用“develop”,但今天你想使用“patchXYZ”......在不改变管道的情况下,有没有办法提示用户输入分支名称? 如果不是,对于这个流程,Concourse 的最佳实践是什么?

您不能从网络更改分支名称 UI 我认为这实际上是个好主意,管道应始终代表相同的分支。

我的建议是为给定项目使用两种类型的管道:

  1. 主管道。它有一个规范的名称,例如 projectA-main,并且它遵循 repo 的主要分支(main、master、develop,...)。它是长寿的。
  2. 每个功能分支一个管道。这是短暂的。按照您的示例,它的名称可能类似于 projectA-patchXYZ.

我们现在需要一种方法来避免手动维护不同管道的痛苦(和错误)。这实际上很容易做到,使用 Concourse ((vars))(参见 documentation)。

您仍然只有一个管道文件,但使用这些 ((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

(请参阅 -y 的 fly 文档)。

一旦完成,你应该记得销毁那个分支管道,否则它们会堆积起来,消耗资源。

或者您可以不断重置相同的分支管道,有效地获得您想要的。在这种情况下,管道名称应保持不变,类似于

$ BRANCH=$(git branch --show-current) \
  fly -t ci set-pipeline \
    -p projectA-branch -c ... \
    -y branch=$BRANCH

最后说明:当给定项目有多个管道时,还必须考虑副作用:管道外可见的影响。

经典示例是将工件推送到 S3。两条管道(主要和分支)会将东西放在同一个地方,这可能不是你想要的。

在这种情况下,可以在 S3 资源的正则表达式中使用相同的 ((branch)) 技巧。

您可以在 marco-m/concourse-pipelines and you might find useful my marco-m/concourse-in-a-box 查看我的示例管道,这是一个基于 Docker Compose 的一体式 Concourse CI/CD 系统,具有 Minio S3 兼容存储和HashiCorp Vault 秘密经理。这使您能够在一个简单而完整的环境中从头开始学习 Concourse 管道。