Type something to search...
Browse documentation

Azure DevOps

Everything needed to connect ProPR to Azure DevOps, hosted or self-hosted: which authentication mode each host variant accepts, what to enter, where to get it, how to register the webhook, and what to fix when verification fails. The fields themselves are described once in common provider connection fields.

Azure DevOps authentication depends on the host variant:

  • Azure DevOps Services on https://dev.azure.com or *.visualstudio.com uses oauthClientCredentials.
  • Self-hosted Azure DevOps Server uses personalAccessToken or windowsUserAccount.
  • appInstallation is not accepted for Azure DevOps.

Either way the organization or collection goes into a provider scope, never into hostBaseUrl.

Azure DevOps Services

ProPR fieldExpected valueWhere to get it
hostBaseUrlhttps://dev.azure.comFixed value for Azure DevOps Services
authenticationKindoauthClientCredentialsThe only mode hosted Azure DevOps accepts
oAuthTenantIdMicrosoft Entra tenant ID (directory ID)Azure Portal -> Microsoft Entra ID -> Overview -> Tenant ID, or App registrations -> your app -> Overview -> Directory (tenant) ID
oAuthClientIdApplication (client) IDAzure Portal -> App registrations -> your app -> Overview -> Application (client) ID
secretClient secret valueAzure Portal -> App registrations -> your app -> Certificates & secrets -> Client secrets -> Value
displayNameFriendly labelAny descriptive value

Use the secret value, not the secret ID, and the tenant ID, not a subscription ID or the service principal object ID. The service principal must be usable against the target organization and project.

Azure DevOps Server

Do not use https://dev.azure.com for a self-hosted server; that host is only for Azure DevOps Services. Both self-hosted modes require an HTTPS hostBaseUrl - HTTP is rejected when you save.

Prepare the endpoint before creating the connection:

  1. Expose Azure DevOps Server over HTTPS, and make sure the certificate’s subject alternative names cover the exact host name or IP address ProPR will call.

  2. From the machine or container ProPR runs in - not your browser - run curl https://<ado-server-host>/. Expect the normal Azure DevOps page or a 401 challenge, not a timeout and not a certificate error.

  3. If the certificate is self-signed or issued by a private CA, install it or its issuing CA into that runtime’s trust store. ProPR does not manage certificate trust. On Debian- or Ubuntu-based runtimes:

    sudo cp <your-cert>.crt /usr/local/share/ca-certificates/
    sudo update-ca-certificates

    Then re-run curl without -k or any other insecure override.

  4. If the TCP connection itself times out, fix the firewall or routing before touching credentials.

  5. Give the account ProPR authenticates as at least Basic access level, plus permission to read the target collection, its repositories, and its pull requests.

Personal access token

Use personalAccessToken when PATs are enabled on the server.

ProPR fieldExpected valueWhere to get it
hostBaseUrlYour Azure DevOps Server base URLExample: https://ado-server.example.com/tfs
authenticationKindpersonalAccessTokenSelect PAT mode for the self-hosted host
secretAzure DevOps Server PATCreate it from the Azure DevOps Server user settings area
userName, oAuthTenantId, oAuthClientIdleave emptyNot used in this mode

Windows user account

Use windowsUserAccount when the server accepts explicit Windows credentials.

ProPR fieldExpected valueWhere to get it
hostBaseUrlYour Azure DevOps Server base URLExample: https://ado-server.example.com/tfs
authenticationKindwindowsUserAccountSelect Windows user-account mode for the self-hosted host
userNameWindows login recognized by the serverExample: CONTOSO\ado-user
secretPassword for that Windows accountEnter the account password directly
oAuthTenantId, oAuthClientIdleave emptyNot used in this mode

Notes for this mode:

  • Prefer the domain-qualified login shape DOMAIN\user so the runtime can split domain from account name for NTLM or Negotiate authentication.
  • userName is stored separately from the password and is returned in API responses so edit screens can show it. The password stays protected secret material and is never returned.
  • ProPR authenticates with the stored credentials only. Host-integrated Windows authentication - the identity of the ProPR process itself - is not used.
  • ProPR enables managed NTLM on Linux and WSL runtimes by default.

Scope examples

ProPR fieldAzure DevOps ServicesAzure DevOps Server
scopeTypeorganizationorganization
externalScopeIdmy-orgDefaultCollection
scopePathhttps://dev.azure.com/my-orghttps://ado-server.example.com/tfs/DefaultCollection
displayNameMy OrgDefault Collection

The scope must point at the real organization or collection URL and use the same host as the connection. A scope left pointing at an old host or an old collection is a common cause of verification failures.

Global Azure fallback

If a client has no Azure DevOps provider connection of its own, hosted Azure DevOps operations can fall back to the global Azure credential of the backend process. Self-hosted Azure DevOps Server never falls back: without stored credentials it fails with an explicit error telling you to re-save the connection or re-add the scope.

That credential is configured on the backend process itself rather than per client; for the variables that supply it, see a process-wide Azure credential.

Webhook registration

Create the configuration in ProPR first; see create the webhook configuration. In the repository filters, prefer the canonical repository entry discovery offers - it stores the repository GUID and avoids the name-versus-id mismatch described below.

Register the listener under Project settings → Service hooks → new subscription → Web Hooks. The secret travels as Basic authentication: any user name, and the generated secret as the password.

Event mapping:

ProPR eventAzure DevOps event
PR CreatedPull request created
PR UpdatedPull request updated
PR CommentedPull request commented on

ProPR classifies the Azure DevOps comment hook, so PR Commented takes effect here.

Repository and project identifiers

Azure DevOps payloads carry resource.repository.id, usually a repository GUID. Some Azure DevOps APIs require a project name rather than a project GUID when a repository is referenced by name. The mismatch surfaces as:

A project name is required in order to reference a Git repository by name

Either fix works:

  • Configure the repository filter using the canonical repository reference (the GUID) the frontend’s discovery offers. Recommended.
  • Or make sure the configuration stores the project name, not a GUID, when the repository is referenced by name.

Testing the listener

The Azure DevOps invocation of the synthetic-event helpers:

# sends created, updated and commented for PR 24
bash scripts/send-ado-webhook.sh \
  -u "https://propr.example.com/webhooks/v1/providers/ado/<pathKey>" \
  -s "<generated-secret>" -r "<repository-guid-or-name>" -i 24

Troubleshooting

A 400 when saving the connection is usually one of the Azure DevOps field rules in HTTP 400 when saving a connection.

Which Azure ID is the tenant ID?

Use the Microsoft Entra tenant or directory ID - not the subscription ID, not the service principal object ID, and not the secret ID.

Azure DevOps Server verification or reviewer resolution fails

Error or symptomWhat to fix
Basic authentication requires a secure connection to the server.The connection host and the provider scope must both use https://. If the connection was first created against an HTTP or different host, re-save it and re-point the scope at the current HTTPS host.
SSL, trust, or certificate-validation errorThe certificate’s subject alternative names must cover the host or IP ProPR calls, and the issuing CA must be trusted inside the ProPR runtime. Re-test with curl https://<ado-server-host>/ without -k.
Timeout on connectA firewall or routing problem, not a credential problem.
Authentication rejected in PAT modePATs may be disabled on that server instance; use windowsUserAccount instead.
PAT works but windowsUserAccount does notSave userName in the server-accepted format, preferably DOMAIN\user, then restart ProPR and retry. If the runtime still behaves as unauthenticated, install the Linux NTLM support package and restart: sudo apt update && sudo apt install -y gss-ntlmssp.

For anything not listed here - reviewer identity, deliveries, reviews - start at troubleshooting.