NI

nic-ci-pipelines

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.zip

Installs 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.
258 chars✓ has a “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Advanced

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

You give it
CI/CD workflow issue
You get back
Pipeline fix or explanation

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.

RepositoryOwnsGate string
nginx/kubernetes-ingress-internalRelease 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 Azuregithub.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 releasegithub.repository == 'nginx/kubernetes-ingress'

Consequences:

  • release-prep.yml / release-prep-lts.yml are 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.yml are public-repo only. They never run docker build; oss-release.yml and plus-release.yml copy image manifests with skopeo from source_registry (default docker-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.yml calls build-artifacts.yml with force: true before tagging edge/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:

  1. Stage 1 (Prep / Creation) (release-prep.yml / release-prep-lts.yml) -- runs in nginx/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
  2. Stage 2 (Publish) (release-publish.yml / release-publish-lts.yml) -- runs in nginx/kubernetes-ingress (public):
    • Copies prepped images from docker-mgmt-test.nginx.com to 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.yml in nginx/nginx-ingress-helm-operator to raise the operator PR (requires a non-empty operator_version input, otherwise the job skips)
    • Verifies all prerequisites via release-gate
    • Creates and pushes the release git tag (vX.Y.Z or <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

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

WorkflowTriggerPurpose
ci.ymlPR to main/release-*, merge_group, workflow_dispatchMain CI orchestrator: checks + build + test. Images built here are test images pushed to the GCR dev registry
lint-format.ymlPR to main/release-*, merge_groupFormat & lint checks (gofumpt, goimports, golangci-lint, actionlint, markdownlint, yamllint, workflow gating validation)
regression.ymlDaily cron (03:00 UTC), manual dispatchMulti-K8s-version regression matrix tests
single-image-regression.ymlManual dispatchRuns Python e2e tests on a single image variant and K8s version
build-base-images.ymlWeekday cron (04:30 UTC), manual, workflow_callRebuilds all base images (alpine, debian, ubi)
build-ubi-dependency.ymlPush to main touching build/dependencies/Dockerfile.ubi10, manualBuilds the UBI dependency image published to ghcr.io/nginx/dependencies/nginx-ubi
image-promotion.ymlPush to main/release-*, workflow_callRebuilds images via build-artifacts.yml (force: true), tags edge/stable, runs security scans, publishes GHCR edge chart

Release Workflows

WorkflowRepoTriggerPurpose
release-prep.ymlinternalManual dispatchStage 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.ymlpublicManual dispatchStage 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.ymlinternalManual dispatchLTS Stage 1: build LTS Plus images & binaries, stage in test registry, sign binaries, upload tarballs to Azure blob storage
release-publish-lts.ymlpublicManual dispatchLTS 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.ymlpublicManual dispatch, workflow_callCopies OSS images from staging registry to public registries via skopeo (called by release-publish.yml)
plus-release.ymlpublicManual dispatch, workflow_callCopies 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.ymlpublicManual dispatch, workflow_callCopies LTS Plus images from staging registry to GCR and NGINX Registry (called by release-publish-lts.yml and update-docker-images.yml)
publish-helm.ymlbothManual dispatch, workflow_callPackages and publishes Helm charts to OCI registries (GHCR, docker-mgmt-test) or the public Helm repo
create-release-branch.ymlpublicManual dispatchCreates a new release-X.Y branch and bumps versions
release-pr.ymlpublicManual dispatchAutomates creation of release PRs for version updates and changelogs
version-bump.ymlpublicManual dispatchBumps IC_VERSION and HELM_CHART_VERSION across the repository

Reusable Build Workflows (called via workflow_call)

WorkflowPurpose

Content truncated.

When not to use it

  • →Modifying repository secrets

Prerequisites

GitHub Actions

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.

SkillInstallsUpdatedSafetyDifficulty
nic-ci-pipelines (this skill)04moNo flagsAdvanced
bazel-build-optimization144moNo flagsAdvanced
linkerd-patterns66moReviewAdvanced
deployment-pipeline-design64moReviewAdvanced

Try saying

Example prompts that trigger this skill in your AI assistant.

Search skills

Search the agent skills registry