Continuous Integration and Automation with DevOps

Chapter 3
Continuous Integration Architecture and Workflow

Diploma in Cloud Computing
Continuous Integration and Automation with DevOps   •   Diploma

Continuous Integration Architecture and Workflow

Introduction

Continuous integration (CI) is a software engineering practice in which developers integrate code changes into a shared repository frequently, while an automated system validates each change. Validation commonly includes compilation, unit testing, static analysis, security checks, packaging, and deployment to a temporary environment. CI is a central DevOps capability because it converts integration from an occasional, risky event into a routine, observable, and repeatable workflow.

A CI system is more than a script that runs tests. It is an architecture involving events, source control, workflow definitions, execution environments, jobs, stages, dependencies, artifacts, caches, parallelism, security controls, and status reporting. Good CI design reduces feedback time without weakening confidence in the software.

This chapter explains how these elements work together and how to select between hosted, self-hosted, and cloud-based CI services. The focus is practical: a diploma-level practitioner should be able to design a maintainable workflow, explain its execution, identify bottlenecks, and apply suitable governance controls.

Learning Objectives

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

  • explain the architecture and purpose of a CI system;
  • distinguish triggers, runners, agents, jobs, stages, steps, artifacts, and caches;
  • design workflows with dependencies, conditional execution, and status checks;
  • apply parallel and matrix execution appropriately;
  • compare hosted, self-hosted, and cloud CI services;
  • design a CI workflow for a realistic software project;
  • identify security, reliability, cost, and governance concerns; and
  • evaluate CI performance using meaningful delivery and operational measures.

1. The Role of Continuous Integration

In a traditional integration model, developers work independently for long periods and merge large changes near a release date. This creates integration risk: conflicts become difficult to resolve, failures are harder to attribute, and testing occurs too late to support rapid correction. CI addresses this problem by encouraging small changes, frequent integration, and automated verification.

A typical CI cycle is:

  1. A developer pushes a commit or opens a pull request.
  2. The source-control platform emits an event.
  3. A workflow is selected according to trigger rules.
  4. A runner or agent obtains the workflow and source code.
  5. Jobs execute commands such as building, testing, scanning, and packaging.
  6. Results, logs, artifacts, and status checks are reported.
  7. The team corrects failures before merging or releasing.

CI does not guarantee defect-free software. It provides rapid evidence about whether a change satisfies defined checks. The quality of that evidence depends on test design, environment consistency, data management, and the reliability of the pipeline itself.

Continuous Integration, Delivery, and Deployment

These terms are related but not identical:

  • Continuous integration validates frequent code integration.
  • Continuous delivery keeps software in a releasable state, usually with production deployment requiring an explicit decision or approval.
  • Continuous deployment automatically releases every change that passes the required controls.

A pipeline may implement CI without implementing delivery or deployment. This distinction is important because deployment introduces additional concerns such as environment promotion, approval, rollback, regulatory controls, and production access.

2. CI Architecture

A CI architecture normally contains the following logical components:

  • Source repository: stores application code, tests, configuration, and often the workflow definition.
  • Event and trigger service: detects commits, pull requests, schedules, tags, manual requests, or external events.
  • Workflow engine: interprets pipeline configuration and determines which jobs can run.
  • Runner or agent: executes commands in an isolated environment.
  • Artifact and cache storage: preserves outputs and reusable dependencies.
  • Result and status service: records logs, test results, approvals, and pass/fail status.
  • Credential and secret service: supplies controlled access to registries, cloud accounts, and other systems.
Continuous integration architecture Repositorycommit / PR Workflow enginetriggers and DAG Runner Abuild and unit test Runner Bintegration test Runner Csecurity scan Resultsstatus and logs
Continuous integration architecture showing repository, workflow engine, runners, storage and status checks
Figure: Continuous integration architecture showing repository, workflow engine, runners, storage and status checks

Figure: Logical architecture of a CI workflow.

The architecture is often represented as a directed acyclic graph (DAG). A directed edge indicates that one job must complete before another can begin. “Acyclic” means the workflow cannot contain a circular dependency; a job cannot ultimately depend on itself.

3. Core Workflow Elements

Triggers

A trigger defines when a workflow starts. Common triggers include:

  • a push to a branch;
  • a pull-request or merge-request event;
  • creation of a tag or release;
  • a scheduled interval;
  • a manual request;
  • completion of another workflow; and
  • an external webhook or API call.

Trigger selection should reflect risk and purpose. Pull requests commonly run fast validation and required status checks. Main-branch pushes may run broader tests and create artifacts. Release tags may initiate packaging and deployment workflows. Scheduled workflows are useful for dependency updates, long-running security scans, and testing against external services.

Poorly designed triggers create unnecessary cost or missing evidence. For example, running an expensive full-system test on every documentation change may waste capacity, while running no validation for changes to a shared library creates avoidable risk. Path filters, branch filters, and change-impact analysis can improve trigger precision, but filters must be reviewed carefully because an incorrect filter can silently omit necessary tests.

Workflow, stages, jobs, and steps

A workflow is the complete automation definition. A stage is a conceptual phase such as validation, packaging, or deployment. A job is an execution unit assigned to one runner, and a step is an individual command or reusable action inside a job.

The exact meaning of “stage” varies by CI product. Some systems treat stages as visual groups; others enforce sequential stage boundaries. Jobs within the same stage may run in parallel, while later stages normally wait for required earlier jobs. A carefully designed workflow uses stages for communication and jobs for scheduling.

Example phases are:

  1. preparation and dependency installation;
  2. fast feedback, including linting and unit tests;
  3. broader integration and end-to-end testing;
  4. packaging and artifact publication; and
  5. optional release or deployment.

A job should have a coherent purpose and a predictable environment. Overly large jobs are difficult to retry and diagnose. Excessively small jobs can create scheduling overhead and repeated setup work.

Runners and agents

A runner or agent is the compute environment that executes a job. It may be a virtual machine, container, physical host, or Kubernetes-based worker. Runners can be:

  • hosted: provisioned and operated by the CI provider;
  • self-hosted: operated by the organisation on its own infrastructure; or
  • ephemeral cloud workers: created for a job and destroyed afterward, often through a cloud service or autoscaling controller.

A runner has an operating system, CPU architecture, installed tools, network access, credentials, and resource limits. Workflows should declare these requirements explicitly where possible. A build that depends on an undocumented tool installed manually on one host is not reproducible.

Persistent runners may be faster because dependencies remain available, but they risk state leakage between jobs. Ephemeral runners improve isolation and repeatability but may incur startup time and image-maintenance costs. Sensitive workloads should use least-privilege credentials, restricted network access, and strong cleanup procedures.

Dependencies and artifacts

A dependency is an input required to build or test software, such as a library, package, compiler, container image, or service. An artifact is an output produced by a job and retained for later use, such as a binary, test report, coverage report, deployment bundle, or container metadata.

Artifacts provide a controlled hand-off between jobs. A packaging job should consume the tested source or build output rather than silently rebuilding different source later. Artifact retention should reflect operational and legal needs: logs and reports may need longer retention than temporary binaries.

Caching

A cache stores reusable inputs to reduce repeated work. Examples include package-manager downloads, compiler intermediates, Docker layers, and dependency indexes. A cache is an optimisation, not the authoritative source of correctness. A job must still be able to run successfully when its cache is empty or unavailable.

A robust cache key reflects all inputs that affect the cached content, such as operating system, architecture, language version, lockfile hash, and dependency-manager version. A conceptual key might be expressed as:

cache\key = platform + toolchain\version + hash(lockfile)

This is a design expression rather than a universal product syntax. If the lockfile changes, the key should normally change. Restoring an older cache can be useful, but the workflow must verify that dependencies are installed according to the lockfile rather than trusting cached contents blindly.

Caches can introduce stale results, excessive storage use, or security risks. Never place secrets in a shared cache. Avoid sharing writable caches between untrusted branches, because a malicious change could poison cached tools or dependencies.

4. Dependencies, Parallelism, and Scheduling

A workflow should run independent work concurrently and preserve ordering where one job requires another. For example, linting, unit tests, and static analysis may begin after checkout and dependency preparation. Packaging should wait for required validation. Deployment should wait for packaging, approval, and policy checks.

Parallel execution reduces elapsed time but does not remove total work. If independent jobs have durations t1, t2, ..., tn, their ideal parallel elapsed time is approximately:

Tparallel ≈ max(t1, t2, …, tn) + Toverhead

Here, Tparallel is elapsed workflow time, ti is the duration of job i, and Toverhead includes scheduling, setup, artifact transfer, and coordination. The approximation assumes sufficient runners and no resource contention. Sequential execution would take approximately:

