DevOps & CI/CD

Chapter 5
Continuous Integration Pipeline Design

Advance Diploma in Cloud Computing
DevOps & CI/CD   •   Advance Diploma

Continuous Integration Pipeline Design

Introduction and Context

Continuous integration (CI) is the disciplined practice of integrating code changes into a shared repository frequently and validating each integration through automated build, test, security, and quality activities. A CI pipeline is the executable design that turns a source-code change into evidence about whether that change is safe to merge, package, or release.

CI is more than a collection of scripts. It is a socio-technical control system involving version control, event triggers, execution environments, dependency management, automated tests, quality policies, artifact repositories, credentials, observability, and human decisions. A well-designed pipeline provides rapid and trustworthy feedback while protecting production systems from unverified changes.

In DevOps, CI is commonly connected to continuous delivery (CD). CI establishes that a change can be built and tested consistently. Continuous delivery extends this result by preparing or deploying the verified change to later environments. This chapter focuses on CI pipeline design, while recognizing that choices made in CI affect release reliability, deployment frequency, security, and operational cost.

Learning Objectives

By the end of this chapter, a learner should be able to:

  1. Explain the purpose and architecture of a CI pipeline.
  2. Select appropriate triggers, runners, stages, and execution strategies.
  3. Design caching and artifact-handling approaches that are reliable and secure.
  4. Apply parallelism, quality gates, and failure-recovery techniques.
  5. Compare implementation patterns in GitHub Actions, GitLab CI, Jenkins, and cloud-native services.
  6. Evaluate a pipeline for speed, reproducibility, maintainability, security, and governance.

1. The CI Pipeline as a Control System

A pipeline accepts an event and a revision of source code, performs controlled transformations, and produces evidence and outputs. A simplified conceptual model is:

Repository event → Pipeline selection → Runner allocation → Build and test stages
       ↑                                                        ↓
Developer feedback ← Results, logs, reports, artifacts ← Quality gates

A pipeline normally contains the following elements:

  • Trigger: The event that starts execution, such as a pull request, branch push, tag, schedule, or manual request.
  • Pipeline definition: Configuration stored as code, for example YAML, a Jenkinsfile, or a cloud build specification.
  • Runner or agent: The compute environment that executes jobs.
  • Job: A unit of work executed by a runner.
  • Stage: A logical grouping or ordering of jobs, such as build, unit test, or security scan.
  • Dependency graph: Rules stating which jobs must finish before others begin.
  • Quality gate: A condition that permits or prevents progression.
  • Artifact: A file deliberately retained or transferred, such as a package, test report, container image, or compiled binary.
  • Cache: Reusable data intended to accelerate future executions, such as dependency downloads.
  • Evidence: Logs, test results, coverage reports, scan results, and metadata used to support a decision.

A key design distinction is between a cache and an artifact. A cache is an optimization and may be deleted or become invalid. An artifact is an output of a particular build and should be traceable to a specific commit, toolchain, and pipeline run. Treating caches as authoritative release outputs is unsafe.

Pipeline properties

A professional pipeline should aim for:

  • Repeatability: The same revision and declared inputs produce materially equivalent results.
  • Reproducibility: Another operator or system can recreate the result using recorded dependencies and tools.
  • Fast feedback: Developers learn about defects early.
  • Isolation: Jobs cannot unintentionally alter one another or access unauthorized resources.
  • Traceability: Every result can be associated with source, actor, configuration, and time.
  • Fail-closed quality: Unmet critical controls prevent promotion.
  • Maintainability: Configuration is understandable, modular, and tested.

2. Designing Triggers and Scope

A trigger should reflect the risk and purpose of the pipeline. Common trigger categories are shown below.

TriggerTypical useMain design concern
Pull or merge requestValidate proposed changesAvoid untrusted code receiving sensitive secrets
Push to a branchValidate integrated codePrevent duplicate work when a request also exists
Tag creationBuild a versioned release candidateEnsure tags are protected
Scheduled executionNightly integration, dependency, or security testsControl cost and alert fatigue
Manual dispatchOperational or exceptional workflowsRestrict authorization and record rationale
External eventRepository or service integrationAuthenticate and validate the event

Branch and path filters reduce unnecessary execution. For example, documentation-only changes may not require a full application build, although security and configuration changes should not be excluded casually. A robust design distinguishes validation of a contribution from validation of the integrated default branch. Both are important because merge order can create interactions not visible in isolated branches.

