Azure DevOps Interview Questions
Reviewed by Mark Dickie · Last updated
12 questions on this page you can answer and see marked on the spot. Go to the first one
Azure DevOps is Microsoft's cloud platform for the full software development lifecycle, combining work tracking, source control, build and release pipelines, test management, and package hosting under one umbrella. For interviews, expect questions on pipeline authoring in YAML and classic mode, agent pools and self-hosted runners, service connections to external systems, branch policies, and role-based security across projects. You should also be able to explain how Azure Boards, Repos, Pipelines, Test Plans, and Artifacts connect to each other and to external toolchains like GitHub, Docker, and Kubernetes.
What services make up Azure DevOps?
| Service | What it does | Common interview focus |
|---|---|---|
| Azure Boards | Work item tracking, sprints, dashboards | Process templates, backlogs, board configurations |
| Azure Repos | Git repositories with pull-request workflows | Branch policies, PR triggers, cross-repo dependencies |
| Azure Pipelines | CI/CD build and release automation | YAML syntax, stages/jobs/steps, agents, service connections |
| Azure Test Plans | Manual, automated, and exploratory testing | Test suites, test runs, integration with pipelines |
| Azure Artifacts | Package feeds for NuGet, npm, Maven, Python | Feed permissions, upstream sources, versioning |
How do Azure Pipelines work?
Azure Pipelines run on agents provided by Microsoft (hosted agents) or on machines you configure yourself (self-hosted agents). A pipeline is defined as a series of stages, each containing one or more jobs, and each job runs steps on an agent. You define pipelines in YAML for version-controlled, repeatable configuration, or use the classic visual editor for simpler scenarios.
Key things to understand about pipeline execution:
- A trigger determines when a pipeline runs: branch triggers fire on push, path filters limit which changes cause a build, and scheduled triggers run on a cron expression.
- Variables can be defined at the pipeline, stage, job, or step level, with later scopes overriding earlier ones. Use variable groups to share secrets and configuration across pipelines.
- Service connections store authenticated credentials to external systems like Azure subscriptions, Kubernetes clusters, or Docker registries. They are referenced in pipeline tasks by an alias you choose.
- Agent pools group agents by capability. Hosted pools are maintained by Microsoft and rotate on each run; self-hosted pools let you cache dependencies and run on your own infrastructure.
- Approvals and checks gate deployment stages. A required reviewer, an exclusive lock on an environment, or a call to an Azure function must pass before the stage starts.
Key facts
- Tarmac has 101 Azure DevOps interview questions on this topic, 25 of them on this page, at difficulty 1–5 of 5.
- Tarmac tracked 562 job postings asking for Azure DevOps in September 2026.
- Roles asking for Azure DevOps advertise a median base salary of £67,500, across 136 job postings as of September 2026.
- Tarmac last reviewed these Azure DevOps interview questions on 20 October 2026.
At a glance
| Questions | 25 shown · 101 in the bank |
|---|---|
| Difficulty | 1–5 of 5 |
| Formats | Multiple choice, Ordering, Multiple answer, Short answer, Fill in the blank, Flashcard, True / false, Design exercise |
What you'll review
- agent pool configuration ado
- microsoft hosted vs self hosted agents
- deployment groups ado
- azure artifacts feeds
- package versioning in ado
- azure devops organization and projects
- azure repos vs github integration
Practice questions
Try one before you open the answer. Pick an option and press Check; it's marked on the spot.
In Azure DevOps, which type of agent pool is fully managed by Microsoft, with a fresh virtual machine provisioned and then discarded for each pipeline run?#
Options
Show answer
Microsoft-hosted agent pools are the fully managed option in Azure DevOps. Microsoft provisions a fresh virtual machine for each pipeline run and discards it afterward, requiring no infrastructure management. Self-hosted and scale set pools, by contrast, are set up and maintained by the user on their own infrastructure.
Microsoft-hosted agent pools are maintained entirely by Microsoft. Each job runs on a clean VM that is spun up for that run and torn down afterward, so no infrastructure management is required. Self-hosted and scale set pools are managed by the user; Azure Container Instances is not a built-in Azure DevOps pool type.
Before a machine can be registered as a self-hosted agent in an Azure DevOps agent pool, what software must be installed and configured on that machine?#
Options
Show answer
A self-hosted Azure DevOps agent requires the Azure Pipelines agent software, downloadable from the agent pool settings in Azure DevOps. After installation, the agent is configured with a personal access token so it can register with the pool and begin polling for jobs. Docker, the Azure CLI, and Visual Studio are not required prerequisites.
Self-hosted agents require the Azure Pipelines agent software, which is downloaded from the agent pool's settings in Azure DevOps. After installation, the agent is configured with a personal access token (PAT) or service connection so it can register with the pool and poll for jobs. Docker, the Azure CLI, and Visual Studio are not prerequisites for the agent itself.
You create a new agent pool at the organization level in Azure DevOps. What additional step must you take before a specific project can use that pool in its pipelines?#
Options
Show answer
An organization-level agent pool in Azure DevOps must be explicitly added to a project before that project's pipelines can use it. You do this from the project's Project Settings under Agent Pools. Project-scoped pools are available immediately within the project that created them, but organization-level pools require this per-project step.
An agent pool created at the organization level is not automatically visible to projects. An administrator must go into each project's Project Settings → Agent Pools and add the organization-level pool so that project's pipelines can target it. Project-scoped pools, by contrast, are immediately available within the project that created them.
When a pipeline job runs on a Microsoft-hosted agent, place these events in the order they occur.#
Put these in order
Show answer
The correct order is: a fresh VM is provisioned → source code is checked out → pipeline tasks execute → the VM is discarded. Microsoft-hosted agents spin up a clean virtual machine for each job, run the work, then destroy it so every build starts from a known-clean state with no leftover artifacts.
Microsoft-hosted agents provide a clean VM for every job. The VM is provisioned first, then the pipeline checks out the source repository onto it, then the defined tasks/steps run, and finally the VM is torn down so nothing persists to the next job.
Place these self-hosted agent setup steps in the correct sequence on a fresh machine.#
Put these in order
Show answer
The correct sequence is: download and extract the agent package → run the config script with the pool URL and a PAT → the agent appears online in the pool → optionally install it as a background service. Each step depends on the one before it; the config script both registers the agent and brings it online.
You first download and extract the agent binaries. Next you run the configuration script, which authenticates with a PAT and registers the agent against a pool so it shows as online in Azure DevOps. Finally, you may install it as a service so it keeps running unattended across reboots.
Which of the following statements about deployment groups in Azure DevOps are true? (Select all that apply.)#
Options
Pick every one that applies.
Show answer
The true statements are that each machine in a deployment group must have the Azure Pipelines agent installed and registered, tags on individual machines can be used to target specific subsets during deployment, and rolling deployment is a supported strategy. A deployment group is a distinct resource from a standard agent pool — it is purpose-built for deploying to sets of target machines, whereas agent pools primarily serve build and release job execution.
A deployment group is a logical set of deployment target machines. Each machine in the group must have the Azure Pipelines agent installed and registered to that group. Tags can be assigned to individual machines so that deployment jobs can target specific subsets, which is a core feature of deployment groups. Rolling deployment is one of the built-in strategies supported when deploying to a deployment group. The claim that a deployment group and a standard agent pool are identical resources that differ only in name is false: a deployment group is a distinct resource from a standard agent pool — deployment groups are specifically designed for deploying to sets of target machines and offer features like tagging and rolling deployments that standard agent pools do not.
In Azure DevOps, what is a deployment group and how is it used across pipeline types?#
Show answer
A deployment group is a logical collection of deployment target machines. You register an Azure Pipelines agent on each target machine, then deploy to all or a subset of those machines. In Classic Release pipelines you use a Deployment Group job; in YAML pipelines you can reference the same deployment group through a deployment job with a deploymentGroup strategy.
A deployment group is a logical grouping of deployment target machines, each running a registered Azure Pipelines agent. It was originally introduced for Classic Release pipelines via Deployment Group jobs, but it is not exclusive to them — YAML pipelines can also target a deployment group by using a deployment job with the deploymentGroup strategy. The key concept is the collection of target machines with registered agents that pipelines deploy to.
In a Classic Release pipeline targeting a deployment group, what specific job or phase type is added to execute tasks across the registered target machines?#
Show answer
You add a Deployment Group job (also referred to as a deployment group phase) to the release pipeline. This job type runs the defined tasks on each target machine that is a member of the deployment group.
Classic Release pipelines offer several phase types; the one that runs tasks on machines in a deployment group is the Deployment Group job. An Agent job runs on an agent pool, not a deployment group.
What must be installed and registered on each target machine before it can participate as a member of an Azure DevOps deployment group?#
Show answer
Each target machine must have the Azure Pipelines agent installed and registered with the deployment group, typically by running the registration script generated from the deployment group page in Azure DevOps.
Every machine in a deployment group runs a self-hosted Azure Pipelines agent that is registered to that group, so the release pipeline can dispatch tasks to it.
You are setting up a brand-new self-hosted Azure DevOps agent on a Linux VM and registering it with an existing agent pool. Arrange the following steps in the order they must be performed.#
Put these in order
Show answer
The correct order is: create a PAT, download the agent software, run the configuration script with the PAT and pool details, then start the agent as a service or interactive process. Each step depends on the previous one — the config script needs both the PAT (for authentication) and the downloaded binaries (to execute), and the agent can only start listening for jobs after it has been successfully configured and registered to a pool.
The self-hosted agent setup follows a strict dependency chain. You first need a PAT because the configuration step uses it to authenticate the agent to Azure DevOps. You then need the agent binaries on the machine before you can configure anything. The configuration script consumes both the PAT and the downloaded binaries to register the agent with the specified pool. Only after configuration succeeds can you run or install the agent as a service so it begins listening for pipeline jobs.
When you run a pipeline job on a Microsoft-hosted agent, Azure DevOps provisions a _____ virtual machine for that job. Once the job finishes, the VM is discarded, so any files written or software installed during the run are lost and unavailable to subsequent jobs.#
Show answer
When you run a pipeline job on a Microsoft-hosted agent, Azure DevOps provisions a fresh virtual machine for that job. Once the job finishes, the VM is discarded, so any files written or software installed during the run are lost and unavailable to subsequent jobs.
Microsoft-hosted agents spin up a fresh VM for every pipeline job and tear it down when the job ends. This guarantees a clean, consistent environment but means no state persists between runs — a key contrast with self-hosted agents, where the machine persists and can retain installed tools, caches, or cloned repos across jobs.
A team needs to deploy an application to database servers that sit behind a corporate firewall and are not reachable from the public internet. In this scenario they should use a _____ agent, because Microsoft-hosted agents run in Microsoft's cloud and cannot reach those internal servers without additional networking configuration.#
Show answer
A team needs to deploy an application to database servers that sit behind a corporate firewall and are not reachable from the public internet. In this scenario they should use a self-hosted agent, because Microsoft-hosted agents run in Microsoft's cloud and cannot reach those internal servers without additional networking configuration.
Self-hosted agents run on infrastructure you control — inside your corporate network, on-premises, or in a private cloud — so they can directly reach internal resources behind a firewall. Microsoft-hosted agents execute in Microsoft's data centers and only have public-internet access by default, making them unsuitable for deployments to isolated on-premises targets without extra networking such as VPNs or ExpressRoute.
With a Microsoft-hosted agent you never need to install or update the operating system or the Azure Pipelines agent software yourself, because Microsoft handles patching, updates, and maintenance. With a self-hosted agent, however, this upkeep is the _____ of your organization.#
Show answer
With a Microsoft-hosted agent you never need to install or update the operating system or the Azure Pipelines agent software yourself, because Microsoft handles patching, updates, and maintenance. With a self-hosted agent, however, this upkeep is the responsibility of your organization.
A central trade-off between the two agent types is maintenance overhead. Microsoft-hosted agents are fully managed by Microsoft — the OS image, installed tools, and agent binary are kept current for you. Self-hosted agents give you full control over the machine and its software, but you are responsible for OS patching, agent upgrades, and tool installation.
Which of the following statements about agent pool configuration in Azure DevOps are correct?#
Options
Pick every one that applies.
Show answer
A self-hosted agent belongs to exactly one pool, Microsoft-hosted agents run on ephemeral VMs discarded after each job, and pipeline permissions can restrict which YAML pipelines target a given pool. Self-hosted agents do not auto-reset their working directory between runs — that requires the clean checkout option.
The statements about a self-hosted agent being registered to only one pool, Microsoft-hosted agents being ephemeral, and pipeline permissions restricting which YAML pipelines can run on a pool are correct. A self-hosted agent is registered to exactly one pool — you cannot register the same agent to multiple pools. Microsoft-hosted agents are ephemeral: each job gets a fresh VM (or container) that is torn down after the job finishes. Pipeline permissions allow restricting which YAML pipelines can target a given pool. The claim that self-hosted agents automatically reset their working directory to a clean state after each pipeline job is false because self-hosted agents retain their _work directory between runs; any cleanup requires the clean checkout option or manual intervention, unlike Microsoft-hosted agents which are always fresh.
Your organization uses Azure Artifacts. Feed "CoreLibs" is configured as an upstream source for Feed "AppLibs", and the public NuGet.org gallery is also configured as an upstream source for "AppLibs" with a lower priority than "CoreLibs". Which of the following statements about this configuration are correct?#
Options
Pick every one that applies.
Show answer
For the same package name and version, Azure Artifacts always serves the local feed copy first — upstream sources are only consulted when the version is absent locally. When falling back to upstreams, they are searched in priority order and the first match is saved as a read-only copy. Upstream-saved versions cannot be directly overwritten by a local publish (the cached version must be deleted first), and upstream sources are read-only from the downstream side — publishing downstream never propagates upstream.
The first statement is correct: Azure Artifacts always checks the local feed first. If the requested package name and version exist locally, the local copy is served and no upstream source is consulted. The second statement is correct: when the version is absent locally, Azure Artifacts searches each configured upstream source in the order determined by its priority setting. The first upstream that contains a matching version serves the package, and a read-only copy is saved into the downstream feed so subsequent lookups are served locally. The claim that a package version saved from an upstream source into AppLibs can be directly overwritten by publishing a new package with the same name and version to AppLibs is incorrect: a version that has been saved from an upstream source is immutable in the downstream feed — you cannot publish over it with the same name and version. The cached upstream version must be deleted first before a local publish of that same version is permitted. The claim that upstream sources are write-through and publishing a new package version to AppLibs automatically propagates it to the CoreLibs feed is incorrect: upstream sources are strictly read-only from the downstream feed's perspective. Publishing a package to AppLibs does not and cannot propagate that package back into the CoreLibs upstream feed; the relationship is unidirectional.
In Azure DevOps, each pipeline run on a Microsoft-hosted agent provisions a clean VM from a pre-built image that is discarded after the run completes. What is the key operational implication for pipelines that rely on build caches, downloaded dependencies, or custom tooling not present on the hosted image?#
Show answer
No files, caches, or installed artifacts persist between runs on a Microsoft-hosted agent — every run starts from a known clean state. You must either re-download/rebuild everything each time, use the Azure DevOps Cache task or an external cache store (Azure Blob, Artifactory), install custom tooling in every run, or switch to a self-hosted agent where the local filesystem persists between runs.
This flashcard tests a core architectural distinction: hosted agents are ephemeral and stateless, so any state (caches, tooling, downloaded dependencies) must be recreated or fetched externally each run, whereas self-hosted agents retain local state across executions.
An Azure DevOps pipeline must deploy to an on-premises SQL Server reachable only over a private corporate network. Microsoft-hosted agents (running in Microsoft's cloud) cannot reach this endpoint. Which agent type resolves this, and what is the standard connectivity pattern?#
Show answer
A self-hosted agent resolves this. You install the agent on a machine or container that already has line-of-sight to the on-premises network (inside the corporate network or a peered/VPN-connected VNet). The agent polls Azure DevOps over outbound HTTPS (port 443) to fetch jobs and report results — no inbound firewall rules are required — then executes the deployment locally, where it can reach the private SQL Server.
This card tests the network-access advantage of self-hosted agents: because the agent runs inside or adjacent to the private network, it can reach resources that Microsoft-hosted agents (which run in Microsoft's public cloud) cannot. The agent's outbound-only polling model means no inbound firewall openings are needed.
In Azure DevOps, a deployment group is used to target multiple on-premises VMs for a rolling release pipeline. At the infrastructure level, how is a deployment group related to agent pools, and what actually runs on each target machine to receive and execute the deployment job? Explain the mechanism by which the Azure DevOps orchestrator dispatches work to machines in a deployment group and how that differs from a standard self-hosted agent pool.#
Show answer
Deployment groups in Azure DevOps are logically backed by a special-purpose deployment pool (distinct from standard agent/machine pools). Each deployment group is a deployment pool scoped to a single project, and the machines registered into it run the self-hosted Azure Pipelines agent in a mode where the agent polls Azure DevOps for deployment jobs rather than general build/release jobs. At the orchestration layer, Azure DevOps Service/Server pushes a job-targeting manifest to the deployment pool; the registered agents on each target machine pick up only the jobs tagged for their group + tags. The pipeline's 'Deployment group job' phase type resolves targets by querying the deployment group's membership and tag metadata, then dispatches the job definition (as a JSON-serialized DAG of tasks) to each matching agent's long-poll connection. Inside each target, the agent executes tasks sequentially under the configured service account, writes logs back over the same HTTPS channel, and reports success/failure so the orchestrator can apply the phase's 'all succeed' or 'rolling batch' success criteria before advancing.
A deployment group is internally a project-scoped deployment pool; the machines in it each run a self-hosted Azure Pipelines agent that polls for deployment jobs. The orchestrator matches pipeline phases to targets via group membership and tags, then dispatches task DAGs over the agents' HTTPS long-poll connections — structurally different from a standard agent pool, which serves build/release jobs to whichever agent acquires the job from the queue.
You need a single on-premises server to act as both a build agent (in a self-hosted agent pool) and a deployment target (in a deployment group). Can you register the same agent installation into both an agent pool and a deployment group? What are the operational and concurrency conflicts that arise, and what is the recommended approach?#
Show answer
It is not recommended to register the same physical machine's agent into both a standard self-hosted agent pool and a deployment group, though it is technically possible because the same agent binary supports both modes. The operational conflicts are: (1) Job contention — the agent has a single concurrent-job capacity by default; a build job and a deployment job can compete for the machine's CPU, disk, and ephemeral working directories (_work folder), causing timing-sensitive deployments to fail or produce inconsistent state. (2) Working-directory collisions — both job types use _work/1, _work/2, etc.; concurrent or interleaved jobs can clobber each other's artifacts. (3) Identity and permissions drift — the agent's personal access token (PAT) used for registration grants pool-level and deployment-group-level scopes; mixing roles broadens the blast radius if the token or machine is compromised. (4) Tag/targeting ambiguity — deployment-group tags and agent-pool demands are evaluated independently, so a machine could be selected for a deployment by its group tags while simultaneously being claimed by a build job via pool demands. The recommended pattern is to run separate agents (even separate _work directories or separate service accounts) for build/release pools versus deployment groups, ideally on separate VMs or at minimum as separate agent registrations with --agent names that make the role explicit.
The same agent binary can register into both a pool and a deployment group, but doing so creates job contention, working-directory collisions in _work, permission/scope drift from the shared PAT, and targeting ambiguity between pool demands and group tags. The recommended approach is to run separate agent registrations (or separate machines) for build versus deployment roles.
In Azure DevOps Services, a self-hosted agent registered to an agent pool does not consume a parallel job entitlement while idle. Parallel jobs are consumed only during active job execution, so an organization can register more self-hosted agents in a pool than its parallel job grant allows — the grant merely caps how many of those agents can run jobs concurrently.#
Options
Show answer
True. Azure DevOps parallel jobs limit concurrent job execution, not agent registration. Idle self-hosted agents consume no parallel job slot; the slot is claimed only when a job is dispatched to that agent and released on completion. You can register more agents than your parallel job grant allows — the grant just caps how many can run simultaneously.
Parallel jobs in Azure DevOps gate the number of pipeline jobs that can execute simultaneously across the organization, not the number of registered agents. A self-hosted agent sitting idle in a pool consumes no parallel job slot; the slot is claimed only when the dispatcher assigns a job to that agent and released when the job completes. Consequently, you may register 20 self-hosted agents in a pool while holding a parallel job grant of 5 — at most 5 of those 20 agents will ever run jobs at the same time, and the remaining 15 simply wait. This differs from Microsoft-hosted agents, where the parallel job grant also controls how many compute instances are provisioned.
In Azure DevOps Services, when an administrator disables a self-hosted agent through the agent pool settings UI while a pipeline job is actively running on that agent, the running job is immediately terminated and automatically re-queued to another enabled agent in the same pool.#
Options
Show answer
False. Disabling a self-hosted agent in Azure DevOps prevents new jobs from being dispatched to it but does not terminate or re-queue a job already running on it. The in-progress job runs to completion normally; only afterward does the agent stop accepting work. To stop a running job you must cancel the pipeline run itself, which is separate from disabling the agent.
Disabling an agent in Azure DevOps marks it as offline for future dispatch — the dispatcher will no longer assign new jobs to it — but it does not interrupt or terminate any job currently in progress on that agent. The running job continues to completion normally; only after it finishes does the agent stop accepting new work. The job is not re-queued, not killed, and not migrated to another agent. To forcibly stop a running job you must cancel the pipeline run itself, which is a separate operation from disabling the agent. This design exists so that disabling an agent for maintenance is non-destructive: you can drain the agent by letting its current job finish and then take it offline without risking data corruption from an abrupt termination mid-step.
In Azure DevOps Services, system capabilities of a self-hosted agent — such as Agent.OS, Agent.OSVersion, and Agent.Name — are automatically discovered and populated by the agent process at startup and cannot be manually overridden through the agent pool UI or the agent's .capabilities configuration. Only user-defined capabilities can be added or modified by an administrator.#
Options
Show answer
True. System capabilities in Azure DevOps — like Agent.OS, Agent.OSVersion, and Agent.Name — are auto-discovered by the agent process at startup from the host environment and are read-only in both the pool UI and the .capabilities config file; they are regenerated on each restart. Only user-defined capabilities can be added or modified by an administrator.
Azure DevOps distinguishes two categories of agent capabilities. System capabilities are discovered by the agent process itself at startup by inspecting the host environment — operating system, architecture, installed tooling paths, the agent's own name and version, etc. These are surfaced as read-only entries in the pool UI (they appear under a separate 'System capabilities' section) and are regenerated on every agent restart, so any manual edit would be overwritten. The .capabilities file and the UI's 'User capabilities' section accept only user-defined capability key-value pairs, and attempting to set a key that collides with a system capability name will not override the system value. Pipeline demands can reference both system and user capabilities, but only user-defined ones are administratively controlled. This separation ensures that environment-sensitive metadata the dispatcher relies on for correct job-to-agent matching always reflects the actual runtime state of the machine rather than an administrator's assumption.
You manage a monorepo that publishes 15 interdependent NuGet packages to a single Azure Artifacts feed. The feed also has an upstream source to nuget.org for third-party dependencies. The constraints are:#
Show answer
Version scheme and uniqueness: Each CI build produces a SemVer string of the form MAJOR.MINOR.PATCH-prerelease.{BuildId} — for example, 2.1.0-ci.4521 for an internal CI build or 2.1.0-rc.4521 for a release-candidate build. The differentiator is $(Build.BuildId), which is monotonically increasing across the entire project and never repeats, so every build yields a globally unique prerelease suffix. ADO Artifacts enforces version immutability at the feed level: once a version string exists in the feed, any attempt to publish that exact string again is rejected. Because the suffix is sourced from a never-repeating build ID, two builds can never generate the same string; and if the publish step retries after a transient failure, the immutability guard turns the retry into a no-op rather than a collision or an overwrite.
Promotion flow: CI publishes every successful build to the @local view. A separate release pipeline promotes the chosen version from @local to @prerelease (for RC validation) and then to @release (for GA). Promotion changes which view the version is visible in — it does not create a new version, re-publish the binary, or alter the version string. Downstream consumers restore from the feed using a view qualifier (e.g., configuring their NuGet restore to resolve from the @release view), so they only ever see versions that have passed the full promotion gate, not raw CI output.
Hotfix isolation: Each of the 15 packages carries its own independent SemVer — the monorepo does not share a single umbrella version. A hotfix branch modifies only the package(s) that need the fix, bumps only those packages' PATCH (or appropriate) component, and CI publishes only the changed packages. Unaffected packages keep their current version and are never re-published or re-promoted — so a hotfix to Contoso.Logging at 2.1.1 does not force Contoso.Auth off its stable 3.0.0.
Upstream collision prevention: Because Azure Artifacts uses local-first resolution — any locally published name@version permanently shadows an identically named-and-versioned upstream package for every consumer of the feed — every internal package is namespaced with an org prefix (e.g., Contoso.Logging, Contoso.Auth). Third-party packages from the nuget.org upstream never share that prefix, so the two namespaces can never collide on name@version, and the shadowing behavior can only ever apply to a name the team deliberately chose to publish locally.
This exercise targets staff-level depth because it requires synthesizing five independent ADO Artifacts mechanisms — SemVer build-suffix uniqueness, feed-level version immutability, view-based promotion without re-versioning, independent per-package versioning for hotfix isolation, and local-first upstream shadowing — into one coherent strategy. Each criterion isolates exactly one mechanism, and a candidate who conflates views with versions, shares a monorepo-wide version, or misses the local-first shadowing rule reveals a gap in their internal model of how Azure Artifacts resolves and promotes packages.
You are the DevOps platform lead for a large enterprise with 50+ development teams across 5 business units, all using Azure DevOps (Services) for Git source control, CI/CD pipelines, Boards work tracking, and Test Plans. The company operates under one Entra ID (Azure AD) tenant but has two distinct regulatory environments: a commercial division subject to SOC 2 and a government division subject to FedRAMP Moderate. Design the Azure DevOps organization and project structure. Your design must address: how many Azure DevOps organizations to create and the criteria for splitting them; how projects map to teams and products; the security group hierarchy and permission model; how shared cross-project resources (service connections, variable groups, pipeline templates, agent pools) are managed; and how governance and compliance policies are enforced uniformly across all projects.#
Show answer
Create two Azure DevOps organizations: one for the commercial division (SOC 2) and one for the government division (FedRAMP Moderate). The split is driven by the regulatory boundary — FedRAMP Moderate requires specific data-handling controls, separate audit trails, and potentially different Azure infrastructure (government cloud regions) that cannot be satisfied within a single organization's shared audit log and extension marketplace. Both organizations use the same Entra ID tenant for identity (the tenant itself supports conditional access policies scoped per org), but each org's data, service connections, agent pools, and audit logs remain isolated. This satisfies the data-isolation requirement without fragmenting identity.
Within each organization, map one Azure DevOps project per development team or product line, targeting 20-30 projects per org. This gives each team its own security boundary for repos, boards, pipelines, and test plans while keeping cross-project visibility for portfolio-level stakeholders who can run cross-project work-item queries and view roll-up dashboards within the org. The trade-off: one project per team provides clean permission isolation and keeps each team's boards uncluttered, but it requires governance automation to keep policies consistent across dozens of projects. The alternative — cramming all teams into a handful of shared projects — creates noisy boards, makes per-team permission management fragile (relying on area-path-level permissions which are error-prone), and complicates pipeline-trigger scoping. The other extreme — one project per microservice (hundreds of projects) — makes cross-project queries sluggish and multiplies admin overhead; the per-team/per-product line granularity is the right balance.
Security uses the built-in group hierarchy: Project Collection Administrators (PCA) at the org level manage org-wide settings, extensions, marketplace, org-level service connections, and org-level agent pools — limit PCA to a small set of platform engineers. Within each project, Project Administrators manage project-level settings and project-level service connections. Contributors get read/write on repos, boards, and pipelines; Readers get view-only. For fine-grained access, create custom Azure DevOps groups per project (e.g., 'Acme-Billing-Developers', 'Acme-Billing-QA') and nest Entra ID security groups inside them so identity lifecycle (joiners/movers/leavers) is managed by the identity team while Azure DevOps permissions are managed by project admins. Apply explicit 'deny' permissions on production service connections and production environment approvals so that even if a contributor is accidentally added to a broader group, they cannot trigger a production deployment.
Cross-project shared resources follow this model: (1) Service connections — create org-level service connections for shared infrastructure (the production Azure subscription, container registry, Key Vault) and authorize them per-project so each project admin explicitly approves which projects can use them; this prevents a new project from automatically inheriting access to production. Use project-level service connections only for team-specific resources. (2) Variable groups — store shared non-secret configuration in org-level variable groups; store secrets in Azure Key Vault-backed variable groups linked per project. (3) Pipeline templates — maintain a central 'platform' repository in a dedicated platform project containing reusable YAML templates (build, test, scan, deploy stages); reference them from each project's pipelines via the 'extends' keyword with the template repo path, ensuring every pipeline inherits mandatory security scans. (4) Agent pools — use org-level managed agent pools for general-purpose CI/CD and project-level self-hosted pools only when a team needs specialized network access (e.g., agents inside a VNet peered to a specific subscription).
Governance is enforced through five mechanisms: (1) Required branch policies on every main/release branch — minimum two reviewers, build validation, and no direct pushes — applied automatically by a provisioning script. (2) Mandatory pipeline templates that inject SAST, dependency-vulnerability scanning, and license compliance checks into every build; teams cannot bypass these because the template's stages are inherited via 'extends'. (3) Azure DevOps audit log streaming to Microsoft Sentinel (or equivalent SIEM) with alerting on sensitive actions (project deletion, permission changes, service-connection creation). (4) Automated compliance scanning via the Azure DevOps REST API (or tools like azure-devops-policy-as-code) that runs nightly, compares every project's branch policies and security group membership against a baseline, and files a work item for any drift. (5) A project provisioning pipeline that creates new projects from a template with standard groups, branch policies, pipeline scaffolding, and org-level service-connection authorizations pre-configured — no project is created by hand. The government division's org additionally enforces that all agent pools run within government-cloud-connected VNets and that all service connections target government-region Azure subscriptions only.
This is a staff-level design exercise because it requires reasoning about the interplay between Azure DevOps organizational topology, regulatory boundaries, project-level security isolation, cross-project resource governance, and automated compliance enforcement — the exact set of decisions a platform lead must make for a regulated multi-team enterprise. The rubric is weighted so that the organization-split decision (c1) and security model (c3) carry the most weight, since getting those wrong has the highest blast radius; the shared-resource strategy (c4) and governance (c5) are slightly lighter because they are downstream of the topology and security decisions.
Your company has 200+ repositories in Azure Repos with Azure Pipelines for CI/CD. The parent company standardizes on GitHub Enterprise Cloud and wants all repos consolidated there within 6 months. Your current setup includes: complex YAML pipelines with Azure DevOps service connections and approval gates, Azure Repos branch policies (required reviewers, build validation, merge-type enforcement), several teams already using GitHub Actions for ad-hoc workflows, and SOC 2 audit-trail requirements.#
Show answer
We adopt a phased migration with GitHub Enterprise as the eventual single source of truth, retaining Azure Pipelines as the CI/CD engine during the transition and allowing GitHub Actions only for net-new, non-deployment workflows.
Repository migration: We use git clone --mirror to push each repo to GitHub Enterprise, preserving all branches, tags, and full commit history. GitHub becomes the single source of truth for each repo at its individual cutover date — not on a single global flag-day. During the 6-month window, repos migrate in batches by team. Critical repos are dual-run via a push-mirror (Azure Repos to GitHub) until the team's cutover is verified; afterward, the Azure Repos copy is set to read-only as an archive.
CI/CD strategy: Rather than rewriting all pipelines immediately, we connect Azure Pipelines to the new GitHub repos via a GitHub service connection. This reuses existing YAML pipelines, agent pools, and approval gates with minimal changes (mainly the repository resource type). The key trade-off: Azure Pipelines retains Azure RBAC integration and deployment-group management that would require re-establishing self-hosted runners and Azure service principals if we moved to GitHub Actions. For deployment-heavy pipelines, we standardize on Azure Pipelines. Net-new CI-only workflows may use GitHub Actions, but any pipeline that deploys to Azure infrastructure goes through Azure Pipelines.
Branch protection mapping: Azure Repos required reviewers map to GitHub required pull request reviews (matching review count). Build validation maps to required status checks (Azure Pipelines publishes commit status back to GitHub via the service connection). Merge-type enforcement maps to linear-history or squash-merge-only settings in branch protection. Required code reviewers map to a CODEOWNERS file with required review.
Authentication & security: We register an Azure DevOps GitHub App as the primary authentication mechanism rather than a PAT — this provides per-repo granularity, doesn't tie access to individual credentials, and is auditable. Azure DevOps service connections to Azure remain unchanged; the GitHub-to-Azure DevOps direction uses the GitHub App for webhook triggers and repo access. For SOC 2, we enable GitHub audit-log streaming to our SIEM alongside existing Azure DevOps audit logs, ensuring continuous coverage across the transition.
Migration sequencing & rollback: Phase 1: pilot with 1–2 low-risk teams — mirror to GitHub, validate pipelines and branch-protection parity. Phase 2: batch migration by business unit (5–10 repos per batch), each dual-running for 2 weeks before Azure Repos is set to read-only. Phase 3: decommission Azure Repos after all teams cut over and a 30-day read-only period. Rollback: during the dual-run window, if GitHub integration fails, we revert the pipeline source back to Azure Repos (which retains full write capability until decommission). The push-mirror ensures no commits are lost.
This is a staff-level design exercise because it requires synthesizing knowledge across five interlocking domains — repository migration mechanics, CI/CD platform trade-offs, branch-policy-to-branch-protection mapping, cross-platform authentication models, and phased migration with rollback — all under regulatory constraints. A correct answer demonstrates that the candidate understands both the Azure DevOps and GitHub sides of the integration and can reason about the concrete technical mechanisms (service connections, GitHub App auth, commit status reporting, push-mirroring) rather than restating generic migration platitudes.
Related interview questions
Job market
See azure-devops salaries and hiring demand from live job postings.
The other 76 questions
This page shows 25 and marks what you pick. That's as far as a page can go. A free account opens the other 76 and keeps every answer. What you miss comes back until it's right: after a day, then at longer gaps.
Free · the whole bank · 100 marked answers per 30 days · written feedback on the paid plan