Целый день гуглил, но решения не нашел. В Azure DevOps для каждого проекта создаются встроенные пользователи. Один из этих пользователей является пользователем агента сборки по умолчанию (обычно с именем <projectName> Build Service
).
Я уже автоматизировал создание репозиториев и конвейеров с помощью REST API Azure DevOps. Следующим шагом будет предоставление определенных прав пользователю встроенного агента сборки. Я уже изо всех сил пытаюсь найти встроенного пользователя в API.
Так как же предоставить права этому пользователю с помощью REST API?
Цель состоит в том, чтобы добавить пользователя встроенного агента сборки по умолчанию в роль участника, чтобы он мог отправлять теги в репозитории.
Вы можете получить его с помощью Пользователи — список API:
GET https://vssps.dev.azure.com/{organization}/_apis/graph/users?api-version=6.0-preview.1
В ответе я вижу:
Give rights to Azure DevOps build-in Users
Вы можете использовать REST API Пользователи — список API:, чтобы получить идентификатор вашей группы.
"subjectKind": "user",
"domain": "Build",
"principalName": "f0a50df8-5a11-41c3-8d7e-22180f923c80",
"mailAddress": "",
"origin": "vsts",
"originId": "64b9d209-XXXXX-bb46ade01dc",
"displayName": "MyTestProject Build Service (YourOrganizationName)",
originId
— это идентификатор в приведенном ниже URL-адресе REST API.
Затем мы используем Identities
API.
GET https://vssps.dev.azure.com/fabrikam/_apis/Identities/{id}?queryMembership=None
Затем получите дескриптор из ответа json .Descriptor.Identifier
:
{
"Id": "64b9d209-0deb-4d9c-9e8d-6bb46ade01dc",
"Descriptor": {
"IdentityType": "Microsoft.TeamFoundation.ServiceIdentity",
"Identifier": "0a2bf5f-XXXXd-1e9006e97c76:Build:f0a50df8-5a11-41c3-8d7e-22180f923c80"
},
Если у вас нет идентификатора группы, но есть отображаемое имя:
GET https://vssps.dev.azure.com/fabrikam/_apis/Identities?searchFactor=DisplayName&factorValue = {display name url encoded}&options=None&queryMembership=None
Затем получите дескриптор из ответа json [0].Descriptor.Identifier
.
Теперь у нас есть Identity
, мы можем использовать REST API Записи управления доступом — установка записей управления доступом, чтобы установить разрешение для этой группы:
POST https://dev.azure.com/{organization}/_apis/accesscontrolentries/{securityNamespaceId}?api-version=5.0
Тело запроса:
{
"token":"repoV2/{projectId}/{repoId}/",
"merge":true,
"accessControlEntries":[
{
"descriptor":"Microsoft.TeamFoundation.Identity;{groupIdentifier}",
"allow":2,
"deny":0,
"extendedInfo":{
"effectiveAllow":2,
"effectiveDeny":0,
"inheritedAllow":2,
"inheritedDeny":0
}
}
]
}
Обратите внимание, что идентификатор в URL-адресе жестко закодирован, потому что он является константой. Но вы также можете получить из ответа
GET https://dev.azure.com/{organization}/_apis/securitynamespaces
Кстати, в вашем запросе идентичности параметрами являются searchFilter и filterValue, а не фактор ... Не могли бы вы исправить это в своем ответе?
Спасибо. Моя проблема заключалась в том, что пользователь службы сборки проекта (org) и пользователь службы сборки коллекции проектов (org) не появлялись в API-интерфейсе пользователей, НО они отображались в API-интерфейсе удостоверений с вашим предложенным запросом. Оттуда было легко идти.