Senior DevOps Toolkit
maslennikov-ig/claude-code-orchestrator-kit
Comprehensive DevOps skill for CI/CD, infrastructure automation, containerization, and cloud platforms (AWS, GCP, Azure). Includes pipeline setup…
Explains how the NGINX Ingress Controller's GitHub Actions workflows, reusable workflows, build matrices and release pipeline fit together across two repositories.
$ npx skills add nginx/kubernetes-ingress --skill nic-ci-pipelines -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install nginx/kubernetes-ingress nic-ci-pipelines --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/nginx/kubernetes-ingress.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/skills/nic-ci-pipelines .claude/skills/nic-ci-pipelines && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "nic-ci-pipelines" agent skill from https://github.com/nginx/kubernetes-ingress/tree/main/.github/skills/nic-ci-pipelines into .claude/skills/nic-ci-pipelines/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nic-ci-pipelines", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/nginx/kubernetes-ingress/tree/main/.github/skills/nic-ci-pipelinesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add nginx/kubernetes-ingress --skill nic-ci-pipelines -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install nginx/kubernetes-ingress nic-ci-pipelines --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nginx/kubernetes-ingress.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.github/skills/nic-ci-pipelines .agents/skills/nic-ci-pipelines && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "nic-ci-pipelines" agent skill from https://github.com/nginx/kubernetes-ingress/tree/main/.github/skills/nic-ci-pipelines into .agents/skills/nic-ci-pipelines/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nic-ci-pipelines", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add nginx/kubernetes-ingress --skill nic-ci-pipelines -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install nginx/kubernetes-ingress nic-ci-pipelines --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nginx/kubernetes-ingress.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.github/skills/nic-ci-pipelines .cursor/skills/nic-ci-pipelines && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "nic-ci-pipelines" agent skill from https://github.com/nginx/kubernetes-ingress/tree/main/.github/skills/nic-ci-pipelines into .cursor/skills/nic-ci-pipelines/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nic-ci-pipelines", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/nginx/kubernetes-ingress.git --path .github/skills/nic-ci-pipelines--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add nginx/kubernetes-ingress --skill nic-ci-pipelines -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install nginx/kubernetes-ingress nic-ci-pipelines --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nginx/kubernetes-ingress.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.github/skills/nic-ci-pipelines .gemini/skills/nic-ci-pipelines && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "nic-ci-pipelines" agent skill from https://github.com/nginx/kubernetes-ingress/tree/main/.github/skills/nic-ci-pipelines into .gemini/skills/nic-ci-pipelines/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nic-ci-pipelines", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install nginx/kubernetes-ingress nic-ci-pipelinesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add nginx/kubernetes-ingress --skill nic-ci-pipelines -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/nginx/kubernetes-ingress.git skills-src && mkdir -p .github/skills && cp -r skills-src/.github/skills/nic-ci-pipelines .github/skills/nic-ci-pipelines && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "nic-ci-pipelines" agent skill from https://github.com/nginx/kubernetes-ingress/tree/main/.github/skills/nic-ci-pipelines into .github/skills/nic-ci-pipelines/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nic-ci-pipelines", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add nginx/kubernetes-ingress --skill nic-ci-pipelines -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install nginx/kubernetes-ingress nic-ci-pipelines --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nginx/kubernetes-ingress.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.github/skills/nic-ci-pipelines .opencode/skills/nic-ci-pipelines && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "nic-ci-pipelines" agent skill from https://github.com/nginx/kubernetes-ingress/tree/main/.github/skills/nic-ci-pipelines into .opencode/skills/nic-ci-pipelines/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nic-ci-pipelines", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
nic-ci-pipelinesExplains how the NGINX Ingress Controller's GitHub Actions workflows, reusable workflows, build matrices and release pipeline fit together across two repositories.
The skill documents CI/CD for the NGINX Ingress Controller. Its first point is that workflow files are shared between an internal repository and the public one, and every job is gated on `github.repository`. The internal repository builds release images and binaries and stages them, while the public repository only publishes: it copies images from the staging registry with `skopeo`, publishes the Helm chart, and tags and publishes the GitHub release.
The public repository still builds images for PR testing and again on merge, but those go to a dev registry and are test artifacts, not release artifacts. `ci.yml` is the main orchestrator, running checks for format, lint, codegen, CRDs and chart version, plus a codegen verification that must produce no diff. A publish failure can be retried on its own because the images already exist in staging. The skill also covers matrix builds and a two-stage release architecture.
2 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 29a1a36. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
makedockergoFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use docker, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
NGINX Ingress CI Pipelines loads about 5.1k tokens when it runs. Until then it costs about 69 tokens; SKILL.md has 1,953 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from nginx/kubernetes-ingress at commit 29a1a36, republished under its Apache-2.0 licence (© nginx). 1,953 words, ~5,081 tokens.
.claude/skills/nic-ci-pipelines/SKILL.md (or your agent's skills folder).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.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.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. 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-releaseThe 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 draftRelease pipelines are split into two independently dispatchable stages that run in different repositories:
release-prep.yml / release-prep-lts.yml) -- runs in nginx/kubernetes-ingress-internal:docker-mgmt-test.nginx.com)release-publish.yml / release-publish-lts.yml) -- runs in nginx/kubernetes-ingress (public):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 Plussync-chart.yml in nginx/nginx-ingress-helm-operator to raise the operator PR (requires a non-empty operator_version input, otherwise the job skips)release-gatevX.Y.Z or <lts_version>)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.
| 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 |
| 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 |
workflow_call)| Workflow | Purpose |
|---|---|
build-artifacts.yml | Orchestrates GoReleaser binary builds + multi-variant image build matrix |
build-oss.yml | Builds a single OSS image variant |
build-plus.yml | Builds a single Plus/NAP image variant (maps pkg-src-repo, pkg-src-waf, pkg-src-dos to docker build args) |
build-single-image.yml | Builds a single image variant on demand (manual dispatch) |
build-test-image.yml | Builds Python e2e test image (kic-test-image) |
setup-smoke.yml | Sets up Kind cluster and runs smoke tests |
patch-image.yml | OS-level security patches on existing images |
retag-images.yml | Re-tags images in GCR Dev Registry |
| Workflow | Trigger | Purpose |
|---|---|---|
codeql-analysis.yml | Push, PR, merge_group | GitHub CodeQL security analysis |
scorecards.yml | Weekly cron (Sun 20:43 UTC), push to main | OpenSSF Scorecards security scanning |
dependency-review.yml | PR to main/release-*, merge_group | GitHub Dependency Review for PRs |
certify-ubi-image.yml | Manual dispatch, called | Red Hat UBI certification for OpenShift (Pyxis) |
f5-cla.yml | PR target, issue comment | CLA Assistant check for PRs |
external-pr.yml | Issue comment | Triggers CI for external contributor PRs after review |
cherry-pick.yml | Issue comment (/cherry-pick) | Automated cherry-picking of PRs to release branches |
renovate-build.yml | PR (opened, synchronize) | CI validation for Renovate dependency updates |
update-release-draft.yml | Manual dispatch, push | Automatically updates GitHub Release draft release notes from PRs |
labeler.yml | pull_request_target | Applies PR labels from .github/labeler.yml config |
issues.yaml | Issue opened | Posts the triage acknowledgement comment |
| Workflow | Trigger | Purpose |
|---|---|---|
update-docker-images.yml | Weekly cron (Sun 01:00 UTC), manual | Rebuilds / updates Docker images with latest base packages |
update-docker-sha.yml | Manual dispatch | Updates pinned base image digests in Dockerfiles |
dockerhub-description.yml | Push to main | Updates description and README on Docker Hub |
cache-update.yml | Manual dispatch | Refreshes Go binary and image build caches |
pull-nap-images.yml | Manual dispatch | Pulls/syncs NAP images from internal registry |
stale.yml | Daily cron (01:30 UTC) | Closes stale issues and PRs |
Image variants and test configurations are defined in JSON under .github/data/:
The matrix-images-*.json rows use build_os / image / tag_suffix and are checked by .github/scripts/validate-image-matrices.sh. See docs/developer/image-matrices.md for the schema and the checklist for adding an image.
matrix-images-oss.json: debian, alpine, ubi (amd64 + arm64)matrix-images-plus.json: debian-plus, alpine-plus, alpine-plus-fips, ubi-10-plusmatrix-images-plus-lts.json: LTS Plus image definitionsmatrix-images-nap.json: WAF v4/v5, DoS, UBI 10 (amd64 only). WAF images appear twice -- the unsuffixed entry pins nginx-agent v2 and the -agent suffixed entry pins v3. DoS images package Agent v3 by default under standard tags (unsuffixed and -ubi) and do not have -agent variants.matrix-smoke-oss.json, matrix-smoke-plus.json, matrix-smoke-nap.json: Smoke test matricesmatrix-regression.json: Regression test matrix (K8s version combinations)patch-images.json, patch-images-lts.json: Patch image definitions for patch-image.ymlgo_code_md5 hash (computed in .github/scripts/variables.sh over all *.go, go.mod, go.sum, *.tmpl, version.txt)docker_md5 hash (computed over build/, .github/data/version.txt, internal/configs/njs, internal/configs/oidc)build_tag (t-<md5>) and stable_tag (s-<md5>) determine image freshnessdocs_only detection in variables.sh identifies PRs touching only docs (*.md, docs/**, examples/**) and skips expensive image builds and integration tests.forked_workflow variable gates authenticated operations. Forked PRs get local-only builds without secret access.group: ${{ github.ref_name }}-<suffix> with cancel-in-progress: true.release-prep.yml and release-publish.yml) share group: ${{ inputs.release_branch }}-release with cancel-in-progress: false to ensure a publish dispatch cannot overtake a prep in flight.release-prep-lts.yml and release-publish-lts.yml) share group: ${{ inputs.release_branch }}-release-lts with cancel-in-progress: false.nginx/ci-self-hosted/.github/actions/get-from-vault using OIDC / Workload Identity -- not stored directly as GitHub repository secrets.google-github-actions/auth)..github/data/version.txt contains IC_VERSION and HELM_CHART_VERSION.The verify-codegen job in ci.yml regenerates and then diffs a specific path -- it is not a repository-wide check. A PR that edits the source without committing the regenerated output in these paths will not merge:
| Command | Path diffed |
|---|---|
go mod tidy | go.mod, go.sum |
make update-crds | config/crd/bases |
make update-codegen | pkg/** |
make telemetry-schema | internal/telemetry |
Gaps to be aware of: make update-crds also rewrites deploy/crds*.yaml and docs/crd/, but neither path is diffed, so stale bundles merge silently. Snapshot golden files are not covered by verify-codegen either -- they fail in unit-tests instead.
release-prep*.yml is gated to nginx/kubernetes-ingress-internal; the public repo only copies manifests with skopeo. Never add a docker build step to a publish-stage workflowget-from-vault action.github/data/ must stay in sync with Makefile image targetslinux/amd64 only -- do not add arm64 to NAP matrices# renovate: comments -- do not update manuallyimage-promotion.yml runs on merge to main and release-*, not on PR -- don't expect images from PRs.github/config/config-* files must be listed in .github/scripts/exclude_ci_files.txt, otherwise they feed get_actions_md5() and invalidate stable_tag, forcing a full image rebuild.github/config/config-* files are shared between release-publish.yml, image-promotion.yml, regression.yml and update-docker-images.yml. Never add a SOURCE_*_IMAGE_PREFIX override to one -- the other callers read from the dev registry and would break. Override TARGET_* onlymirror-* workflow must be gated as github.repository == 'nginx/kubernetes-ingress' (or nginx/kubernetes-ingress-internal for internal-only jobs like prep) optionally followed by && ( ... ) with all extra conditions inside one balanced group. && binds tighter than ||, so an ungrouped chain like gate && (a) || (b) parses as (gate && (a)) || (b) and would run on a fork. Enforced by .github/scripts/validate-workflow-gating.sh (pre-commit + lint-format.yml); run it locally after editing any job's ifrelease-publish.yml (or vice versa) silently skips the job forever -- there is no error, just a permanently grey boxoperator job skips silently when operator_version is empty. If a release ships without an operator PR, check that input before assuming the dispatch failedif contains always(), !cancelled() or failure() runs even when a needs dependency failed. Such jobs must assert every dependency explicitly (needs.<job>.result == 'success'), which is why the release jobs list results one by oneskipped, and result == 'skipped' is usually an accepted arm. Assert the job that actually does the work (e.g. tag asserts release-gate, release-assets asserts variables)contains() is a substring match, not a token match. Never gate on a value that is a prefix of another job name: contains(skip_step, 'prep') also matches push-prep-images, and contains(skip_step, 'publish') also matches publish-helm-chartrelease-prep.yml and release-publish.yml share the <branch>-release concurrency group so a publish dispatch cannot overtake a prep still writing to the staging registry (likewise for LTS release workflows sharing <branch>-release-lts)copy-images.sh resolves SOURCE_REGISTRY/TARGET_REGISTRY after sourcing CONFIG_PATH, so an explicit positional argument beats the config file. Pass the source registry as $1; let the config own TARGET_REGISTRYgithub-release errors on a missing draft release before closing the milestone, so a green run guarantees a published release© nginx, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .github/skills/nic-ci-pipelines of nginx/kubernetes-ingress.
Open the folder on GitHubat commit 29a1a36
NGINX Ingress CI Pipelines next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| NGINX Ingress CI Pipelines this skillnginx/kubernetes-ingress | 5.1k | — | ~5.1k | Automated safety check: Pass | Apache-2.0 | |
| Senior DevOps Toolkitmaslennikov-ig/claude-code-orchestrator-kit | 260 | 6 repos | ~1.1k | Automated safety check: Notes | Custom licence | |
| CI CDEliasOulkadi/shokunin | 114 | — | ~3.4k | Automated safety check: Notes | MIT | |
| Devops EngineerYikai-Liao/symusic | 189 | 1 repos | ~1.5k | Automated safety check: Pass | MIT | |
| CI/CD Pipeline Principlesirahardianto/awesome-agv | 156 | — | ~2.7k | Automated safety check: Notes | MIT | |
| Devops Excellencemajiayu000/spellbook | 287 | — | ~2.4k | Automated safety check: Notes | MIT |
maslennikov-ig/claude-code-orchestrator-kit
Comprehensive DevOps skill for CI/CD, infrastructure automation, containerization, and cloud platforms (AWS, GCP, Azure). Includes pipeline setup…
EliasOulkadi/shokunin
Design CI/CD pipelines for GitHub Actions, GitLab CI, and CircleCI with matrix builds, test sharding, caching, Docker layer caching, OIDC auth, deployment strategies (rolling, blue-green, canary)…
Yikai-Liao/symusic
Creates Dockerfiles, configures CI/CD pipelines, writes Kubernetes manifests, and generates Terraform/Pulumi infrastructure templates.
irahardianto/awesome-agv
Rules for designing CI/CD pipelines in layers: universal lint, test and scan stages, container builds with SBOM attestation, and GitOps for orchestrated deployments.
majiayu000/spellbook
DevOps and CI/CD expert. An agent skill from majiayu000/spellbook.
yonatangross/orchestkit
A skill your agent uses when setting up CI/CD pipelines, containerizing applications, deploying to Kubernetes, or writing infrastructure as code.
nginx/kubernetes-ingress
Gives step-by-step checklists for adding Ingress annotations, VirtualServer fields and Helm values to the NGINX Kubernetes Ingress Controller, with common gotchas.
nginx/kubernetes-ingress
Step-by-step checklist for adding a new Policy CRD type to the NGINX Ingress Controller, from the Go types and validation to config generation and templates.
nginx/kubernetes-ingress
Explains the multi-stage Dockerfile, the 25 image variant combinations, and the Makefile targets for building NGINX Ingress Controller images.
nginx/kubernetes-ingress
Maps the NGINX Kubernetes Ingress Controller codebase: repository layout, architectural layers, layer-crossing rules and which files are generated.
nginx/kubernetes-ingress
Testing conventions for the NGINX Ingress Controller repo: Go table-driven tests, mandatory snapshot regeneration, Helm tests and Python pytest integration tests.
nginx/kubernetes-ingress
Troubleshooting patterns for the NGINX Ingress Controller: reload failures, custom resources that have no effect, controller panics and snapshot test failures.
Works with
Categories
Explains how the NGINX Ingress Controller's GitHub Actions workflows, reusable workflows, build matrices and release pipeline fit together across two repositories. The skill documents CI/CD for the NGINX Ingress Controller.repository`.
NGINX Ingress CI Pipelines fits situations like: debugging a failing NIC GitHub Actions workflow; adding a step or changing a build matrix in the CI workflows; working out which repository builds and which publishes a release.
Run `npx skills add nginx/kubernetes-ingress --skill nic-ci-pipelines -a claude-code`. Or copy the skill folder (.github/skills/nic-ci-pipelines in nginx/kubernetes-ingress) into .claude/skills/nic-ci-pipelines in your project. Claude Code loads it when a task matches its description.
Run `npx skills add nginx/kubernetes-ingress --skill nic-ci-pipelines -a codex`. Or copy the skill folder (.github/skills/nic-ci-pipelines in nginx/kubernetes-ingress) into .agents/skills/nic-ci-pipelines in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add nginx/kubernetes-ingress --skill nic-ci-pipelines -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/nic-ci-pipelines, .gemini/skills/nic-ci-pipelines, .github/skills/nic-ci-pipelines and .opencode/skills/nic-ci-pipelines in your project.
Going by SKILL.md and its folder, NGINX Ingress CI Pipelines needs the command-line tools its instructions call (make, docker and go).
SKILL.md contains no URLs. Its commands use docker, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
NGINX Ingress CI Pipelines is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.1k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with NGINX Ingress CI Pipelines: Senior DevOps Toolkit (maslennikov-ig/claude-code-orchestrator-kit, 260 stars), CI CD (EliasOulkadi/shokunin, 114 stars), Devops Engineer (Yikai-Liao/symusic, 189 stars) and CI/CD Pipeline Principles (irahardianto/awesome-agv, 156 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
nginx (a GitHub organization) maintains it in nginx/kubernetes-ingress, which has 5,081 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 10, 2026.
Source: nginx/kubernetes-ingress on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.