A reliable CI/CD pipeline gives a small team a repeatable way to move code from commit to production without relying on memory or last-minute heroics. This practical checklist covers pipeline design, automated tests, security checks, artifact promotion, pre-production validation, approvals, rollback planning, and the maintenance work that keeps delivery dependable as the system changes.
Overview
A CI/CD pipeline is more than a sequence of build commands. It is a set of controls that answers four operational questions:
- Can the change be built consistently?
- Does it meet the team’s quality and security expectations?
- Can the same tested artifact be promoted through each environment?
- Can the team detect and recover from a bad release?
For a small team, the best design is usually understandable, observable, and proportionate to the application’s risk. Start with a single source-control workflow and a small number of clearly defined stages. Add complexity only when it solves a demonstrated problem, such as long test times, multiple deployable services, regulated approval requirements, or a need for independent release schedules.
A practical pipeline commonly follows this path:
- A developer opens or updates a pull request.
- The pipeline validates formatting, compiles or packages the application, and runs automated tests.
- Security checks inspect dependencies, source code, configuration, and—where appropriate—the built image.
- A versioned artifact is stored in an artifact repository or container registry.
- The artifact is deployed to a development or pre-production environment.
- Smoke, integration, and acceptance checks run against the deployed version.
- An approved release is promoted to production using the same artifact.
- Post-release monitoring confirms that the service is healthy and usable.
Keep environment responsibilities explicit. If your team is uncertain about the differences between staging, pre-production, and production, review the environment strategy and promotion checklist before configuring deployment jobs.
Checklist by scenario
1. For every pull request
The pull-request pipeline should provide fast, useful feedback before code is merged. Confirm that it:
- Uses a defined runtime, operating system, and dependency-installation process.
- Checks formatting, linting, type safety, and other low-cost quality rules.
- Runs unit tests and reports failures in a location developers can easily inspect.
- Builds the application or package, rather than testing only individual files.
- Prevents merging when required checks fail.
- Uses a lockfile or equivalent mechanism to make dependency resolution repeatable.
- Stores logs and test reports long enough to investigate failures.
Keep this path focused. Expensive end-to-end tests can run after merge or in a separate validation stage if they make routine feedback too slow. The goal is not to run every possible check on every event; it is to place each check where it provides the most useful signal.
2. For the main branch
After a change is merged, the pipeline should produce a release candidate that can be traced back to source control. Verify that it:
- Records the commit identifier, branch, build number, and release metadata.
- Creates one immutable artifact, such as a package, binary, or container image.
- Publishes the artifact only after required tests and security checks pass.
- Separates build permissions from deployment permissions where practical.
- Prevents a later job from silently rebuilding different source code.
- Retains enough metadata to identify which source produced a deployed version.
For container-based systems, build the image once and promote that image across environments. The container image promotion workflow explains why rebuilding separately for pre-production and production can weaken traceability.
3. For deployment to pre-production
Pre-production should answer whether the release works in an environment that resembles production closely enough to expose meaningful problems. Before deployment, check that:
- Infrastructure and application configuration are managed through reviewed changes.
- Secrets come from an approved secret-management mechanism and are not printed in logs.
- Database migrations are ordered, repeatable, and compatible with the intended rollout.
- External dependencies are available, safely simulated, or intentionally stubbed.
- Smoke tests verify startup, health endpoints, authentication, and one critical user path.
- Test data is safe to use and does not contain unnecessary production information.
- Deployment logs identify the artifact, environment, and operator or automation run.
Use a consistent pre-production setup where possible. A documented golden path for pre-production environments can reduce differences between teams without forcing every service into an identical architecture.
4. For production release
A production job should be deliberately harder to trigger than a test job, but not so manual that the process becomes opaque. Define:
- Who can approve or initiate a production deployment.
- Which checks must pass before approval is available.
- Whether deployment uses a rolling, blue-green, canary, or simpler replacement strategy.
- How configuration differences are reviewed without changing the artifact.
- What health signals pause or stop the rollout.
- Where the release record, approval, and deployment result are stored.
For a high-risk launch window, use a release freeze review rather than relying on a generic approval button. The pre-production release freeze checklist can help the team confirm open defects, migrations, monitoring, support coverage, and rollback readiness.
5. For a failed deployment or rollback
Write the recovery path before the first incident. Confirm that the team can:
- Identify the last known-good artifact.
- Redeploy that artifact without rebuilding it.
- Restore or reverse an incompatible configuration change.
- Handle database migrations that cannot be automatically reversed.
- Disable a risky feature through a controlled flag or configuration change, if available.
- Verify service health after rollback.
- Record the decision, impact, and follow-up work.
Practice the procedure in a safe environment. The pre-production rollback and incident-response guide provides a useful framework for rehearsing failed releases before they become production emergencies.
What to double-check
Once the basic stages exist, review the boundaries between them. Most reliability problems come from unclear ownership or hidden assumptions rather than from a missing pipeline feature.
- Artifact identity: Confirm that the artifact tested in pre-production is exactly the one promoted to production. Use immutable tags or digests where supported.
- Secret handling: Check that secrets are injected at runtime, masked in logs, rotated through a documented process, and unavailable to jobs that do not need them.
- Permissions: Give pull-request jobs only the access they require. Treat deployment credentials as higher-risk than build credentials.
- Dependency controls: Review lockfiles, package sources, vulnerable dependency alerts, and the process for approving updates.
- Infrastructure changes: Run infrastructure-as-code validation and plan reviews before applying changes. Application delivery and infrastructure delivery may be separate pipelines, but their dependencies should be visible.
- Observability: Ensure each release can be connected to logs, metrics, traces, health checks, and alerts. A green deployment job does not prove that users are unaffected.
- Data compatibility: Use an expand-and-contract approach when application versions and database schemas must coexist during a rolling deployment.
- Queue and worker behavior: Consider background jobs, scheduled tasks, retries, and message formats, not only HTTP services.
- Cost and cleanup: Set retention rules for artifacts, test environments, logs, and temporary resources. Non-production resources should be right-sized without removing the capacity needed for realistic testing.
Security should be integrated rather than reserved for the final stage. A practical baseline may include dependency scanning, secret detection, static analysis, container or infrastructure checks, and a targeted dynamic test against pre-production. The appropriate checks depend on the application and threat model; the important point is that failures have an owner and a documented response. See the pre-production security scanning guide for a way to organize these controls.
Common mistakes
- Building different artifacts per environment: This makes it difficult to prove what was tested. Build once, then promote.
- Making every job blocking: A pipeline filled with slow or low-value gates encourages bypasses. Classify checks as required, advisory, or scheduled.
- Using production data in test environments by default: This creates privacy, security, and data-integrity risks. Use synthetic or minimized data unless a justified process says otherwise.
- Ignoring failed tests: A flaky test is still a delivery problem. Track it, assign ownership, and either fix, quarantine with a time limit, or remove it.
- Treating approval as a substitute for evidence: A person clicking approve cannot compensate for missing tests, weak monitoring, or an unknown artifact.
- Coupling unrelated services into one release: Release independently where the architecture allows it, and document unavoidable coordination points.
- Keeping rollback instructions in someone’s memory: If only one engineer knows how to recover a release, the process is not reliable enough.
- Measuring only pipeline duration: Also review failure rates, time to restore service, change-related incidents, queue time, and the proportion of releases requiring manual intervention.
When to revisit
Review the CI/CD pipeline before seasonal planning cycles, major product launches, infrastructure migrations, or changes to the team’s working agreements. Revisit it whenever the repository structure, deployment platform, cloud account layout, testing strategy, security requirements, or ownership model changes.
A lightweight quarterly review can ask:
- Which pipeline failures consumed the most engineering time?
- Which checks failed to catch problems before production?
- Can a new team member understand the release path without private documentation?
- Is the same artifact promoted through each environment?
- Has the rollback procedure been tested since the last major change?
- Are permissions, secrets, runners, dependencies, and action or plugin versions still maintained?
- Are pipeline costs and execution times still appropriate for the team?
End each review with a short action list: one reliability improvement, one security or access review, and one developer-experience improvement. This keeps the pipeline from becoming a neglected piece of infrastructure while avoiding unnecessary redesign.
For immediate use, copy the scenario headings into your team’s runbook. Mark each item as complete, not applicable, or needing an owner. Then run one low-risk release through the full path—from pull request to pre-production, approval, production deployment, monitoring, and rollback verification. That exercise will reveal more than a diagram alone and gives the team a dependable baseline for future changes.