簡體   English   中英

Jenkins 多分支管道在不相關的分支上觸發管道

[英]Jenkins multibranch pipeline triggers pipeline on unrelated branches

我在使用 JenkinsFile 和 GIT 插件時遇到了 Jenkins 多分支管道問題。

問題是每次推送到暫存分支也會觸發 master 的管道。 所需的行為是推送到登台分支僅觸發用於登台的管道,而推送到主分支僅觸發主管道

這是我的 JenkinsFile

#!/usr/bin/env bash
pipeline {
    agent any
    triggers {
        pollSCM('*/1 * * * *')
    }
    environment {
        GCLOUD_PATH="/var/jenkins_home/GoogleCloudSDK/google-cloud-sdk/bin"
    }
    stages {
        stage('Git Checkout'){
            steps{
              // Clean Workspace
              cleanWs()
              // Get source from Git
              git branch: 'staging', 
                credentialsId: ****', 
                url: 'git@github.com:***/****.git'
            }    
        }
        stage('Update Staging') {
            when {
                branch 'staging'
            }
            environment{
                INSTANCE="***"        
            }
            steps {
                sshagent(credentials : ['****']) {
                    sh 'ssh -tt -o StrictHostKeyChecking=no jenkins@"${INSTANCE}" sudo /opt/webapps/****/deploy.sh firstinstance'
                }
            }
        }
        stage('Update Production') {
            when {
                branch 'master'
            }
            environment{
                gzone="us-central1-a"
            }
            steps {
                    sh '''
                        #!/bin/bash
                        echo "${BRANCH_NAME}"
                        export instances=$("${GCLOUD_PATH}"/gcloud compute instances list --filter="status:(running) AND tags.items=web" --format="value(name)")
                        FIRST=1
                        for instance in ${instances}
                        do
                            echo "### Running Instance: ${instance} ###"
                            if [[ $FIRST == 1 ]]; then
                                echo "first instance"
                                ${GCLOUD_PATH}/gcloud compute ssh jenkins@${instance} --zone ${gzone} '--ssh-flag=-tt -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no' --command="echo first"
                            else
                                ${GCLOUD_PATH}/gcloud compute ssh jenkins@${instance} --zone ${gzone} '--ssh-flag=-tt -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no' --command="sudo uptime"
                            fi
                            FIRST=0
                        done
                    '''

            }
        }
    }
    post {
        success {
            cleanWs()
        }
    }

}

我將分享一些日志:這是 master 分支的日志

http://34.69.57.212:8080/job/tinytap-server/job/master/2/pollingLog/  returns
Started on Dec 10, 2019 1:42:00 PM
Using strategy: Specific revision
[poll] Last Built Revision: Revision 12ecdbc8d2f7e7ff1f578b135ea0b23a28d7672d (master)
using credential ccb9a735-04d9-4aab-8bab-5c86fe0f363c
 > git --version # timeout=10
using GIT_ASKPASS to set credentials 
 > git ls-remote -h -- https://github.com/tinytap/tinytap-web.git # timeout=10
Found 222 remote heads on https://github.com/tinytap/tinytap-web.git
[poll] Latest remote head revision on refs/heads/master is: 12ecdbc8d2f7e7ff1f578b135ea0b23a28d7672d - already built by 1
Using strategy: Default
[poll] Last Built Revision: Revision f693e358ce14bc5dfc6111e62ed88e6dd1d0dfc9 (refs/remotes/origin/staging)
using credential 17f45a89-da78-4969-b18f-cb270a526347
 > git --version # timeout=10
using GIT_SSH to set credentials jenkins key
 > git ls-remote -h -- git@github.com:tinytap/tinytap-web.git # timeout=10
Found 222 remote heads on git@github.com:tinytap/tinytap-web.git
[poll] Latest remote head revision on refs/heads/staging is: 907899a0e7e131e9416ee65aad041c8da111e2fe
Done. Took 1 sec 
Changes found 

這是 master 分支的日志,但只有 staging 有一個新的提交:

http://34.69.57.212:8080/job/tt-server/job/master/3/pollingLog/    returns
Started on Dec 10, 2019 1:55:00 PM
Using strategy: Specific revision
[poll] Last Built Revision: Revision 12ecdbc8d2f7e7ff1f578b135ea0b23a28d7672d (master)
using credential ****-****-****-****-5c86fe0f363c
 > git --version # timeout=10
using GIT_ASKPASS to set credentials 
 > git ls-remote -h -- https://github.com/tt/tt-web.git # timeout=10
Found 222 remote heads on https://github.com/tt/tt-web.git
[poll] Latest remote head revision on refs/heads/master is: 12ecdbc8d2f7e7ff1f578b135ea0b23a28d7672d - already built by 2
Using strategy: Default
[poll] Last Built Revision: Revision 907899a0e7e131e9416ee65aad041c8da111e2fe (refs/remotes/origin/staging)
using credential ****-****-****-****-cb270a526347
 > git --version # timeout=10
using GIT_SSH to set credentials jenkins key
 > git ls-remote -h -- git@github.com:tt/tt-web.git # timeout=10
Found 222 remote heads on git@github.com:tt/tt-web.git
[poll] Latest remote head revision on refs/heads/staging is: eab6e8bc6d8586084e9fe9856dec7fd8b31dd098
Done. Took 0.98 sec 
Changes found 

即使主分支上的頭部沒有更改,請注意“發現更改”

詹金斯版。 2.190.1 Git 插件 4.0.0 版 Git 客戶端插件 2.9.0 版

我使用這個插件 - https://github.com/lachie83/jenkins-pipeline ,它對我來說很好用。 每個分支都需要單獨的 if 塊,然后是其中的 stage 塊。 下面的例子:

#!/usr/bin/groovy

@Library('https://github.com/lachie83/jenkins-pipeline@master')

def pipeline = new io.estrado.Pipeline()
def cloud = pipeline.getCloud(env.BRANCH_NAME)
def label = pipeline.getPodLabel(cloud)

// deploy only the staging branch
if (env.BRANCH_NAME == 'staging') {
    stage ('deploy to k8s staging') {
      //Deploy to staging
    }
}
// deploy only the master branch
if (env.BRANCH_NAME == 'master') {
    stage ('deploy to k8s production') {
      //Deploy to production
    }
}

我認為您的 Jenkinsfile 中有一些邏輯上的遺漏。 按照目前的情況,您可以輪詢 SCM 以了解更改。 如果檢測到任何更改,第一階段“Git Checkout”將檢出暫存分支(始終)。 然后你有另一個階段,如果分支是“暫存”(它是這樣,因為它是硬編碼來檢查上面的那個分支)等等。這將是首先要修復的 - 如果檢測到 SCM 更改,檢查正確的分支. 如何 - 有幾個選項。 我通常在“選項”中使用“skipDefaultCheckout()”,並在我的第一個管道階段使用顯式結帳:

        steps {
            sshagent(['github-creds']) {
                git branch: "${env.BRANCH_NAME}", credentialsId: 'github-creds', url: 'git@github.com:x/y.git'
            }
        }

第二件事是您嘗試將兩個不同的分支處理壓縮到一個 Jenkinsfile 中。 這不是應該做的。 Jenkins 將使用來自給定分支的 Jenkinsfile - 只需確保暫存上的 Jenkinsfile 包含您希望它包含的內容,與 master 上的 Jenkinsfile 相同。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM