jenkins+ansible自动化部署springboot项目

本文详细介绍了如何使用Jenkins2.346.3、Docker24.0.2、Maven3.8.4和Ansible2.10.8进行程序打包部署,包括创建和配置Jenkins任务,使用Git获取代码,以及通过shell和Ansible实现部署、解压和服务重启的过程。

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

一. 版本

jenkins:2.346.3

Docker:24.0.2

maven:3.8.4

ansible:2.10.8

git:2.30.2

二. 前言

1)  jenkins程序打包部署非常灵活,有多种实现方式,选择适合自己的就好。

2)大致实现思路:jenkins通过git拉取最新代码,并使用maven打包。打包完成后,通过shell + ansible脚本实现程序包的部署、解压和服务重启。如果熟悉ansible-playbook的,也可网上看下其他朋友的实现方法。

3)我用的是docker安装的jenkins,各种配置折腾了好一阵才调通,建议大家还是本地服务器直接安装。jenkins的安装过程,网上有很多参考资料,可以搜一搜并参照安装。本次主要说的是如何创建和配置jenkins任务来实现自动化部署。

三. 创建和配置jenkins任务步骤

1.新建jenkins任务

选择“构建一个maven项目”,如果打包方式不是maven,可能需要使用其他的。

2.配置参数

参数化构建过程--->新增三个参数:

部署环境选择(根据实际需要自定义):

选项参数--->DEPLOY_ENV--->sit / uat / prod

部署模块选择(根据项目自定义):

选项参数--->module--->user-service / product-service

通过git参数获取分支:

GIT参数--->DEPLOY_BRANCH

3.源码管理-git配置

配置git访问地址和登录信息,并指定具体的分支。

4.构建触发器、构建环境和Pre Steps

这三部分都未勾选。

5.构建

按具体项目进行配置pom.xml和goals and options

6.Post Steps(后置步骤)

新增"执行shell"步骤,这部分通过shell脚本和ansible来实现程序包的备份,上传,解压和应用服务重启。

7. 完成jenkins任务配置

完成第6步后,点击“保存”按钮完成任务配置。

下面是执行构建部署任务的界面:

8.部署脚本

脚本说明:

1)如果是docker安装的jenkins,需要在容器内安装:sshpass 和ansible

2)部署环境可分为sit / uat / prod或者其他,ansible的hosts配置目录(自定义):

/var/jenkins_home/ansible_hosts

hosts文件,可保持一致,如果不同需修改对应脚本。另外建议生产环境和测试/uat环境分开设置,并通过jenkins的角色管理来分配权限给不同人员使用。

app-sit  /  app-uat  /  app-prod

文件内容(示例):

[user-service]
192.168.2.1

[user-service:vars]
ansible_ssh_user="username"
ansible_ssh_pass="password"
ansible_ssh_port=22

[product-service]
192.168.2.1

[product-service:vars]
ansible_ssh_user="username"
ansible_ssh_pass="password"
ansible_ssh_port=22

上面配置的主要目的是根据构建时选择的部署环境参数和模块参数:DEPLOY_ENV、module,来决定部署哪个模块的应用服务到哪个环境。

3)我这里构建的是:xxx-1.0-SNAPSHOT-bin.tar.gz 程序包,启停服务脚本在对应的bin目录下,如果不一致可对应做调整,这块可以灵活进行配置。

4)通过jenkins构建后的程序包一般是在jenkins主目录的workspace下面。

5)具体脚本如下,可参考:

#!/bin/bash
# 设置字符集为UTF-8
#这边应用服务的日志是UTF-8格式,按各自所需,也可不设置
export LANG=en_US.UTF-8  
export LC_ALL=en_US.UTF-8

#获取当前日期,年+月+日+时
curTime=`date +%Y%m%d%H`

### jenkins服务器目录设置
# ansible应用环境服务器hosts设置目录
hosts_dir="/var/jenkins_home/ansible_hosts"
# 获取当前目录
current_dir=$(pwd)
# 获取构建包目录
package_dir="$current_dir/$module/target"
# 构建程序包名称
package_name="$module-1.0-SNAPSHOT-bin.tar.gz"
# 备份程序包目录
bak_packages_dir="/var/jenkins_home/bak_packages/$module"

