原创 jenkins集成gitlab-push后自动build
已前两节为基础,没看的可以返回查看
本文基于spring boot项目
一、安装docker插件
1、首先在操作系统内安装docker,可参考第一篇文章
2、在jenkins安装docker-build-step插件
3、Jenkins配置Docker:Manager Jenkins-->Global Tool Configuration-->Docker
二、Jenkins项目配置
点击要配置的项目-->配置-->构建-->添加构建步骤-->执行shell
填入一下命令
#操作/项目路径(Dockerfile存放的路劲)
BASE_PATH=/work/project
# 源项目工作空间
SOURCE_PATH=/root/.jenkins/workspace
#docker 镜像/容器/项目名字或者jar名字数组 这里都使用项目名命名
PROJECT_NAMES=("jenkins-demo-1")
#项目版本号/docker 容器tag,使用项目版本号来做tag,版本号要与项目数组PROJECT_NAMES一一对应
PROJECT_VERSIONS=("0.0.1-SNAPSHOT")
#docker容器暴露的端口,端口号要与项目数组PROJECT_NAMES一一对应,这里为了简化,docker容器端口与宿主机端口配置成一样的。
EXPOSE_PORTS=("8084")
##############以下内容不用修改
DATE=`date +%Y%m%d%H%M`
#创建项目环境目录
function projectDir(){
for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ ))
do
if [ ! -e $BASE_PATH/${PROJECT_NAMES[$i]} ] && [ ! -d $BASE_PATH/${PROJECT_NAMES[$i]} ];
then
mkdir -p $BASE_PATH/${PROJECT_NAMES[$i]}
echo "Create Dir: $BASE_PATH/${PROJECT_NAMES[$i]}"
fi
done
}
# 备份
function bakup(){
for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ ))
do
if [ -f "$BASE_PATH/${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}.jar" ]; then
echo "${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}.jar 备份..."
cp $BASE_PATH/${PROJECT_NAMES[$i]}/${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}.jar $BASE_PATH/${PROJECT_NAMES[$i]}/backup/${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}-$DATE.jar
cp $BASE_PATH/${PROJECT_NAMES[$i]}/Dockerfile $BASE_PATH/${PROJECT_NAMES[$i]}/backup/Dockerfile-$DATE.jar
echo "备份 ${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}.jar 完成"
else
echo "$BASE_PATH/${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}.jar不存在,跳过备份"
fi
done
}
# 最新构建代码 移动到项目环境
function transfer(){
for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ ))
do
echo "最新构建代码 $SOURCE_PATH/${PROJECT_NAMES[$i]}/target/${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}.jar 迁移至 $BASE_PATH ...."
cp $SOURCE_PATH/${PROJECT_NAMES[$i]}/target/${PROJECT_NAMES[$i]}-${PROJECT_VERSIONS[$i]}.jar $BASE_PATH/${PROJECT_NAMES[$i]}
cp $SOURCE_PATH/${PROJECT_NAMES[$i]}/Dockerfile $BASE_PATH/${PROJECT_NAMES[$i]}
echo "迁移完成"
done
}
# 构建docker镜像
function build(){
for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ ))
do
#镜像id
IID=$(docker images | grep "${PROJECT_NAMES[$i]}" | awk '{print $3}')
if [ -n "$IID" ]; then
echo "存在${PROJECT_NAMES[$i]}镜像,IID=$IID"
#容器id
CID=$(docker ps -a | grep "${PROJECT_NAMES[$i]}" | awk '{print $1}')
if [ -n "$CID" ]; then
echo "存在${PROJECT_NAMES[$i]}容器,CID=$CID,删除docker容器 ..."
docker stop $CID
docker rm $CID
echo "${PROJECT_NAMES[$i]}容器删除完成$CID"
fi
docker rmi $IID
echo "${PROJECT_NAMES[$i]}镜像删除完成$IID"
fi
echo "不存在${PROJECT_NAMES[$i]}镜像,开始构建镜像"
cd $BASE_PATH/${PROJECT_NAMES[$i]}
docker build -t ${PROJECT_NAMES[$i]} .
done
}
function runContainer(){
for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ ))
do
#容器id
CID=$(docker ps -a | grep "${PROJECT_NAMES[$i]}" | awk '{print $1}')
if [ -n "$CID" ]; then
echo "存在${PROJECT_NAMES[$i]}容器,CID=$CID,重启docker容器 ..."
#docker restart ${PROJECT_NAMES[$i]}
#echo "${PROJECT_NAMES[$i]}容器重启完成"
docker rm $CID
echo "${PROJECT_NAMES[$i]}容器删除完成$CID"
fi
echo "不存在${PROJECT_NAMES[$i]}容器,docker run创建容器..."
docker run --name ${PROJECT_NAMES[$i]} -v $BASE_PATH/${PROJECT_NAMES[$i]}:$BASE_PATH/${PROJECT_NAMES[$i]} -d -p ${EXPOSE_PORTS[$i]}:${EXPOSE_PORTS[$i]} ${PROJECT_NAMES[$i]}
echo "${PROJECT_NAMES[$i]}容器创建完成"
done
}
# 运行docker容器
function run(){
projectDir
bakup
transfer
build
runContainer
#启动容器,我们采用docker compose来编排docker容器,解决docker容器之间网络访问的问题
#先编写docker-compose.yml文件后,放入项目路径下
#cd $BASE_PATH
#docker-compose up -d
}
#入口
run
稍微了解一下docker命令的一看就懂
着重看一下bakup函数里有个Dockerfile的拷贝,注意要将自己的Dokerfile放入源项目工作空对应的项目下
本文对应目录:/root/.jenkins/workspace/jenkins-demo-1
三、编写Dockerfile
#基于java:8
FROM java:8
VOLUME /tmp
ADD jenkins-demo-1-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8084
CMD java -jar app.jar
四、测试
- 在idea修改代码,push到gitlab
- gitlab触发Webhooks,触发配置的jenkins
- jenkins项目触发构建
- 生成镜像-->生成容器-->启动项目
- 完成
公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