Microsoft GH-200 (GitHub Actions) Exam

94%

Students found the real exam almost same

Students Passed GH-200 1057

Students passed this exam after ExamTopic Prep

95.1%

Average score during Real Exams at the Testing Centre

94%

Students found the real exam almost same

Students Passed GH-200 1057

Students passed this exam after ExamTopic Prep

Average GH-200 score 95.1%

Average score during Real Exams at the Testing Centre

GitHub GH-200: Designing Secure GitHub Actions Automation

GH-200 tests the engineer who authors, secures and troubleshoots GitHub Actions workflows at scale. Microsoft's January 2026 study guide covers workflow triggers and expressions, job outputs, reusable automation, custom actions, runners, policies, secrets, and performance. Successful preparation means understanding what code executes, which identity authorizes that execution, and how artifacts move between jobs. A workflow that passes on a developer branch may still be unsafe for public contributions or unreliable during a release incident.

Consider an application team publishing a container image. Its pipeline checks out source code, installs dependencies, tests several runtimes, builds an image, signs an artifact and deploys to a staging environment. Every step has inputs, a permission boundary and a failure mode. GH-200 is less about copying YAML from a tutorial than interpreting how those steps interact when the build is triggered by a pull request, a tag or a manually approved deployment. The broader AZ-400 pathway covers DevOps delivery across platforms, while this examination emphasizes GitHub Actions behavior.

Understand events, contexts and data flow in a workflow

A workflow's on configuration determines which events start it. A push to a protected branch has different trust characteristics from a pull request from an external fork. Filters for paths, tags and branches can reduce unnecessary executions but may also skip required validations if misconfigured. Examine the difference between the event payload and the current branch reference before choosing a condition. A workflow that deploys on any tag name may accidentally publish an unsigned pre-release if repository policy does not control who creates tags.

Jobs define runner environments and dependency order. Steps share a job environment while separate jobs typically do not share a mutable filesystem. Use artifacts or defined outputs to pass required values across job boundaries. $GITHUB_OUTPUT and $GITHUB_ENV solve different scopes of communication; a job summary is for readable result reporting rather than securely transmitting credentials. The needs context can pass known outputs to downstream jobs, but a skipped prerequisite changes which expressions are available. Inspect that behavior in a deliberately failing test workflow.

Matrix strategies run combinations of platforms or versions. They improve coverage but can multiply cost and make a failure difficult to isolate. Label each matrix axis clearly, consider fail-fast behavior, and retain diagnostic artifacts from the failing variant. If only Windows tests fail, determine whether the issue is path syntax, line endings, tool versions or a real platform-specific bug. Rerunning the complete matrix without inspecting the logs wastes resources and often conceals the cause.

Choose between custom actions and reusable workflows

A composite action packages a sequence of steps; a reusable workflow coordinates jobs and can be invoked with workflow_call. A starter template is copied as a starting point and evolves independently afterward. Confusing these models creates governance problems. If the security team needs one centrally reviewed deployment job, a reusable workflow offers a stronger change-control boundary than distributing many separately edited templates. A composite action is useful for a repeatable unit such as validating a package version, but it does not replace job-level orchestration.

Custom actions may use JavaScript, Docker or composite metadata. Select the action type according to runtime requirements, portability and operational support. Define inputs, outputs and versioning clearly; avoid requiring broad secret access for an action that only formats files. Publish tagged releases carefully and prefer immutable references where supply-chain controls demand them. If an action is private, verify which repositories or organizations are permitted to consume it and how upgrades will be rolled out.

Version selection affects reproducibility. Depending on a mutable branch reference can silently change build behavior when another team updates the action. Pinning a trusted third-party action to a commit identifier makes changes explicit, though teams still need a process for reviewing security fixes. A secure automation program balances reproducible deployments with managed updates rather than freezing dependencies forever.

Give automation only the permissions it needs

The ephemeral GITHUB_TOKEN is not an all-purpose administrator credential. Declare the minimal permissions appropriate to each job and distinguish read-only build tasks from publishing or deployment. Repository secrets, environment secrets and organizational secrets have different scopes. Protect high-value environments with approvals and branch restrictions. The runner executing untrusted pull-request code should not gain credentials used to deploy production or change organization settings.

For cloud deployments, OpenID Connect federation can exchange a short-lived workflow identity for a cloud-issued credential, avoiding long-lived keys stored in GitHub. That requires appropriate cloud-side trust conditions: repository, branch, environment and workflow identity claims must be checked. Simply enabling an OIDC permission without restrictive audience and subject rules can expand risk. Verify the exact identity that the cloud system trusts and test that a workflow from an unauthorized ref cannot assume the role.