Tsequential ≈ ∑ᵢ₌₁ⁿ ti + Toverhead

These expressions are planning models, not guarantees. A workflow is limited by its critical path: the longest chain of dependent jobs. Adding runners does not shorten a serial critical path unless the dependency structure is redesigned.

Matrix execution

Matrix execution runs the same job across combinations of variables, such as language versions, operating systems, database versions, or CPU architectures. It improves coverage but multiplies compute demand. A matrix with 3 operating systems and 2 language versions creates 6 combinations before additional dimensions are considered.

Matrix design should be purposeful. Test the full matrix on scheduled or release workflows if cost is high, and test a representative subset on every pull request. Fail-fast behaviour can stop remaining combinations after an early failure, while complete execution provides more diagnostic information.

Conditions and status checks

Conditions allow jobs or steps to run only when specified criteria are satisfied, such as a branch name, changed path, event type, or previous result. Status checks communicate whether required controls passed. A protected branch may require successful unit tests, security scanning, and review approval before accepting a merge.

A status check should be:

  • deterministic enough to support a clear decision;
  • named clearly;
  • associated with the relevant commit or pull request;
  • protected against accidental bypass; and
  • backed by accessible logs and reports.

A workflow should distinguish a genuine failure from an intentionally skipped job. Treating every skip as success can create a governance gap; treating every skip as failure can block legitimate changes. The policy must define acceptable conditions explicitly.

5. Designing a CI Workflow

A useful design process is as follows.

Step 1: Identify change types and quality risks

List the technologies, build outputs, interfaces, and failure modes. A web service may require compilation, unit tests, API tests, container scanning, and infrastructure validation. Documentation-only changes may need link and spelling checks but not a full integration environment.

Step 2: Define the trust boundary

Determine which code can execute with which privileges. Pull requests from external contributors should not automatically receive production credentials. Separate untrusted validation from trusted release jobs. Use short-lived credentials and workload identity where supported.

Step 3: Establish a fast feedback path

Run inexpensive, high-value checks early. Developers benefit more from a reliable five-minute result than from a theoretically complete test suite that takes two hours and frequently flakes.

Step 4: Define the dependency graph

Document which jobs require which outputs. Avoid accidental dependencies caused by shared workspaces or implicit files on persistent runners. Pass data through explicit artifacts or declared outputs.

Step 5: Select runner environments

Choose hosted or self-hosted execution according to operating-system requirements, network access, performance, compliance, and cost. Pin important tool versions and define the environment as code where practical.

Step 6: Add caching carefully

Cache downloads and reusable intermediates using keys derived from relevant inputs. Measure whether the cache improves elapsed time; a cache that is frequently invalidated may add complexity without benefit.

Step 7: Add protection and observability

Require appropriate status checks, retain useful reports, redact secrets from logs, and record workflow duration, failure cause, queue time, and resource consumption.

6. Illustrative Workflow Design

Consider a Java-based web service stored in a Git repository. The team uses pull requests for review and protects the main branch. The service is built into a container image and deployed separately by a release process.

A suitable workflow is:

StageJobMain responsibilityDependency
Validatestyleformatting and lint checkscheckout
Validateunitunit tests and coveragecheckout, dependencies
Validatestatic-securitystatic analysis and dependency scancheckout
VerifyintegrationAPI tests using a temporary databasestyle, unit
Packageimagebuild and scan container imagestyle, unit, static-security, integration
Reportstatuspublish reports and final resultall required jobs

The style, unit, and static-security jobs can run in parallel after checkout and dependency preparation. The integration job waits for the application build and starts a temporary database service. The image job consumes the tested revision and produces a versioned artifact. The workflow reports a required status to the protected branch.

A simplified sequence is:

  • On a pull request, run validation and integration tests.
  • On a main-branch push, run the same checks and publish a non-production image.
  • On a release tag, run the release workflow only after required checks have passed.
  • On a nightly schedule, run the complete compatibility matrix and deeper security checks.

This structure separates evidence generation from release authority. Passing a pull-request workflow demonstrates that specified checks passed; it does not itself grant permission to deploy to production.

7. Hosted, Self-Hosted, and Cloud CI Services

The terms overlap in the marketplace, so classification should focus on control and operating responsibility.

