我正在嘗試撰寫一個腳本來合并已打開且符合合并請求標準(通過設定實作)的合并請求。
所以我唯一想做的就是,我想撰寫一個 CI yaml 檔案,我將安排它每 30 分鐘左右運行一次,以檢查打開的合并請求并合并它們(如果它們可以合并)。
困惑一:
我可以通過撰寫多個 curl 請求來實作這一點,但是我不確定在它們執行后如何一個接一個地使用它們。
因此,要檢查打開的合并請求,我需要一個組專案的 ID,以便我有一個 curl 命令,該命令將為我提供專案 ID,并將它們保存在一個檔案中projectid.txt。
curl -s --location --request GET --header 'PRIVATE-TOKEN:<PRIVATE_TOKEN>' '$CI_API_V4_URL/groups/'$GROUPID'/projects' | sed 's/,/\n/g' | grep -w "id" | awk -F ':' '{print $2}' | sed -s 's/{"id"//g'
現在,一旦我擁有了所有的專案 ID,我想將它們流入另一個 curl 命令,即:
curl -s --location --request GET '$CI_API_V4_URL/projects/3/merge_requests?state=opened' --header 'PRIVATE-TOKEN:<PRIVATE_TOKEN>' | sed 's/,/\n/g' | grep -w "iid" | awk -F ':' '{print $2}'
但是如果你看到上面的 curl 請求,我會3手動給出以獲得所需的輸出。
但我希望這個 curl 命令自動獲取每行中存在的每個 projectidprojectid.txt并將其執行到第二個 curl 命令..這樣我想要一個檔案,它將明智地顯示打開的合并請求專案。
獲得所有這些資訊后,我想合并有效且準備合并的開放合并請求(GitLab 負責檢查它們是否準備好合并)
所以,我現在唯一需要的是,在另一個 curl 命令中輸入projectid& merge request id,這是一個 PUT 請求。
curl --location --request PUT '$CI_API_V4_URL/projects/3/merge_requests/26/merge' \
--header 'PRIVATE-TOKEN: <PRIVATE_TOKEN>'
來源:https : //docs.gitlab.com/ee/api/merge_requests.html#accept-mr
如果你看到上面的合并請求,我需要提供專案明智的合并請求..我對它如何自動化有點困惑。
另外,你能告訴我這是否是在我的gitlab-ci.yml檔案中使用這些許多 curl 請求來自動執行此操作的正確方法嗎?有沒有其他方法可以通過Python或shell腳本來做到這一點?
另外,有沒有什么簡單的方法可以在 REST API 檔案的幫助下撰寫 python 腳本?我能夠生成 curl 請求來使用 REST API,但不確定如何使用 Python 來實作。
任何幫助或建議都是最受歡迎的。
到目前為止,我的 gitlab-ci.yml 檔案看起來像這樣,因為在這一點之后我無法想太多:
variables:
GROUPID: 6
stages:
- cleanup
cleanup-code-job:
stage: cleanup
tags:
- build
script:
- echo "$GROUPID"
##Below curl command can be used to identify projects in group
- curl -s --location --request GET --header 'PRIVATE-TOKEN:<PRIVATE_TOKEN>' '$CI_API_V4_URL/groups/'$GROUPID'/projects' | sed 's/,/\n/g' | grep -w "id" | awk -F ':' '{print $2}' | sed -s 's/{"id"//g' > projects.txt
- cat projects.txt
謝謝
uj5u.com熱心網友回復:
使用python-gitlab庫,python 腳本使這個任務的腳本變得更加簡單,尤其是在分頁方面。
此外,您可以使用Group merge requests API作為快捷方式,而不是列出組中的所有專案,然后列出每個專案中的所有合并請求。
使用 Python 腳本,它可能如下所示:
import gitlab
from gitlab.v4.objects import GroupMergeRequest
TOKEN = "your API key"
GITLAB_HOST = 'https://gitlab.com' # or your instance
gl = gitlab.Gitlab(GITLAB_HOST, private_token=TOKEN)
GROUP_ID = 123
def mr_meets_merge_criteria(mr: GroupMergeRequest) -> bool:
"""
A function to check if it meets criteria to
be merged automatically by this script
"""
print(mr.project_id)
print(mr.merge_status) # e.g. 'can_be_merged'
# check something
...
return True | False
group = gl.groups.get(GROUP_ID)
# loop over all merge requests in the group
for mr in group.mergerequests.list(as_list=False):
if mr_meets_merge_criteria(mr):
project = gl.projects.get(mr.project_id, lazy=True)
project_mr = project.mergerequests.get(mr.iid)
project_mr.merge()
因此,如果您輸入正確的常量并完成mr_meets_merge_criteria函式的實作,那就應該是所有需要的:-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/351869.html
