如何通过Github Webhook触发Jenkins流水线仅在合并到develop分支时触发

102次阅读
没有评论

问题描述

在使用Jenkins流水线时,遇到了一个问题:希望只有在将任何分支合并到develop分支时才能触发Jenkins流水线作业。用户还没有找到任何关于合并的Webhook,类似于Bitbucket。用户还尝试使用pull request,但这会在对PR分支进行任何更改时触发作业,这不符合用户的要求。用户还分享了他的代码和Jenkins配置。
Jenkins配置

def CONTAINER_NAME=""
def CONTAINER_TAG="${env.BUILD_NUMBER}"
def CONTAINER_PORT=""
def ECR_REPO=""
def HOST_PORT=""
def URL=""
def INSTANCE_IP=""

pipeline {
  agent any
  stages {
    stage('Image Build Develop') {
      when {
        expression {
         return env.BRANCH_NAME != 'feature_cicd'
         echo env.BRANCH_NAME
        }
      }
      steps {
        git branch: "develop", url: 'https://github.com/jenkinsci/git-parameter-plugin.git'
        imageBuildDevelop(CONTAINER_NAME, CONTAINER_TAG)
      }
    }
    stage('Image Tag') {
      steps {
        imageTag(CONTAINER_NAME, CONTAINER_TAG, ECR_REPO)
      }
    }
    stage('Image Push') {
      steps {
        imagePush(CONTAINER_NAME, CONTAINER_TAG, ECR_REPO)
      }
    }
    stage('Image Deploy') {
      steps {
        imageDeploy(HOST_PORT, env.BUILD_NUMBER, INSTANCE_IP)
      }
    }
  }
}

def imageBuildDevelop(containerName, tag) {
  echo "#------------------- Checkout Develop Branch -------------------#"
  git branch: "feature_cicd", url: 'https://github.com/jenkinsci/git-parameter-plugin.git'
  echo "#------------------- Login into ECR Repository -------------------#"
  sh "`/var/jenkins_home/.local/bin/aws ecr get-login --no-include-email`"
  echo "#------------------- Build Docker Image for Media-API -------------------#"
  sh "docker build -t $containerName:$tag -t $containerName ."
  echo "#------------------- Image Build Complete -------------------#"
}

def imageTag(containerName, tag, repo) {
  echo "#------------------- Tag media-api image -------------------#"
  sh "docker tag $containerName:$tag $repo:$containerName-$tag"
  echo "#------------------- Image Tag Complete ------------------#"
}

def imagePush(containerName, tag, repo) {
  echo "#------------------- Login into ECR Repository -------------------#"
  sh "`/var/jenkins_home/.local/bin/aws ecr get-login --no-include-email`"
  echo "#------------------- Push Image into ECR Repository -------------------#"
  sh "docker push $repo:$containerName-$tag"
  echo "#------------------- Image Push to ECR Repository Complete -------------------#"
}

def imageDeploy(hostPort, tag, ip) {
  echo "#------------------- SSH into media-api instance -------------------#"
  sh "ssh ubuntu@$ip \"BUILD_NUMBER=$tag\" \
  ' cd reactApi_test/ &&\
    echo \"TAG=${BUILD_NUMBER}\" > .env &&\
    `aws ecr get-login --no-include-email` &&\
    docker-compose up -d --build &&\
    ./test.sh '"
  echo "#------------------- Media-API container started on Port '${hostPort} (http)' -------------------#"
}

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

您可以使用CHANGE_TARGET环境变量来解决这个问题。如果该变量存在,则表示您正在处理合并请求。
您可以使用以下代码片段来确定分支名称,并根据代码合并到的分支来更改作业的逻辑。

branchName = env.CHANGE_TARGET ? env.CHANGE_TARGET : env.BRANCH_NAME

在您的代码示例中,您需要将

        expression {
         return env.BRANCH_NAME != 'feature_cicd'
         echo env.BRANCH_NAME
        }

替换为

        expression {
         branchName = env.CHANGE_TARGET ? env.CHANGE_TARGET : env.BRANCH_NAME
         return branchName != 'feature_cicd'
         echo branchName
        }

方案2

使用多个分支的情况下,您可以根据branchName的值添加条件。
如果您希望根据不同的分支进行更改,请在branchName的值上添加条件。

if (branchName == 'master') {
  // 执行与master分支相关的操作
} else if (branchName == 'develop') {
  // 执行与develop分支相关的操作
} else {
  // 执行与其他分支相关的操作
}

请注意,您需要根据您的实际需求修改条件中的分支名称。

以上是两种解决方案,您可以根据您的需求选择适合您的方案。希望对您有所帮助!

正文完