ModelProvider operatesOrganisation operatesStrengthsLimitations
Hosted CIcontrol plane and runnersworkflow and project policyquick start, low maintenanceless infrastructure control, provider limits
Self-hosted CIoften control software or subscriptionrunners, network, patching, securitycustom tools, private networks, hardware controloperational burden and security responsibility
Cloud-integrated CICI service and cloud execution integrationworkflow, identity, cloud policyelastic capacity, cloud-native identity and servicescloud dependence, cost variation, configuration complexity

Hosted runners are attractive for small teams and standard platforms. Self-hosted runners are useful when builds require private networks, licensed tools, specialised hardware, or strict data residency. Cloud-integrated approaches support elasticity and infrastructure-as-code but require careful identity and cost management.

Selection criteria include:

  • supported source-control systems and workflow syntax;
  • operating systems, architectures, and toolchains;
  • concurrency limits and queue behaviour;
  • secret management and identity integration;
  • network isolation and private connectivity;
  • audit logs and compliance evidence;
  • artifact and cache retention;
  • availability and support arrangements;
  • migration and portability; and
  • total cost, including engineering administration.

The cheapest advertised runner price is not the total cost. A self-hosted platform may avoid per-minute charges but require staff time for patching, monitoring, incident response, capacity planning, and hardware replacement.

8. Reliability, Performance, and Quality Measures

CI should be measured as an engineering service. Useful measures include:

  • queue time: time waiting for an available runner;
  • execution time: time spent running jobs;
  • feedback time: time from event creation to a usable result;
  • success rate: proportion of runs that complete successfully;
  • flaky-test rate: proportion of failures caused by nondeterministic tests;
  • cache hit rate: proportion of cache requests served successfully;
  • artifact availability: whether required outputs are retained and accessible; and
  • change-related measures: lead time, deployment frequency, change failure rate, and recovery time.

A successful run is not necessarily a good run. A pipeline that passes by skipping tests is worse than one that fails transparently. Similarly, increasing parallelism may reduce feedback time while increasing cost and runner contention. Teams should examine both speed and confidence.

Flaky tests deserve special treatment. Re-running failures automatically may reduce noise, but unlimited retries hide instability. The preferred approach is to identify, isolate, repair, and monitor flaky tests. A retry policy should record that a retry occurred rather than presenting the result as an ordinary pass.

9. Security, Governance, and Ethical Considerations

CI executes code automatically, so the pipeline is part of the organisation’s attack surface. Important controls include:

  • protect workflow definitions and branch policies;
  • apply least privilege to runner identities;
  • use short-lived credentials where possible;
  • separate secrets from source code and logs;
  • restrict untrusted pull requests from privileged environments;
  • pin or verify third-party actions and build images;
  • scan dependencies and container images;
  • maintain audit logs for changes and approvals;
  • patch self-hosted runners promptly; and
  • destroy or clean ephemeral environments after use.

Supply-chain security is especially important because a compromised dependency, action, plugin, or base image can affect every build. Build provenance, signed artifacts, dependency lockfiles, and software bills of materials can improve traceability, although they do not replace review and vulnerability management.

Ethically, teams should avoid designing automation that obscures responsibility. A green status must be meaningful, and exceptions should be visible. Security scans should not collect unnecessary personal information, and test data should be anonymised when it represents customers or employees. Governance should balance protection with developer productivity; excessive gates encourage workarounds and weaken the system’s legitimacy.

10. Contemporary Developments and AI-Assisted CI

Modern CI systems increasingly use ephemeral containers, autoscaling runner pools, reusable workflow components, remote build caches, policy-as-code, and software supply-chain attestations. These features can improve consistency and scale, but each adds configuration and operational dependencies.

AI-assisted tools may generate tests, summarise failures, suggest workflow changes, or identify probable causes from logs. They can improve triage speed, but generated code and recommendations require human review. AI systems may expose secrets through prompts or logs, produce incorrect diagnoses, or encourage unsafe changes. A sound policy prohibits sending confidential source, credentials, or personal data to an unapproved service and requires validation of generated workflow configuration.

11. Challenges and Limitations

CI has several limitations:

  1. Incomplete tests: passing checks can miss untested behaviours.
  2. Flaky infrastructure: network services, clocks, external APIs, and shared environments can produce nondeterministic results.
  3. Pipeline complexity: many jobs and exceptions make behaviour difficult to understand.
  4. Slow feedback: large suites and serial dependencies reduce developer productivity.
  5. False confidence: a green pipeline may validate only a narrow set of assumptions.
  6. Cost growth: matrix builds, high concurrency, artifact retention, and frequent runs consume resources.
  7. Tool dependence: proprietary workflow syntax can make migration difficult.

