Chapter 18Lesson 01~125 minutes

GitHub, GitLab, Azure DevOps, and Bitbucket Integration: Core Concepts and Mental Model

Model DevOps-platform integration as a trust path among provider identity, scoped credentials, SonarQube binding, CI analysis, asynchronous gate processing, and provider decoration.

GitHubGitLabAzure DevOpsBitbucketLeast privilege

Learning objectives

  • Separate provider identity, SonarQube binding, analysis authentication, CI metadata, Quality Gate state, and provider decoration into independently verifiable states.
  • Explain why GitHub, GitLab, Azure DevOps, and Bitbucket do not use one interchangeable credential model.
  • Identify the least-privilege provider credential used for repository import/decoration and distinguish it from a SonarQube analysis token.
  • Explain the difference between provider webhooks/callbacks, outbound provider API calls, and SonarQube project webhooks.
  • State the Developer-edition boundary for native pull/merge-request decoration while preserving a Community Build/local/free learning path.
  • Inspect provider organization/repository identity, permission scope, binding, callback/base URLs, secret storage, revision/PR metadata, gate/check state, and revocation history before making changes.

1. The practical problem: integration is a trust graph, not a token field

Chapter 17 established that a pull-request result is meaningful only when the checkout SHA, target branch, merge base, edition, analysis task, and Quality Gate are known. Chapter 18 adds a second trust boundary: how SonarQube is allowed to read provider metadata and report results back to the provider.

A common anti-pattern is to create one powerful personal token, paste it into a CI YAML file, and use it for repository access, analysis, decoration, and administration. That makes failures hard to diagnose and creates a credential with far more authority than any one action requires. A governed integration instead assigns each credential to a specific owner, direction, scope, storage location, lifetime, and revocation path.

provider org/repo + dedicated app/service identity + scoped credential → SonarQube DevOps-platform configuration/binding → CI checkout + SonarQube analysis token → report upload → ceTaskId / Compute Engine → Quality Gate → provider API/status/decoration → audit + revocation

2. Mental model: three trust paths cross the same workflow

Provider/SonarQube trust paths
flowchart TD
  R[Provider repository / PR] -->|checkout metadata| C[CI runner]
  C -->|SONAR_TOKEN| S[Scanner]
  S -->|analysis report| Q[SonarQube Server]
  Q -->|Compute Engine| G[Quality Gate]
  P[Provider app / technical account] -->|scoped provider credential| Q
  Q -->|provider API| D[Check / MR comment / PR status]
  W[Optional provider event / callback] -. not scanner auth .-> Q
  G --> D

The scanner credential and provider credential are different. The SonarQube analysis token authorizes report submission to SonarQube. The GitHub App, GitLab token, Azure PAT, or Bitbucket OAuth/API credential authorizes SonarQube to interact with the provider. A webhook or callback carries an event or browser redirect; it is not a substitute for either authentication path.

3. Edition and capability boundary

Rechecked 2026-09-08. Community Build remains the mandatory executable path for this chapter. Native analysis of feature/maintenance branches and pull/merge requests, plus pull-request Quality Gate decoration, starts in Developer Edition. Enterprise/Data Center add multiple DevOps-platform configurations/instances, monorepo and enterprise-governance capabilities. The local lab therefore simulates decoration honestly instead of claiming Community Build produced a native provider check.

Community Build can still run scanners inside GitHub Actions, GitLab CI/CD, Azure Pipelines, Bitbucket Pipelines, Jenkins, or other runners. That is CI execution. It is not the same as licensed branch/PR analysis or native provider decoration.

4. State map: capture ownership before credentials

Provider identity

Provider type, organization/workspace/project, repository ID/slug, PR/MR key, target branch, and exact commit SHA.

SonarQube binding

DevOps-platform configuration name, bound repository, project key, server base URL, edition, and whether the project was imported or manually bound.

Provider credential

GitHub App installation; GitLab dedicated user/group token; Azure technical-account PAT; Bitbucket OAuth Client/API token. Record scope, owner, expiry, storage, and revocation location.

Analysis credential

Project-analysis token or CI-bound Sonar credential. Do not reuse provider credentials as SONAR_TOKEN.

Processing/result

Scanner version, report upload, ceTaskId, Compute Engine status, analysis ID, Quality Gate status, and provider check/comment/status ID.

Governance

Who approved scopes, credential rotation date, callback/webhook exposure, failed-delivery evidence, and cleanup/revocation proof.

5. Four provider models: similar goal, different credentials

Provider Current SonarQube integration identity Least-privilege facts to record Important caveat
GitHub Dedicated GitHub App installed only where needed Checks read/write; Pull Requests read/write; Metadata read; Contents read for private repositories; optional Code scanning alerts permission only if that feature is used. GitHub App webhooks are normally disabled for ordinary import/PR decoration unless the optional security-alert flow needs them.
GitLab Dedicated technical user PAT or Group Access Token For global integration/decoration: at least Reporter role and api scope on analyzed repositories. Repository-import token can use the documented narrower read_api path. Do not give Owner/Admin simply because the token is stored globally.
Azure DevOps Dedicated technical account PAT + SonarQube Azure DevOps extension/service endpoint Global decoration PAT requires Code read/write on analyzed repositories; import/onboarding has a separate repository-listing PAT flow. Record PAT expiry. Azure integration has distinct global and project/import PAT uses; collapsing them hides permission failures.
Bitbucket Cloud OAuth Client for global PR reporting + API token for repository import Current Bitbucket UI: client credentials and Pull requests Read for the OAuth Client; import API token uses read:repository:bitbucket. Some Sonar docs still say “OAuth consumer/key/secret.” Sonar staff confirmed in Aug 2026 that current Bitbucket terminology is OAuth Client / Client ID / Secret. App passwords are deprecated.

