当前位置: 代码迷 >> 综合 >> 使用jenkins api完成构建
  详细解决方案

使用jenkins api完成构建

热度:60   发布时间:2024-02-24 04:55:21.0
#!/bin/bash
CPPS=${new_lib_dir} #c++项目名称通过jenkins参数化构建传入
user=    # jenkins账号
passwd=    # jenkins密码
JENKINS_URL=   # jenkins地址
# 判断是否存在此job
jenkins_cpp_status=$(curl -s -u ${user}:${passwd} ${JENKINS_URL}/job/${CPPS}/api/json -o /dev/null  -w %{http_code})
if [[ $jenkins_cpp_status == 404 ]];then# 自动创建CPP任务curl -X POST "${JENKINS_URL}/createItem?name=${CPPS}&mode=copy&from=job_Template" --user ${user}:${passwd}# 因createItem复制出来的job,默认没有保存配置,此时的job是没有构建按钮的,通过禁用job,启用job方式来保存配置curl -X POST "${JENKINS_URL}/job/${CPPS}/disable" --user ${user}:${passwd}curl -X POST "${JENKINS_URL}/job/${CPPS}/enable" --user ${user}:${passwd}
fi# 如果目录不存在就执行全量构建,存在就执行增量构建
BUILD=true
# 避免前一条命令执行后返回码非0,使用"||"改变变量的值进行判断
ssh root@1.1.1.1 [ -d /jenkins/workspace/${CPPS}/job_${ARCH} ] || BUILD=false# 获取当前构建的number号
last_build=$(curl -s -u ${user}:${passwd} ${JENKINS_URL}/job/${CPPS}/api/json | jq .lastCompletedBuild.number)
if [[ $last_build != 'null' ]];then# 获取构建日志最后一行last_message=$(curl -s -u ${user}:${passwd} ${JENKINS_URL}/job/${CPPS}/${last_build}/consoleText | tail -n 1)# 获取参数化构建有没有开启diffbuilddiffbuild=$(curl -s -u ${user}:${passwd} ${JENKINS_URL}/job/${CPPS}/${last_build}/api/json  | jq .actions | grep -A 1 diffbuild | grep -E 'false|true' | awk '{print $2}')
fiif [ "$BUILD" == "true" ];then# 如果构建日志中返回构建结果'Finished: SUCCESS' 就执行增量构建if echo ${last_message} |grep 'Finished: SUCCESS' &> /dev/null ;thencurl "${JENKINS_URL}/job/${CPPS}/buildWithParameters?ARCH=${ARCH}&diffbuild=true&BRANCH=${CPPS}"  --user ${user}:${passwd} --data verbosity=high# 如果上一次构建中,已经构建完成的job(不成功) diffbuild的值是false就执行全量构建elif [ "echo ${last_message} |grep 'Finished' &> /dev/null" ] && [ "${diffbuild}" == "false" ];thencurl "${JENKINS_URL}/job/${CPPS}/buildWithParameters?ARCH=${ARCH}&BRANCH=${CPPS}"  --user ${user}:${passwd} --data verbosity=high# 如果上一次构建中,已经构建完成的job(不成功) diffbuild的值是true就执行增量构建elif [ "echo ${last_message} |grep 'Finished' &> /dev/null" ] && [ "${diffbuild}" == "true" ];thencurl "${JENKINS_URL}/job/${CPPS}/buildWithParameters?ARCH=${ARCH}&diffbuild=true&BRANCH=${CPPS}"  --user ${user}:${passwd} --data verbosity=highelse# 如果上面3个判断都没有执行,说明有job在构建echo "有任务构建中,等待"fi
else# 判断目录不存在,直接全量curl "${JENKINS_URL}/job/${CPPS}/buildWithParameters?ARCH=${ARCH}&BRANCH=${CPPS}"  --user ${user}:${passwd} --data verbosity=high
fisleep 10
let num=$last_build+1
while true
dolast_message=$(curl -s -u ${user}:${passwd} ${JENKINS_URL}/job/${CPPS}/${num}/consoleText|tail -n 1)if echo ${last_message} |grep 'Finished: SUCCESS' &> /dev/null ;thenbreakelif echo ${last_message} |grep 'Finished: FAILURE' &> /dev/null || echo ${last_message} |grep 'Finished: ABORTED' &> /dev/null ;thenecho "C++构建失败,请查看c++构建任务 ${JENKINS_URL}/job/${CPPS}/${num}/consoleText"exit 1;elsesleep 30fi
done