如何在 Concourse CI 中使用 yaml 模板变量作为值的一部分

How to use yaml template variable as a part of value in Concourse CI

当我尝试使用模板变量时,例如{{hostname}} 作为值的一部分,它用双引号引起来。

如何给变量添加w/o引号?

示例:

---
resource_types:
  - name: maven
    type: docker-image
    source:
      repository: patrickcrocker/maven-resource
      tag: latest

resources:
  - name: maven-snapshot
    type: maven
    source:
      url: http://{{hostname}}:8081/repository/maven-snapshots/

  - name: repo
    type: git
    source:
      uri: "git@bitbucket.org:foo/bar.git"
      branch: master{{hostname}}

命令fly -t ci set-pipeline --pipeline test --config test.yml --var="hostname=localhost"的结果如下(看"localhost"):

resources:
  resource maven-snapshot has been added:
    name: maven-snapshot
    type: maven
    source:
      url: http://"localhost":8081/repository/maven-snapshots/

  resource repo has been added:
    name: repo
    type: git
    source:
      branch: master"localhost"
      uri: git@bitbucket.org:foo/bar.git

resource types:
  resource type maven has been added:
    name: maven
    type: docker-image
    source:
      repository: patrickcrocker/maven-resource
      tag: latest

我包含第 3 方 Maven 资源的原因是 git 资源不允许 uri 中的 {{}},导致错误:

failed to unmarshal configStructure: yaml: line 17: did not find expected key

更新

concourse v3.2.0 开始,{{someValue}} 语法已弃用,取而代之的是 ((someValue))。新语法将理解您正在尝试插入字符串并相应地放置值。

{{hostname}} 替换为 ((hostname)) 将解决您的问题:

resources:
  - name: maven-snapshot
    type: maven
    source:
      url: http://((hostname)):8081/repository/maven-snapshots/

Concourse 不支持此功能。 Concourse yaml 模板非常原始,您不能在字符串中间插入变量。 您需要将 url 参数设置为 http://localhost:8081/repository/maven-snapshots/ 并将您的分支参数设置为 localmaster 或任何应该设置的参数。

我们知道这是一个问题,我们正在努力解决它,但目前您无法按照您想要的方式设置变量。

在等待 concourse 团队提供此功能的同时,我编写了这个小型可执行文件来解决此 GitHub 存储库中的问题:

https://github.com/sercant/inline-yaml

我这样准备 config.yml:

ftp-username: username
ftp-password: password
ftp-uri: 192.168.1.2
ftp-dir: home/ftp/

ftp-uri-combined: ftp://{{ftp-username}}:{{ftp-password}}@{{ftp-uri}}/{{ftp-dir}}

ftp-uri-combined-html5: {{ftp-uri-combined}}html5
ftp-uri-combined-android: {{ftp-uri-combined}}android

并准备了一个创建-pipeline.sh:

#!/usr/bin/env sh
TEMP=$(mktemp)

java -jar inline-yaml.jar  ${TEMP};
fly -t lite set-pipeline -p  -c  --load-vars-from ${TEMP};

rm ${TEMP};

每当我需要创建管道时,我 运行:

./create-pipeline.sh build-plan.yml build-plan-name config.yml