Modules · wrap-up
Cheat sheet & self-check
24 questions across 8 lessons. Each answer links back to the lesson it came from.
Pick an answer to see if you got it, and why.
Q1. Two jobs in a workflow have no `needs`. How do they run?
Show answer
B. Jobs are independent by default. Use `needs` to order them and artifacts or outputs to pass data.
From lesson 01 · The execution modelQ2. Why is `run: echo "${{ github.event.pull_request.title }}"` dangerous?
Show answer
B. Expressions are expanded into the script text. Use `env: TITLE: ${{ … }}` and reference "$TITLE" in the script.
From lesson 01 · The execution modelQ3. What does setting `permissions: contents: read` at the top of a workflow do?
Show answer
B. Grant only what each workflow or job needs (e.g. packages: write only on the publish job).
From lesson 01 · The execution modelQ4. What's the difference between a reusable workflow and a composite action?
Show answer
B. Use reusable workflows for whole pipelines (build, deploy); composite actions for shared step sequences.
From lesson 02 · Real pipelinesQ5. Why capture the image digest from the build step?
Show answer
B. Deploying by digest makes releases and rollbacks exact (see the scenario in lesson 05).
From lesson 02 · Real pipelinesQ6. How do you require a human approval before a production deploy job runs?
Show answer
B. Environment protection rules pause the job until an approver allows it, and environment secrets are only available after approval.
From lesson 02 · Real pipelinesQ7. In ARC's scale-set mode, what happens when a job is queued?
Show answer
B. One job per fresh runner pod: clean state every time and autoscaling from minRunners to maxRunners.
From lesson 03 · Actions Runner ControllerQ8. Why is a GitHub App preferred over a personal access token for ARC?
Show answer
B. Organisation infrastructure shouldn't depend on one person's account and long-lived token.
From lesson 03 · Actions Runner ControllerQ9. A job needs to build a container image. Which trade-off comes with ARC's dind (Docker-in-Docker) mode?
Show answer
B. Privileged containers can reach the node. Choose the mode deliberately, and isolate runner nodes (lesson 06).
From lesson 03 · Actions Runner ControllerQ10. How does OIDC federation remove stored cloud keys from CI?
Show answer
B. No static secret exists to leak. Credentials last minutes and only match the workflows you trust.
From lesson 04 · OIDC federation & secret hygieneQ11. Your AWS role trusts `repo:acme/*`. What's the risk?
Show answer
B. The subject condition is the whole security boundary. Make it as specific as possible.
From lesson 04 · OIDC federation & secret hygieneQ12. Which secrets still need managing even with OIDC everywhere?
Show answer
B. OIDC removes cloud keys, but not every integration supports it, so secret hygiene still matters.
From lesson 04 · OIDC federation & secret hygieneQ13. What does keyless signing with cosign in GitHub Actions use instead of a long-lived private key?
Show answer
B. No key to store or leak. Verification checks WHO signed (which repo/workflow) rather than which key.
From lesson 05 · Supply chain: sign, attest, scan, verifyQ14. What is build provenance?
Show answer
B. Provenance lets consumers check that an image came from the expected repo and pipeline (SLSA's central idea).
From lesson 05 · Supply chain: sign, attest, scan, verifyQ15. Where must signatures be verified to actually protect you?
Show answer
B. Signing without verification is decoration. Enforce it where images are admitted.
From lesson 05 · Supply chain: sign, attest, scan, verifyQ16. Why should self-hosted runners not be used for public repositories that accept fork PRs?
Show answer
B. A self-hosted runner executes whatever the workflow says. For untrusted code, use GitHub-hosted runners or heavily isolated, ephemeral ones with no network access to internal systems.
From lesson 06 · Hardening the runnerQ17. What makes ephemeral runners safer than long-lived ones?
Show answer
B. Persistence between jobs is how one compromised build poisons later ones, including release builds.
From lesson 06 · Hardening the runnerQ18. A runner pod on EKS uses the node's IAM role. What's wrong?
Show answer
B. Jobs should get only the credentials they explicitly request, never ambient node permissions.
From lesson 06 · Hardening the runnerQ19. How compatible are Gitea/Forgejo Actions workflows with GitHub Actions?
Show answer
B. The runners are based on act-style execution. Familiar syntax, but not a perfect clone of GitHub's platform.
From lesson 07 · The air-gapped portQ20. In an air-gapped network, where does `uses: actions/checkout@v4` come from?
Show answer
B. Every external dependency (actions, images, packages, scanner databases) must be mirrored inside the gap.
From lesson 07 · The air-gapped portQ21. Keyless cosign signing isn't possible offline by default. Why, and what's the alternative?
Show answer
B. Supply-chain controls still matter inside the gap; they just use local trust roots.
From lesson 07 · The air-gapped portQ22. Why set the built-in (controller) node to 0 executors?
Show answer
B. The controller holds secrets for every job. Isolating builds to agents limits what a malicious build can reach.
From lesson 08 · Jenkins in the real worldQ23. What problem do Jenkins shared libraries solve?
Show answer
B. Like reusable workflows in Actions (lesson 02): one place to fix and improve, versioned so teams upgrade deliberately.
From lesson 08 · Jenkins in the real worldQ24. Your single Jenkins controller dies in the middle of a release. What design would have reduced the impact?
Show answer
B. CI is a dependency of every release. It needs a tested recovery path and a fallback, like any production system.
From lesson 08 · Jenkins in the real world