jenkins构建docker镜像

                               创建:2022年5月27日 更新:2022年6月9日 248点热度 0人点赞 0条评论

背景

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

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

注意点

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

流程

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

示例

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

yuc

这个人很懒,什么都没留下

error: Content is protected !!