问题描述
在使用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 {
// 执行与其他分支相关的操作
}
请注意,您需要根据您的实际需求修改条件中的分支名称。
以上是两种解决方案,您可以根据您的需求选择适合您的方案。希望对您有所帮助!
正文完