Trust boundaries and forked contributions

A pull request from an external fork should be treated as untrusted input. Its code can modify the pipeline definition and attempt to print environment variables, alter build steps, or exploit dependencies. Secrets should therefore not be exposed to untrusted jobs. Safer patterns include:

  1. Run untrusted validation with read-only permissions and no deployment credentials.
  2. Use a trusted workflow to inspect results after the untrusted workflow completes.
  3. Require human approval before privileged jobs execute.
  4. Pin actions, plugins, and reusable components to reviewed versions.

The principle is least privilege: a test job should receive only the permissions, network access, and credentials required for testing.

3. Runners and Execution Environments

A runner may be hosted by a platform provider or operated by the organization. Hosted runners reduce infrastructure administration and provide disposable environments. Self-hosted runners can provide specialized hardware, private-network access, licensing, or predictable capacity, but they increase patching, isolation, and credential risks.

Runner selection criteria

Consider:

  • Operating system and processor architecture
  • Required language runtimes and SDKs
  • Container or virtualization support
  • Network access to internal systems
  • Availability of GPUs or licensed tools
  • Startup time and capacity
  • Isolation between jobs
  • Data residency and regulatory requirements
  • Cost per execution

Ephemeral runners are usually preferable for untrusted or variable workloads because the environment is destroyed after the job. Long-lived runners can be faster when tools are preinstalled, but residual files, credentials, and workspace modifications can contaminate later jobs. If persistent agents are used, workspace cleanup and periodic reimaging are mandatory controls.

A runner image should be versioned. Uncontrolled use of a moving image label can cause a pipeline to change behavior without a source-code change. Teams should periodically update images, test the update, and document supported tool versions.

4. Stages, Jobs, and Dependency Graphs

A pipeline can be represented as a directed acyclic graph (DAG). Each node is a job and each directed edge expresses a prerequisite. A simple sequence is:

lint → unit test → build → integration test → package

However, linting and unit testing may often run concurrently, and independent platform builds can form a matrix. A graph rather than a rigid sequence reduces waiting while preserving necessary controls.

Typical stages include:

  1. Preparation: Check out source, establish tool versions, and restore dependencies.
  2. Static validation: Formatting, linting, type checking, and configuration validation.
  3. Unit testing: Fast tests of isolated components.
  4. Build: Compile or assemble the application.
  5. Integration testing: Validate interactions with databases, queues, APIs, or services.
  6. Security and compliance: Dependency, secret, software composition, container, and static analysis scans.
  7. Packaging: Produce versioned artifacts or container images.
  8. Publication: Transfer approved outputs to an artifact repository.

The order should reflect both technical dependencies and risk. For example, a cheap syntax check can run before an expensive integration environment is created. Security scans may run early for rapid feedback and again at packaging for final evidence.

Build once, test and promote the same output

A major reliability principle is to build a versioned output once and use that same output for later tests and promotion. Rebuilding separately in each environment can produce differences caused by timestamps, dependency resolution, compiler versions, or external repositories. A build record should include at least the commit identifier, pipeline identifier, tool versions, dependency lock-file state, and artifact digest.

5. Caching and Dependency Management

Dependency installation is frequently a major component of pipeline duration. Caching can reduce repeated downloads, but an incorrect cache can create nondeterministic or insecure behavior.

A cache key should represent the inputs that determine the cached data. A common pattern is:

operating-system + runtime-version + lock-file-hash

When the lock file changes, the key changes and stale dependencies are not reused. A fallback key may permit partial reuse, but fallback data must be treated as an optimization, never as proof of correctness.

Good cache practice includes:

  • Cache package-manager directories rather than arbitrary workspaces.
  • Use lock files and verify checksums where supported.
  • Do not cache secrets, credentials, deployment tokens, or generated private data.
  • Separate caches by operating system, architecture, runtime, and trust boundary.
  • Evict caches periodically and document invalidation rules.
  • Retain a cache-disabled path for diagnosing failures.

Dependency pinning improves repeatability, but pinning does not eliminate supply-chain risk. Organizations should monitor vulnerabilities, review transitive dependencies, use trusted registries, and produce software bills of materials where required.

6. Parallelism and Matrix Execution

Parallelism reduces elapsed time by executing independent work simultaneously. If jobs have durations t1, t2, …, tn and unlimited independent capacity, the ideal elapsed duration is approximately the maximum job duration rather than the sum:

Tparallel ≈ max(t₁, t₂, …, tₙ)

