簡體   English   中英

為 GitLab 編寫腳本以自動合並 Merge Request

[英]Write script for GitLab for automatic merge of Merge Request

我正在嘗試編寫一個腳本來合並已打開且符合合並請求標准(通過設置實現)的合並請求。

所以我唯一想做的就是,我想編寫一個 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 命令自動獲取 projectid.txt 每一行中存在的每個projectid.txt並將其執行到第二個 curl 命令..這樣我想要一個文件,它將明智地顯示打開的合並請求項目。

獲得所有這些信息后,我想合並有效且准備合並的開放合並請求(GitLab 負責檢查它們是否准備好合並)

所以,我現在唯一需要的是,在另一個 curl 命令(PUT 請求)中輸入projectidmerge request id

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

謝謝

使用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函數的實現,那就應該是所有需要的 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM