Gitlab触发Jenkins部署(deploy)构建和手动回滚(rollback)构建--根据构建号回滚

本文介绍如何利用Jenkins和GitLab实现自动化的软件部署流程,包括部署构建与回滚构建的过程。通过配置Jenkins任务,实现代码更新后的自动构建与部署,以及在出现问题时的手动回滚。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本例声明

本例中的物料:

1.Jenkins   docker容器版

2.Gitlab  docker容器版

3.springboot项目

4.maven构建

本例中的特殊术语:

“部署构建”:用于部署的构建,这种构建会在Gitlab中下拉master分支中的最新的代码,然后使用maven进行的构建并发布到生产环境。

“回滚构建”:用于回滚的构建,根据构建号进行回滚,Jenkins会取出备份的文件,然后将其发布到生产环境。

本例中的“部署构建”条件:

在分支合并到master的请求经过研发经理审批以后merge的瞬间进行“部署构建”

如果发布后出现bug,可以手工回滚到指定的构建版本

本例配置

使用gitlab触发Jenkins构建的步骤不再赘述,请大家参考:

GitLab触发jenkins构建项目

基于gitlab和jenkins的自动化部署实例

下面我们重点讲一下Jenkins配置:

有时候我们发布完成后发现有很大的bug需要马上回滚到上一个版本:

在Jenkins中“新建任务”-->"构建一个自由风格的软件项目"在项目的。

在项目配置的“General”--“参数化构建”

1.添加选项参数

名称:

deploy_evt

选项:

deploy

rollback

描述:

deploy:发布,rollback:回滚

2.添加字符参数

名称:

buildNum

默认值:

0

描述:

需要回滚到的构建号,发布时忽略该参数

 

源码管理:

 

构建触发器:

我使用的是在分支代码合并到master然后在合并申请接受后的情况下才出发构建,所以不选push事件:

构建环境

选择输出时间戳:

构建(最关键发部分):

脚本:

case $deploy_evt in
	deploy)
    	echo "deploy:$deploy_evt"
        /var/jenkins_home/maven/apache-maven-3.6.1/bin/mvn -s /var/jenkins_home/maven/apache-maven-3.6.1/conf/settings.xml clean install -Dmaven.test.skip=true
        path="${WORKSPACE}/bak"
   		 if [ -d $path ];
    		then
       		 echo "The files is already  exists "
   		 else
       		 mkdir -p  $path
   		 fi
    	cd ${WORKSPACE}
        rm -rf *.tar.gz
   		  tar czf bak/${JOB_NAME}-${BUILD_NUMBER}.tar.gz target/*.jar --exclude=bak
    		find $path  -mtime 2 -name "*.tar.gz"  -exec rm -rf {} \;
    		echo "Deployment Completed!"
    	;;
    rollback)
    	echo  "rollback:$deploy_evt"
        echo "buildNum:"$buildNum
        rm -rf target
        cd ${WORKSPACE}
        rm -rf *.tar.gz
        if [ -f bak/${JOB_NAME}-$buildNum.tar.gz ];
        then
        	cp bak/${JOB_NAME}-$buildNum.tar.gz ${WORKSPACE}
        	tar -zxvf ${JOB_NAME}-$buildNum.tar.gz
        	echo  "Rollbacked To build Number:$buildNum"
        	pwd && ls
        else
        	echo  "------------------------------------------------------------------------------------------------------------------------------ "
        	echo  "------------------------------------------------------------------------------------------------------------------------------ "
            echo  "------------------------------------------------------------------------------------------------------------------------------ "
            echo  "------------------------------------------------------------------------------------------------------------------------------ "
        	echo  "Build Number $buildNum is a Rollback build number ;Please chose a deploy build number!"
            echo  "------------------------------------------------------------------------------------------------------------------------------ "
            echo  "------------------------------------------------------------------------------------------------------------------------------ "
            echo  "------------------------------------------------------------------------------------------------------------------------------ "
            echo  "------------------------------------------------------------------------------------------------------------------------------ "

            cp bak/${JOB_NAME}-$buildNum.tar.gz ${WORKSPACE}
        fi
        ;;
        *)
        exit
        	;;
esac
        

注:

1.apache-maven-3.6.1这个是自己安装的(因为是绿色版,复制进容器然后解压缩)。

2.思路在“发布构建”的时候将spring生成的jar包进行打包(根据构建号打包)并放在项目bak(自己新建的一个文件夹)的文件夹下面;

回滚的时候将对应的构建号的压缩包拿出来解压。然后部署生产环境;

3.由于这里有两种构建方式:“部署构建”和“回滚构建”,我们在回滚的时候需要选择“部署构建”的构建号,如果回滚的时候选择“回滚构建”的构建号是不能成功构建的。这种情况的构建失败有以下提示信息:

 

构建后操作:发布到生产环境

这样在构建完成后可以将程序发布到服务器:

startjk-rtd.sh

#!/bin/bash
chmod 777 /home/zhangsan/abc/abc-1.0.0-SNAPSHOT.jar
echo "开始启动......"
nohup java -jar abc-1.0.0-SNAPSHOT.jar > /dev/null &
echo "启动成功!"

stopjk-rtd.sh

#!/bin/bash
echo "stop SpringBoot abc Application"
pid=`ps -ef | grep abc-1.0.0-SNAPSHOT.jar | grep -v grep | awk '{print $2}'`
echo  "应用进程id:$pid"
if [ -n "$pid" ]
then
kill -9 $pid
echo "停止成功!"
fi

 

Gitlab侧:

关于1和2处的信息在Jenkins的触发构建中找到:

这样就可以实现合并成功后发布了。

构建的使用

一、gitlab自动构建

在分支合并到master的请求经过研发经理审批以后merge的瞬间进行自动“部署构建”。

二、手动“部署构建”

点击项目,选择“Build with Parameters”

deploy_evt下拉菜单选择deploy

buildNum 参数忽略不写

击“开始构建”即可。

三、手动“回滚构建”

点击项目,选择“Build with Parameters”

deploy_evt下拉菜单选择rollback

buildNum选择需要回滚到的构建号,

比如上图的构建号是:45

点击开始构建,回滚构建完成!

 

 

 

 

 

 

 

<think>嗯,用户想要找关于Jenkins自动构建部署的脚本示例或指南。首先,我需要回顾一下用户之前提供的引用内容。引用[1][2]都提到了Jenkins自动构建原理,以及如何通过脚本替代手动操作。用户可能已经了解了一些基本概念,现在需要具体的脚本示例步骤。 我应该先整理一个典型的Jenkins自动化流程,比如从代码拉取、构建、测试到部署的各个阶段。然后,针对每个阶段提供相应的脚本示例,比如Shell脚本或Pipeline脚本。记得用户提到过Docker部署,所以在部署部分可能需要结合Docker命令。 另外,用户提供的引用中提到使用Docker快速部署Jenkins,这部分可以作为环境搭建的参考。但用户现在更关注的是构建部署的脚本,所以重点应该放在脚本编写配置上,而不是安装步骤。 需要确保脚本的语法正确,比如在Jenkinsfile中使用Declarative Pipeline的格式,或者Shell脚本的正确写法。同时,要结合用户提到的多环境部署依赖管理,可能需要在脚本中展示如何处理不同环境变量或配置文件。 还要注意用户可能需要了解如何将脚本集成到Jenkins任务中,所以步骤中要包括创建流水线任务、配置仓库地址等操作。另外,错误处理通知机制也是用户可能关心的点,比如构建失败时发送邮件或Slack通知。 最后,生成的相关问题需要围绕用户可能进一步的需求,比如优化构建速度、安全加固或与Kubernetes集成,这样可以帮助用户深入探索更多自动部署的方面。</think>### Jenkins自动构建部署脚本示例教程 #### 一、典型自动构建流程 1. **代码拉取**:从Git仓库获取最新代码 2. **依赖安装**:使用Maven/Gradle/NPM等工具安装依赖 3. **代码构建**:编译源代码生成可执行文件 4. **质量检测**:执行单元测试/代码扫描 5. **制品归档**:存储构建产物(JAR/WAR/Docker镜像) 6. **自动部署**:通过SSH/Ansible/Kubernetes部署到目标环境 #### 二、基础Shell脚本示例(Java项目) ```bash #!/bin/bash # 构建阶段 REPO_URL="git@github.com:yourrepo/springboot-demo.git" TARGET_DIR="/opt/deployments" BRANCH="main" echo "Cloning repository..." git clone -b $BRANCH $REPO_URL || exit 1 cd springboot-demo echo "Building with Maven..." mvn clean package -DskipTests || exit 1 # Docker镜像构建 echo "Building Docker image..." docker build -t app:v$BUILD_NUMBER . || exit 1 # 部署到测试环境 echo "Deploying to test environment..." scp target/*.jar user@test-server:$TARGET_DIR ssh user@test-server "systemctl restart app-service" ``` #### 三、Jenkins Pipeline脚本(推荐方式) ```groovy pipeline { agent any environment { DOCKER_REGISTRY = "registry.example.com" PROD_SERVER = "prod-server.example.com" } stages { stage('Checkout') { steps { git branch: 'main', url: 'git@github.com:yourrepo/springboot-demo.git' } } stage('Build') { steps { sh 'mvn clean package -DskipTests' } } stage('Test') { steps { parallel( "Unit Tests": { sh 'mvn test' }, "Code Analysis": { sh 'sonar-scanner -Dsonar.projectKey=myapp' } ) } } stage('Docker Push') { steps { script { docker.withRegistry('https://' + DOCKER_REGISTRY) { def image = docker.build("myapp:${env.BUILD_ID}") image.push() } } } } stage('Deploy to Prod') { when { branch 'main' } steps { sshagent(['prod-server-key']) { sh """ ssh ubuntu@${PROD_SERVER} 'docker pull ${DOCKER_REGISTRY}/myapp:${env.BUILD_ID}' ssh ubuntu@${PROD_SERVER} 'docker-compose down && docker-compose up -d' """ } } } } post { failure { emailext body: '构建失败,请检查日志:${BUILD_URL}', subject: '构建失败通知', to: 'team@example.com' } } } ``` #### 四、关键配置步骤 1. **创建流水线任务**: - 新建Item → 选择"Pipeline" - 在Pipeline配置页选择"Pipeline script from SCM" - 设置Git仓库地址Jenkinsfile路径 2. **凭据管理**: ```bash # 添加SSH密钥 Jenkins → 凭据 → 系统 → 全局凭据 → 添加凭据 # 类型选择"SSH Username with private key" ``` 3. **构建触发器配置**: - 定时构建:`H/5 * * * *`(每5分钟) - Git Hook:通过Webhook实现代码提交触发 - 手动触发:提供参数化构建选项 #### 五、最佳实践建议 1. **构建缓存优化**: ```bash # Maven本地仓库缓存 docker run -v /path/to/m2:/root/.m2 ... # NPM缓存示例 sh 'npm config set cache .npmcache --global' ``` 2. **多阶段Docker构建**: ```dockerfile FROM maven:3.8-jdk-11 AS builder COPY . /app RUN mvn package FROM openjdk:11-jre-slim COPY --from=builder /app/target/*.jar /app.jar CMD ["java","-jar","/app.jar"] ``` 3. **部署回滚机制**: ```groovy stage('Rollback') { steps { script { def lastGood = currentBuild.getPreviousSuccessfulBuild() if (lastGood) { sh "ssh prod-server 'docker tag ${DOCKER_REGISTRY}/myapp:${lastGood.id} myapp:current'" } } } } ``` [^1]: Jenkins自动部署的核心原理是将手动操作转化为可重复执行的脚本流程。 [^2]: 通过Docker部署Jenkins可以快速搭建可靠的环境,结合Pipeline脚本实现复杂工作流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值