Destination: Secure SDLC
)
Set off confidently, land safely.
September 21, 2026
Everyone wants to have a secure software development lifecycle, but unless it's tied to a larger initiative, it's often an abstract goal on next year's roadmap. And taking that larger, highly prioritized initiative, such as a migration from Azure DevOps to GitHub, and adding in an entire new security-focused program sounds like just the kind of competing priorities which take a journey off-course and introduce risk.
But if your goal is to migrate/modernize and improve your security posture in a significant way, let's take you on such a journey...
But if your goal is to migrate/modernize and improve your security posture in a significant way, let's take you on such a journey...
Where are we going?
Let's be specific about the destination. A Secure SDLC on GitHub is an estate where access is standardized, provisioning is automated, policy is enforced at the org level, secrets are caught before they land, pipelines authenticate without stored credentials, and every artifact can be traced to the workflow and commit that built it.
That is where your migration or modernization should land. Not on GitHub with the old access model and the old secrets recreated. Everything that follows is how.
What will you encounter along the way?
A migration or modernization at any real scale comes down to one motion repeated hundreds to thousands of times: pipelines moved, in waves, onto a small number of shared workflows a platform team owns. Whether they are arriving from Jenkins or from a .github/workflows directory that grew by copy and paste, every one of them passes through the same terrain. These are the things you will have to plan for and solve. Each has a GitHub-native solution, and each is far cheaper to deal with while the "my pipeline is changing" window is already open than after it has been validated and signed off.
- Who can do what. The first thing a migration surfaces is the access model you actually have, as opposed to the one on the wiki: permissions granted by tenure, by who created the repository, by a script someone ran in 2019. You will have to decide what replaces it: access as a property of a role and a team, organization and enterprise roles, team-based repository access, a small set of custom roles where the defaults do not fit. A migration is the one moment you get to define this from scratch rather than untangle it.
- How people get in and out. A clean access model decays within months if onboarding and offboarding are manual, and you will discover this the first time a wave lands and half the team cannot see it. SCIM-backed provisioning and team sync from your identity provider keep the model true after the migration is over.
- What the rules are, and who enforces them. Every source platform had branch protections, review requirements, and status checks, applied inconsistently by whoever set up each repository. You will have to decide whether to recreate that or replace it. Rulesets at the organization level mean the rules are set once and every repository that lands inherits them.
- What is already in the code. Repositories arrive with history: secrets committed years ago, dependencies nobody has updated, vulnerabilities the previous platform never scanned for. You will find these during the migration whether you look or not, so it is better to look. GitHub's secret scanning with push protection, Dependabot, and code scanning can all be enabled at the organization level, so every repository that lands is covered from day one instead of being enabled one by one afterward.
- How pipelines prove who they are. Every pipeline being moved has credentials in it, and every one of them is a decision: copy the long-lived secret to a new secrets store, or stop having one. GitHub Actions has native OpenID Connect to the major clouds, so a pipeline can request a short-lived token at run time instead. Since the pipeline is being rewritten anyway, this is the cheapest it will ever be to change how it authenticates.
- What you can prove about what you built. Once builds run through a shared workflow, you can finally say which workflow built an artifact and from which commit, and it takes one step. Artifact attestations generated inside the shared build workflow and verified at deploy time give you provenance aligned with SLSA. The shared workflow that consolidation produces is exactly the isolation SLSA Build L3 requires, so provenance is one added step in a workflow that was going to exist anyway.
None of this is a security stack bolted onto the migration. It is the migration, done with a few decisions made up front: enterprise-managed users, governance and policy set at the organization level, standardized CI/CD through shared workflows, and a commitment to security as part of the build rather than a review after it.
Why not land first and secure later?
Because nobody wants to modify a pipeline that was just migrated, validated, and approved. Security as its own program afterward means every workflow needs to be modified, tested, and validated again. Making these decisions on the way costs design work up front and almost nothing per pipeline.
What does the route look like?
You can do this with solid design and architecture work, followed by a phased modernization and migration plan that includes security baked into the entire pipeline process.
- Align leadership on the destination (human). The initiative is already funded as a migration or a modernization. What leadership needs to agree to is that it arrives at the destination defined above, and that the platform team's design work up front is the price of arriving there.
- Map the estate (automated). Not a list of repositories but the whole web: which depend on which, where submodules and shared templates create hidden coupling, which pipelines are near-copies of each other, where the long-lived credentials live. This is where the patterns that become shared workflows first show up, and where the exceptions that need their own plan get found. It is also what keeps one cancelled leg from ending the journey: when a wave cannot move on schedule, the map shows which ones can, and the journey reroutes instead of stalling.
- Design the destination (human-in-the-loop). The access model, the rulesets, the OIDC trust relationships, the scanning policy, the attestation requirements.
- Build the golden paths (automated, with review). Shared, reusable GitHub Actions workflows that embed the decisions: OIDC instead of stored secrets, scanning as a required check, attestation as a build step.
- Migrate in waves (automated, with owners validating). Repositories and pipelines moved onto the golden paths in groups, by team, business unit, or dependency cluster, each wave validated before the next starts, until every last pipeline is there. Every pipeline that lands is already secure, because the path it landed on is.
- Report (continuous). Waves completed, repositories on golden paths. Because the security work rides inside the migration, those numbers are also secrets retired, provenance coverage, and policy adoption. One progress report, not two.
Migration in waves is what makes this survivable at scale: each wave is a checkpoint, and repository count stops driving risk. And because the destination is designed before the first wave moves, there is nothing to circle back for. When the migration is done, so is everything it carried.
Did we land?
Yes. The estate described at the start is now the estate you have: standardized, provisioned, governed, scanned, authenticated with minimal stored secrets, and traceable. You set out to get off Bitbucket, or to turn four hundred build paths into one. You arrived with a Secure SDLC. The initiative that could never make the roadmap on its own is finished, because it was never a separate initiative.
Where does CodeCargo fit?
For one app, everything above is a few YAML pipelines and a few settings pages worth of configuration. For hundreds, thousands of repos? It's all about coordination, discovery, context, planning and execution. What is hard is the map, the design, the order of the waves, which teams own which pipelines and when they can validate, and knowing at any point how far along the journey the estate actually is.
CodeCargo is the control plane for GitHub, and the company behind it was built on years of engineering consulting doing exactly this kind of transformation for enterprises in constant flux, perpetually reacting to market and industry conditions. The sequencing above is that experience written down. The platform exists because the hardest part of a Journey like this is conceptualizing it, where it starts given where you actually are, where it ends given what the business needs, everything you will meet along the way, and then turning that plan into work that keeps moving.
- Journeys are how security work gets included in your migration instead of becoming another roadmap item. The destination is designed, the waves sequenced against it, and progress is visible in one place. A Journey is your opportunity to evaluate the true state of your SDLC, incorporate your wish list of changes, and create a plan that you actually can implement.
- Migration Assistant joins the Journey when it includes a move from another SCM or CI/CD platform. It maps the entire repository and pipeline web, submodules and templates included, identifies the recurring patterns that become the golden paths, and runs those legs of the migration in waves onto them.
- Actions Advisor joins the Journey when it includes an estate already on GitHub but not as standardized or modern as it should be. It maps the existing workflows, surfaces the patterns worth consolidating, and moves workflows onto the golden paths wave by wave. For an estate already on GitHub, that consolidation is the journey.
Conclusion
A migration or modernization moves every pipeline in the estate, and every one of them forces the same decisions: who can do what, how the rules are enforced, what is in the code, how pipelines authenticate, and what you can prove about what you built. Make those decisions during the migration and you land at a Secure SDLC without ever having to fund one separately. Make them afterward and you do the whole thing twice. The controls themselves are GitHub-native and well understood. Success comes down to designing the destination before the first wave moves, and being able to see, at every point, how far along the estate really is.
Key Takeaways
- A Secure SDLC is a destination, not a program. Define it up front, then point the migration or modernization you are already funding at it.
- Every migration brings up the same things. Who can do what, how people get in and out, what the rules are, what is already in the code, how pipelines authenticate, and what you can prove about what you built. Each has a GitHub-native solution, and each is cheapest to deal with while the SDLC is in flux
- Decide four things before the first wave moves. Enterprise-managed users, governance and policy at the organization level, standardized CI/CD through shared workflows, and security as part of the build rather than a review after it.
- Shared workflows carry the security. A pipeline that lands on a golden path arrives with OIDC, scanning, and provenance already in place. The same shared workflow is what makes SLSA Build L3 reachable.
- Don't land first and secure later. Reopening every migrated pipeline means making the journey twice, and the second trip rarely gets scheduled.
- At scale, coordination is the work. For one app it is a few pipelines and a few settings pages. For thousands of repos it is discovery, context, planning, and execution. A Journey is where that plan gets made, with Migration Assistant and Actions Advisor covering the legs that need them, all on GitHub's native foundation.
C
CodeCargo Team
The CodeCargo team writes about GitHub workflow automation, developer productivity, and DevOps best practices.
)