【问题标题】:Jenkins shared library - how to define common options for a declarative pipelineJenkins 共享库 - 如何定义声明式管道的常用选项
【发布时间】:2017-12-08 10:54:59
【问题描述】:

我在声明式管道中有许多类似的配置,例如代理、工具、选项或帖子部分。是否有任何选项可以以某种方式定义这些选项,以便单个作业只需定义步骤(可能来自共享库)?

有一个description at "Defining a more stuctured DSL",其中有一些类似于我想要实现的东西,但这似乎适用于脚本化管道。

pipeline {
    agent {
        label 'somelabel'
    }
    tools {
        jdk 'somejdk'
        maven 'somemaven'
    }
    options {
        timeout(time: 2, unit: 'HOURS')
    }

    stages {

         stage('do something') {
            steps {
                    doSomething()
            }
         }            

    }
    post {
        failure {
            emailext body: '${DEFAULT_CONTENT}', subject: '${DEFAULT_SUBJECT}',
                    to: 'some@mail.com', recipientProviders: [[$class: 'CulpritsRecipientProvider'], [$class: 'RequesterRecipientProvider'], [$class: 'DevelopersRecipientProvider']]
        }
    }
}

实际上,我尝试了类似that 的方法,试图将闭包传递给管道,但这似乎不起作用。如果它有效,可能会有一些关于如何做到这一点的文档。

def call(stageClosure) {
    pipeline {
        agent {
            label 'somelabel'
        }
        tools {
            jdk 'somejdk'
            maven 'somemaven'
        }
        options {
            timeout(time: 2, unit: 'HOURS')
        }

        stages {

             stageClosure()           

        }
        post {
            failure {
                emailext body: '${DEFAULT_CONTENT}', subject: '${DEFAULT_SUBJECT}',
                        to: 'some@mail.com', recipientProviders: [[$class: 'CulpritsRecipientProvider'], [$class: 'RequesterRecipientProvider'], [$class: 'DevelopersRecipientProvider']]
            }
        }
    }
}

并以某种方式这样称呼它:

library 'my-library@master'

callJob{

     stage('do something') {
          steps {
                doSomething()
                }
          }  
  }

【问题讨论】:

  • 我认为共享库现在不能很好地与声明性管道配合使用。共享库可以声明整个管道,也可以不声明。
  • 使用声明性管道制作共享库有几个困难,因此我们必须等待社区提供一些解决方案

标签: jenkins groovy closures jenkins-pipeline jenkins-declarative-pipeline


【解决方案1】:

我创建了一个完整的流程

//SbtFlowDockerLarge.groovy
def call(int buildTimeout,String sbtVersion,List<String> fbGoals, List<String> masterGoals ){

    def fbSbtGoals = fbGoals.join ' '
    def masterSbtGoals = masterGoals.join ' '

    pipeline {
        agent { label DPgetLabelDockerLarge() }
        options {
            timestamps()
            timeout(time: buildTimeout, unit: 'MINUTES')
            disableConcurrentBuilds()
            buildDiscarder(logRotator(daysToKeepStr: '35'))
        }

        stages {
            stage('Prepare') {
                steps {
                    setGitHubBuildStatus("Running Build", "PENDING")
                    echo "featureTask :  ${fbSbtGoals}"
                    echo "masterTask :  ${masterSbtGoals}"
                }
            }
            stage('Build') {
                when {
                    not { branch 'master' }
                }
                steps {
                    sbtTask tasks: "${fbSbtGoals}", sbtVersion: sbtVersion
                }
            }
            stage('Deploy') {
                when {
                    branch 'master'
                }
                environment {
                    TARGET_ENVIRONMENT='prod'
                }
                steps {
                    sbtTask tasks: "${masterSbtGoals}", sbtVersion: sbtVersion
                }
            }
        }
        post {
            success {
                setGitHubBuildStatus("Build complete", "SUCCESS")
            }
            failure {
                setGitHubBuildStatus("Build complete", "FAILED")
            }
            always {
                junit allowEmptyResults: true, testResults: '**/target/test-reports/*.xml'
                dockerCleanup()
            }
        }
    }
}

这是 Jenkins 文件

@Library('aol-on-jenkins-lib') _
def buildTimeout = 60
def sbtVersion = 'sbt-0.13.11'
OathSbtFlowDockerLarge (buildTimeout, sbtVersion,['clean test-all'],['clean test-all publish'])

【讨论】:

  • 这是什么DPgetLabelDockerLarge
  • @RajeshRajendran 这是一个返回从属类型的内部函数
  • 感谢您提供的信息。但是内部功能是指詹金斯内部的还是您的?还有一件事,我有一个包含所有共享库的分支,我需要签出 scm 以获取私人仓库,jenkinsfile 在哪里。我正在为多个詹金斯奴隶容器使用标签。如果我在 jenkinsfile 中签出 scm,我会得到代码,但不能确定它是否在共享 lib 管道运行的同一节点中。你能提出任何解决方案吗?
  • @RajeshRajendran 我的函数
  • 你想做什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多