我们公司是通过Git+Jenkins+Shell+Docker实现自动化更新发布。

    这里我说下我是如何用Shell+atd服务,在晚上21:00自动完成领导交代的某个项目上线操作。要注意的是,这个上线项目和上线时间是不固定的!注意:这个跟jenkins的定时任务不同,jenkins定时任务是循环任务,这个是一次性的,需要人工设定好。

    CTO规定每天21:00后才可以网站发布,下班时,开发告知我API项目晚上9点要上线。TM的回去打LOL或有事情容易搞忘了(CTO说:我希望这种事情以后不要发生!!),咋办呢?

    于是,我就写了个Shell,at 21:00 /auto_build.sh (脚本路径/脚本名)自动完成上线任务。

    Shell脚本运行原理:通过curl访问网页,用命令对判断构建的信息,成功与失败都往手机与邮箱发送构建提醒,中途失败则不执行下一步。

    我们的jenkins发布需要构建2个任务完成:第一步打包;第二步发布,即运行脚本会依次执行好几个任务。废话不多说了,放上脚本。



#!/bin/bash


#——————————————————————— 以下内容使用前需要手工修改 ——————————————————————


#开发测试 jenkins 链接

jenkins_path="http://IP:端口/job"


#新版本接口 jenkins 链接

#jenkins_path="http://IP/view/All/job"


#需要构建的项目名称

#buildJob="it_test"   #测试项目

#buildJob="tmp_accompany-server"

#buildJob="tmp-accompany-server_1-Deploy"

#buildJob="tmp-accompany-server_2-Deploy"


#构建任务列表,按顺序执行构建

#arr=("tmp_accompany-server" "tmp-accompany-server_1-Deploy" "tmp-accompany-server_2-Deploy")

arr=("it_test" "it_test")

#——————————————————————— 以上内容使用前需要手工修改 ——————————————————————


#—————————————————————————— 定义发邮件函数 —————————————————————————————————

Email(){

/sendEmail/sendEmail -f 发件人邮箱 -t 收件人邮箱 -s 发送服务器 -u "Build INFO" -o message-content-type=html -o message-charset=utf8 -xu 邮箱名 -xp 密码 -m $1

}


#—————————————————————————— 定义jenkins构建函数 —————————————————————————————

build(){


#判断是否传入了参数。

if [ -z $1 ];then

echo "ERROR,未传入构建链接!"

exit 1

fi


#把这个项目的页面信息存到build.tmp文件中  

curl -s -o build.tmp ${1} 


#对页面信息进行提取最后构建数  

lastbuild=$(grep -oE "Last build \(\#[0-9]*" build.tmp |grep -oE [0-9]*) 


#接下来要构建的数  

newbuild=$[lastbuild+1]


#触发构建

curl -u 用户名:密码 -s -d build -d delay=0sec ${1}build?delay=0sec

echo "buliding ${buildJob} #${newbuild} url:${1}"

echo -n "building..."  

sleep 5


#访问最新构建结果信息放到build.tmp2文件中

#http://ip:port/job/test/buildHistory/ajax --header n:${num} num存放想查看具体某次的构建结果信息


#下面为查看最新构建(刚刚触发的构建)的结果。  

curl -o build.tmp2 -s --header n:${newbuild} ${1}buildHistory/ajax


#判断结果文件中是否包含 In progress(排队中)|pending(构建中),是的话每三秒去重新获取结果进行判断  

while grep -qE "In progress|pending" build.tmp2;  

do  

  echo -n "."  

  sleep 3  

  curl -o build.tmp2 -s --header n:${newbuild} ${1}buildHistory/ajax  

done  

echo  

#包含Success单词为构建成功  

if grep -qE "Success" build.tmp2 ;then  

  echo "Build Success"  

  Email "Build Success! ${BuildJob}"

#包含Unstable单词为构建有警告但是构建成功  

elif grep -qE "Unstable" build.tmp2 ;then  

  echo "Build Success, but is a Unstable build"  

  Email "Build Success, but is a Unstable build"

  exit 1

#包含<span style="font-family: Arial, Helvetica, sans-serif;">Failed或者</span><span style="font-family: Arial, Helvetica, sans-serif;">Aborted单词为构建失败</span>  

elif grep -qE "Failed|Aborted" build.tmp2 ;then  

  echo "Build Fail"  

  echo "#Open Link: ${1}${newbuild}/console see details"  

  rm -rf build.tmp*  

  Email "Build Fail! $buildJob"

  exit 1  

fi  

#执行过程中产生的文件删除  

rm -rf build.tmp*  

#后面可以写相应的脚本进行获取war包部署到环境中 

}

#——————————————————————————jenkins构建函数结尾——————————————————————————————




#——————————————————————————开始执行构建任务—————————————————————————————————

for buildJob in ${arr[@]};

do

#job的URL路径

jobPage=${jenkins_path}/${buildJob}/

echo $jobPage

build $jobPage

done