### 应用服务器目录
#应用服务部署目录
module_dir="/myproject/$module"
#服务启停脚本目录
work_dir="/myproject/$module/$module-1.0-SNAPSHOT/bin"

# 如果备份目录不存在,则创建它
if [ ! -d "$bak_packages_dir" ]; then
    mkdir -p "$bak_packages_dir"
fi

echo "---------------1.备份程序包--------------------"
cp ${package_dir}/${package_name} ${bak_packages_dir}/${package_name}.bak.$curTime
ls -l ${bak_packages_dir}/${package_name}.bak.$curTime

echo "---------------2.停服务--------------------"
ansible -i ${hosts_dir}/app-${DEPLOY_ENV} ${module} -m shell -a "cd ${work_dir} && sh stop.sh"

echo "---------------3.上传应用包--------------------"
ansible -i ${hosts_dir}/app-${DEPLOY_ENV} ${module} -m copy -a "src=${package_dir}/${package_name} dest=${module_dir}"

# echo "---------------4.删除历史应用包(可直接解压覆盖,备用)--------------------"
# ansible -i ${hosts_dir}/app-${DEPLOY_ENV} ${module} -m shell -a "cd ${module_dir} && rm -rf ${module}-1.0-SNAPSHOT"

echo "---------------3.解压--------------------"
ansible -i ${hosts_dir}/app-${DEPLOY_ENV} ${module} -m shell -a "cd ${module_dir} && tar -xzvf ${package_name}"
sleep 3

echo "---------------4.启动服务--------------------"
ansible -i ${hosts_dir}/app-${DEPLOY_ENV} ${module} -m shell -a "cd ${work_dir} && sh run.sh"

echo "---------------${module},启动成功!--------------------"
echo "---------------${module},部署完成!--------------------"

### 使用 Jenkins 实现 Spring Boot 自动化部署 #### 构建环境准备 为了实现自动化部署,需搭建必要的基础设施。这包括安装并配置好Jenkins服务器以及设置Docker容器来运行构建逻辑[^1]。 #### 配置代码仓库 确保Spring Boot应用的源码托管在一个版本控制系统内,比如Git。通过在Jenkins中创建一个新的Pipeline Job,并指定该Job去连接至对应的Git仓库地址完成拉取操作。 #### 创建基础流水线 定义一个简单的Jenkins Pipeline脚本来描述CI/CD流程: ```groovy pipeline { agent any stages { stage('Checkout') { steps { git 'https://github.com/user/repo.git' } } stage('Build') { steps { sh './mvnw clean package -DskipTests' // 假设项目根目录下有 mvnw 脚本文件 } } stage('Test') { when { expression { return params.runTests } } // 可选参数决定是否跳过此阶段 steps { echo "Running tests..." // 这里可以加入单元测试或其他形式的质量检测工具调用语句 } } stage('Deploy') { environment { DOCKER_IMAGE = 'my-springboot-app:${BUILD_NUMBER}' } steps { script { docker.build(DOCKER_IMAGE).inside('-u root') { sh 'java -jar /app/target/*.jar &> log.txt &' // 后台启动服务并将日志重定向保存起来 } // 推送镜像到私有的Registry或者云服务商提供的存储库... } // 执行Ansible剧本来进行远程主机上的实际部署工作... } } stage('Notify') { steps { mail to: 'team@example.org', subject: "${env.JOB_NAME}#${env.BUILD_NUMBER}", body: "Check build at ${env.BUILD_URL}" } } } } ``` 上述Groovy脚本展示了如何利用Jenkinsfile定义一个多阶段管道,涵盖了从检出、编译打包直至最终通知团队成员整个过程。 #### 测试与验证 每次提交新代码之后触发一次完整的构建周期,在这个过程中不仅完成了软件本身的组装还进行了质量检验环节(如果启用了的话)。一旦所有步骤都顺利完成,则意味着新的变更已经被成功部署到了目标环境中[^3]。 #### 生产环境部署策略 当涉及到生产级别的发布时,建议采用蓝绿部署或是滚动更新的方式减少停机时间影响用户体验;另外还可以考虑引入灰度发布的概念逐步扩大流量比例直到完全替换旧版本[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值