一、前言
为了实现 从模板job中创建对应的过程job 使用createitem进行复制job
通过判断job状态码达到验证是否已存在对应工程job
因为使用createitem复制的job会存在没有构建按钮的情况,通过disable enable保存配置
验证是否需要传入某些参数构建,多参数构建等 进行获取上次编译情况进行判断
二、文档
https://www.jenkins.io/doc/book/using/remote-access-api/#RemoteaccessAPI-Whatcanyoudowithit
https://ci.jenkins.io/job/Plugins/job/maven-plugin/job/PR-107/api/
https://www.jianshu.com/p/ae7e003dfb2c
https://blog.csdn.net/qq_34832393/article/details/88210942
https://blog.csdn.net/qq_34832393/article/details/88229804
三、注意点
1、通过createItem创建的job会归于all视图下,可在视图中使用正则去匹配归于到某个视图下
2、创建对应账号与密码
3、为什么使用 disable enable 因为自动创建复制的job 没有保存配置 不会存在构建 这个时候去触发会404
4、不能删除job的构建记录,不然获取到的参数会不准确
5、注意jenkins的权限控制问题
四、成果
#!/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)
# 获取参数化构建有没有开启diffbuild
diffbuild=$(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}')
fi
if [ "$BUILD" == "true" ];then
# 如果构建日志中返回构建结果'Finished: SUCCESS' 就执行增量构建
if echo ${last_message} |grep 'Finished: SUCCESS' &> /dev/null ;then
curl "${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" ];then
curl "${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" ];then
curl "${JENKINS_URL}/job/${CPPS}/buildWithParameters?ARCH=${ARCH}&diffbuild=true&BRANCH=${CPPS}" --user ${user}:${passwd} --data verbosity=high
else
# 如果上面3个判断都没有执行,说明有job在构建
echo "有任务构建中,等待"
fi
else
# 判断目录不存在,直接全量
curl "${JENKINS_URL}/job/${CPPS}/buildWithParameters?ARCH=${ARCH}&BRANCH=${CPPS}" --user ${user}:${passwd} --data verbosity=high
fi
sleep 10
let num=$last_build+1
while true
do
last_message=$(curl -s -u ${user}:${passwd} ${JENKINS_URL}/job/${CPPS}/${num}/consoleText|tail -n 1)
if echo ${last_message} |grep 'Finished: SUCCESS' &> /dev/null ;then
break
elif echo ${last_message} |grep 'Finished: FAILURE' &> /dev/null || echo ${last_message} |grep 'Finished: ABORTED' &> /dev/null ;then
echo "C++构建失败,请查看c++构建任务 ${JENKINS_URL}/job/${CPPS}/${num}/consoleText"
exit 1;
else
sleep 30
fi
done