6. GitHub: prefer an app identity over a personal token

A GitHub App gives the integration its own identity and installation boundary. For SonarQube repository import and pull-request reporting, current Sonar guidance requires repository permissions that include Checks: read/write and Pull Requests: read/write; private repositories also require Contents: read. Metadata is read-only. Additional Administration, organization membership, email, or code-scanning-alert permissions belong only to specific optional provisioning/auth/security-alert features.

This is materially safer than a human personal token because the App can be installed on selected organizations/repositories, its permissions are explicit, and its private key/client secret can be rotated independently of a developer account.

7. GitLab: technical account or group token, scoped to the repositories

For SonarQube’s global GitLab configuration, Sonar currently documents either a personal access token from a dedicated account with at least Reporter permission or a Group Access Token, with api scope so SonarQube can import/report Quality Gate status to merge requests. For repository onboarding, the user-side import flow can use a read_api token. Preserve which token is performing which action; “GitLab token” is not enough evidence.

8. Azure DevOps: technical PAT and extension are separate pieces

Azure DevOps integration has both a SonarQube global configuration and the Azure DevOps Extension/service endpoint used in pipelines. Current Sonar guidance recommends a dedicated technical account. The PAT used for pull-request Quality Gate reporting needs Code read/write on the analyzed repositories. Azure PATs have expiry/lifecycle behavior, so expiration is part of the operating evidence—not an incidental field.

9. Bitbucket: do not freeze automation to deprecated credential names

Bitbucket Cloud is changing its authentication UI. Current Sonar documentation still contains “OAuth consumer” language in places, but Sonar staff confirmed in August 2026 that current Bitbucket Cloud uses an OAuth Client: use Client credentials, Pull requests Read permission, and map Sonar’s older OAuth Key/Secret labels to Client ID/Secret where the product UI has not caught up. Repository import uses a separate API token with read:repository:bitbucket; App passwords are deprecated.

Compatibility control. Record both the SonarQube patch level and Bitbucket credential model. If an older supported LTA fails OAuth because of provider-side field changes, upgrade to a current patched release rather than weakening authentication.

10. Webhook, callback, outbound API, and CI authentication are different arrows

Mechanism Direction/purpose Not a substitute for
Provider webhook/event Provider → service event notification, only when the integration feature needs it. Scanner authentication or provider API write permission.
OAuth callback Browser/provider → SonarQube during an auth flow. PR decoration credential.
Provider API call SonarQube → GitHub/GitLab/Azure/Bitbucket to read repository metadata or publish result. SONAR_TOKEN.
SonarQube project webhook SonarQube → arbitrary configured endpoint after analysis. Native DevOps-platform binding/PR decoration.
Scanner analysis request CI/scanner → SonarQube using analysis token. Provider App/PAT/OAuth credential.

11. Read-only/non-destructive inspection first

git rev-parse HEAD
git remote -v
git branch --show-current
sonar-scanner --version
curl -fsS "$SONAR_HOST_URL/api/system/status"

# After analysis, preserve the task identity rather than assuming a provider check exists:
cat .scannerwork/report-task.txt
CE_TASK_ID="$(sed -n 's/^ceTaskId=//p' .scannerwork/report-task.txt)"
curl -fsS -H "Authorization: Bearer $SONAR_TOKEN" \
  "$SONAR_HOST_URL/api/ce/task?id=$CE_TASK_ID"

In the provider UI, inspect app/token owner, repository installation/access, exact scopes, expiry, callback/base URL, and any current check/status/comment. Do not reveal secret values in screenshots or evidence files.

Knowledge check

Can a GitHub token used to decorate PRs also be reused as SONAR_TOKEN?

Does configuring a webhook make SonarQube able to write a Quality Gate status back to the provider?

Why is a GitHub App preferred to a personal administrator token?

What recent Bitbucket change must a 2026 runbook record?

Scanner upload and Compute Engine are successful but no provider check exists. Which layer should be inspected next?

Next lesson

Execute the local least-privilege provider workflow

Lesson 2 turns the four-provider model into a real Community Build analysis plus a safe provider-decoration simulation.

Official references and version notes

Version and compatibility note

Rechecked 2026-09-08. Mandatory examples target Community Build 26.9.0.129388 and SonarScanner CLI 8.1.0.6389; current commercial reference points are SonarQube Server 2026 Release 4.1 and 2026.1.5 LTA. Native feature/maintenance branch and pull/merge-request analysis plus provider decoration start in Developer Edition. GitHub integration uses a GitHub App with explicit repository permissions; GitLab global integration uses a dedicated Reporter-capable personal/group token with api scope; Azure DevOps uses a dedicated technical PAT and Azure DevOps Extension/service endpoint; Bitbucket Cloud is currently transitioning terminology/credentials, with API tokens replacing App passwords for import and current provider UI using OAuth Clients even where some Sonar documentation still says OAuth Consumer. Multiple configurations/instances and several monorepo/enterprise integration capabilities begin in Enterprise. Recheck provider UI, token deprecations, patch notes, callback/base URL requirements, and exact permissions before production rollout.

Task identity. After report upload, preserve .scannerwork/report-task.txt and its ceTaskId; the scanner process, Compute Engine task, Quality Gate, CI job, and provider decoration remain separate states.

Keep the academy open

Support free, practical DevOps education.

Every lesson is designed to remain readable in a browser, downloadable from GitHub, and usable without a paid learning platform. Contributions help expand and maintain the curriculum.

Ethereum / ERC-20
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0Send only Ethereum/ERC-20 compatible assets to this address.