Jenkins DSL - 解析Yaml以进行复杂处理

9

我正在使用Jenkins Job DSL为多个SOA风格的服务构建流水线。所有这些服务的流水线都是相同的。

job('wibble') {
  publishers {
    downstreamParameterized {
      trigger("SOA_Pipeline_Builder") {
        condition('SUCCESS')
        parameters {
          predefinedProp('PROJECT_NAME', "myproject-2"             )
          predefinedProp('PROJECT_REPO', "myprojecttwo@gitrepo.com" )
        }
      }
      trigger("SOA_Pipeline_Builder") {
        condition('SUCCESS')
        parameters {
          predefinedProp('PROJECT_NAME', "myproject-1"             )
          predefinedProp('PROJECT_REPO', "myprojectone@gitrepo.com" )
        }
      }
    }
  }
}

由于我每天都在添加新项目,所以我不得不不断操作DSL。我已经决定将所有的配置都放在DSL之外的yaml文件中。我知道可以使用groovy创建数组、循环等,但是我一直没有太大的成功。 我正在尝试做这样的事情...

@Grab('org.yaml:snakeyaml:1.17')
import org.yaml.snakeyaml.Yaml
List projects = new Yaml().load(("conf/projects.yml" as File).text)

job('wibble') {
  publishers {
    downstreamParameterized {
      projects.each {
        trigger("SOA_Pipeline_Builder") {
          condition('SUCCESS')
          parameters {
            predefinedProp('PROJECT_NAME', it.name )
            predefinedProp('PROJECT_REPO', it.repo )
          }
        }
      }
    }
  }
}

conf/projects.yml

---
- name: myproject-1
  repo: myprojectone@gitrepo.com
- name: myproject-2
  repo: myprojecttwo@gitrepo.com

有没有人对这种事情有经验?


1个回答

3
这是我使用snakeyaml和jobDSL将配置与“应用程序”代码分离的方式。 < p > 这是我的 config.yml 文件。
services:
    - some-service-1
    - some-service-2
target_envs:
    - stage
    - prod
folder_path: "promotion-jobs"

seed_job.groovy

#!/usr/bin/groovy
@Grab('org.yaml:snakeyaml:1.17')
import org.yaml.snakeyaml.Yaml

def workDir = SEED_JOB.getWorkspace()
print("Loading config from ${workDir}/config.yml")
def config = new Yaml().load(("${workDir}/config.yml" as File).text)

for (service in config.services) {
    for (stage in config.target_envs) {
        folder("${config.folder_path}/to-${stage}") {
            displayName("Deploy to ${stage} jobs")
            description("Deploy ECS services to ${stage}")
        }

        if (stage == "stage") {
            stage_trigger = """
            pipelineTriggers([cron["1 1 * * 1"])
"""
        } else {
            stage_trigger = ""
        }

        pipelineJob("${config.folder_path}/to-${stage}/${service}") {
            definition {
                cps {
                    sandbox()
                    script("""
    node {
        properties([
            ${stage_trigger}
            parameters([
                choice(
                    choices: ['dev,stage'],
                    description: 'The source environment to promote',
                    name: 'sourceEnv'
                ),
                string(
                    defaultValue: '',
                    description: 'Specify a specific Docker image tag to deploy. This will override sourceEnv and should be left blank',
                    name: 'sourceTag',
                    trim: true
                )
            ])
        ])

        properties([
            disableConcurrentBuilds(),
        ])

        stage('init') {
            dockerPromote(
                app="${service}",
                destinationEnv="${stage}"
            )
        }
    }
                    """)
                }
            }
        }
    }
}

我也不得不在主节点上运行我的版本才能使其正常工作。 - David West

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接