Jenkins自动构建发布镜像脚本

交互设计

  大体流程如下: 1、提交代码到SVN 2、拉取代码到本地 3、执行maven package 打包 4、生成Dockerfile 5、构建、标签、推送镜像 6、发送邮件通知 主要分两个脚本,一个是jenkins配置的构建脚本,一个是构建推送以及邮件脚本,首先上Jenkins脚本 ###### ===* **************************************************** *== ################## 开发人员在此位置一下添加程序编译过程 ########EVN_HOME jenkins全局变量控制,如有必要可以进行重定义#EVN_HOME="/where/is"#可选择的JAVA编译环境#JDK#export JAVA_HOME="${EVN_HOME}/jdk1.6.0_14"#export JAVA_HOME="${EVN_HOME}/jdk1.6.0_25"#export JAVA_HOME="${EVN_HOME}/jdk1.7.0_51"export JAVA_HOME="${EVN_HOME}/jdk1.8.0_25"#ANT#export ANT_HOME="${EVN_HOME}/apache-ant-1.8.4"export ANT_HOME="${EVN_HOME}/apache-ant-1.9.4"#MVN#export MAVEN_HOME="${EVN_HOME}/apache-maven-3.0.4"#export MAVEN_HOME="${EVN_HOME}/apache-maven-3.1.1"export MAVEN_HOME="${EVN_HOME}/apache-maven-3.2.3"#export MAVEN_HOME="/opt/apache-maven-3.2.3-bak"#gradleexport GRADLE_HOME="${EVN_HOME}/gradle-2.0/"#添加PATHexport PATH="${MAVEN_HOME}/bin:${ANT_HOME}/bin:${JAVA_HOME}/bin:${GRADLE_HOME}/bin:${PATH}"echo ${PATH}###############编译过程################################echo "=========== start compile ============="Archive=${JOB_NAME}_${version}_${BUILD_TIMESTAMP}Archive_abs="${WORKSPACE}/Arch_files"Archive_zip="${JOB_NAME}_${version}_${BUILD_TIMESTAMP}.zip"rm -fr ${Archive_abs} mkdir -p ${Archive_abs}#添加版本信息echo "${JOB_NAME} ${version} ${BUILD_TIMESTAMP}" >${Archive_abs}/version.txtcd data_sync_parentmvn install -Dmaven.test.skip=truecp ./data_sync_admin/target/*.war ${Archive_abs}cd data_sync_agentmvn install -Dmaven.test.skip=truecp ./target/*.jar ${Archive_abs}cd ..cd data_sync_apimvn install -Dmaven.test.skip=truecp ./target/*.jar ${Archive_abs}cd ..cd data_sync_basemvn install -Dmaven.test.skip=truecp ./target/*.jar ${Archive_abs}#删除sources.jar文件cd ${Archive_abs}rm -f *-sources.jarecho "=================md5sum====================="cd ${Archive_abs} md5sum * > md5sum.txtecho "=================docker start====================="#将文件传输到远程docker机器scp -r -i ~/.ssh/id_rsa ${Archive_abs} jenkins@172.16.10.99:/opt/${Archive}/#登陆docker机器ssh -t -t 172.16.10.99 << eeooff#进入工作目录cd /opt/${Archive}#以下为循环,建立任务主要变动地方#1、打包&推送base镜像mkdir base && cd base && mv ../*base*.jar ./sh /opt/docker_workspace/pushimage.sh -n ${JOB_NAME} -v ${version} -t basecd ../#2、打包&推送admin镜像mkdir admin && cd admin && mv ../*admin*.war ./sh /opt/docker_workspace/pushimage.sh -n ${JOB_NAME} -v ${version} -t admincd ../#发送邮件通知sh email.sh#完成打包&推送任务,删除工作目录rm -rf /opt/${Archive}#退出exiteeooffecho "ALL images build and push complete! "echo "=================docker ====================="echo "=================== =================="这里注意最后的sh email.sh这句命令,email.sh是由pushimage.sh这个脚本生成,下面是pushimage.sh#!/bin/bashecho "****** start push image to registry......"echo "(1/5) parse args......"# 接收参数while getopts :n:v:r:h:t:k:c optdo case $opt in n) image_name=$(echo $OPTARG tr A-Z a-z) ;; v) image_version="$OPTARG" ;; r) image_registry="$OPTARG" ;; t) Type="$OPTARG" ;; k) kafka_address="$OPTARG" ;; c) conf_server="$OPTARG" ;; h) echo "****** -n set image name" echo "****** -v set image version" echo "****** -r set image registry address" echo "****** -t set dockerfile type(base inf admin)" echo "****** -k set kafka address" echo "****** -c set conf server address" echo "****** -h for help" ;; *) echo "****** ERR!unsuport command -$opt" ;; esacdone# 解析验证参数[ -z "$image_version" ] && echo "ERR! missing args:image_version" && exit 1echo "****** image version is $image_version"[ -z "$Type" ] && Type=baseecho "****** Type is $Type"[ -z "$image_name" ] && echo "ERR! missing args:image_name" && exit 1if echo $image_version grep -E "[0-9]{8}.[0-9]{6}">/dev/null;then # 测试环境 echo "init test env args!" [ -z "$image_registry" ] && image_registry="xxxx.xxx.com/xxxx" echo "****** image registry is $image_registry" [ -z "$kafka_address" ] && kafka_address="172.16.40.4:9092,172.16.40.5:9092" echo "****** kafka_address is $kafka_address" [ -z "$conf_server" ] && conf_server="172.16.40.4:80" echo "****** conf_server is $conf_server" Env="test" echo "****** Env is $Env" case $Type in base) image_name="test_"$image_name"_base" echo "****** image name is $image_name" jar_file=$(find -name *base*.jar awk -F/ '{print $NF}') echo "****** jar_file is $jar_file" ;; inf) image_name=$image_name"_inf" image_name="test_"$image_name"_inf" echo "****** image name is $image_name" jar_file=$(find -name *inf*.jar awk -F/ '{print $NF}') echo "****** jar_file is $jar_file" ;; admin) image_name="test_"$image_name"_admin" echo "****** image name is $image_name" jar_file=$(find -name *admin*.jar awk -F/ '{print $NF}') echo "****** jar_file is $jar_file" ;; esac kafka_topic="log_test_${jar_file%-*}" echo "****** kafka_topic is $kafka_topic" recivers="xxxx@xxx.com" echo "****** email recivers is $recivers" env_name="测试"else # 线上环境 echo "init online env args!" [ -z "$image_registry" ] && image_registry="xxx.xxxx.com/xxx" echo "****** image registry is $image_registry" [ -z "$kafka_address" ] && kafka_address="172.16.40.4:9092,172.16.40.5:9092" echo "****** kafka_address is $kafka_address" [ -z "$conf_server" ] && conf_server="conf.xxxx.com:80" echo "****** conf_server is $conf_server" Env="online" echo "****** Env is $Env" case $Type in base) image_name="online_"$image_name"_base" echo "****** image name is $image_name" jar_file=$(find -name *base*.jar awk -F/ '{print $NF}') echo "****** jar_file is $jar_file" ;; inf) image_name="online_"$image_name"_inf" echo "****** image name is $image_name" jar_file=$(find -name *inf*.jar awk -F/ '{print $NF}') echo "****** jar_file is $jar_file" ;; admin) image_name="online_"$image_name"_admin" echo "****** image name is $image_name" jar_file=$(find -name *admin*.war awk -F/ '{print $NF}') echo "****** jar_file is $jar_file" ;; esac kafka_topic="log_online_${jar_file%-*}" echo "****** kafka_topic is $kafka_topic" recivers="xxxx@xxx.com" echo "****** email recivers is $recivers" env_name="线上"fi# 生成对应类型Dockerfile文件file_name=Dockerfilebase(){ echo " # base on java8 FROM xxx.xxx.com/xxx/xxx/java8:1.0 # run with base path : /opt WORKDIR /opt #create webapps RUN mkdir webapps # add jar to container ADD $jar_file webapps # run with base path : /opt WORKDIR /opt/webapps # run when container started CMD java -Dredis.properties.filename=/opt/webapps/redis.properties -Dlog.kafka.address=$kafka_address -Dlog.kafka.topic=$kafka_topic -Ddisconf.conf_server_host=$conf_server -Ddisconf.env=$Env -jar /opt/webapps/$jar_file ">$file_name}inf(){ echo " # base on java8 FROM xxx.xxx.com/xx/xxx/java8:1.0 # run with base path : /opt WORKDIR /opt #create webapps RUN mkdir webapps # add jar to container ADD $jar_file webapps # run with base path : /opt WORKDIR /opt/webapps # run when container started CMD java -Dlog.kafka.address=$kafka_address -Dlog.kafka.topic=$kafka_topic -Ddisconf.conf_server_host=$conf_server -Ddisconf.env=$Env -jar /opt/webapps/$jar_file ">$file_name}admin(){ echo " # base on tomcat8 FROM xx/tomcat8:1.0 # run with base path : /opt WORKDIR /opt # add tomcat to container ADD $jar_file tomcat/webapps/ # rename war to ROOT.war run mv tomcat/webapps/$jar_file tomcat/webapps/ROOT.war #set env ENV JAVA_OPTS -Ddisconf.conf_server_host=$conf_server -Dlog.kafka.address=$kafka_address -Dlog.kafka.topic=$kafka_topic -Ddisconf.env=$Env # start tomcat CMD tomcat/bin/catalina.sh run ">$file_name}echo "(2/5) generate Dockerfile to current file......"case $Type in base) base ;; inf) inf ;; admin) admin ;;esac# 构建镜像echo "(3/5) build docker image:$image_name......"sudo docker build -t $image_name .# 对镜像打标签echo "(4/5) tag image:$image_name $image_registry/$image_name:$image_version......"sudo docker tag $image_name $image_registry/$image_name:$image_version# 上传镜像到私服echo "(5/5) push $image_registry/$image_name:$image_version......"sudo docker push $image_registry/$image_name:$image_versionecho "<li>$image_registry/$image_name:$image_version</li>">>../email-images.text#!/bin/bashecho "<!DOCTYPE html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /></head><body style=\"margin: 0; padding: 0;\"> <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"> <tr> <td style=\"padding: 10px 0 30px 0;\"> <table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"600\" style=\"border: 1px solid #cccccc; border-collapse: collapse;\"> <tr> <td align=\"center\" bgcolor=\"#70bbd9\" style=\"padding: 40px 0 30px 0; color: #153643; font-size: 28px; font-weight: bold; font-family: Arial, sans-serif;\"> <img src=\"http://imgstbox.voole.com/img/new_img/2022/03/20/2022032020594549GU9.gif\" alt=\"Creating Email Magic\" width=\"300\" height=\"230\" style=\"display: block;\" /> </td> </tr> <tr> <td bgcolor=\"#ffffff\" style=\"padding: 40px 30px 40px 30px;\"> <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"> <tr> <td style=\"color: #153643; font-family: Arial, sans-serif; font-size: 24px;\"> <b><span style=\"color: red;\">${env_name}环境</span>镜像发布成功!</b> </td> </tr> <tr> <td style=\"padding: 20px 0 30px 0; color: #153643; font-family: Arial, sans-serif; font-size: 16px; line-height: 20px;\"> 各位好,<span style=\"color: red;\">${env_name}环境</span>镜像构建发布成功!镜像全称为:</br> <ul style=\"color: red;\"> ">../email-header.textecho " </ul> </td> </tr> <tr> </table> </td> </tr> <tr> <td bgcolor=\"#ee4c50\" style=\"padding: 30px 30px 30px 30px;\"> <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"> <tr> <td style=\"color: #ffffff; font-family: Arial, sans-serif; font-size: 14px;\" width=\"75%\"> S from xxxxxx@xxxx.com<br/> POWER BY ® SCC, VOOLE 2022 </td> </tr> </table> </td> </tr> </table> </td> </tr> </table></body></html>">../email-foot.textecho " #!/bin/bash echo \"\`cat email-header.text\`\">>email.text echo \"\`cat email-images.text\`\">>email.text echo \"\`cat email-foot.text\`\">>email.text sEmail -f xxxx@xxx.com -t \"$recivers\" -s mail.voole.com -u \"${env_name}环境镜像打版成功!\" -o message-content-type=html -o message-charset=utf8 -xu xxxxr@xxxx.com -xp xxxxx -m \"\`cat email.text\` \" ">../email.shchmod +x ../email.sh

标签: 交互设计