Jenkins文件和分支机构的不同策略

Jenkins文件和分支机构的不同策略,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我试图在Jenkins中为所有构建使用Jenkins文件,我有以下问题。 我们基本上有3种构建: 拉式请求构建-在代码审查之后,如果构建有效,它将合并到master manual pull request build(手动拉取请求构建)-一个与上面相同的构建,但可以由用户手动触发(例如,如果我们有一些不稳定的测试) 初始的连续交付管道—这将构建代码、部署到存储库、在目标服务器上从存储库安装工件并在那里启动应用程序 我应该如何将上述所有构建包含到一个文件中。 现在我唯一的想法就是做一个巨人,如

我试图在Jenkins中为所有构建使用Jenkins文件,我有以下问题。 我们基本上有3种构建:

  • 拉式请求构建-在代码审查之后,如果构建有效,它将合并到master
  • manual pull request build(手动拉取请求构建)-一个与上面相同的构建,但可以由用户手动触发(例如,如果我们有一些不稳定的测试)
  • 初始的连续交付管道—这将构建代码、部署到存储库、在目标服务器上从存储库安装工件并在那里启动应用程序
我应该如何将上述所有构建包含到一个文件中。 现在我唯一的想法就是做一个巨人,如果这能检查它是哪个分支,并能完成步骤

所以我有两个问题:

一,。在Jenkins文件中这样做合适吗

  • 如何获取多分支作业类型中当前正在执行的分支的名称
  • 以下是我当前的
    Jenkinsfile
    ,仅供参考:

    defservers=['server1','server2']
    def version=“1.0.0-${env.BUILD_ID}”
    舞台“构建,UT,IT”
    节点{
    校验scm
    env.PATH=“${tool'Maven'}/bin:${env.PATH}”
    withEnv([“PATH+MAVEN=${tool'MAVEN'}/bin”]){
    sh“mvn-e org.codehaus.mojo:versions maven插件:2.1:set-DnewVersion=$version-DgenerateBackupPoms=false”
    sh“mvn-e清洁部署”
    sh“mvn-e scm:标记”
    }
    }
    def节点=[:]
    对于(int i=0;i
    2) 为了知道分支的名称,可以使用branch_name变量,其名称取自分支名称

    ${env.BRANCH_NAME}
    
    答案如下:

    对于问题2,您可以

    sh'git branch>git_branch' def gitBranch=readFile'GIT_BRANCH'


    由于您是从git签出的,因此我们遵循了用于构建的模型,根据需要对其进行了调整,其中使用了
    Jenkinsfile
    来定义分支和部署处理逻辑,以及用于构建逻辑的
    release.groovy
    文件

    下面是我们的
    Jenkinsfile
    对于从主分支持续部署到DEV中的管道的外观:

    #!groovy
    导入com.terradatam.jenkins.workflow*
    节点{
    包装([$class:'TimestamperBuildWrapper'])){
    校验scm
    echo“分支:${env.branch_NAME}”
    def pipeline=加载“${pwd()}/release.groovy”
    if(env.DEPLOY_env!=null){
    如果(环境部署\u环境修剪(){
    setDisplayName(pipeline.staging()作为版本)
    }else if(env.DEPLOY_env.trim()=“PROD”){
    setDisplayName(pipeline.production()作为版本)
    }
    }else if(环境分支机构名称=='master'){
    试一试{
    setDisplayName(pipeline.development()作为版本)
    }捕获(例外e){
    HIPSHATSEND color:'RED',失败报告:true,消息:“生成失败:

    检查控制台输出,位于

    ${e.message}

    ”,通知:true,room:'Aergo',v2enabled:false throw e;//重新throw,因此生成被视为失败 } }否则{ setDisplayName(pipeline.other()作为版本) } } } def setDisplayName(版本){ 如果(版本){ currentBuild.displayName=version.toString() } }

    注意:您可以找到我们的全局管道库的代码。

    如果要根据分支跳过多个阶段,您可以为多个阶段添加If语句,如中所示:

    stage("Deploy"){
      if(env.BRANCH_NAME == 'master'){
       // Deploy steps here
      }
    }
    
    或者,您可以将其添加到各个阶段,如中所示:

    node {
        def rootDir = pwd()
    
        def branchName = ${env.BRANCH_NAME}
    
        // Workaround for pipeline (not multibranches pipeline)
        def branchName = getCurrentBranch()
    
        echo 'BRANCH.. ' + branchName
        load "${rootDir}@script/Jenkinsfile.${branchName}.Groovy"
    }
    
    def getCurrentBranch () {
        return sh (
            script: 'git rev-parse --abbrev-ref HEAD',
            returnStdout: true
        ).trim()
    }
    

    不知道这是不是你想要的。。 我更喜欢,因为它看起来更有条理

    詹金斯档案

    echo 'mybranch'
    // Pipeline code here
    
    Jenkinsfile.mybranch.Groovy

        stage('Download'){
    
            when{
                environment name: 'gitlabSourceBranch', value: 'master'
    
            }
    
            steps{
                echo "### Deploy Artifactory ###"
    
                }       
        }
    

    在我的场景中,只有当分支是主分支(webhook Gitlab)时,我才需要运行一个阶段部署工件,否则我无法执行部署

    下面是我的Jenkins文件的代码:

    stages{

            stage('...') {
                when {
                    expression { env.BRANCH_NAME == 'master' }
                }
                steps {
                    ...
                }
            }
    
    
    }

    使用,这对我来说很有用:


    实际上它是
    ${env.BRANCH\u NAME}
    release.groovy的可能副本我会说,这对我真的很有帮助,但为什么要使用release.groovy文件,而不是在vars/…下包含release.groovy中的方法,并让它们在不加载release.groovy的情况下全局访问呢?我之所以这么问,是因为我即将走上一条类似的道路,我的“根”Jenkinsfile只包含con图为管道,由vars/…的方法包装,该方法定义整个构建,根据需要加载vars/…方法和全局libs。这里的目标是通过定义必要的配置并调用其构建类型,让最终用户编写自己的Jenkins文件。下面的链接可以更好地解释我的目的:。Jenkins文件将包含在buildPlugin{}中的所有必要配置中,buildPlugin.groovy文件将包含运行整个构建的多个阶段和步骤(不仅仅是链接中的简单示例)。您当然可以将
    release.groovy
    中的代码推送到您的全局管道库中,但需要注意的是,您希望避免出现这样一种情况,即在一个旨在为所有构建提供服务的库中存在特定于单个构建的代码。我希望脚本管道和声明性管道都可以使用条件选项像
    when{}
    之类。我仍然觉得阅读他们的文档有点困难。对我来说,使用
    stage(“Deploy”){if(…){
    导致
    不是一个有效的stage节定义:“if(env.BRANCH_NAME='master'){
    是的,这对我也不起作用。没有足够的管道示例来解决这一问题。@CodingWistPike听起来像是在使用声明性管道,而不是脚本化管道。我想你已经解决了这个问题
            stage('...') {
                when {
                    expression { env.BRANCH_NAME == 'master' }
                }
                steps {
                    ...
                }
            }