如何参数化大厅任务文件

时间:2017-03-14 09:35:42

标签: concourse

我对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-传递}}没有被替换。

我如何实现这一目标?

3 个答案:

答案 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,以便使用当前VaultCredhub,{{3}支持的凭据管理器之一的变量}和Amazon SSM。因此,您不必再将pipeline.yml中的任务文件分开。您还可以从task.yml文件中访问您在保险柜中设置的值。

由于不推荐使用v3.2.0 {{foo}}而支持((foo))

使用Credential Manager,您可以参数化:

  • sourcepipeline
  • 的资源下
  • source位于pipeline
  • 中的resource_types下
  • webhook_tokenpipeline
  • 的资源下
  • image_resource.source位于task config
  • 中的image_resource下
  • params位于pipeline
  • params位于task config

有关设置大厅的保险库,您可以参考:

  

Amazon Secrets Manager

答案 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;
}