持续集成
根据实际情况,持续集成的目标是自动化编译以及打包
注意: 根据实际情况可按照当前环境进行对应的变化,只要能完成对应的目标,合理化的改变方案即可。由于 jenkins 使用界面操作较为方便,所以在表述上可能欠妥。也可以编写 jenkins 的 pipline 文件进行流水线操作
后端服务编译打包
maven
- 安装
# 下载maven安装包,具体的文件可根据选择下载
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
# 解压apache-maven-3.6.1-bin.tar.gz
tar zvxf apache-maven-3.6.1-bin.tar.gz
# 开始配置环境变量,编辑文件/etc/profile
# 在最下面添加以下内容(MAVEN_HOME是刚才解压maven的路径)
export MAVEN_HOME=/opt/maven/apache-maven-3.6.1
# 查看mvn安装是否成功
mvn -v
- 设定 maven 私有仓库(可选)
vim /opt/maven/apache-maven-3.6.1/conf/settings.xml
<mirrors>
<!-- * 表示让所有仓库使用该镜像-->
<mirror>
<id>nexus</id>
<name>nexus</name>
<mirrorOf>*</mirrorOf>
<url>http://172.16.63.21:9999/repository/maven-group/</url>
</mirror>
</mirrors>
- 设定经过编译的 jar 包推送到私有镜像仓库(可选)
# 在编译项目中的pom.xml文件修改<distributionManagement>
<distributionManagement>
<snapshotRepository>
<uniqueVersion>false</uniqueVersion>
<id>nexus</id>
<name>nexus</name>
<url>http://172.16.63.21:9999/repository/maven_snapshot/</url>
</snapshotRepository>
<repository>
<uniqueVersion>false</uniqueVersion>
<id>nexus</id>
<name>nexus</name>
<url>http://172.16.63.21:9999/repository/maven_release/</url>
</repository>
</distributionManagement>
npm
- 安装
# 下载安装包
wget https://nodejs.org/dist/v14.15.4/node-v14.15.4-linux-x64.tar.xz
# 解压并放入指定目录
tar -xf node-v14.15.4-linux-x64.tar.xz
mv node-v14.15.4-linux-x64 /usr/local/node
# 建立软连接
cd /usr/bin
ln -s /usr/local/node/bin/node node
ln -s /usr/local/node/bin/npm npm
- 设定私有的镜像仓库
npm config set http://172.16.63.21:9999/repository/npm-group/
# 验证
npm config get registry
docker
- 安装
yum -y install yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's/$releasever/7/g' /etc/yum.repos.d/docker-ce.repo # 由于中标麒麟系统的$releasever值和Centos不同,所以需要修改
yum install -y docker-ce-20.10.9
systemctl start docker
systemctl enable docker
- 设定私有的镜像仓库
vim /etc/docker/daemon.json
{
"data-root": "/home/docker", # 设定docker默认存储位置
"registry-mirrors": ["http://172.16.63.21:6001"], # 设定私有仓库
"insecure-registries": ["172.16.63.21:6001","172.16.63.21:6000"]
}
git
- 安装
yum install -y git
git --version
httpd
yum install http* -y
setenforce 0
# 可将文件放/var/www/html/下则可以实现curl获取文件
Jenkins 配置持续集成
后端
- 持续集成
新建Item ---> 构建一个maven项目
源码管理 Git
Repository URL: git源码的地址
Credentials: 添加用户和密码
Branches to build: 指定分支
构建触发器 Build when a change is pushed to GitLab. GitLab webhook
使用Secret token注册在gitlab上实现实时联动(具体方式可百度)
Build
Root POM: pom.xml
Goals and options: clean package -U -Dmaven.test.skip=true
前端
- 持续集成
新建Item ---> Freestyle Project
源码管理 Git
Repository URL: git源码的地址
Credentials: 添加用户和密码
Branches to build: 指定分支
构建触发器 Build when a change is pushed to GitLab. GitLab webhook
使用Secret token注册在gitlab上实现实时联动(具体方式可百度)
构建 Execute shell
npm install
rm -rf ./dist/*
npm run build
jenkins 额外配置
- 邮箱配置
构建后操作
Editable Email Notification(如果不存在则需要安装插件)
Project From: 邮件的发送者
Project Recipient List: 邮件接收者
Project Reply-To List: 项目回复列表
Content Type: 内容类型
Default Subject: 邮件标题
Default Content: 邮件内容
Triggers: 触发器
Always: 总是发送邮件
注: 以上内容可以在Jenkins Configure System中设定,并且在项目中使用变量代替
关于邮件内容可根据html语法自定义
示例
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
<style>
th {
background-color: antiquewhite;
}
.ehead {
background-color: antiquewhite;
text-align: center;
border: 1px solid #F0F8FF;
}
.email {
width: 400px;
height: 330px;
border: 2px solid black;
margin: auto
}
.ebody {
background-color: #DCDCDC;
border: 1px solid #F0F8FF;
}
h4 {
margin-left: 20px;
}
</style>
</head>
<body>
<div class="email">
<div class="ehead">
<h2>构建信息</h2>
</div>
<div class="ebody">
<h4>
项目名称: ${PROJECT_NAME}
</h4>
<h4>
触发原因: ${CAUSE}
</h4>
<h4>
构建结果: ${BUILD_STATUS}
</h4>
<h4>
构建日志: <a
href="http://172.16.63.21:8080/job/$PROJECT_NAME/$BUILD_NUMBER/console">点击查看构建日志</a>
</h4>
<h4>
项目配置: <a
href="http://172.16.63.21:8080/job/$PROJECT_NAME/configure">点击查看jenkins项目配置</a>
</h4>
</div>
<div class="etips">
<h5 style="text-align: center;color:#FF3E96">以上是Jenkins自动发送的邮件,请勿回复!</h5>
</div>
</div>
</body>
</html>
- 企业微信配置
构建后操作: 企业微信通知(如果不存在则需要安装插件)
在jenkins Configure System中<企业微信通知配置>
默认Webhook地址需要去企业微信中获取
在指定的群中创建机器人获取Webhook(可自行百度)
企业微信通知
仅失败才@: 根据需求选定
通知UserID: 需要@的成员(微信群中的名称)
通知手机号码: 必须和成员的名字匹配
存储编译后文件
- 后端
Execute shell
# 项目名
export Project=jc-earth-atmosphere
# 将编译的jar包放置到httpd服务的文件中,以提供http访问获取
cp target/*.jar /var/www/html/ci/develop/$Project
# 将编译好的jar包制作成docker镜像,并推送到镜像仓库
cp target/*.jar /var/lib/jenkins/dockerbuild/$Project/$Project.jar
cd /var/lib/jenkins/dockerbuild/$Project
# docker制作镜像
docker build -t $Project:v1 .
docker tag $Project:v1 172.16.63.21:6000/$Project:v1
docker login 172.16.63.21:6001 -u admin -p eds1234*
# docker推送镜像
docker push 172.16.63.21:6000/$Project:v1
docker rmi 172.16.63.21:6000/$Project:v1
注: 在/var/lib/jenkins/dockerbuild/$Project/目录下有对应的Dockerfile,示例如下:
FROM java:8
RUN mkdir /home/Service
RUN echo "Asia/Shanghai" > /etc/timezone
ADD jc-earth-atmosphere.jar /home/Service
ADD jc-earth-atmosphere.yml /home/Service
WORKDIR /home/Service
CMD java -Dfile.encoding=utf-8 -jar jc-earth-atmosphere.jar --spring.config.location=./jc-earth-atmosphere.yml --spring.cloud.nacos.discovery.server-addr=$jc_nacos_ip --spring.cloud.nacos.discovery.namespace=$jc_nacos_namespace
- 前端
Execute shell
# 项目名
export Project=jc-interface-environment
npm install
rm -rf ./dist/*
npm run build
# 将新生成的dist文件夹压缩
tar -zcvf platform.tar dist
# 将压缩包放置到httpd服务的文件中,以提供http访问获取
cp -r platform.tar /var/www/html/ci/develop/$Project/platform.tar
cp -r dist /var/lib/jenkins/dockerbuild/$Project/platform
cd /var/lib/jenkins/dockerbuild/$Project
# docker制作镜像
docker build -t $Project:v1 .
docker tag $Project:v1 172.16.63.21:6000/$Project:v1
docker login 172.16.63.21:6001 -u admin -p eds1234*
# docker推送镜像
docker push 172.16.63.21:6000/$Project:v1
docker rmi 172.16.63.21:6000/$Project:v1
注: 在/var/lib/jenkins/dockerbuild/$Project/目录下有对应的Dockerfile,示例如下:
FROM nginx:1.20.1
RUN mkdir /jiacheng/
ADD platform /jiacheng/platform
ADD env.sh /docker-entrypoint.d/env.sh
ADD nginx.conf /etc/nginx/nginx.conf
Jenkins 持续交付
后端
# 将新编译的jar部署到指定服务器上
Manage Jenkins --> Configure System --> SSH Servers
添加需要被部署的服务器
Name: 服务器名字
Hostname: 服务器IP地址
Username: ssh连接的用户名
Remote Directory: 远程的目录
Use password authentication, or use a different key: 使用密码登录
Passphrase / Password: ssh密码
项目中
构建后操作
Send build artifacts over SSH
SSH Publishers
Name: 之前设定的ssh服务器
Transfers: 需要从jenkins传递的文件(必须是文件)
Remove prefix: 需要删除的路径(Transfers)
Remote directory: 传递的目的路径
Exec command: 在服务器上需要执行的shell命令
shell命令示例:
#!/bin/sh
jar_name=jc-earth-atmosphere
app_dir=/home/Devops/deploy/$jar_name
rm $app_dir/$jar_name.jar -f
mv $app_dir/$jar_name*.jar $app_dir/$jar_name.jar
docker restart $jar_name
解析:由于在目标服务器上服务已经被docker化,并且jar包被挂载在外部,所以只需要替换jar包并且重启相关的容器则部署完毕
前端
# 将新编译的jar部署到指定服务器上
Manage Jenkins --> Configure System --> SSH Servers
添加需要被部署的服务器
Name: 服务器名字
Hostname: 服务器IP地址
Username: ssh连接的用户名
Remote Directory: 远程的目录
Use password authentication, or use a different key: 使用密码登录
Passphrase / Password: ssh密码
项目中
构建后操作
Send build artifacts over SSH
SSH Publishers
Name: 之前设定的ssh服务器
Transfers: 需要从jenkins传递的文件(必须是文件)
Remove prefix: 需要删除的路径(Transfers)
Remote directory: 传递的目的路径
Exec command: 在服务器上需要执行的shell命令
shell命令示例:
#!/bin/sh
file_path=/home/webroots/environment
echo --删除旧的platform
rm $file_path/platform -rf
echo --生成新的platform
tar -xmvf $file_path/platform.tar -C $file_path
mv $file_path/dist $file_path/platform
rm $file_path/platform.tar -f
echo --重启nginx
nginx -s reload
解析:由于在目标服务器上前端服务使用nginx代理,所以只需要将原有的对应文件夹替换,重启nginx则部署完毕