Azure DevOps REST API 端点用于存储库大小和存储库权限

问题描述 投票:0回答:1

我正在尝试获取我的 azure devops 项目中的存储库列表,并列出每个存储库的大小以及有权访问的人员的访问权限列表。我正在使用 python 作为脚本。这是下面的代码:

import requests
from requests.auth import HTTPBasicA`your text`uth

# Azure DevOps organization URL
organization_url = "https://dev.azure.com/your_organization"

# Personal Access Token (PAT) with appropriate permissions
personal_access_token = "your_personal_access_token"

# Project name
project_name = "your_project_name"

# Azure DevOps REST API endpoint for repositories
repo_api_url = f"{organization_url}/{project_name}/_apis/git/repositories?api-version=7.1"

# Headers for API request
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Basic {personal_access_token}"
}

# Make the API request to get the list of repositories
response = requests.get(repo_api_url, headers=headers)

# Check if the request was successful (status code 200)
if response.status_code == 200:
    # Parse the JSON response
    repositories = response.json()["value"]

    # Iterate through repositories
    for repo in repositories:
        repo_name = repo["name"]
        repo_id = repo["id"]

        # Azure DevOps REST API endpoint for repository size
        size_api_url = f"{organization_url}/{project_name}/_apis/git/repositories/{repo_id}/itemsizes?api-version=7.1"

        # Make the API request to get the repository size
        size_response = requests.get(size_api_url, headers=headers)

        # Check if the request was successful
        if size_response.status_code == 200:
            repo_size = size_response.json()["repositorySize"]
            print(f"Repository: {repo_name}, Size: {repo_size} bytes")

            # Azure DevOps REST API endpoint for repository permissions
            access_api_url = f"{organization_url}/{project_name}/_apis/securitynamespaces/{repo_id}/permissions?api-version=7.1"

            # Make the API request to get repository permissions
            access_response = requests.get(access_api_url, headers=headers)

            # Check if the request was successful
            if access_response.status_code == 200:
                permissions = access_response.json()["value"]
                print("Access:")
                for permission in permissions:
                    user_name = permission.get("principalName", "Unknown User")
                    permission_name = permission.get("permission", "Unknown Permission")
                    print(f"  User: {user_name}, Permission: {permission_name}")
            else:
                print(f"Failed to retrieve access for repository {repo_name}. Status code: {access_response.status_code}")
                print(access_response.text)
        else:
            print(f"Failed to retrieve size for repository {repo_name}. Status code: {size_response.status_code}")
            print(size_response.text)
else:
    # Print an error message if the request was not successful
    print(f"Failed to retrieve repositories. Status code: {response.status_code}")
    print(response.text)

上面用于“用于存储库大小的 Azure DevOps REST API 端点”和“用于存储库权限的 Azure DevOps REST API 端点”的 API 似乎不起作用,我收到 SizeResponse 的 404 错误。有没有其他方法可以获取这些数据或者 API 是否正确?我的 PAT 在 ADO 中具有完全访问权限。我能够获取我的项目的回购列表。只有 Size API 不起作用。如有任何帮助,我们将不胜感激。

我仔细检查了 PAT 访问权限并授予其完全访问权限。存储库中有内容,因此存储库不为空。

python azure-devops automation repository azure-devops-rest-api
1个回答
0
投票

上面用于“存储库的 Azure DevOps REST API 端点”的 API 大小”和“用于存储库权限的 Azure DevOps REST API 端点” 似乎不起作用。

根据 Repositories - ListSecurity Namespaces:您使用的两个 API

_apis/git/repositories/{repo_id}/itemsizes
_apis/securitynamespaces/{repo_id}/permissions
不存在。所以你不能这样使用它。

以下是一个Python脚本,它使用API(Repositories - ListPermissions Report - Create)来完成您的需求。它将把权限报告下载到 python 脚本的位置。

import requests 
import base64
import json

# Personal Access Token (PAT) with appropriate permissions
personal_access_token = "XXXXXXXXX"
authorization = str(base64.b64encode(bytes(':'+personal_access_token, 'ascii')), 'ascii')

# Azure DevOps organization URL
organization_url = "https://dev.azure.com/your_organization"

# Project name
project_name = "your_project_name"

# Azure DevOps REST API endpoint for repositories
repo_api_url = f"{organization_url}/{project_name}/_apis/git/repositories?api-version=7.2-preview.1"

# Headers for API request
headers = {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
    'Authorization': 'Basic '+authorization
}

# Make the API request to get the list of repositories
list_repo_response = requests.get(repo_api_url, headers=headers)

# Check if the request was successful (status code 200)
if list_repo_response.status_code == 200:
    # Parse the JSON response
    repositories = list_repo_response.json()["value"]

    # Iterate through repositories
    for repo in repositories:
        repo_name = repo["name"]
        repo_id = repo["id"]
        repo_size = repo["size"]
        print(f"Repository: {repo_name}, Id: {repo_id} Size: {repo_size} bytes")
        # Azure DevOps REST API endpoint for Permissions Report - Create
        permission_report_url = f"{organization_url}/_apis/permissionsreport?api-version=7.1-preview.1"

        body = json.dumps({
          "descriptors": [],
          "reportName": f"Permission report for repository {repo_name}",
          "resources": [
            {
              "resourceId": f"{repo_id}",
              "resourceType": "repo"
            }
          ]
        })

        # Make the API request  Permissions Report - Create
        permission_report_create_response = requests.request("POST", permission_report_url, headers=headers, data=body)

        # Check if the request was successful
        if permission_report_create_response.status_code == 202:
            PermissionReportDownloadLink=permission_report_create_response.json()["_downloadLink"] 
            DownloadLink=PermissionReportDownloadLink["href"]
           # print(DownloadLink)
           
           # dowmload the Permissions Report
            permission_report_download_response = requests.get(DownloadLink, headers=headers)
            downloaded_file = f"permission report for repository {repo_name}.json"
            # Ensure the request was successful
            if permission_report_download_response.status_code == 200:
                with open(f'{downloaded_file}', 'wb') as file:
                    # Write the contents of the response to the file
                    file.write(permission_report_download_response.content)
                print(f"permission report for repository {repo_name}.json is downloaded")
            else:
                print(f"Failed to download Permissions Report for repository {repo_name}. Status code: {permission_report_download_response.status_code}")
                print(permission_report_download_response.text)
        else:
            print(f"Failed to Permissions Report - Create  for repository {repo_name}. Status code: {permission_report_create_response.status_code}")
            print(permission_report_create_response.text)
else:
    # Print an error message if the request was not successful
    print(f"Failed to retrieve repositories. Status code: {list_repo_response.status_code}")
    print(list_repo_response.text)

测试结果:

顺便说一句,正如您在结果中看到的,如果短时间内发生大量下载,可能会触发速率和使用限制

© www.soinside.com 2019 - 2024. All rights reserved.