大体流程如下:
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 end====================="echo "===================end =================="
这里注意最后的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 optdocase $opt inn)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 inbase)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";;esackafka_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 inbase)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";;esackafka_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 java8FROM xxx.xxx.com/xxx/xxx/java8:1.0# run with base path : /optWORKDIR /opt#create webappsRUN mkdir webapps# add jar to containerADD $jar_file webapps# run with base path : /optWORKDIR /opt/webapps# run when container startedCMD 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 java8FROM xxx.xxx.com/xx/xxx/java8:1.0# run with base path : /optWORKDIR /opt#create webappsRUN mkdir webapps# add jar to containerADD $jar_file webapps# run with base path : /optWORKDIR /opt/webapps# run when container startedCMD 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 tomcat8FROM xx/tomcat8:1.0# run with base path : /optWORKDIR /opt# add tomcat to containerADD $jar_file tomcat/webapps/# rename war to ROOT.warrun mv tomcat/webapps/$jar_file tomcat/webapps/ROOT.war#set envENV JAVA_OPTS -Ddisconf.conf_server_host=$conf_server -Dlog.kafka.address=$kafka_address -Dlog.kafka.topic=$kafka_topic -Ddisconf.env=$Env# start tomcatCMD tomcat/bin/catalina.sh run">$file_name}echo "(2/5) generate Dockerfile to current file......"case $Type inbase)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/2018/03/20/2018032020594549GU9.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%\">Send from xxxxxx@xxxx.com<br/>POWER BY ® SCC, VOOLE 2018</td></tr></table></td></tr></table></td></tr></table></body></html>">../email-foot.textecho "#!/bin/bashecho \"\`cat email-header.text\`\">>email.textecho \"\`cat email-images.text\`\">>email.textecho \"\`cat email-foot.text\`\">>email.textsendEmail -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
有兴趣的大佬大神可以关注下小弟的微信公共号,一起学习交流,扫描以下二维码关注即可。
文章转载自尚浩宇,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。





