在外部文件上定义Jenkins管道

时间:2018-08-10 10:36:01

标签: jenkins jenkins-pipeline jenkins-groovy

我们有几个具有相同结构和行为的管道作业:更新ansible信息库,使用一些值取决于环境的参数执行剧本,并通过inspec进行测试。我们试图将外部文件中的一般行为抽象出来。

JenkinsfileAnsible:

#!/usr/bin/env groovy
import groovy.json.JsonOutput

node {
}

def executePlaybook(environment){
  pipeline{

    agent any

    stages{
      stage('Update repository'){
        ...
      }
      stage('Esecute playbook'){
        ...
      }
      stage('Execute tests'){
        ...
      }
    }
  }
}
return this

每个环境都有一个特定的Jenkinsfile,用于设置参数并加载一般的Jenkinsfile,以执行管道。

JenkinsfileDev:

#!/usr/bin/env groovy
import groovy.json.JsonOutput

node{
    checkout scm
    def ansible = load "../JenkinsfileAnsible"
    ansible.execute_playbook("development")
}

代码已简化,我们可以轻松加载外部文件或执行定义的函数。问题在于,我们想在常规文件中定义管道,就像在每个环境中一样,仅调用它即可,但是我们无法使其正常工作。

我们遇到了错误,因为Jenkins无法识别外部文件中的管道定义。

有什么建议吗?是不可能的吗?我们缺少什么吗?

1 个答案:

答案 0 :(得分:1)

您可以使用https://jenkins.io/doc/book/pipeline/shared-libraries/

的Jenkins管道共享库

方法是使用这样的Jenkinsfile:

@Library('your-pipeline') _
thePipeline([param1: val1])

在管道库代码中,类似:

def call(Map<String, String> pipelineConfig) {

    pipeline{

        agent any

        stages{
           stage('Update repository'){
           //You can use your pipelineConfig param1 etc.
        }
        stage('Esecute playbook'){
           ...
        }
        stage('Execute tests'){
           ...
        }
    }
}

您可以将config参数用于不同的环境,甚至可以为不同的环境创建不同的管道。

希望有帮助。