用jenkins 实现项目自动部署笔记
1、目的
1、一键实现项目自动构建打包发布(用于生产环境)
2、实现代码提交到代码仓库立刻自动打包部署(用于测试环境)
3、本测试脚本代码在最后
2、操作环境
- centos
- jdk
- maven
- jenkins
- gitee
- git
- docker
2、实现思路
1、生产环境
- 合并代码开发分支到master分支,准备发布最新代码
- jenkins一键点击发布
- jenkins从代码仓库拉取最新代码
- 通过maven进行打包
- 把jar包打包成镜像,上传到自己的镜像仓库私服
- jenkins通知应用服务器拉取最新镜像
- 应用服务器拉取最新镜像,运行新容器
- 删除旧的容器和镜像
- 若发布失败回滚到上一个版本
2、测试环境、开发环境
- 提交代码到代码仓库dev或其他分支
- 自动触发jenkins构建项目
- jenkins从代码仓库拉取最新代码
- 最新代码拷贝到测试服务器
- 自动连接测试服务器进行maven打包
- 把jar包打包成镜像
- 删除旧的容器和镜像
- 通过新打包的镜像,运行新容器
3、前期准备
- 两台centos服务器可以互相ping通(或者两台虚拟机)
- 准备一个springcloud或者springboot项目,用于自动发布测试(我这里准备的是一个多模块项目,目录结构如下)
- jdk 1.8安装包,maven 3.6 啊包装包
- jdk下载地址:https://wp.boytian.com/#/s/p8Fv 密码 tiantian123
- maven下载地址:https://wp.boytian.com/#/s/2lc1 密码 tiantian321
4、安装jdk环境和maven环境
“
两台最好都安装,这里演示一台服务器
”
1、jdk环境安裝
- 创建jdk存放目录
mkdir -p /home/jdk
- 上传jdk到该目录下,进入该目录并解压,解压命令:
tar -zxvf jdk-8u144-linux-x64.tar.g
2、maven安装
- 创建maven目录和maven仓库目录
mkdir -p /home/maven
mkdir -p /home/maven/repo
- 上传maven到
/home/maven/
目录下,进入该目录并解压,解压命令:tar -zxvf apache-maven-3.6.3
3、配置jdk和maven的环境变量
- 修改
/etc/profile
文件,命令vim /etc/profile
- 若目录创建和我保持一致则在底部添加如下配置,否则自行修改即可
#输入i 进入编辑模式
# java配置
export JAVA_HOME=/home/jdk/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/bin
#maven 配置
export MAVEN_HOME=/home/maven/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH
- 刷新配置使之生效
source /etc/profile
- 测试环境是否生效 , 命令
java
mvn -v
- 另一台服务器主机同样配置
5、配置免密登录(两台服务器互相免密登录)
- 输入
ssh-keygen -t rsa
连敲三个回车 - 输入
ssh-copy-id -i ~/.ssh/id_rsa.pub ip地址
回车 - 输入第二台服务器密码验证即可实现免密登录
- 同样的方式配置第二台服务器免密登录第一台服务器
“
参考:
”
6、在第一台服务器上安装jenkin服务
1、在第一台服务器安装依次执行以下命令
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins
ln -s /home/jdk/jdk1.8.0_144/bin/java /usr/bin/java
sudo ln -s /home/maven/apache-maven-3.6.3 /usr/local/maven
systemctl start jenkins
“
(1、2、3)是安装jenkins,(4、5)是软连接环境命令到usr目录下(6)启动Jenkins
”
2、修改jenkins的权限为root权限,方便以后执行命令权限不足问题
# 打开配置文件
vim /etc/sysconfig/jenkins
# 修改$JENKINS_USER
$JENKINS_USER="root"
#修改Jenkins相关文件夹用户权限
chown -R root:root /var/lib/jenkins
chown -R root:root /var/cache/jenkins
chown -R root:root /var/log/jenkins
#重启
systemctl restart jenkins
1619053352839
7、访问jenkins服务进行一些基础配置
- 浏览器访问:ip:8080
1618994599246
- 到服务器获取密码 命令:
cat /var/lib/jenkins/secrets/initialAdminPassword
1618995408605
- 安装自定义插件
1618995513826
- 创建管理员账号
- 点击完成之后重启一下jenkins服务,命令:
systemctl restart jenkins
- jenkins配置全局jdk和maven环境
1618996436490
1618996573737
1618996616938
- 安装gitee插件,推送代码到gitee主要由此插件进行触发
- 配置gitee交互凭证
- 全局配置gitee
8、准备部署项目
- 创建gitee代码仓库
1619050043509
9、配置jenkins开始配置自动部署
- 创建一个自动构建流程 选择自由风格
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tAOlG9N1-1637893426234)(https://mmbiz.qpic.cn/mmbiz_png/0bmE6dS9CgJQUEbkCyje2ajToYicZGj4rVheOTDiahK1yzXSvdpwsAOsNeiaibia91ZwxkAG0QLEpv6hJmdNEGIeksA/640?wx_fmt=png)]
1618997421632
- 选择参数化构建
“
定义一些变量,这些变量在脚本中使用”
1619050337908
1619054535420
3、配置git仓库
1619050733823
1619050777451
1619050871896
- 构建自动触发器,配置jenkins
- 构建触发器,配置gitee
1619051250412
- 测试构建是否生效
配置jenkins添加构建步骤
1619051394272
点击 应用 保存
- 测试手动构建
1619051457074
1619051489297
1619051513195
- 测试自动构建
“
手动push代码看看是否会出发自动构建
”
10、自动化部署脚本
“
自动构建配置完成,接下来编写一个脚本进行真正的部署项目
脚本内容如下,目前实现了功能但还是不完善,后期完善
”
- 项目部署脚
# 项目模块统一变量设置
# 公共服务
CLOUD_CONTAINER="cloud"
CLOUD_IMAGE="cloud_server"
CLOUD_PORT=8002
# 微信小程序模块
FAMILY_CONTAINER="family"
FAMILY_IMAGE="family_server"
FAMILY_PORT=8003
# 鉴权模块
AUTH_CONTAINER="auth"
AUTH_IMAGE="auth_server"
AUTH_PORT=8004
# 网关
GATEWAY_CONTAINER="gateway"
GATEWAY_IMAGE="gateway_server"
GATEWAY_PORT=9999
# 删除应用服务器旧的代码(在第二个服务器创建好/home/project/fym-platform/目录,否则报错)
ssh -Tq ${host} <<EOF
rm -rf /home/project/fym-platform/*
EOF
# 拷贝新代码到应用服务器
echo "拷贝代码开始..."
scp -r ./* ${host}:/home/project/fym-platform
echo "拷贝代码结束..."
# 登录到项目服务器执行命令
ssh -Tq ${host} <<EOF
cd /home/project/fym-platform
echo "项目开始构建打包"
mvn clean package -Dmaven.test.skip=true -P${environment}
echo "jar文件拷贝"
mkdir -p /web/project/fym-platform
cp -r gateway-server/target/gateway-server*.jar Dockerfile /web/project/fym-platform/
cp -r fym-service/*/*/target/*server*.jar /web/project/fym-platform/
echo "=============== 开始部署容器 ==============="
# 停止并删除旧的容器
docker ps -a|grep $CLOUD_CONTAINER && docker stop $CLOUD_CONTAINER && docker rm $CLOUD_CONTAINER || echo "not exist"
docker ps -a|grep $GATEWAY_CONTAINER && docker stop $GATEWAY_CONTAINER && docker rm $GATEWAY_CONTAINER || echo "not exist"
docker ps -a|grep $FAMILY_CONTAINER && docker stop $FAMILY_CONTAINER && docker rm $FAMILY_CONTAINER || echo "not exist"
docker ps -a|grep $AUTH_CONTAINER && docker stop $AUTH_CONTAINER && docker rm $AUTH_CONTAINER || echo "not exist"
# 删除旧的镜像
docker images |grep $CLOUD_IMAGE && docker rmi -f $CLOUD_IMAGE || echo "not exist"
docker images |grep $GATEWAY_IMAGE && docker rmi -f $GATEWAY_IMAGE || echo "not exist"
docker images |grep $FAMILY_IMAGE && docker rmi -f $FAMILY_IMAGE || echo "not exist"
docker images |grep $AUTH_IMAGE && docker rmi -f $AUTH_IMAGE || echo "not exist"
# 构建新的镜像
docker build --build-arg JAR_FILE=cloud-server-1.0.jar -t $CLOUD_IMAGE /web/project/fym-platform/
docker build --build-arg JAR_FILE=gateway-server-1.0.jar -t $GATEWAY_IMAGE /web/project/fym-platform/
docker build --build-arg JAR_FILE=family-server-1.0.jar -t $FAMILY_IMAGE /web/project/fym-platform/
docker build --build-arg JAR_FILE=auth-server-1.0.jar -t $AUTH_IMAGE /web/project/fym-platform/
# 运行镜像容器
docker run -it -d --name $CLOUD_CONTAINER -p $CLOUD_PORT:$CLOUD_PORT $CLOUD_IMAGE
docker run -it -d --name $GATEWAY_CONTAINER -p $GATEWAY_PORT:$GATEWAY_PORT $GATEWAY_IMAGE
docker run -it -d --name $FAMILY_CONTAINER -p $FAMILY_PORT:$FAMILY_PORT $FAMILY_IMAGE
docker run -it -d --name $AUTH_CONTAINER -p $AUTH_PORT:$AUTH_PORT $AUTH_IMAGE
EOF
echo "部署成功"
- jar镜像打包脚本
FROM primetoninc/jdk:1.8
ARG JAR_FILE
MAINTAINER d1376537549@qq.com
COPY ${JAR_FILE} app.jar
ENV JAVA_OPTS="-Xmx512m -Xms512m -Xmn512m -Xss256K -XX:SurvivorRatio=8 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+UseConcMarkSweepGC -XX:ConcGCThreads=4 -XX:+CMSClassUnloadingEnabled -Dfile.encoding=UTF-8 -XX:+DisableExplicitGC -XX:+PrintGC -XX:+PrintGCTimeStamps -Xloggc:./gc.log"
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
- 修改jenkins刚才shell配置如下
#!/bin/bash
chmod u+x run.sh # 一行是赋予脚本执行权限
./run.sh #一行是执行脚本
1619052201097
11、测试自动构建和手动构建
- 手动触发构建(提交代码自动触发也一样),查看输出控制台,已经开始下载maven依赖开始打包
1619053964419
1619054134274
1619054194717
- 查看第二台服务器docker镜像
1619054218370
1619054239768
- 查看nacos服务启动状态
- 测试项目是否部署成功即可