来自另一个参数

时间:2017-08-16 02:49:05

标签: concourse

我的工作有很多这样的任务:

- name: main-job
  serial: true
  plan:
  - aggregate:
    - get: <git-resource>
      passed: [previous-job]
      trigger: true
    - get: <git-resource-3>
  - task: <task-1>
    file: <git-resource>/<path>/<task-1-no-db>.yml
  - task: <task-2>
    tags: ['<specific-tag>']
    file: <git-resource>/<path>/<task-1>.yml
    params:
      DATABASE_HOST: <file>
      DATABASE: <my-db-1>
  - task: <task-2>
    tags: ['<specific-tag>']
    file: <git-resource>/<path>/<task-1>.yml
    params:
      DATABASE_HOST: <file>
      DATABASE: <my-db-1>

对我来说问题是,我必须完全相同的工作,但不是DATABASE参数my-db-1,我希望它是my-db-2

我能够做到这一点的唯一方法是通过新工作并传递参数,从字面上复制整行。我的工作太胖了,因为它有太多的任务,所以复制它是显而易见的解决方案,我想知道是否有通过拥有多个管道和一个基本上调用这些管道的主要管道来重用的方法通过DATABASE参数传递的管道或者有两个小工作,用不同的参数调用这个主要工作:

- name: <call-main-job-with-db-1>
  serial: true
  plan:
  - aggregate:
    - get: <git-resource>
      passed: [previous-job]
      trigger: true
  - task: <call-main-job-task>
    params:
      DATABASE_HOST: <file>
      DATABASE: <my-db-1>



- name: <call-main-job-with-db-2>
  serial: true
  plan:
  - aggregate:
    - get: <git-resource>
      passed: [previous-job]
      trigger: true
  - task: <call-main-job-task>
    params:
      DATABASE: <my-db-2>

我不确定这是否可能,因为我没有找到任何这方面的例子。

3 个答案:

答案 0 :(得分:3)

请记住您正在使用YAML,因此您可以使用YAML功能,例如“Anchors”

您可以在此link中找到有关“锚点”的其他信息。寻找“额外的YAML功能”

  

YAML还有一个名为'anchors'的便利功能,可让您轻松复制   整个文档中的内容。这两个键都具有相同的值:anchored_content:&amp; anchor_name此字符串将显示为   两个键的值。 other_anchor:* anchor_name

# Anchors can be used to duplicate/inherit properties
base: &base
    name: Everyone has same name

foo: &foo
    <<: *base
    age: 10

bar: &bar
    <<: *base
    age: 20

在Concourse Pipeline上试试这个:

common:
  db_common: &db_common
    serial: true
    plan:
    - aggregate:
        - get: <git-resource>
        passed: [previous-job]
        trigger: true
    - task: <call-main-job-task>
        params:

jobs:
- name: <call-main-job-with-db-1>
  <<: *db_common
      DATABASE_HOST: <file>
      DATABASE: <my-db-1>

- name: <call-main-job-with-db-2>
  <<: *db_common
      DATABASE: <my-db-2>

注意:请记住,您可以拥有任意数量的锚点,您可以为同一个作业/任务/资源定义两个或多个锚点等。

答案 1 :(得分:1)

您需要像在问题描述中那样复制并粘贴任务。 Concourse期望一个富有表现力的yaml,不允许分支或逻辑。如果你不想复制和粘贴那么多yaml,那么你可以做一些yaml代魔术来简化你所看到和使用的东西,但是大厅将需要完全yaml与每个作业分别定义。

答案 2 :(得分:0)

Concourse有这个粉丝在粉丝范式,你想要保持简单和短暂的工作。使用脚本语言,例如像python或ruby一样,可以使您的管道创建更加灵活。

我个人使用一个pipeline.yml.erb文件,我在里面渲染不同的作业模板。我尽量保持job.yml.erb尽可能通用,这样我就可以将它们重用于不同的管道。

要将它带到下一个级别,您可以指定一个meta config.yml并在模板中使用此配置根据您在配置中指定的内容生成管道。