【问题标题】:How to get GitLab project name by using Project id in GitLab API如何使用 GitLab API 中的项目 ID 获取 GitLab 项目名称
【发布时间】:2023-02-02 04:49:14
【问题描述】:

我有一个脚本,它打印项目 ID 和其他属性,如允许推送、允许合并我需要用项目 ID 替换项目名称。这怎么可能?

PROJECT=$(cat /var/opt/gitlab/.project)
TOKEN=$(cat /var/opt/gitlab/.token)
URL=$(cat /etc/gitlab/gitlab.rb | grep external_url | grep -vE 'pages|registry' | grep -v ^# | cut -f 2 -d "'")
projectId=( $(curl -sS --header "PRIVATE-TOKEN: $TOKEN" "$URL/api/v4/projects?&per_page=100&sort=asc&page=[1-50]"| jq -r .[].id) )
for i in "${projectId[@]}"
do
branch1=( $( curl -sS --header "PRIVATE-TOKEN: $TOKEN" "$URL/api/v4/projects/$i/protected_branches" | jq -r ".[]" | jq -r ".name") )
        branch1=( $( curl -sS --header "PRIVATE-TOKEN: $TOKEN" "$URL/api/v4/projects/$i/protected_branches" | jq ".path_with_namespace") )
        for  branch in "${branch1[@]}"
        do
        Allowed_to_push=( $(curl -sS --header "PRIVATE-TOKEN: $TOKEN" "$URL/api/v4/projects/$i/protected_branches/"$branch""| jq -r .push_access_levels |grep -o '"access_level_description": *"[^"]*"' | grep -o '"[^"]*"$') )
        Allowed_to_Merge=( $(curl -sS --header "PRIVATE-TOKEN: $TOKEN" "$URL/api/v4/projects/$i/protected_branches/"$branch""| jq -r .merge_access_levels |grep -o '"access_level_description": *"[^"]*"' | grep -o '"[^"]*"$') )
        Allow_to_force_push=( $(curl -sS --header "PRIVATE-TOKEN: $TOKEN" "$URL/api/v4/projects/$i/protected_branches/"$branch""| jq -r .allow_force_push) )
echo  -e "$branch,\t\t\t\t$i,\t\t\t\t$Allowed_to_push,\t\t\t\t$Allowed_to_Merge,\t\t\t\t$Allow_to_force_push" >> input.json
        done
echo -e "Branch,\t\t\t\tprojectname,\t\t\t\tAllowed_to_push,\t\t\t\tAllowed_to_Merge,\t\t\t\tAllow_to_force_push" | cat - input.json > output.csv

【问题讨论】:

    标签: api gitlab


    【解决方案1】:

    使用python-gitlab wrapper 更容易。

    python3 -m pip install python-gitlab

    #!/usr/bin/env python3
    
    import gitlab
    
    gl = gitlab.Gitlab('https://gitlab.com', private_token='your API token')
    
    # Replace with your project path
    PROJECT_NAME = 'mynamespace/myproject'
    
    project = gl.projects.get(PROJECT_NAME)
    
    print('PROJECT:', project.path_with_namespace)
    print('PROJECT ID:', project.id)
    
    protected_branches = project.protectedbranches.list(all=True)
    
    print('PROTECTED BRANCHES:')
    for branch in protected_branches:
        print(f'{branch.name}:')
        print('  allowed to merge:')
        for grant in branch.merge_access_levels:
            print('   ', grant['access_level_description'] or grant['user_id'] or grant['group_id'])
        print('  allowed to push:')
        for grant in branch.push_access_levels:
            print('   ', grant['access_level_description'] or grant['user_id'] or grant['group_id'])
        print('  force push allowed?')
        print('   ', branch.allow_force_push) 
    

    输出将显示如下内容:

    PROJECT: mynamespace/myproject
    PROJECT ID: 1234
    PROTECTED BRANCHES:
    master:
      allowed to merge:
        Maintainers
      allowed to push:
        No one
      force push allowed?
        False
    

    如果你真的不想使用 python-gitlab API,你需要的相关 API 是:

    1. projects API
    2. protected branches API

    【讨论】:

    • 我们不使用 python gitlab。您能帮忙修复 API 脚本吗?
    【解决方案2】:

    您已经有了项目 ID 列表,并且正在对它们施展魔法。您可以轻松地将以下内容添加到您的 for 循环中以获取项目名称。另请注意,您还可以获得 name_with_namespace API 参考,这可能也很有用。您可以随时查看 GitLab documentation,看看您可以从 API 中获得什么。

    projectId=( $(curl -sS --header "PRIVATE-TOKEN: $TOKEN" "$URL/api/v4/projects?&per_page=100&sort=asc&page=[1-50]"| jq -r .[].id) )
    for i in "${projectId[@]}"
    do
      projectName=$(curl -sS --header "PRIVATE-TOKEN: $TOKEN" "$URL/api/v4/projects/${i} | jq '.name')
      echo $projectName
    

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 2021-08-24
      • 2018-05-19
      • 2022-11-27
      • 2018-06-25
      • 2017-09-15
      • 2021-01-23
      • 2020-08-09
      • 2022-01-05
      相关资源
      最近更新 更多