Shell interpolation also introduces injection risk. Values in event payloads, commit messages and issue comments may be attacker-controlled. Placing such text directly into a shell command can execute unintended instructions. Prefer passing values through environment variables, applying correct shell quoting and avoiding untrusted content in privileged steps. Tests should include characters such as quotes, newlines and command delimiters to verify that user-provided strings remain data rather than code.

Troubleshoot runners and environment differences

GitHub-hosted runners have published image contents that can change over time; self-hosted runners inherit patching, isolation and network responsibilities from the organization. If a build suddenly fails after a hosted image update, compare installed tool versions and environment changes before blaming application code. Use explicit tool setup actions for required versions. Avoid depending on a transitive package that happened to be preinstalled in one environment.

A self-hosted runner that builds untrusted repositories may leak state between jobs if its cleanup and isolation are insufficient. Enterprise administrators pursuing GH-100 define which teams may attach these runners to sensitive networks; GH-200 authors must then respect the actual runner and workflow permission boundaries. Sensitive credentials, compiled code or cached files can persist on disk. Use restricted runner groups, limit eligible repositories and evaluate ephemeral runners for higher-risk workloads. When a runner queues indefinitely, examine matching labels, group restrictions, capacity and connectivity rather than disabling restrictions to clear the queue.

Artifact and cache design must be intentional. Artifacts represent outputs to retain or hand to another job; caches accelerate repeatable dependency retrieval. Neither is a general secret-storage mechanism. Define retention according to debugging and compliance needs, verify upload/download paths and prevent untrusted caches from influencing privileged release builds. Review package integrity when dependencies come from public registries.

Treat a deployment failure as a controlled incident

Suppose a release pipeline published a container image successfully but stopped before deployment. The first action is to identify the last durable state: image digest, artifact signature, staged configuration and environment approval. A blind rerun could publish a second image under the same tag or repeat a database migration. Design idempotent steps and use immutable artifact identifiers so a restart does not change the underlying release unexpectedly.

A good release workflow separates build, verification and promotion. Record provenance, run security checks under limited access, require the appropriate approvers and use environment protection rules for production. If the deployment fails, roll back by reference to a known image digest and verify application health and data integrity, not merely the status of the workflow run. A green job result can coexist with a broken service if its health checks are superficial.

Performance tuning should begin with measured bottlenecks. Cache stable dependencies, cancel redundant in-progress runs when appropriate, and limit large matrix combinations to relevant changes. Never optimize by removing essential tests or approval gates from a critical branch. Compare cost against failure risk and developer wait time. GitHub Actions is infrastructure for delivering software; reducing compute minutes is valuable only if the release process remains trustworthy.

A supply-chain attack drill provides a powerful GH-200 scenario. A workflow that previously pulled a third-party action by floating tag begins executing changed code after the action maintainer's account is compromised. The attack may not modify the application repository at all. Determine whether action pinning, organization allowlists, constrained token permissions and environment protections would prevent the modified action from reaching deployment credentials. Then review what audit and build evidence remains available to establish which jobs used the affected version.

The incident also tests recovery. Pausing every workflow may be necessary briefly, but the team should prioritize critical releases and known-safe build paths. Identify last trusted artifacts, verify their provenance and record which workflows require rebuilding. Avoid treating a successfully signed artifact as safe unless its signing process itself was trustworthy. A secure pipeline needs a way to establish trust in both its code and its automation dependencies.

Another high-value exercise is a failed matrix run caused by an unavailable registry. Retry logic can help with transient errors, but excessive retries amplify outages and make delivery unpredictable. Choose bounded retries, informative logs and a clear failure classification. Decide which tasks should fail the release and which can produce warnings without compromising policy. Reproducible automation means both successful and failed runs provide enough evidence for a deliberate next action.

Prepare GH-200 through a compact pipeline laboratory

Create a small repository with tests running on two operating systems, a composite action for an internal step, a reusable release workflow and a staged deployment requiring approval. Break an output name, a token permission, a matrix parameter and a runner label separately. Diagnose each failure using actual logs. Add an untrusted pull-request test that confirms deployment secrets remain unavailable and event text cannot become executable shell content.

Use Microsoft's January 2026 GH-200 objective list to check domain coverage and practice reasoning from workflow YAML to actual execution semantics. A proficient candidate can explain which actor triggered a run, which identity authenticated a job, which artifact was produced, what a retry would repeat and how organizational policy changes the result. That end-to-end reasoning is the practical basis for secure GitHub automation.

Read More GH-200 arrow