Table of Contents
If you’ve been in the Azure space for any length of time, you’ve probably built pipelines in Azure DevOps. It’s been the default choice for Microsoft-centric organisations for years, and for good reason. But over the last couple of years, I’ve noticed more and more teams starting to ask the question: should we be moving to GitHub?
It’s not a simple yes or no. Both platforms are owned by Microsoft, both are being actively developed, and both have a legitimate place depending on what you’re trying to do. In this post I’m going to give you my honest, practitioner take on where each platform excels, where the gaps are, and why a hybrid approach might actually be the most pragmatic answer for a lot of teams.
Why Teams Are Reconsidering GitHub
The conversation has shifted noticeably in the last couple of years, and there are a few clear reasons why.
Microsoft’s strategic investment in developer tooling increasingly appears in GitHub first, particularly around AI-assisted development, code collaboration, and platform integrations. Azure DevOps continues to receive updates and support, but GitHub is clearly Microsoft’s primary innovation platform.
The bigger driver right now is AI. GitHub Copilot has become a serious part of how development teams work, and the integrations keep getting deeper.
At the IDE level, Copilot works against whatever repo you’ve cloned locally — ADO or GitHub. But the more powerful features are platform-level, and this is where the GitHub advantage becomes significant.
The Copilot coding agent lets you assign a GitHub Issue directly to Copilot, just like you’d assign it to a developer. Copilot plans the work, opens a pull request, writes the code, runs any tests configured in the repo, and requests a review from you when it’s done. You can also add Copilot as a reviewer on any pull request, and it will review the code and suggest fixes you can apply in a couple of clicks.
None of this works with Azure Repos. The Copilot coding agent requires repositories hosted on GitHub, full stop. If your code lives in Azure Repos, you’re locked out of this workflow entirely.
Azure Boards can be connected to GitHub repositories, allowing work items to participate in GitHub-based workflows and enabling some Copilot-driven development experiences. The key requirement remains that the source repository is hosted in GitHub.
This is a meaningful shift. It’s not just that GitHub is getting new features — it’s that the most compelling AI-driven development workflows are being built around GitHub repositories specifically. If you want these workflows, you need your code in GitHub.
The GitHub Marketplace and the broader ecosystem also play a role. The range of pre-built actions available, the community around them, and the familiarity developers have with GitHub as a platform all create a gravitational pull, particularly if you’re hiring engineers who’ve spent most of their careers outside the Microsoft ecosystem.
What GitHub Is Still Missing: Boards
If GitHub is pulling teams away from Azure DevOps, the thing most likely to give them pause is Boards.
Azure Boards is genuinely good. Backlogs, sprint planning, work item tracking, customisable process templates, dashboards, and deep integration with your pipelines and repositories. It’s a mature product that’s been iterated on for years, and for teams doing structured agile delivery, it’s hard to match.
GitHub has Projects, which has improved considerably, but it’s not at the same level of maturity as Azure Boards for enterprise delivery teams. If your organisation has invested in Azure Boards and built processes around it, moving away is not a trivial decision.
This is where the hybrid model starts to make sense.
The Hybrid Approach: Best of Both Worlds
You don’t have to pick one and abandon the other. Azure DevOps and GitHub integrate natively, and Microsoft actively supports this model.
The setup I’ve seen work well is: keep Azure Boards for work item tracking and sprint management, host your repositories in GitHub, and connect them. Azure DevOps has a native GitHub integration that links commits, pull requests, and branches directly to work items in Boards. You get the full traceability you’d expect, without having to migrate your planning and delivery processes.
For pipelines, you have a genuine choice. Azure Pipelines can run against GitHub-hosted repositories, so you can keep your existing pipeline investment if that’s where your standards and templates live. Alternatively, you can move to GitHub Actions. I’ll cover the differences below, but the point is the decision doesn’t have to be all-or-nothing.
Governance and Enterprise Controls
One area that often gets overlooked is governance. Azure DevOps and GitHub both provide enterprise controls, but they approach them differently. Azure DevOps tends to centralise governance through service connections, variable groups, templates, and project-level administration. GitHub leans more heavily on repository standards, environments, branch protections, reusable workflows, rulesets, and organisation policies. Neither model is inherently better, but platform teams should evaluate how governance scales across hundreds of repositories before making a strategic decision.
Pipelines: Azure DevOps vs GitHub Actions
Both platforms use YAML. Both support triggers, jobs, steps, environments, and approval gates. If you’re familiar with one, you’ll find the other readable within a few minutes. But there are meaningful differences once you get into how you structure and share pipeline logic.
Templates vs Reusable Workflows
In Azure DevOps, templates are the mechanism for sharing pipeline logic across repos. You can extract common steps, jobs, or entire stages into a template YAML file and reference it from multiple pipelines. This is powerful, and it’s how platform teams in ADO typically enforce standards.
Azure DevOps also has extends templates, which flip the model around. Instead of a pipeline optionally including a template, the pipeline is required to extend from a central template. The central template defines the structure, and the calling pipeline fills in what it’s permitted to fill in. Steps and stages defined in the template cannot be overridden by the caller. This is a genuine governance pattern for platform teams: if you adopt it, you control what runs in every pipeline that extends your template.
GitHub Actions handles reuse differently. Reusable workflows let you call an entire workflow from another workflow using the uses keyword. Composite actions let you bundle multiple steps into a single action and reference them the same way you’d reference any marketplace action. The model is more consistent: uses means “call this thing” whether it’s a marketplace action, a composite action in your own repo, or a reusable workflow.
My honest take is that GitHub’s model is more intuitive day-to-day. The uses syntax is consistent, and the separation between reusable workflows and composite actions is clearer than the various template types in ADO. For platform teams that need to enforce standards centrally, ADO’s extends pattern gives you tighter control. For teams where developer experience and ease of adoption matter more, GitHub’s approach is cleaner.
Runners
Both platforms support Microsoft-hosted (GitHub-hosted) runners and self-hosted runners. The experience is broadly similar. One difference worth noting: Azure DevOps has Managed DevOps Pools, which is Microsoft’s managed runner infrastructure for ADO with native VNet injection. There is no direct equivalent for GitHub Actions. If you need self-hosted runners connected to your Azure network in GitHub Actions, you’re managing that yourself, whether through VMs, ARC on AKS, or Azure Container Apps Jobs.
Federated Identity: Where ADO Has a Clear Advantage
Setting up OIDC-based authentication to Azure is something I’d recommend on both platforms. Long-lived secrets in pipelines are a risk you don’t need to take. But the experience of getting there is noticeably different.
In Azure DevOps, you create a service connection, select Workload Identity Federation, and point it at an app registration in Entra ID. The service connection handles the federated credential configuration for you. Once it’s done, your pipelines reference the service connection by name. It’s straightforward, and the Entra integration is native to the ADO service connection experience.
In GitHub Actions, you configure the federated identity credential manually on the app registration in Entra ID. You set the issuer to the GitHub OIDC provider, define the subject claim to match your specific repo and workflow context, and then configure your workflow to request an OIDC token and exchange it for an Azure access token. It works well once it’s set up, and I’ve written about this pattern in detail in the [OIDC to Azure post in this series]. But there are more steps, more opportunity for misconfiguration, and less guidance built into the tooling itself.
For teams new to federated identity, ADO’s service connection approach is the easier entry point. For teams already comfortable with OIDC, GitHub’s approach is perfectly manageable.
My Take
Neither platform is objectively better. The right answer depends on what you’re optimising for.
If your organisation is deeply invested in Azure DevOps and the thought of a migration is painful, you don’t need to migrate. You can connect GitHub repositories to Azure Boards, adopt GitHub Actions gradually where it makes sense, and still benefit from the GitHub ecosystem without ripping everything out.
If you’re building a new platform from scratch and developer experience matters, GitHub is where I’d start. The Copilot integrations are deeper, the ecosystem is broader, and the tooling is evolving faster.
If you need the full Copilot-driven workflow, including having Copilot action work items and raise pull requests on your behalf, you need GitHub repositories. That’s a meaningful constraint on any hybrid approach that keeps code in Azure Repos.
The hybrid model — Azure Boards for planning, GitHub for code and pipelines — is a legitimate, supported configuration and one I’d recommend looking at if you’re sitting on the fence. It’s not a compromise. It’s using each platform for what it’s actually best at.
Further Reading
- Azure DevOps Terraform Pipeline: Complete Guide
- Improving Terraform Pipelines in Azure DevOps
- Entra Workload Identities Explained