This is an ideal upper-bound improvement model. It assumes jobs are independent and ignores queueing, runner startup, coordination, resource contention, and teardown. With limited capacity, the actual duration is longer.

A matrix strategy is useful for testing combinations such as operating systems, language versions, database versions, or architectures. Matrix growth can become expensive: if there are a operating systems, b runtime versions, and c database versions, the number of combinations is:

N = a × b × c

This assumes every combination is valid and selected. Exclusions, inclusions, and risk-based sampling may reduce N. For example, a project may run the complete matrix nightly but a representative subset on every pull request.

Parallelism should not be added blindly. It can increase runner cost, saturate package registries, overload shared test databases, and make logs harder to interpret. Tests that share mutable state must be isolated or serialized.

7. Quality Gates and Test Strategy

A quality gate is an explicit decision rule. Examples include:

  • All required unit tests pass.
  • No critical vulnerability is present.
  • Code coverage remains above an agreed threshold, where coverage is used appropriately.
  • Static analysis reports no blocking defects.
  • The artifact is signed or has an approved provenance record.
  • Required reviewers and status checks are complete.

A quality gate should be specific, observable, and connected to risk. A coverage percentage alone is not a quality guarantee: tests may execute lines without checking meaningful behavior. Coverage is evidence, not a substitute for test design.

Test-pyramid implications

Fast unit tests usually provide high feedback frequency and low environmental complexity. Integration tests provide stronger evidence about system boundaries but take longer and require more infrastructure. End-to-end tests represent user workflows but are often slower and more fragile. A balanced pipeline places many fast tests early and a smaller number of high-value system tests later.

Flaky tests require special handling. Automatically retrying every failure can conceal real defects. A retry may be acceptable for a known transient infrastructure condition, but the original failure must remain visible, and flakiness should be measured and removed. A test that passes only after repeated retries should not be treated as normal evidence of quality.

Security gates

Security controls may include:

  • Secret scanning before merge
  • Software composition analysis for dependencies
  • Static application security testing
  • Container image scanning
  • Infrastructure-as-code scanning
  • License-policy checks
  • Artifact signing and provenance verification

The pipeline itself is part of the attack surface. Third-party actions and plugins can execute with pipeline privileges. They should be selected from trusted sources, pinned to immutable revisions where practical, reviewed on update, and granted minimal permissions.

8. Artifacts, Reports, and Provenance

Artifacts should have clear lifecycle categories:

  • Build artifacts: binaries, packages, libraries, and container images.
  • Diagnostic artifacts: logs, screenshots, crash dumps, and test reports.
  • Compliance artifacts: scan reports, SBOMs, attestations, and approval records.

A useful artifact naming scheme includes the application, version, source revision, platform, and format. Content-addressable identifiers or cryptographic digests strengthen integrity. A digest is a fingerprint, not encryption; it supports detection of changes but does not keep content confidential.

Artifacts should be stored in repositories with access control, retention policies, immutability options, and audit logs. The pipeline should fail if publication of a required release artifact fails. Diagnostic artifacts may be retained only on failure to reduce cost, provided that retention supports investigation and regulatory needs.

Reports must be machine-readable where possible. Standard test-result formats allow the platform to display failures and trends rather than forcing developers to search raw logs.

9. Failure Handling and Recovery

Pipeline failure is not a single condition. It may result from a product defect, test defect, infrastructure outage, dependency registry failure, resource exhaustion, configuration error, or security policy violation. Recovery begins with classification.

Failure classAppropriate response
Deterministic code or test failureFix the change; do not hide it with retries
Transient network or service failureUse bounded retry with backoff and clear logging
Runner or capacity failureReschedule or provide capacity; preserve evidence
Dependency or registry outageUse approved mirrors or controlled fallback mechanisms
Security-policy failureBlock progression and investigate; never bypass silently
Pipeline-definition defectRevert or repair the definition and test it

A retry policy should be bounded. If a task has a transient failure probability p per attempt and independent attempts are made up to k times, the probability of at least one success is:

P(success) = 1 − pk

This assumes failures are independent and that the retry does not change the underlying condition. In real systems, correlated outages violate that assumption, so retries can amplify load and delay recovery. Exponential backoff, jitter, maximum attempts, and circuit-breaking are safer than immediate unlimited retries.

