前言:
通过前一个项目触发后面一个项目的CI/CD的方式,在下游的时候并不会触发设置好的取消多余冗余管道的参数,因此在下游就会因为前面一个或者多个项目的项目触发,生成许多条多余的过期管道,很容易在构建部署的时候造成干扰,最后影响下游项目的部署。因此可以调用gitlab的管道API进行对多余的管道进行取消。
gitlab 管道的API调用:
列出项目触发器
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/pipelines""
取消项目触发器
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/pipelines/46/cancel"
注意: PRIVATE-TOKEN是个人的访问token,需要妥善保管,不能轻易存放。
脚本思路:
先将查询到的所有管道信息放到一个文件当中然后进行数据清洗,得到想要的数据信息再存放到另外一个文件当中,再使用另外一个脚本对清洗后的数据文件进行管道id的提取,执行调用api取消管道的命令。
查询管道信息并进行数据清洗的脚本
#!/bin/bash
row=1
piplinestate='status'
piplineneed1='running'
piplineneed2='"pending"'
FILE=result.txt
key='xxxxxxxxxxx'
get_file=get_piplines.txt
clean_file=status_piplines.txt
gitlab_url=gitlab.example.com
##调用api管道,获取galaxy项目的所有管道信息
curl --header "PRIVATE-TOKEN: $key" "https://$gitlab_url/api/v4/projects/1/pipelines" > $get_file
#项目号可以在CI/CD的设置trigger里面看到
#进行数据清洗,将得到的数据的文件输出到另外一个新文件中
sed "s/},/}\n/g" $get_file > $clean_file
#判断当前目录最后的输出文件是否存在,如果存在就进行删除
if [ -e $FILE ]
then
rm -f $FILE
fi
#逐行读取日志,检查是否"status":"pending" or "running"?
#如果有,输出到结果文件中
##通过api调用的所有管道信息,通过数据清洗,获取想要的信息进行筛选
cat $clean_file | while read line
do
if echo $line|grep $piplinestate
then
if echo $line|grep $piplineneed1
then
echo $line >> $FILE
elif echo $line|grep $piplineneed2
then
echo $line >> $FILE
else
echo $row" : "$line
fi
fi
row=`expr $row + 1`
done
#将最新的管道id删除掉,不然会把自身的管道取消掉
sed -i '1d' $FILE
#/bin/bash ./run.sh
#如果有问题可以把下面的脚本再拆分出来,放到run.sh执行。
#逐行读取信息,将管道id提取出来执行调用api取消管道
#cat result.txt | awk -F "id" '{print $2}' | awk -F"," '{print $1}' | awk -F ":" '{print $2}'
for id in $(cat $FILE | awk -F "id" '{print $2}' | awk -F"," '{print $1}' | awk -F ":" '{print $2}')
do
curl --header "PRIVATE-TOKEN: $key" "https://$gitlab_url/api/v4/projects/1/pipelines/$id/cancel"
echo "id:$id has been cancelled successfully"
#echo $id
done
对清洗完的数据进行管道id提取(已经整合到上面的脚本了)
评论区