使用jenkins api完成构建

一、前言

为了实现 从模板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/api/

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值