我对Concourse的力量和简洁性印象深刻。由于我的管道不断增长,我决定将任务移到单独的文件中。其中一项任务使用我们自己的私有注册表中的自定义Docker镜像。所以,在那个任务文件中我有:
image_resource:
type: docker-image
source:
repository: docker.mycomp.com:443/app-builder
tag: latest
username: {{dckr-user}}
password: {{dckr-pass}}
当我执行set-pipeline时,我将--load-from-vars参数从单独的文件传递到加载凭据等。
现在我的问题出现了:我注意到我的管道文件中的变量被替换为实际的正确值,但是一旦任务运行,前面提到的{{dckr-user}}和{{dckr-传递}}没有被替换。
我如何实现这一目标?
答案 0 :(得分:4)
除了answer
中提供的内容之外如果您希望在任务中使用私有图片,可以在pipeline.yml
中执行以下操作:
resources:
- name: some-private-image
type: docker
params:
repository: ...
username: {{my-username}}
password: {{my-password}}
jobs:
- name: foo
plan:
- get: some-private-image
- task: some-task
image: some-private-image
因为这是您的管道,您可以使用--load-vars-from
,它将首先get
您的图片作为资源,然后将其用于后续任务。
您还可以看到此article on pre-fetching ruby gems in test containers on Concourse
唯一的缺点是,在运行fly execute
时无法使用此技术。
答案 1 :(得分:2)
自concourse v3.3.0起,您可以设置Credential Management,以便使用当前Vault,Credhub,{{3}支持的凭据管理器之一的变量}和Amazon SSM。因此,您不必再将pipeline.yml
中的任务文件分开。您还可以从task.yml
文件中访问您在保险柜中设置的值。
由于不推荐使用v3.2.0 {{foo}}
而支持((foo))
。
使用Credential Manager,您可以参数化:
source
在pipeline
source
位于pipeline
webhook_token
在pipeline
image_resource.source
位于task config
params
位于pipeline
params
位于task config
有关设置大厅的保险库,您可以参考:
答案 2 :(得分:1)
您始终可以在pipeline.yml中定义任务... 例如:
public final class SerializingExceptionMapper implements ExceptionMapper<Exception> {
@Override
public Response toResponse(Exception exception) {
try {
final byte[] serializedException = serializeException(exception);
final String base64EncodedException = Base64.getEncoder().encodeToString(serializedException);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity(new Message(base64EncodedException))
.build();
} catch (Exception ex) {
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
}
}
private byte[] serializeException(Exception ex) throws IOException {
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(ex);
oos.close();
return bos.toByteArray();
}
}
final class Message {
public Message(String exception) {
this.exception = exception;
}
public String exception;
}