Recovery practices include:

  • Preserve logs and failed test reports.
  • Make reruns possible without changing source unexpectedly.
  • Record whether a rerun used a new runner image or dependency state.
  • Permit cancellation of obsolete pipeline runs.
  • Define ownership and escalation for repeated failures.
  • Use post-incident analysis for systemic problems.

An emergency bypass, if permitted, must be time-limited, authorized, recorded, and followed by remediation. A permanent bypass converts a quality control into an illusion.

10. Platform Implementation Patterns

GitHub Actions

GitHub Actions expresses workflows, jobs, steps, permissions, runners, matrices, environments, and reusable workflows in YAML. A workflow commonly triggers on pull requests and pushes. Jobs can use hosted or self-hosted runners and exchange outputs or artifacts. Permissions should be explicitly minimized, and secrets should be scoped to environments or jobs.

GitLab CI/CD

GitLab CI/CD commonly uses a .gitlab-ci.yml file with stages, jobs, rules, variables, runners, artifacts, caches, and environments. rules can provide precise trigger conditions. GitLab artifacts are generally associated with job outputs and can be passed between jobs, while caches are intended for reusable acceleration data.

Jenkins

Jenkins uses pipelines defined in a Jenkinsfile, either declaratively or through scripted syntax. Agents execute stages, and plugins provide integrations. Jenkins offers flexibility and supports complex installations, but plugin governance, controller security, agent isolation, upgrades, and credential management require active administration.

Cloud-native build services

Services such as managed build systems integrate with cloud repositories, identity systems, artifact registries, secret managers, and logging platforms. They can provide scalable ephemeral workers and private networking. Their design still requires explicit permissions, reproducible build specifications, artifact policies, and cost controls. Managed execution does not remove governance responsibility.

The platforms differ in syntax, but the design principles are transferable: controlled triggers, least privilege, isolated runners, explicit dependencies, immutable outputs, and observable gates.

11. Illustrative Case: An Online Retail Service

Background

An online retailer maintains a Java-based order service and a containerized web front end. Developers previously built locally and requested manual testing. Releases were delayed, and defects sometimes appeared only after deployment.

Problem

The organization identified four causes: inconsistent Java versions, repeated dependency downloads, no reliable merge protection, and separate rebuilds for testing and release. The average feedback time was long, while failures were difficult to reproduce.

Analysis

The team mapped the flow from pull request to release candidate. Unit tests were independent and could run in parallel. Integration tests required a database and message broker. Security scans were available but were not enforced. The existing build produced a container image twice, allowing differences between the tested and released images.

Approach and solution

The redesigned pipeline used these controls:

  1. Pull-request triggers ran formatting, static analysis, unit tests, dependency checks, and a reduced integration suite.
  2. Pushes to the protected default branch ran the complete integration suite.
  3. A versioned runner image supplied a fixed Java toolchain.
  4. The dependency cache key included the operating system, Java version, and lock-file hash.
  5. Unit tests and independent scans ran in parallel.
  6. The application image was built once, tagged with the commit identifier, and tested by digest.
  7. Required checks blocked merging when tests failed or critical vulnerabilities were detected.
  8. The image and reports were stored in an access-controlled registry.
  9. Untrusted pull requests received no production credentials.
  10. Transient infrastructure errors were retried twice with backoff; product-test failures were not automatically hidden.

Outcome

The team obtained earlier feedback, consistent tool versions, and a traceable relationship between source revision and container image. Some jobs became slower because integration and security checks were added, but parallel execution reduced total elapsed time. Most importantly, the pipeline distinguished genuine application failures from infrastructure interruptions and preserved evidence for both.

Learning points

The case illustrates that CI improvement is not equivalent to adding more tests. The most valuable changes were explicit trust boundaries, build-once promotion, reproducible environments, meaningful gates, and useful failure classification. Speed was achieved through dependency-aware parallelism rather than by weakening controls.

12. Governance, Ethics, and Professional Practice

CI systems often process source code, customer-related test data, credentials, proprietary algorithms, and security findings. Governance therefore includes:

  • Data minimization and appropriate test-data anonymization
  • Access control and separation of duties
  • Auditability of approvals and bypasses
  • Retention and deletion policies
  • Software licensing compliance
  • Protection of personal data in logs and reports
  • Regional requirements for data residency
  • Secure handling of vulnerability information

Teams should avoid placing secrets in command arguments or logs. Masking is useful but imperfect; the strongest control is preventing secret exposure. Test data should not contain real personal information unless its use is justified, protected, and compliant with applicable law.

