一. 版本

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},部署完成!--------------------"

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