如何在许多项目中共享声明性管道

时间:2017-02-21 14:34:45

标签: jenkins jenkins-pipeline

我在不同的存储库中有很多项目,它们共享相同的基本CI工作流程,我可以轻松地将其表达为声明性管道:

pipeline {
  agent any

  options {
    buildDiscarder(logRotator(numToKeepStr: '20'))
  }

  stages {
    stage('CI') {
      steps {
        echo 'Do CI'
      }
    }

    stage('QA') {
      steps {
        echo 'Do QA'
      }
    }
  }

  post {
    always {
      junit allowEmptyResults: true, testResults: '**/target/surefire-reports/TEST-*.xml'
      // etc...
    }

    failure {
      echo 'Failure mail'
      // etc
    }
  }
}

我想在我的所有项目中使用相同的声明管道,并且能够在一个地方更改管道的定义,并自动在所有项目中使用更改。

基本上我在项目中会做什么; Jenkins文件是这样的:

loadPipelineFromScm 'repository', 'pipeline.groovy'

我已经可以使用共享库执行此操作,但之后我无法再使用Declarative Pipeline功能。

有没有办法在多个存储库之间共享声明性管道?

3 个答案:

答案 0 :(得分:1)

虽然使用noober01的建议保持视图完整,但声明性管道将无法正常运行。例如。 when子句将被忽略,因为管道元素应该是顶级的,这意味着它被解析为脚本管道。

请参阅Jenkins背后的团队拒绝的以下问题:loading external declarative pipelines issue

答案 1 :(得分:0)

我一直在为自己的工作处理同样的问题。我能提出的最佳解决方案是在我的组织的每个项目/仓库中包含泛型 Jenkins文件:

node
{
  checkout([$class: 'GitSCM', branches: [[name: env.DELIVERY_PIPELINE_BRANCH]], userRemoteConfigs: [[credentialsId: env.DELIVERY_PIPELINE_CREDENTIALS, url: env.DELIVERY_PIPELINE_URL]]])
  stash includes: '*.groovy', name: 'assets', useDefaultExcludes: false
  load './Jenkinsfile.groovy'
}

我使用环境变量以防万一需要改变,可能比我的示例当前更加动态(这仍然在开发中)。

然后stash用于保存稍后使用的其余groovy脚本,并在声明性管道中取消它们。

最后加载声明性管道。不搞乱意见,基本上一切都表现正常。

所以这并不是你想要的,我宁愿有能力从SCM开始。但是,嘿,它暂时对我来说运作得很好。

答案 2 :(得分:0)

我能够使用共享库定义可通过YAML文件配置的声明性管道。

在我的repo/project中,我定义了一个Jenkinsfile来调用共享库:

@Library('my-shared-library')_

pipelineDefault(); // cannot be named 'pipeline'

Jenkinsfile.yaml来配置构建参数:

project_name: my_project
debug: true
# you get the idea

然后在我的vars/pipelineDefault.groovy文件中,一个非常简单的共享库可能看起来像这样:

def call() {
  Map pipelineConfig = readYaml(file: "${WORKSPACE}/Jenkinsfile.yaml }")
  node {
    stage('Build'){
      println "Building: ${pipelineConfig.project_name}"
    }
  }
}  

这当然是一个非常简化的示例,但是动态配置确实有效。

注意:这需要pipeline-utility-steps插件才能读取YAML文件