Automation also creates accountability questions. A failed automated gate should not be overridden merely because a release date is inconvenient. Conversely, a gate that generates excessive false positives can encourage unsafe bypass behavior. Governance must therefore evaluate both false rejection and false acceptance, review thresholds periodically, and involve developers, security specialists, operations staff, and product owners.

13. Metrics and Continuous Improvement

Useful CI metrics include lead time from commit to feedback, queue time, execution time, failure rate, rerun rate, flaky-test rate, cache-hit rate, artifact publication success, and mean time to restore a broken pipeline. Metrics should support improvement rather than punish teams.

A pipeline may be fast but untrustworthy if it omits important tests. It may be comprehensive but ineffective if feedback arrives too late for developers to act. A balanced assessment considers speed, quality, reliability, cost, security, and developer experience together.

Improvement techniques include:

  • Remove duplicate work and obsolete jobs.
  • Move cheap deterministic checks earlier.
  • Parallelize only independent work.
  • Quarantine and repair flaky tests rather than ignoring them.
  • Version runner images and build tools.
  • Review caches and artifact retention.
  • Test pipeline definitions as carefully as application code.
  • Use reusable workflow components with clear interfaces.
  • Conduct periodic threat modeling of the CI system.

Contemporary Developments

Modern CI increasingly incorporates software supply-chain frameworks, artifact attestations, SBOM generation, signed commits or images, and policy-as-code. Ephemeral runners and workload identity reduce long-lived credentials. Remote execution and build acceleration can reduce feedback time, but they introduce additional trust and data-transfer considerations.

Artificial intelligence can assist with test generation, log classification, failure clustering, and pipeline-maintenance suggestions. These uses require human review because generated tests may be shallow, log classifications may be wrong, and AI tools may expose proprietary source or secrets. AI should support evidence-based engineering, not replace quality gates or accountability.

Best-Practice Design Checklist

Before approving a CI pipeline, ask:

  1. Are triggers precise and protected against duplicate or unauthorized execution?
  2. Are untrusted contributions isolated from secrets and privileged networks?
  3. Are runner images versioned, patched, and appropriately ephemeral?
  4. Are dependencies locked and caches keyed by relevant inputs?
  5. Is the job graph parallel where safe and ordered where necessary?
  6. Are quality gates explicit, risk-based, and observable?
  7. Is the released artifact the same verified artifact produced by CI?
  8. Are artifacts, reports, logs, and provenance retained appropriately?
  9. Are retries bounded and distinguished from defect suppression?
  10. Can a failed run be reproduced, investigated, and recovered without guesswork?

Chapter Summary

Continuous Integration Pipeline Design combines automation, software architecture, security engineering, and governance. A pipeline begins with a controlled trigger and executes jobs on suitably isolated runners. Stages and dependency graphs express the required order while safe parallelism reduces feedback time. Caches accelerate work but must not be confused with authoritative artifacts. Quality gates convert test, security, and compliance evidence into explicit decisions. Build-once practices, immutable or traceable artifacts, and provenance improve release confidence. Failure handling requires classification, bounded retries, preserved evidence, and accountable recovery. GitHub Actions, GitLab CI/CD, Jenkins, and cloud-native build services implement these ideas differently, but the underlying principles remain portable. Effective CI is not simply fast; it is repeatable, secure, observable, maintainable, and trustworthy.

Key Terms

Continuous integration: Frequent integration of code changes with automated validation.

Pipeline: An automated sequence or graph of jobs that processes a source revision.

Trigger: An event that starts or selects pipeline execution.

Runner: Compute infrastructure that executes pipeline jobs.

Job: A unit of executable pipeline work.

Stage: A logical grouping or ordering of jobs.

DAG: A directed acyclic graph representing job dependencies without cycles.

Quality gate: A rule that permits or blocks progression.

Cache: Reusable data retained to accelerate future execution.

Artifact: A deliberate output such as a package, image, or report.

Provenance: Evidence describing how an artifact was produced.

Matrix build: Execution across selected combinations of platforms or versions.

Ephemeral runner: A temporary runner destroyed after execution.

Flaky test: A test whose result varies without a relevant code change.

Least privilege: Granting only the permissions required for a task.

Dependency lock file: A file recording exact or constrained dependency versions.

SBOM: Software bill of materials listing software components and dependencies.

Static analysis: Automated examination of source or configuration without executing the application.

Retry with backoff: Reattempting a transient operation after increasing delays.

