BYOWBuild Your Own Workflow

Part 3 · Reference

Compare the platforms, then check your pipeline

A translation table for teams that work on more than one platform, and a hardening checklist you can tick through for any repository. Your ticks are saved in this browser only.

Concept map

The same idea under three names. Use this when you know how to do something on one platform and need the equivalent on another.

ConceptGitHub ActionsAzure DevOpsGitLab CI/CD
Pipeline file.github/workflows/*.ymlazure-pipelines.yml (any path).gitlab-ci.yml
Structureworkflow › job › steppipeline › stage › job › steppipeline › stage › job › script
ComputeRunner: GitHub-hosted or self-hostedAgent: Microsoft-hosted, Managed DevOps Pools, self-hostedRunner: GitLab-hosted or self-managed
ReuseReusable workflows, composite actionsTemplates with template and extendsinclude, CI/CD components, extends
Central enforcementOrg rulesets that require workflowsRequired template check on protected resourcesScan execution, approval and pipeline execution policies
Built-in tokenGITHUB_TOKEN, scoped by permissionsSystem.AccessToken, scoped by job authorization scopeCI_JOB_TOKEN, scoped by the job token allowlist
OIDC to cloudpermissions: id-token: writeService connection with workload identity federationid_tokens: with aud
SecretsRepository, organization and environment secretsSecret variables, Key Vault-linked variable groups, secure filesProtected, masked and hidden CI/CD variables; Vault via secrets:
Deployment gateEnvironments: required reviewers, branch rules, wait timerEnvironments: approvals and checksProtected environments: deployment approvals
Serialize deploysconcurrencyExclusive lock check, lockBehaviorresource_group
Fork contributionspull_request with read-only token, approval for outside contributorsFork builds without secrets, comment to triggerFork MR pipelines run in the fork
Injection trap${{ }} inside run$(macro) inside scriptRe-parsing with sh -c or eval
PinningActions by full commit SHA, enforceable by policyTemplate repositories by ref tag; images by digestIncludes by ref; components by exact version

Security features side by side

What each platform gives you natively, and what it costs. GitHub and Azure DevOps both sell Secret Protection and Code Security as separate products; on GitHub they are free for public repositories.

CapabilityGitHubAzure DevOpsGitLab
Secret scanningSecret Protection, with push protectionSecret Protection, with push protection (Azure Repos only)Secret Detection job (Free); secret push protection (Ultimate)
SASTCodeQL via Code SecurityCodeQL tasks via Code SecuritySAST template (Free); Advanced SAST (Ultimate)
Dependency scanningDependency review and DependabotDependency scanning task (Code Security)Dependency Scanning v2 (Ultimate)
IaC and containersThird-party scanners, results via SARIFThird-party scanners, results via the Publish taskSAST-IaC and Container Scanning templates (Free)
Merge gate on findingsRuleset: require code scanning resultsBranch policy build validation; scanner exit codesMerge request approval policy (Ultimate)
Signing and provenanceArtifact attestations: SLSA provenance and SBOMNotation with Azure Key VaultSigstore keyless signing with id_tokens
Pipeline lintCodeQL actions languageThird-party (poutine)Third-party (poutine)

Hardening checklist

Thirty-two controls, grouped the same way as the tutorials. Choose a platform to see only its instructions.

Progress0 of 32

Source control 0/5

Identity and secrets 0/5

Pipeline definition 0/5

Security gates 0/6

Artifact integrity and deployment 0/6

Runners and operations 0/5