上次弄了个
idea一键部署
的,今天换上Jenkins,跟idea相比有哪些优点呢,团队协作中,第一避免了冗余的pom插件配置和idea配置或Dockerfile,第二主要解决后端或者前端在开发过程中的持续集成、部署问题,第三为整个团队提供一个统一的部署环境,避免因为各开发人员因为本地环境不同而导致的问题。为开发者节约大量的时间,专注于业务逻辑,功能完成后只管push你的git代码,编译打包发布都可自动化,避免冗余重复的工作。
大概工作流程如下,Jenkins点击构建(或webhook自动触发),首先它会先去git上拉取你指定分支的最新代码,拉取完之后,执行maven命令,clean package,把代码打成jar包,然后执行shell命令,备份->生成Dockerfile->打镜像->启动容器。
准备工作
- 云服务器,我这里是购买的阿里云的,最便宜的,1核2G的,Linux CentOS 7.5
- 连接linux工具,我这里用的是SecureCRT
-
git这块由于网络原因,这里使用了
Gitee
,如果商用的话一般自己搭建GitLab
安装Docker
详细步骤请戳
这里
安装Jenkins
详细步骤请戳
这里
新建任务
-
任务名称规则(参考):前端/后端_测试/生产环境_项目名
我这里的任务名为:back_test_docker-day2
- 添加任务描述
-
添加git源码管理
这里其实推荐配置使用SSH免密,我这边多次配置之后各种连不上,放弃治疗了,就直接用账密登录了,点击添加,Domain选择全局凭据,类型选择Username with password。
连接成功后,选择你的分支,比如测试环境,你就填测试分支,生产就填生产的分支
-
构建触发器
这里一般测试环境我们希望,只要push代码到仓库,gitee就会触发webhook执行此任务(会给你配置的 url 发送一个post请求),这种比轮询要高效一点,但是生产环境的话建议还是使用手动点击构建。 - 构建环境
构建
这一步我们将通过shell脚本完成备份-编译-打包-发布等一系列操作。
-
第一步,执行maven打包命令,这一步会在你的jenkins容器内完成,然后把你的源码打成jar包,路径如下:
/var/jenkins_home/workspace/back_test_docker-day2/target/xxx.jar
其中back_test_docker-day2为你的任务名,如果你改了的话,这个目录也会改
- 第二步,执行shell脚本,这里暂只做备份jar,生成Dockerfile,这里有个坑,就是容器内的时区可能不对,导致java获取的时间有问题,这里解决方案是在生成Dockerfile的时候加上Asia/Shanghai
对应脚本内容如下:
#!/bin/bash
# 上面这个东西不加,会报空间不足异常
# 注意:所有镜像,容器和应用的命名,最好不要有大写字母
# docker镜像/容器名字
SERVER_NAME=docker-day2
# 操作/项目路径(Dockerfile和Jar存放的路径)
BASE_PATH=/var/jenkins_home/docker/project/$SERVER_NAME
# 备份目录
BACKUP_PATH=/var/jenkins_home/docker/project/backup
# jar名字
JAR_NAME=$SERVER_NAME-0.0.1-SNAPSHOT.jar
# 源jar路径(注:更新任务名需要同步更新这个路径,例:back_test_docker-day2)
SOURCE_PATH=/var/jenkins_home/workspace/back_test_docker-day2/target/$JAR_NAME
# 当前日期时间
DATE=`date +%Y%m%d-%H%M%S`
# 备份
function backup(){
if [ ! -d $BACKUP_PATH ]; then
mkdir $BACKUP_PATH
else
echo "备份文件夹已存在"
fi
if [ -f "$BASE_PATH/$JAR_NAME" ]; then
echo "$JAR_NAME 备份..."
cp $BASE_PATH/$JAR_NAME $BACKUP_PATH/$SERVER_NAME-$DATE.jar
echo "备份 $JAR_NAME 完成"
else
echo "$BASE_PATH/$JAR_NAME不存在,跳过备份"
fi
}
# 迁移,构建好的Jar包,复制到DockerFile一起
function transfer(){
echo "迁移代码开始"
rm -rf $BASE_PATH
mkdir -p $BASE_PATH
echo "最新构建代码 $SOURCE_PATH 迁移至 $BASE_PATH ...."
cp $SOURCE_PATH $BASE_PATH
echo "迁移完成"
}
# 生成Dockerfile文件
function dockerfile(){
echo "开始生成Dockerfile文件"
echo """
FROM java:8
ADD $JAR_NAME $JAR_NAME
#更改容器时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 容器启动后执行的操作
CMD java -jar $JAR_NAME
""" > $BASE_PATH/Dockerfile
echo "生成Dockerfile文件成功"
}
#入口
backup # 1:备份
transfer # 2:迁移
dockerfile # 3:生成dockerfile
-
第三步,ssh内执行shell脚本,这里为啥要放ssh呢,因为容器内是没办法使用宿主机的命令的,所以得通过ssh,这里配置参考
这里
,配置好之后再jenkins的系统设置中添加SSH Server ,执行脚本,功能:停止->删除旧容器,删除旧镜像,重建镜像,run容器
对应脚本内容如下:
#!/bin/bash
# 上面这个东西不加,会报空间不足异常
# 注意:所有镜像,容器和应用的命名,最好不要有大写字母
# docker镜像/容器名字
SERVER_NAME=docker-day2
# 操作/项目路径(Dockerfile和Jar存放的路径)
BASE_PATH=/data/jenkins_home/docker/project/$SERVER_NAME
# 端口号
APP_PORT=8092 #应用的端口
E_PORT=8092 #服务暴露给外部调用的端口
# 容器id
CID=$(docker ps -a | grep "$SERVER_NAME" | awk '{print $1}')
# 镜像id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
function dockerBuild(){
if [ -n "$CID" ]; then
echo "存在$SERVER_NAME容器,CID=$CID,删除容器 ..."
docker rm -f $CID
echo "$SERVER_NAME容器删除完成..."
else
echo "不存在$SERVER_NAME容器..."
fi
if [ -n "$IID" ]; then
echo "存在$SERVER_NAME镜像,IID=$IID"
docker rmi -f $IID
echo "镜像删除完成"
cd $BASE_PATH
docker build -t $SERVER_NAME .
echo "镜像构建完成"
else
echo "不存在$SERVER_NAME镜像,开始构建镜像"
cd $BASE_PATH
docker build -t $SERVER_NAME .
echo "镜像构建完成"
fi
echo "启动容器..."
docker run --name $SERVER_NAME -d -p $E_PORT:$APP_PORT $SERVER_NAME
echo "容器启动完成"
}
dockerBuild # 4:停止->删除旧容器,删除旧镜像,重建镜像,run容器
-
构建后操作
暂时没想到啥操作,空着,然后点击保存
验证
- 点击立即构建,点击进度条,进入日志页面,如果有错误,会在此页面提示,成功会显示SUCCESS
- 我们再去服务器看一下容器的状态
docker ps | grep docker-day2
- 访问一下我们之前写的测试接口,正常响应,没有问题
- 进容器看看log打印
docker exec -u 0 -it 1f3fb6e642c2 /bin/bash
tail -500 /data/app/logs/docker-day2/docker-day2-8092.log
源码
版权声明:本文为z1353095373原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。