Build-once promotion: Testing and promoting the same produced output rather than rebuilding it.

Review Questions

Short Answer Questions

  1. What is the difference between a CI cache and a build artifact?
  2. Why should untrusted pull requests generally receive no production secrets?
  3. What is the purpose of a quality gate?
  4. State two advantages and one risk of using parallel jobs.
  5. Why are dependency lock files important in CI?

Long Answer Questions

  1. Explain how triggers, runners, stages, jobs, and quality gates combine to form a CI pipeline.
  2. Compare hosted and self-hosted runners, including security, cost, isolation, and operational considerations.
  3. Discuss how caching can improve pipeline performance while undermining reproducibility if designed poorly.
  4. Explain the build-once principle and its relationship to artifact integrity and provenance.
  5. Compare the CI design approaches of GitHub Actions, GitLab CI/CD, Jenkins, and managed cloud build services.

Analytical / Application Questions

  1. Design a CI job graph for a containerized web service containing linting, unit tests, integration tests, security scanning, image building, and publication. Identify which jobs can run in parallel and justify every dependency.
  2. A pipeline fails intermittently when downloading dependencies, but application tests fail deterministically when a feature is incorrect. Design a retry and failure-classification policy that handles both cases safely.
  3. A team proposes using one persistent self-hosted runner for all pull requests and storing deployment credentials in its environment. Critically evaluate the proposal and recommend a safer architecture.

Multiple Choice Questions with Answers

Question 1

Which statement best distinguishes a CI cache from an artifact?

A. A cache is always immutable, while an artifact is temporary.

B. A cache accelerates future runs, while an artifact is a traceable output of a specific run.

C. A cache contains only source code, while an artifact contains only logs.

D. A cache requires signing, while an artifact never requires metadata.

Correct Answer: B. A cache accelerates future runs, while an artifact is a traceable output of a specific run.

Question 2

What is the safest default treatment of production secrets for code from an untrusted fork?

A. Expose them to all test jobs so the build is complete.

B. Store them in the source repository in encrypted text.

C. Do not expose them to the untrusted workflow.

D. Print them in masked logs for troubleshooting.

Correct Answer: C. Do not expose them to the untrusted workflow.

Question 3

If three independent jobs take 4, 7, and 10 minutes and unlimited runner capacity is available, what is the ideal parallel execution time, ignoring overhead?

A. 4 minutes

B. 7 minutes

C. 10 minutes

D. 21 minutes

Correct Answer: C. 10 minutes

Question 4

Which input is most appropriate for a dependency cache key?

A. The developer’s username only

B. The lock-file hash together with relevant platform and runtime information

C. The current wall-clock time only

D. A constant key shared by every project and operating system

Correct Answer: B. The lock-file hash together with relevant platform and runtime information

Question 5

What does the build-once principle require?

A. Rebuilding the application separately in every environment

B. Testing and promoting the same produced output

C. Skipping integration tests after compilation

D. Using an unversioned latest container tag

Correct Answer: B. Testing and promoting the same produced output

Question 6

Which response is most appropriate for a deterministic unit-test failure?

A. Retry indefinitely until it passes

B. Ignore it if the artifact was already created

C. Fix the change or test and retain the failure evidence

D. Replace the test with a manual approval

Correct Answer: C. Fix the change or test and retain the failure evidence

Question 7

What is a major security advantage of an ephemeral runner?

A. It permanently stores credentials for faster use.

B. It reduces residual workspace and credential contamination between jobs.

C. It allows all jobs to share unrestricted network access.

D. It removes the need to patch runner images.

Correct Answer: B. It reduces residual workspace and credential contamination between jobs.

Question 8

If a matrix has 2 operating systems, 3 runtime versions, and 2 database versions, with every combination selected, how many jobs are created?

A. 7

B. 10

C. 12

D. 18

Correct Answer: C. 12

Question 9

Which item is evidence of software supply-chain provenance?

A. An unlabelled temporary workspace

B. A record linking an artifact to its source revision and build process

C. A developer’s informal message

D. A cache hit without a lock file

Correct Answer: B. A record linking an artifact to its source revision and build process

Question 10

Why should unlimited immediate retries be avoided?

A. They always reduce infrastructure load.

B. They can hide defects and amplify correlated outages.

C. They prevent logs from being generated.

D. They make deterministic tests more accurate.

Correct Answer: B. They can hide defects and amplify correlated outages.

DevOps & CI/CD
Chapter 5 of 15