These limitations call for incremental design. Start with a small reliable pipeline, measure it, improve test quality, and add controls when a demonstrated risk justifies them.

Applied Case: Northstar Retail Service

Background

Northstar Retail, an illustrative medium-sized organisation, maintains a Python API and a web client. Developers previously merged code after informal local testing. Releases were delayed by environment differences and late integration failures.

Problem

The organisation needed pull-request feedback within approximately ten minutes, consistent builds, and evidence that production candidates had passed security and integration checks. The team had a private database network that could not be exposed to a public runner.

Analysis

The team measured an average of 18 minutes of serial validation, with repeated dependency downloads accounting for four minutes. Integration tests required the private database. A review also found that a persistent build host contained credentials in local configuration files.

Approach and solution

The team adopted hosted runners for linting, unit tests, and dependency scanning, and a restricted self-hosted ephemeral runner for integration tests. Credentials were moved to a managed secret store and issued only to the integration job. The workflow was divided into parallel validation jobs followed by integration and packaging jobs. Dependencies were cached using a key based on the operating system, Python version, and lockfile hash. The main branch required successful style, unit, security, and integration status checks.

The container image was built once after validation and passed as an artifact to the release workflow. The release workflow required a signed tag and approval, rather than automatically deploying every pull request.

Outcome

The average pull-request feedback time fell because independent checks ran concurrently and dependency downloads were reduced. More importantly, the team gained consistent logs, explicit status checks, and removal of long-lived credentials from the build host. The private runner remained a responsibility: it required patching, monitoring, capacity planning, and network-control review.

Learning points

  • Parallelism is effective only when dependencies are explicit.
  • Caching improves speed but must not be treated as a trust boundary.
  • Hosted and self-hosted execution can be combined according to workload risk.
  • A release artifact should be traceable to the validated source revision.
  • Security and operational ownership continue after the first successful pipeline.

Best-Practice Checklist

Before adopting a CI workflow, verify that:

  • triggers match change types and branch policy;
  • jobs have clear responsibilities and explicit dependencies;
  • fast, high-value checks run early;
  • independent jobs run in parallel where capacity permits;
  • runner environments are reproducible and appropriately isolated;
  • caches are keyed by relevant inputs and contain no secrets;
  • artifacts are versioned, retained, and traceable;
  • required status checks cannot be bypassed casually;
  • logs and reports are useful without exposing sensitive data;
  • failures and flaky tests are actively managed; and
  • cost, security, compliance, and operational ownership are documented.

Chapter Summary

Continuous integration is an architectural and organisational practice for integrating changes frequently and validating them automatically. Its workflow consists of triggers, a workflow engine, runners or agents, jobs, steps, dependencies, artifacts, caches, and status reporting. A workflow is commonly modelled as a directed acyclic graph: independent jobs can run in parallel, while dependent jobs must wait for required outputs.

Effective CI design begins with risk analysis and a clear trust boundary. Fast checks should provide early feedback, while broader integration, security, packaging, and release controls should be added according to purpose. Caching can reduce repeated work but must be reproducible, correctly keyed, and treated as an optimisation rather than an authority. Hosted, self-hosted, and cloud-integrated services differ mainly in control, operational responsibility, network access, elasticity, and cost.

Reliable CI requires more than a green result. Teams must manage flaky tests, queue time, runner security, credentials, artifact traceability, supply-chain risks, and governance. A well-designed pipeline makes quality evidence visible, limits privilege, supports rapid correction, and remains understandable as the software system evolves.

Key Terms

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

Workflow: The complete definition of events, jobs, conditions, and execution logic.

Trigger: An event or condition that starts a workflow.

Runner: An environment that executes CI jobs.

Agent: Another term for a CI execution worker.

Job: A group of steps executed in one runner environment.

Step: An individual command or reusable action within a job.

Stage: A conceptual or enforced phase containing one or more jobs.

Dependency: An input or prerequisite required by a job.

Artifact: A retained output produced by a workflow job.

Cache: Reusable stored data intended to reduce repeated computation or downloads.

Directed acyclic graph: A dependency graph with directed relationships and no cycles.

Matrix build: Repeated execution across combinations of platforms, versions, or configurations.

Status check: A recorded pass, fail, or defined result associated with a change.

Hosted runner: A runner provisioned and operated by a CI provider.

