阿牛 发表于 2018-9-4 09:10:11

通过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 发件人邮箱 -t 收件人邮箱 -s 发送服务器 -u "Build INFO" -o message-content-type=html -o message- -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 \(\#*" build.tmp |grep -oE *)
  #接下来要构建的数
  newbuild=$
  #触发构建
  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
  #包含Failed或者Aborted单词为构建失败
  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

页: [1]
查看完整版本: 通过Shell+atd定时任务,实现jenkins指定时间自动发布任务