Lesson 25 of 30
A pipeline that pauses and waits for a human to click 'approve' before touching production. Worth it when a human genuinely catches something automation can't — theater when it's just a rubber stamp.
15 min read
Every option explains itself — why the right one is right, and why each wrong one is wrong. Miss one and it comes back later on a spaced-repetition schedule.
This topic is about judgment and practical tradeoffs more than a single right answer — a mock interview is the better way to test yourself on it.
Be interviewed on this →Hints without spoilers, and a plain explanation of why a wrong answer was wrong — answered only from this lesson. Free account, no card.
Sign up freeWhat interviewers actually ask about this, and what a strong answer has to cover.
A strong answer covers
Likely follow-ups
Everything so far in this track has been about automation removing humans from the loop — tests instead of manual QA, automated deploys instead of someone SSHing in. A manual approval gate is the deliberate exception: a specific point in the pipeline where automation stops, and a designated human has to explicitly click "approve" before the pipeline is allowed to continue, usually right before a production deploy.
GitHub's version of this is an Environment with required reviewers. You define an environment (say, production), attach a list of people or teams as required reviewers, and any job targeting that environment pauses — not failed, not skipped, genuinely paused, minutes or days if needed — until one of those reviewers approves it in the GitHub UI. Everything before that gate (build, test, lint) still runs fully automatically; only the specific step of "let this touch production" waits on a person.
The honest question this lesson is really about is when this is worth it. A gate is worth the friction when a human can catch something automation genuinely can't — judgment about timing ("we don't deploy Friday at 5pm"), business context automation has no way to know ("legal hasn't signed off on this copy change yet"), or a second set of eyes on something high-stakes and hard to automate a check for. A gate is theater when it's a rubber-stamp click from someone who isn't actually looking at anything — reviewing the same PR that already passed CI, with no new information available at approval time, purely because "production deploys should have a human in the loop" as an unexamined rule. That second case doesn't add safety, it just adds latency and a false sense of security.
name: Deploy
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pnpm install --frozen-lockfile
- run: pnpm build
- uses: actions/upload-artifact@v4
with:
name: build-output
path: dist/
deploy-production:
needs: build
runs-on: ubuntu-latest
environment:
name: production
url: https://praxis.example.com
steps:
- uses: actions/download-artifact@v4
with:
name: build-output
path: dist/
- name: Deploy
run: ./scripts/deploy.sh dist/
environment: production is what triggers the pause — it's not a YAML field with deploy-specific behavior on its own, it's a pointer to a GitHub Environment configured (in the repo's Settings → Environments) with required reviewers. When this job reaches that point, GitHub shows the listed reviewers a pending-deployment notification; the job's steps don't start running until one of them clicks approve. Note the shape: build runs completely unattended and produces an artifact, and only deploy-production, which needs: build, sits behind the gate — the automation still does everything it can do alone, and the human is inserted only at the one step that's genuinely irreversible.
Branch-protection-and-required-checks gates merging on automated signals — tests, lint, review approval on the PR itself. A manual approval workflow is the same core idea of "don't let this proceed without a satisfied condition," just relocated to a later, higher-stakes point: not "is this code good enough to merge" but "is right now, with this context, the right moment to put it in front of real users."