批量删除 GitLab CI 流水线
首先安装 glab
工具,并且登录和授权。
安装 glab
,并授权
#!/usr/bin/env bash
set -euo pipefail
ORG_NAME=${1:?ORG_NAME is required}
REPO_NAME=${2:?REPO_NAME is required}
project_path="$ORG_NAME/$REPO_NAME"
encoded_path=$(echo -n "$project_path" | jq -sRr @uri)
url="projects/$encoded_path/pipelines"
total_deleted=0
#GITLAB_HOST=""
delete_pipeline() {
local id=$1
local result=""
echo "Deleting pipeline ID: $id"
if glab api --method DELETE "$url/$id" --silent; then
result="✅ Deleted pipeline '$id'"
total_deleted=$((total_deleted + 1))
else
result="❌ Failed to delete pipeline '$id'"
echo "$result"
echo "An error occurred while deleting pipeline ID '$id'. Press Enter to exit."
echo "Total pipelines deleted: $total_deleted"
read -n 1 -s -r -p ""
exit 1
fi
printf "%s\n" "$result"
}
while true; do
# 获取流水线列表(默认每页20条)
response=$(glab api "$url" --paginate 2>/dev/null || echo "[]")
total_pipelines=$(echo "$response" | jq '. | length')
if [[ $total_pipelines -eq 0 ]]; then
echo "No more pipelines to delete. Press Enter to exit."
echo "Total pipelines deleted: $total_deleted"
read -n 1 -s -r -p ""
break
fi
# 使用 process substitution 避免子 shell
while read -r id; do
id="${id//$'\r'/}" # 去掉回车符
delete_pipeline "$id"
done < <(echo "$response" | jq -r '.[].id')
# 可选:等待几秒再继续循环,避免频繁调用 API
# sleep 2
done