如何在 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
当我尝试使用模板变量时,例如{{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