背景
因为有用户需要容器化运行,需要我们提供镜像,但镜像构建分发还是比较麻烦的,涉及到如下步骤:
- 下载此版本最新的war包
- 构建war包为镜像
- 推送到仓库
如果总是人工操作必然会浪费很多时间,于是使用jenkins来提供自动化的流程
注意点
因为Dockerfile/启动脚本的以后可能会修改,这部分我们使用git托管起来,使用jenkins构建的时候也能自动拉取最新代码
流程
- jenkins中先拉取代码
- jenkins中调用脚本拿到war包,并且获取war包的版本
- 把脚本从本地发送到远端进行构建,如果是本地就更方便一点了!
- 远程机器获取到war版本,设置新镜像名称,根据传送过来的文件中的dockerfile进行构建
- 构建完成后推送至镜像仓库
示例
20220527
代码部分
镜像的dockerfile
FROM harbor.succez.com/base/succez-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.succez.com/succbi/"
image_latest="harbor.succez.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