Provides access to the architecture, workflows, and build patterns for the NIC CI/CD system on GitHub Actions.
Install
mkdir -p .claude/skills/nic-ci-pipelines && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/10137" && unzip -o skill.zip -d .claude/skills/nic-ci-pipelines && rm skill.zipInstalls to .claude/skills/nic-ci-pipelines
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
CI/CD pipeline structure, GitHub Actions workflows, reusable workflow patterns, and matrix builds for NIC. Use when working on CI workflows, debugging build failures, adding new workflow steps, modifying build matrices, or understanding the release pipeline.Key capabilities
- →Debug CI build failures
- →Modify workflow steps
- →Adjust build matrices
- →Understand release pipelines
- →Manage reusable workflows
How it works
It provides context on the composition of reusable workflows, helping to debug failures and manage build matrices.
Inputs & outputs
When to use nic-ci-pipelines
- →Debugging a CI build failure
- →Adding a new step to the CI pipeline
- →Modifying the build matrix for new variants
About this skill
NIC CI/CD Pipelines
Repository Split -- read this first
Workflow files are shared between two repositories, and every job is gated on github.repository. The same file behaves differently depending on which repo runs it.
| Repository | Owns | Gate string |
|---|---|---|
nginx/kubernetes-ingress-internal | Release image and binary builds. Builds all OSS/Plus/NAP variants, stages them plus the Helm chart in the internal registry, signs binaries, uploads tarballs to Azure | github.repository == 'nginx/kubernetes-ingress-internal' |
nginx/kubernetes-ingress (public) | Publishing only. Pulls prepped images from the internal staging registry and pushes them to every public registry, publishes the Helm chart, certifies UBI images, opens the operator PR, tags and publishes the GitHub release | github.repository == 'nginx/kubernetes-ingress' |
Consequences:
release-prep.yml/release-prep-lts.ymlare internal-repo only. They are the only workflows that build release images. Dispatching them on the public repo is a no-op -- every job skips.release-publish.yml/release-publish-lts.ymlare public-repo only. They never rundocker build;oss-release.ymlandplus-release.ymlcopy image manifests withskopeofromsource_registry(defaultdocker-mgmt-test.nginx.com) to the public targets.- The public repo still builds images for PR/CI testing (
ci.yml->build-artifacts.yml) and again on merge (image-promotion.ymlcallsbuild-artifacts.ymlwithforce: truebefore taggingedge/stable). Both push to the GCR dev registry -- they are test artifacts, not release artifacts. - A publish failure is retryable on its own -- nothing needs rebuilding because the images already exist in the staging registry.
internal repo public repo
------------- -----------
release-prep.yml release-publish.yml
build-artifacts.yml oss-release.yml (skopeo copy)
push-prep-images --> docker-mgmt-test.nginx.com --> GCR / Docker Hub / ECR Public / Quay / GHCR / NGINX Registry
stage-helm-chart --> oci://docker-mgmt-test... --> publish-helm.yml (Helm repo + GHCR)
binaries (SBOM, Cosign) certify-openshift-images (Pyxis)
azure-upload --> Azure blob operator (dispatch nginx-ingress-helm-operator/sync-chart.yml)
release-gate -> tag -> release-assets -> github-release
Workflow Architecture
The CI system uses GitHub Actions with extensive reusable workflow composition.
ci.yml (main CI orchestrator) [public repo]
-> checks (format, lint, codegen, CRDs, chart version)
-> verify-codegen (go mod tidy, make update-crds, make update-codegen, make telemetry-schema -- all must produce no diff)
-> unit-tests, staticcheck, govulncheck
-> build-artifacts.yml (reusable) <- CI/test images only, pushed to GCR dev registry
-> build-oss.yml (per-variant, matrix)
-> build-plus.yml (per-variant, matrix) <- also used for NAP variants
-> package-tests, helm-tests
-> setup-smoke.yml (reusable)
-> smoke / e2e tests
image-promotion.yml (post-merge) [public repo]
-> build-artifacts.yml (force: true) <- rebuilds test images before promoting
-> tags images edge/stable
-> Trivy + DockerScout security scans
-> publishes edge Helm charts to GHCR
-> updates GitHub Release draft notes
release-prep.yml (dispatchable Stage 1: Creation) [INTERNAL repo only]
-> build-artifacts.yml (reusable) <- the only release image build
-> push-prep-images -> stages images in docker-mgmt-test.nginx.com
-> stage-helm-chart -> stages Helm chart in oci://docker-mgmt-test.nginx.com/nginx-ic/helm
-> binaries -> generates SBOM (Syft), signs (Cosign), creates tarballs
-> azure-upload -> uploads signed tarballs to Azure blob storage
release-publish.yml (dispatchable Stage 2: Publish) [PUBLIC repo only -- no builds]
-> oss-release.yml (skopeo copy from source_registry: docker-mgmt-test.nginx.com)
-> plus-release.yml (skopeo copy from source_registry: docker-mgmt-test.nginx.com)
-> publish-helm.yml (publishes Helm chart to Helm repo & GHCR)
-> certify-openshift-images (certifies UBI images on OpenShift / Pyxis)
-> operator -> dispatches nginx-ingress-helm-operator/sync-chart.yml to raise the operator PR
-> release-gate -> verifies all artifact publications succeed
-> tag -> creates and pushes the vX.Y.Z git tag
-> release-assets -> downloads tarballs from Azure and uploads to GitHub release draft
-> github-release -> closes milestone and publishes the GitHub release draft
Two-Stage Release Architecture
Release pipelines are split into two independently dispatchable stages that run in different repositories:
- Stage 1 (Prep / Creation) (
release-prep.yml/release-prep-lts.yml) -- runs innginx/kubernetes-ingress-internal:- Builds binaries and container images (the only place release images are built)
- Stages container images and Helm charts in the internal test registry (
docker-mgmt-test.nginx.com) - Generates Syft SBOMs, signs artifacts with Cosign, and uploads release tarballs to Azure blob storage
- Does not create git tags, publish public images, or publish the GitHub release
- Stage 2 (Publish) (
release-publish.yml/release-publish-lts.yml) -- runs innginx/kubernetes-ingress(public):- Copies prepped images from
docker-mgmt-test.nginx.comto public registries (GCR, Docker Hub, ECR Public, Quay, GHCR, NGINX Registry) plus the marketplace registries (GCR Marketplace, ECR Marketplace, Azure Marketplace) for Plus - Publishes public Helm charts and certifies UBI images on OpenShift
- Dispatches
sync-chart.ymlinnginx/nginx-ingress-helm-operatorto raise the operator PR (requires a non-emptyoperator_versioninput, otherwise the job skips) - Verifies all prerequisites via
release-gate - Creates and pushes the release git tag (
vX.Y.Zor<lts_version>) - Downloads signed binaries from Azure blob storage and attaches them to the GitHub release draft
- Closes the release milestone and publishes the GitHub release
- Copies prepped images from
Because the stages are decoupled and live in separate repos, a transient failure in publishing or external registry sync can be retried directly via release-publish.yml without rebuilding any images or binaries.
Key Workflows
Core CI & Testing
| Workflow | Trigger | Purpose |
|---|---|---|
ci.yml | PR to main/release-*, merge_group, workflow_dispatch | Main CI orchestrator: checks + build + test. Images built here are test images pushed to the GCR dev registry |
lint-format.yml | PR to main/release-*, merge_group | Format & lint checks (gofumpt, goimports, golangci-lint, actionlint, markdownlint, yamllint, workflow gating validation) |
regression.yml | Daily cron (03:00 UTC), manual dispatch | Multi-K8s-version regression matrix tests |
single-image-regression.yml | Manual dispatch | Runs Python e2e tests on a single image variant and K8s version |
build-base-images.yml | Weekday cron (04:30 UTC), manual, workflow_call | Rebuilds all base images (alpine, debian, ubi) |
build-ubi-dependency.yml | Push to main touching build/dependencies/Dockerfile.ubi10, manual | Builds the UBI dependency image published to ghcr.io/nginx/dependencies/nginx-ubi |
image-promotion.yml | Push to main/release-*, workflow_call | Rebuilds images via build-artifacts.yml (force: true), tags edge/stable, runs security scans, publishes GHCR edge chart |
Release Workflows
| Workflow | Repo | Trigger | Purpose |
|---|---|---|---|
release-prep.yml | internal | Manual dispatch | Stage 1: build artifacts, stage images and Helm chart in test registry (docker-mgmt-test.nginx.com), sign binaries, upload tarballs to Azure blob storage |
release-publish.yml | public | Manual dispatch | Stage 2: copy staged images to public registries, publish Helm chart, certify UBI images, dispatch operator sync PR, create git tag, upload release assets, close milestone, publish GitHub release |
release-prep-lts.yml | internal | Manual dispatch | LTS Stage 1: build LTS Plus images & binaries, stage in test registry, sign binaries, upload tarballs to Azure blob storage |
release-publish-lts.yml | public | Manual dispatch | LTS Stage 2: copy staged LTS Plus images to public registries, publish LTS Helm chart (nginx-ingress-lts), create git tag, attach release assets, close milestone, publish GitHub release |
oss-release.yml | public | Manual dispatch, workflow_call | Copies OSS images from staging registry to public registries via skopeo (called by release-publish.yml) |
plus-release.yml | public | Manual dispatch, workflow_call | Copies Plus/NAP images from staging registry to GCR, NGINX Registry and the GCR/ECR/Azure marketplaces via skopeo (called by release-publish.yml) |
plus-release-lts.yml | public | Manual dispatch, workflow_call | Copies LTS Plus images from staging registry to GCR and NGINX Registry (called by release-publish-lts.yml and update-docker-images.yml) |
publish-helm.yml | both | Manual dispatch, workflow_call | Packages and publishes Helm charts to OCI registries (GHCR, docker-mgmt-test) or the public Helm repo |
create-release-branch.yml | public | Manual dispatch | Creates a new release-X.Y branch and bumps versions |
release-pr.yml | public | Manual dispatch | Automates creation of release PRs for version updates and changelogs |
version-bump.yml | public | Manual dispatch | Bumps IC_VERSION and HELM_CHART_VERSION across the repository |
Reusable Build Workflows (called via workflow_call)
| Workflow | Purpose |
|---|
Content truncated.
When not to use it
- →Modifying repository secrets
Prerequisites
Limitations
- →Requires understanding of reusable workflow composition
How it compares
It offers deep insight into a complex, composition-heavy CI/CD architecture, rather than just general GitHub Actions help.
Compared to similar skills
nic-ci-pipelines side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| nic-ci-pipelines (this skill) | 0 | 4mo | No flags | Advanced |
| bazel-build-optimization | 14 | 4mo | No flags | Advanced |
| linkerd-patterns | 6 | 6mo | Review | Advanced |
| deployment-pipeline-design | 6 | 4mo | Review | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
bazel-build-optimization
wshobson
Optimize Bazel builds for large-scale monorepos. Use when configuring Bazel, implementing remote execution, or optimizing build performance for enterprise codebases.
linkerd-patterns
wshobson
Implement Linkerd service mesh patterns for lightweight, security-focused service mesh deployments. Use when setting up Linkerd, configuring traffic policies, or implementing zero-trust networking with minimal overhead.
deployment-pipeline-design
wshobson
Design multi-stage CI/CD pipelines with approval gates, security checks, and deployment orchestration. Use when architecting deployment workflows, setting up continuous delivery, or implementing GitOps practices.
k8s-helm
rohitg00
Manage Helm charts, releases, and repositories. Use for Helm installations, upgrades, rollbacks, chart development, and release management.
cloudflare-deploy
davila7
Deploy applications and infrastructure to Cloudflare using Workers, Pages, and related platform services. Use when the user asks to deploy, host, publish, or set up a project on Cloudflare.
gitlab-ci-patterns
wshobson
Build GitLab CI/CD pipelines with multi-stage workflows, caching, and distributed runners for scalable automation. Use when implementing GitLab CI/CD, optimizing pipeline performance, or setting up automated testing and deployment.