我正在尝试获取我的 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 访问权限并授予其完全访问权限。存储库中有内容,因此存储库不为空。
上面用于“存储库的 Azure DevOps REST API 端点”的 API 大小”和“用于存储库权限的 Azure DevOps REST API 端点” 似乎不起作用。
根据 Repositories - List 和 Security Namespaces:您使用的两个 API
_apis/git/repositories/{repo_id}/itemsizes
和 _apis/securitynamespaces/{repo_id}/permissions
不存在。所以你不能这样使用它。
以下是一个Python脚本,它使用API(Repositories - List和Permissions 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)
测试结果:
顺便说一句,正如您在结果中看到的,如果短时间内发生大量下载,可能会触发速率和使用限制。