用jenkins 实现项目自动部署笔记

1、目的

1、一键实现项目自动构建打包发布(用于生产环境)

2、实现代码提交到代码仓库立刻自动打包部署(用于测试环境)

3、本测试脚本代码在最后

2、操作环境

  • centos
  • jdk
  • maven
  • jenkins
  • gitee
  • git
  • docker

2、实现思路

1、生产环境
  1. 合并代码开发分支到master分支,准备发布最新代码
  2. jenkins一键点击发布
  3. jenkins从代码仓库拉取最新代码
  4. 通过maven进行打包
  5. 把jar包打包成镜像,上传到自己的镜像仓库私服
  6. jenkins通知应用服务器拉取最新镜像
  7. 应用服务器拉取最新镜像,运行新容器
  8. 删除旧的容器和镜像
  9. 若发布失败回滚到上一个版本
2、测试环境、开发环境
  1. 提交代码到代码仓库dev或其他分支
  2. 自动触发jenkins构建项目
  3. jenkins从代码仓库拉取最新代码
  4. 最新代码拷贝到测试服务器
  5. 自动连接测试服务器进行maven打包
  6. 把jar包打包成镜像
  7. 删除旧的容器和镜像
  8. 通过新打包的镜像,运行新容器

3、前期准备

  1. 两台centos服务器可以互相ping通(或者两台虚拟机)
  2. 准备一个springcloud或者springboot项目,用于自动发布测试(我这里准备的是一个多模块项目,目录结构如下)
  3. 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环境安裝
  1. 创建jdk存放目录 mkdir -p /home/jdk
  2. 上传jdk到该目录下,进入该目录并解压,解压命令: tar -zxvf jdk-8u144-linux-x64.tar.g
2、maven安装
  1. 创建maven目录和maven仓库目录
  • mkdir -p /home/maven
  • mkdir -p /home/maven/repo
  1. 上传maven到/home/maven/目录下,进入该目录并解压,解压命令:tar -zxvf apache-maven-3.6.3
3、配置jdk和maven的环境变量
  1. 修改/etc/profile文件,命令 vim /etc/profile
  2. 若目录创建和我保持一致则在底部添加如下配置,否则自行修改即可
#输入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
  1. 刷新配置使之生效
  • source /etc/profile
  1. 测试环境是否生效 , 命令 javamvn -v
  2. 另一台服务器主机同样配置

5、配置免密登录(两台服务器互相免密登录)

  1. 输入ssh-keygen -t rsa连敲三个回车
  2. 输入ssh-copy-id -i ~/.ssh/id_rsa.pub ip地址 回车
  3. 输入第二台服务器密码验证即可实现免密登录
  4. 同样的方式配置第二台服务器免密登录第一台服务器

参考:

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

jenkins 启动 springBoot 时间太长 spring cloud jenkins_docker

1619053352839

7、访问jenkins服务进行一些基础配置

  1. 浏览器访问:ip:8080

jenkins 启动 springBoot 时间太长 spring cloud jenkins_docker_02

1618994599246

  1. 到服务器获取密码 命令:cat /var/lib/jenkins/secrets/initialAdminPassword

jenkins 启动 springBoot 时间太长 spring cloud jenkins_docker_03

1618995408605

  1. 安装自定义插件

jenkins 启动 springBoot 时间太长 spring cloud jenkins_maven_04

1618995513826

  1. 创建管理员账号
  2. 点击完成之后重启一下jenkins服务,命令:systemctl restart jenkins
  3. jenkins配置全局jdk和maven环境

jenkins 启动 springBoot 时间太长 spring cloud jenkins_docker_05

1618996436490

jenkins 启动 springBoot 时间太长 spring cloud jenkins_maven_06

1618996573737

jenkins 启动 springBoot 时间太长 spring cloud jenkins_spring_07

1618996616938

  1. 安装gitee插件,推送代码到gitee主要由此插件进行触发
  2. 配置gitee交互凭证

