【问题标题】:Concourse call job from another job with parameters带有参数的另一个作业的大厅呼叫作业
【发布时间】:2017-09-01 21:55:21
【问题描述】:

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

- 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>

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

【问题讨论】:

    标签: concourse


    【解决方案1】:

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

    您将在此link 中找到有关“锚点”的更多信息。寻找“额外的 YAML 功能”

    YAML 还有一个名为“锚点”的便捷功能,可让您轻松复制 文档中的内容。这两个键将具有相同的值: anchored_content: &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>
    

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

    【讨论】:

      【解决方案2】:

      您只需像在问题描述中那样复制并粘贴任务即可。 Concourse 需要一个富有表现力的 yaml,不允许分支或逻辑。如果您不想复制和粘贴这么多 yaml,那么您可以做一些 yaml 生成魔术来简化您查看和使用的内容,但是 concourse 将需要完整的 yaml,每个作业都单独定义。

      【讨论】:

      • 这就是我的想法,这个答案对我来说似乎很好,因为它是大厅所期望的。
      【解决方案3】:

      Concourse 拥有这种扇入扇出范式,您希望在其中保持工作简单而简短。使用脚本语言,例如像 python 或 ruby​​ 让你的管道创建更加灵活。

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

      要将其提升到一个新的水平,您可以指定一个元 config.yml 并在您的模板中使用此配置来根据您在配置中指定的内容生成您的管道。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-02
        • 2018-06-27
        • 1970-01-01
        • 2017-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多