jenkins构建docker镜像
侧边栏壁纸
博主昵称
yuc

  • 累计撰写 291 篇文章
  • 累计收到 0 条评论

jenkins构建docker镜像

yuc
yuc
2022-05-27 / 最后修改: 2023-06-01 08:41 / 0 评论 / 920 阅读 / 正在检测是否收录...
背景

因为有用户需要容器化运行,需要我们提供镜像,但镜像构建分发还是比较麻烦的,涉及到如下步骤:

  1. 下载此版本最新的war包
  2. 构建war包为镜像
  3. 推送到仓库 如果总是人工操作必然会浪费很多时间,于是使用jenkins来提供自动化的流程
注意点

因为Dockerfile/启动脚本的以后可能会修改,这部分我们使用git托管起来,使用jenkins构建的时候也能自动拉取最新代码

流程
  1. jenkins中先拉取代码
  2. jenkins中调用脚本拿到war包,并且获取war包的版本
  3. 把脚本从本地发送到远端进行构建,如果是本地就更方便一点了!
  4. 远程机器获取到war版本,设置新镜像名称,根据传送过来的文件中的dockerfile进行构建
  5. 构建完成后推送至镜像仓库
代码部分

镜像的dockerfile

FROM harbor.xxx.com/base/xxx-centos:7.6-2020120414

COPY dirs/ /usr/local/
COPY ROOT.war start.sh /opt/
CMD sh -x /opt/start.sh

dockerfile中的启动命令

#!/bin/bash
#
# 提供了三个参数:
# MEM用来设置内存大小,未设置为1G
# SERVICE来设置war名,上下文,否则为ROOT
# CLUSTER设置集群ip前缀,docker私有ip有多个,如果做web集群,需要指定能容器之间互通的段
mem=0
war=0
cluster=0
if [ ! -z "${MEM}" ];then
	if echo ${MEM} | grep "^[[:digit:]]*$" &> /dev/null;then
		if [ ${MEM} -gt 31 ];then
			MEM=31
		fi	
		mem=1
	fi
fi
if [ ! -z "${SERVICE}" ];then
	if [ -z "$(echo ${SERVICE} | tr -d '0-9A-Za-z')" ];then
		if ! echo ${SERVICE} | egrep "^[0-9]|[0-9]$" &> /dev/null;then
			war=1
		fi
	fi
fi
if [ ! -z "${CLUSTER}" ];then
	cluster=1
fi
if [ ${cluster} -eq 1 ];then
	export JAVA_OPTS="-Dsucc.clusterBindAddressPrefix=${CLUSTER}"
fi
if [ ${mem} -eq 1 ];then
	sed -i "s/1g/${MEM}g/g" /usr/local/tomcat/bin/catalina.sh
fi
if [ ${war} -eq 1 ];then
	cp -a /usr/local/tomcat/ROOT /usr/local/tomcat/webapps/
	cp -a /opt/ROOT.war /usr/local/tomcat/webapps/${SERVICE}.war
else
	cp -a /opt/ROOT.war /usr/local/tomcat/webapps/
fi
/usr/local/tomcat/bin/catalina.sh start
tail -f /etc/getcode/code
jenkins部分
this="镜像-4.19.3"
release_root="/var/jenkins_home/jobs/bi-4.19.3/workspace/bi"
src_FILE="${release_root}/com.succez.bi/dist/ROOT.war"
dst_FILE="/var/jenkins_home/jobs/${this}/workspace/ROOT.war"
if [ ! -f "${src_FILE}" ];then
	echo "war包不存在"
	exit 1
fi
\cp -rfa ${src_FILE} ${dst_FILE}
version=$(cat ${release_root}/com.succez.bi/src/main/java/META-INF/succ-product.json  | grep "version" | awk '{print $2}' | tr -d "\",")
echo ${version} > /var/jenkins_home/jobs/${this}/workspace/version
文件传输

文件传输到远程机器使用的jenkins的sftp传输插件,在后台配置server登录账号密码后,在前端设置本地路径和目的路径。 本地路径是以workspace为参照的相对目录,表示当前所有文件,如果下级目录下的所有文件需要两个 目的路径需要写绝对目录 Remove prefix,如果本地目录中的目录层级需要移除,那么写入

后续脚本
cd /usr/local/build/release-bi/
version=$(cat version)
time=`date +%Y%m%d%H`
echo ${time}
echo ${version}
image_name="succbi:${version}-${time}"
image_prefix="harbor.xxx.com/succbi/"
image_latest="harbor.xxx.com/succbi/succbi:latest"
image_cn=${image_prefix}${image_name}
docker build -t ${image_name} .
if [ $? -ne 0 ];then
    echo "docker build failed"
    exit 1
fi
docker tag ${image_name} ${image_cn}
docker tag ${image_name} ${image_latest}
docker push ${image_cn}
docker push ${image_latest}
docker镜像命名规范
suxxx-4.xx.3:latest
suxxx-4.xx.3:2022060801
suxxx-4.xx.0:latest
suxxx-4.xx.0:2022060801
suxxx-oem:latest
suxxx-oem:2022060801
0

评论

博主关闭了当前页面的评论