Jenkinsfile和分支的不同策略

Krz*_*soń 33 jenkins jenkins-pipeline

我正在尝试将Jenkins文件用于Jenkins中的所有构建,并且我有以下问题.我们基本上有3种构建:

  • pull-request build - 它将在代码审查后合并到master,如果构建有效
  • 手动拉取请求构建 - 与上面相同的构建,但可以由用户手动触发(例如,如果我们有一些不稳定的测试)
  • 一个初始的连续交付管道 - 这将构建代码,部署到存储库,从目标服务器上的存储库安装工件并在那里启动应用程序

我应该如何将所有上述构建包含在一个Jenkins文件中.现在我唯一的想法就是创造一个巨人,如果它将检查它是哪个分支并将执行这些步骤.

所以我有两个问题:

1.在Jenkinsfile中这样做是否合适?

  1. 如何在多分支作业类型中获取当前正在执行的分支的名称?

作为参考,这是我目前的Jenkinsfile:

def servers = ['server1', 'server2']

def version = "1.0.0-${env.BUILD_ID}"

stage 'Build, UT, IT'
node {
    checkout scm
    env.PATH = "${tool 'Maven'}/bin:${env.PATH}"
    withEnv(["PATH+MAVEN=${tool 'Maven'}/bin"]) {
        sh "mvn -e org.codehaus.mojo:versions-maven-plugin:2.1:set -DnewVersion=$version -DgenerateBackupPoms=false"
        sh 'mvn -e clean deploy'
        sh 'mvn -e scm:tag'
    }
}


def nodes = [:]
for (int i = 0; i < servers.size(); i++) {
    def server = servers.get(i)
    nodes["$server"] = {
        stage "Deploy to INT ($server)"
        node {
            sshagent(['SOME-ID']) {
                sh """
                ssh ${server}.example.com <<END
                hostname
                /apps/stop.sh
                yum  -y update-to my-app.noarch
                /apps/start.sh
                END""".stripIndent()
            }
        }
    }
}

parallel nodes
Run Code Online (Sandbox Code Playgroud)

编辑:删除基于意见的问题

小智 25

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

if(env.BRANCH_NAME == 'master'){
     stage("Upload"){
        // Artifact repository upload steps here
        }
     stage("Deploy"){
        // Deploy steps here
       }
     }
Run Code Online (Sandbox Code Playgroud)

或者,您可以将其添加到个别阶段,如:

stage("Deploy"){
  if(env.BRANCH_NAME == 'master'){
   // Deploy steps here
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,使用`stage(“ Deploy”){if(...){`会导致`无效的stage节定义:“ if(env.BRANCH_NAME =='master'){` (4认同)
  • @CodingWithSpike 听起来您可能正在使用声明性管道而不是脚本化管道。我假设您现在已经弄清楚了这一点,但请尝试使用 `stage(...){ when { expression { BRANCH_NAME == 'master' } } steps { ... } }`。 (2认同)

小智 7

1)我不知道它是否合适,但如果它解决了你的问题,我认为是合适的.

2)为了知道分支的名称,您可以使用BRANCH_NAME变量,其名称取自分支名称.

${env.BRANCH_NAME}
Run Code Online (Sandbox Code Playgroud)

答案如下: Jenkins Multibranch管道:什么是分支名称变量?

  • 实际上它是`$ {env.BRANCH_NAME}` (10认同)

Mic*_*aël 7

使用这篇文章,这对我有用:

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

Run Code Online (Sandbox Code Playgroud)