jenkins 启动 springBoot 时间太长 spring cloud jenkins_编程语言_08

jenkins 启动 springBoot 时间太长 spring cloud jenkins_编程语言_09

  1. 全局配置gitee

8、准备部署项目

  1. 创建gitee代码仓库

jenkins 启动 springBoot 时间太长 spring cloud jenkins_maven_10

1619050043509

9、配置jenkins开始配置自动部署

  1. 创建一个自动构建流程 选择自由风格

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tAOlG9N1-1637893426234)(https://mmbiz.qpic.cn/mmbiz_png/0bmE6dS9CgJQUEbkCyje2ajToYicZGj4rVheOTDiahK1yzXSvdpwsAOsNeiaibia91ZwxkAG0QLEpv6hJmdNEGIeksA/640?wx_fmt=png)]

1618997421632

  1. 选择参数化构建

定义一些变量,这些变量在脚本中使用

jenkins 启动 springBoot 时间太长 spring cloud jenkins_maven_11

jenkins 启动 springBoot 时间太长 spring cloud jenkins_java_12

1619050337908

jenkins 启动 springBoot 时间太长 spring cloud jenkins_java_13

1619054535420

3、配置git仓库

jenkins 启动 springBoot 时间太长 spring cloud jenkins_maven_14

1619050733823

jenkins 启动 springBoot 时间太长 spring cloud jenkins_maven_15

1619050777451

jenkins 启动 springBoot 时间太长 spring cloud jenkins_java_16

1619050871896

  1. 构建自动触发器,配置jenkins
  2. 构建触发器,配置gitee

jenkins 启动 springBoot 时间太长 spring cloud jenkins_spring_17

1619051250412

  1. 测试构建是否生效
    配置jenkins添加构建步骤

jenkins 启动 springBoot 时间太长 spring cloud jenkins_maven_18

1619051394272

点击 应用 保存

  1. 测试手动构建

jenkins 启动 springBoot 时间太长 spring cloud jenkins_spring_19

1619051457074

jenkins 启动 springBoot 时间太长 spring cloud jenkins_maven_20

1619051489297

jenkins 启动 springBoot 时间太长 spring cloud jenkins_maven_21

1619051513195

  1. 测试自动构建

手动push代码看看是否会出发自动构建


jenkins 启动 springBoot 时间太长 spring cloud jenkins_编程语言_22

jenkins 启动 springBoot 时间太长 spring cloud jenkins_java_23

jenkins 启动 springBoot 时间太长 spring cloud jenkins_spring_24

10、自动化部署脚本

自动构建配置完成,接下来编写一个脚本进行真正的部署项目

脚本内容如下,目前实现了功能但还是不完善,后期完善

  1. 项目部署脚
# 项目模块统一变量设置

# 公共服务
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 "部署成功"
  1. 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"]
  1. 修改jenkins刚才shell配置如下
#!/bin/bash
chmod u+x run.sh # 一行是赋予脚本执行权限
./run.sh #一行是执行脚本

jenkins 启动 springBoot 时间太长 spring cloud jenkins_maven_25

1619052201097

11、测试自动构建和手动构建

  1. 手动触发构建(提交代码自动触发也一样),查看输出控制台,已经开始下载maven依赖开始打包

jenkins 启动 springBoot 时间太长 spring cloud jenkins_编程语言_26

1619053964419

jenkins 启动 springBoot 时间太长 spring cloud jenkins_spring_27

1619054134274

jenkins 启动 springBoot 时间太长 spring cloud jenkins_编程语言_28

1619054194717

  1. 查看第二台服务器docker镜像

jenkins 启动 springBoot 时间太长 spring cloud jenkins_docker_29

1619054218370

jenkins 启动 springBoot 时间太长 spring cloud jenkins_spring_30

1619054239768

  1. 查看nacos服务启动状态
  2. 测试项目是否部署成功即可