Self-hosted runner: A runner operated and maintained by the organisation using it.

Ephemeral environment: A temporary execution environment created for a limited task and then removed.

Critical path: The longest dependency chain determining minimum workflow duration.

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

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

Review Questions

Short Answer Questions

  1. What is the main purpose of continuous integration?
  2. Distinguish a job from a step in a CI workflow.
  3. Why is a cache considered an optimisation rather than an authority?
  4. What is a status check, and how is it used in branch protection?
  5. State one important difference between a hosted and a self-hosted runner.

Long Answer Questions

  1. Explain the main components of a CI architecture and describe how data moves between them.
  2. Discuss how dependencies and parallel execution influence CI workflow duration and reliability.
  3. Compare hosted, self-hosted, and cloud-integrated CI services using security, cost, control, and operational criteria.
  4. Explain how triggers, stages, jobs, artifacts, and status checks can be combined to support pull-request validation and release control.
  5. Describe the security risks of CI systems and propose appropriate controls for credentials, runners, dependencies, and logs.

Analytical / Application Questions

  1. Design a CI workflow for a containerised web application that requires linting, unit tests, integration tests, image scanning, and packaging. Identify the jobs that can run in parallel and the dependencies that must remain sequential.
  2. A workflow contains three independent jobs lasting 4, 6, and 8 minutes, followed by a packaging job lasting 3 minutes. Ignoring setup and transfer overhead, estimate the elapsed time when the first three jobs run in parallel and compare it with sequential execution.
  3. An organisation is deciding whether to use hosted runners or self-hosted runners for tests that require a private database and licensed software. Analyse the decision using network access, security, maintenance, cost, and scalability criteria.

Multiple Choice Questions with Answers

Question 1

Which event most commonly starts CI validation for a proposed code change?

A. A pull-request creation or update

B. Deletion of an unrelated cache

C. A user changing a desktop wallpaper

D. A database backup expiring

Correct Answer: A. A pull-request creation or update

Question 2

What is the primary role of a CI runner?

A. To approve all production deployments

B. To execute workflow commands in a defined environment

C. To replace the source-code repository

D. To permanently store every dependency

Correct Answer: B. To execute workflow commands in a defined environment

Question 3

Which statement about CI caches is correct?

A. A cache must contain production credentials to be useful

B. A cache replaces lockfiles and dependency verification

C. A cache is an optimisation and should not be required for correctness

D. A cache always makes a workflow faster

Correct Answer: C. A cache is an optimisation and should not be required for correctness

Question 4

A workflow has three independent jobs lasting 4, 6, and 8 minutes. Ignoring overhead, what is their parallel elapsed time?

A. 6 minutes

B. 8 minutes

C. 18 minutes

D. 24 minutes

Correct Answer: B. 8 minutes

Question 5

What does a matrix build do?

A. Runs a job across selected combinations of variables

B. Deletes all previous workflow results

C. Forces every job to run sequentially

D. Converts a hosted runner into a physical server

Correct Answer: A. Runs a job across selected combinations of variables

Question 6

Which job dependency is most appropriate?

A. Deploy before testing

B. Package before source checkout

C. Integration test after required build and validation outputs

D. Security scanning only after production deployment

Correct Answer: C. Integration test after required build and validation outputs

Question 7

What is a major advantage of an ephemeral runner?

A. It preserves all state indefinitely

B. It improves isolation by being created for limited use

C. It eliminates the need for workflow configuration

D. It automatically makes tests deterministic

Correct Answer: B. It improves isolation by being created for limited use

Question 8

Which control best protects secrets in CI?

A. Writing them directly into the repository

B. Printing them in diagnostic logs

C. Using managed secrets and least-privilege access

D. Sharing one permanent administrator token with all jobs

Correct Answer: C. Using managed secrets and least-privilege access

Question 9

What does a required status check provide?

A. Evidence that specified validation passed before a protected merge

B. A guarantee that the application has no defects

C. A replacement for code review in every organisation

D. Permission for any user to deploy to production

Correct Answer: A. Evidence that specified validation passed before a protected merge

Question 10

Which situation most strongly supports using a self-hosted runner?

A. A standard lint job with no special requirements

B. A job requiring access to a private network and specialised licensed software

C. A documentation check that runs once per month

D. A workflow that has no source code

Correct Answer: B. A job requiring access to a private network and specialised licensed software

Continuous Integration and Automation with DevOps
Chapter 3 of 15