首页 > 代码库 > 通过Shell+atd定时任务,实现jenkins指定时间自动发布任务
通过Shell+atd定时任务,实现jenkins指定时间自动发布任务
我们公司是通过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 xiaoshan@haohushi.me -t xiaoshan@haohushi.me -t 13521482403@139.com -s smtp.haohushi.me -u "Build INFO" -o message-content-type=html -o message-charset=utf8 -xu xiaoshan@haohushi.me -xp quhu.hill.4 -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 admin:quhuhaohushi -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
本文出自 “业余修心” 博客,请务必保留此出处http://helpxiaoshan.blog.51cto.com/3526503/1851145
通过Shell+atd定时任务,实现jenkins指定时间自动发布任务