gitlab-ci-generator — скилл для Claude Code: сборка .gitlab-ci.yml
Скилл генерирует и дописывает .gitlab-ci.yml: стадии, джобы, шаблоны. Пригодится, когда пайплайн нужно собрать с нуля или расширить.
npx skills add akin-ozer/cc-devops-skills --skill gitlab-ci-generator -a claude-codeЧто делает gitlab-ci-generator
Скилл берёт запрос вида «сделай пайплайн для Node» и выдаёт готовый .gitlab-ci.yml — со стадиями, джобами и настройками под текущие практики GitLab. Сначала он оценивает сложность запроса и выбирает один из трёх режимов: targeted для правки или вопроса по куску файла, lightweight для простого однофайлового пайплайна, full для мультисредовых деплоев, includes, сложных rules и всего, что связано с безопасностью. Если непонятно, какой режим брать, скилл уходит в full.
Внутри — набор справочников и шаблонов. Для полной генерации он читает references/best-practices.md и references/common-patterns.md, затем берёт подходящий шаблон из assets/templates/: docker-build.yml, kubernetes-deploy.yml, multi-project.yml или basic-pipeline.yml. В режиме full добавляются references/gitlab-ci-reference.md и references/security-guidelines.md. Готовый пайплайн прогоняется через скилл devops-skills:gitlab-ci-validator со строгими порогами по Critical и High.
Перед генерацией скилл обязан показать блок подтверждения с выбранным паттерном, шаблоном и стандартами. Пропустить этот шаг нельзя — если ответа нет, генерация не начнётся. Ещё один момент: если нужного справочника или шаблона нет на месте, скилл сообщит точный путь и продолжит на том, что осталось, помечая допущения. Так что проверьте, что репозиторий скиллов склонирован целиком, иначе часть пайплайна соберётся на догадках.
Какие задачи решает
- собрать
.gitlab-ci.ymlс нуля под конкретный стек - добавить сборку Docker-образа и деплой в Kubernetes
- настроить parent-child или multi-project пайплайн
- подключить шаблоны SAST и сканирования зависимостей
- переписать устаревшие
only/exceptнаrules
Примеры запросов агенту
- Создай
.gitlab-ci.ymlдля Python-сервиса: тесты, сборка образа, деплой в staging и production - Добавь в GitLab CI джобы сборки Docker и выката в Kubernetes через kubectl
- Настрой multi-project пайплайн и подключи шаблон dependency scanning
Как установить gitlab-ci-generator
1Через Skills CLI (Vercel)
npx skills add akin-ozer/cc-devops-skills --skill gitlab-ci-generator -a claude-code2Вручную: положить файлы
~/.claude/skills/gitlab-ci-generator/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/gitlab-ci-generator/
1Через Skills CLI (Vercel)
npx skills add akin-ozer/cc-devops-skills --skill gitlab-ci-generator -a codex2Вручную: положить файлы
.agents/skills/gitlab-ci-generator/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add akin-ozer/cc-devops-skills --skill gitlab-ci-generator -a cursor2Вручную: положить файлы
.cursor/skills/gitlab-ci-generator/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install akin-ozer/cc-devops-skills gitlab-ci-generator2Вручную: положить файлы
.github/skills/gitlab-ci-generator/SKILL.md1Через Skills CLI (Vercel)
npx skills add akin-ozer/cc-devops-skills --skill gitlab-ci-generator -a gemini-cli2Командой платформы
gemini skills install https://github.com/akin-ozer/cc-devops-skills --path devops-skills-plugin/skills/gitlab-ci-generatorВручную: положить файлы
.devin/skills/gitlab-ci-generator/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add akin-ozer/cc-devops-skills --skill gitlab-ci-generator -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о gitlab-ci-generator
Как установить gitlab-ci-generator в Claude?
Выполните npx skills add akin-ozer/cc-devops-skills --skill gitlab-ci-generator -a claude-code. После этого файл скилла лежит в ~/.claude/skills/gitlab-ci-generator/SKILL.md.
Что делает gitlab-ci-generator?
Генерирует и дописывает конфигурации GitLab CI/CD: стадии, джобы, шаблоны. Готовый пайплайн проверяется скиллом devops-skills:gitlab-ci-validator.
На каких платформах работает скилл?
Кроме Claude есть установка для Codex, Cursor, GitHub Copilot, Gemini CLI и OpenCode. Для каждой платформы своя команда и свой путь к SKILL.md.
Исходный текст
SKILL.md · Apache-2.0
---
name: gitlab-ci-generator
description: Create, generate, or scaffold .gitlab-ci.yml pipelines, stages, and jobs.
---
# GitLab CI/CD Pipeline Generator
## Overview
Generate production-ready GitLab CI/CD pipeline configurations following current best practices, security standards, and naming conventions. All generated resources are automatically validated using the devops-skills:gitlab-ci-validator skill to ensure syntax correctness and compliance with best practices.
---
## Trigger Phrases
Use this skill when the user asks for GitLab CI/CD generation requests such as:
- "Create a `.gitlab-ci.yml` for..."
- "Build a GitLab pipeline for Node/Python/Java..."
- "Add Docker build and deploy jobs in GitLab CI"
- "Set up GitLab parent-child or multi-project pipelines"
- "Include SAST/dependency scanning templates in GitLab CI"
## Execution Model
Follow this deterministic flow in order:
1. Classify request complexity (`targeted`, `lightweight`, or `full`).
2. Load only the required reference tier for that complexity.
3. Output the matching response profile for the selected mode.
4. For complete pipeline generation, start from the closest template and customize.
5. Validate complete pipelines with strict Critical/High gates.
6. Present output with validation status and template/version notes.
If tooling is unavailable, use the documented fallback branch and report it explicitly.
## Mode Routing (Quick Decision)
| Request shape | Mode | Required references | Output profile |
|---------------|------|---------------------|----------------|
| Simple single-file pipeline with common jobs/stages and low risk | **Lightweight** | Tier 1 (+ Tier 2 only if needed) | Lightweight confirmation + compact final sections |
| Multi-environment deploy, advanced `rules`, includes/templates, security/compliance-sensitive workflow, or unclear/risky requirement | **Full** | Tier 1 + Tier 2 (Tier 3 only if needed) | Full confirmation + full final sections |
| Review/Q&A/snippet/focused fix (not full file generation) | **Targeted** | Only directly relevant files | Concise targeted response (no full boilerplate) |
When uncertain on a complete-generation request, route to **Full** mode.
## MANDATORY PRE-GENERATION STEPS
**CRITICAL:** Before generating any complete GitLab CI/CD pipeline, complete these steps.
### Step 1: Classify Complexity (REQUIRED)
| Mode | Use When | Minimum Confirmation |
|------|----------|----------------------|
| **Targeted** | Review/Q&A/snippet/focused fix where full pipeline generation is not requested | Concise targeted response |
| **Lightweight** | Simple single-file pipeline, common stages/jobs, no advanced GitLab features, no sensitive deploy/security customization | Lightweight confirmation |
| **Full** | Multi-environment deploys, includes/templates, advanced `rules` logic, security scanning customization, compliance-sensitive workflows, or any unclear/risky request | Full confirmation |
When uncertain on a complete-generation request, default to **Full** mode.
### Step 2: Load References by Tier (REQUIRED)
Use an open/read action to load references based on the selected mode.
**Targeted mode (review/Q&A/snippet/focused fix):**
- Load only directly relevant references/templates for the scoped request.
- Do not enforce Full-generation Tier 1/Tier 2 checklist items.
**Tier 1 (Required for complete pipeline generation in Lightweight and Full modes):**
1. `references/best-practices.md` - baseline security, performance, naming
2. `references/common-patterns.md` - starting pattern selection
3. Matching template from `assets/templates/`:
- Docker pipelines -> `assets/templates/docker-build.yml`
- Kubernetes deployments -> `assets/templates/kubernetes-deploy.yml`
- Multi-project pipelines -> `assets/templates/multi-project.yml`
- Basic pipelines -> `assets/templates/basic-pipeline.yml`
**Tier 2 (Required for Full mode; optional for Lightweight mode):**
1. `references/gitlab-ci-reference.md` - keyword/syntax edge cases
2. `references/security-guidelines.md` - security-sensitive controls
**Tier 3 (Conditional external docs lookup):**
- Use only when local references do not cover requested features or version-specific behavior.
- Follow the lookup flow in "Handling GitLab CI/CD Documentation Lookup."
**If a required local reference or template is unavailable:**
- Report the exact missing path.
- Continue with available references and mark assumptions explicitly.
- Do not claim production-ready confidence until missing critical inputs are resolved.
### Step 3: Confirm Understanding (EXPLICIT OUTPUT REQUIRED)
#### Lightweight Confirmation Mode
Use for simple requests only.
**Required format:**
```markdown
## Reference Analysis Complete (Lightweight)
**Pattern:** [Pattern name] from common-patterns.md
**Template:** [Template file]
**Key standards to enforce:**
- [2-3 concrete standards]
```
**Example:**
```markdown
## Reference Analysis Complete (Lightweight)
**Pattern:** Basic Build-Test-Deploy from common-patterns.md
**Template:** assets/templates/basic-pipeline.yml
**Key standards to enforce:**
- Pin runtime image versions (no `:latest`)
- Add explicit job timeouts
- Use `rules` instead of deprecated `only`/`except`
```
#### Full Confirmation Mode
Use for complex or security-sensitive requests.
**Required format:**
```markdown
## Reference Analysis Complete (Full)
**Pipeline Pattern Identified:** [Pattern name] from common-patterns.md
- [Brief description of why this pattern fits]
**Best Practices to Apply:**
- [List 3-5 key best practices relevant to this pipeline]
**Security Guidelines:**
- [List security measures to implement]
**Template Foundation:** [Template file name]
- [What will be customized from this template]
```
**Example:**
```markdown
## Reference Analysis Complete (Full)
**Pipeline Pattern Identified:** Docker Build + Kubernetes Deployment from common-patterns.md
- User needs containerized deployment to K8s clusters with staging/production environments
**Best Practices to Apply:**
- Pin all Docker images to specific versions (not `:latest`)
- Use caching for pip dependencies
- Implement DAG optimization with `needs` keyword
- Set explicit timeout on all jobs (15-20 minutes)
- Use `resource_group` for deployment jobs
**Security Guidelines:**
- Use masked CI/CD variables for secrets (KUBE_CONTEXT, registry credentials)
- Include container scanning with Trivy
- Never expose secrets in logs
**Template Foundation:** assets/templates/docker-build.yml + assets/templates/kubernetes-deploy.yml
- Combine Docker build pattern with K8s kubectl deployment
- Add Python-specific test jobs
```
**Skipping confirmation is not allowed for complete pipeline generation.**
---
## Core Capabilities
### 1. Generate Basic CI/CD Pipelines
Create complete, production-ready `.gitlab-ci.yml` files with proper structure, security best practices, and efficient CI/CD patterns.
**When to use:**
- User requests: "Create a GitLab pipeline for...", "Build a CI/CD pipeline...", "Generate GitLab CI config..."
- Scenarios: CI/CD pipelines, automated testing, build automation, deployment pipelines
**Process:**
1. Understand the user's requirements (what needs to be automated)
2. Identify stages, jobs, dependencies, and artifacts
3. Use `assets/templates/basic-pipeline.yml` as structural foundation
4. Reference `references/best-practices.md` for implementation patterns
5. Reference `references/common-patterns.md` for standard pipeline patterns
6. Generate the pipeline following these principles:
- Use semantic stage and job names
- Pin Docker images to specific versions (not :latest)
- Implement proper secrets management with masked variables
- Use caching for dependencies to improve performance
- Implement proper artifact handling with expiration
- Use `needs` keyword for DAG optimization when appropriate
- Add proper error handling with retry and allow_failure
- Use `rules` instead of deprecated only/except
- **Set explicit `timeout` for all jobs** (10-30 minutes typically)
- Add meaningful job descriptions in comments
7. **ALWAYS validate** the generated pipeline using the devops-skills:gitlab-ci-validator skill
8. If validation fails, fix the issues and re-validate
**Example structure:**
```yaml
# Basic CI/CD Pipeline
# Builds, tests, and deploys the application
stages:
- build
- test
- deploy
# Global variables
variables:
NODE_VERSION: "20"
DOCKER_DRIVER: overlay2
# Default settings for all jobs
default:
image: node:20-alpine
timeout: 20 minutes # Default timeout for all jobs
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
before_script:
- echo "Starting job ${CI_JOB_NAME}"
tags:
- docker
interruptible: true
# Build stage - Compiles the application
build-application:
stage: build
timeout: 15 minutes
script:
- npm ci
- npm run build
artifacts:
paths:
- dist/
expire_in: 1 hour
rules:
- changes:
- src/**/*
- package*.json
when: always
- when: on_success
# Test stage
test-unit:
stage: test
needs: [build-application]
script:
- npm run test:unit
coverage: '/Coverage: \d+\.\d+%/'
artifacts:
reports:
junit: junit.xml
coverage_report:
coverage_format: cobertura
path: coverage/cobertura-coverage.xml
test-lint:
stage: test
needs: [] # Can run immediately
script:
- npm run lint
allow_failure: true
# Deploy stage
deploy-staging:
stage: deploy
needs: [build-application, test-unit]
script:
- npm run deploy:staging
environment:
name: staging
url: https://staging.example.com
rules:
- if: $CI_COMMIT_BRANCH == "develop"
when: manual
deploy-production:
stage: deploy
needs: [build-application, test-unit]
script:
- npm run deploy:production
environment:
name: production
url: https://example.com
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual
resource_group: production
```
### 2. Generate Docker Build Pipelines
Create pipelines for building, testing, and pushing Docker images to container registries.
**When to use:**
- User requests: "Create a Docker build pipeline...", "Build and push Docker images..."
- Scenarios: Container builds, multi-stage Docker builds, registry pushes
**Process:**
1. Understand the Docker build requirements (base images, registries, tags)
2. Use `assets/templates/docker-build.yml` as foundation
3. Implement Docker-in-Docker or Kaniko for builds
4. Configure registry authentication
5. Implement image tagging strategy
6. Add security scanning if needed
7. **ALWAYS validate** using devops-skills:gitlab-ci-validator skill
**Example:**
```yaml
stages:
- build
- scan
- push
variables:
DOCKER_DRIVER: overlay2
IMAGE_NAME: $CI_REGISTRY_IMAGE
IMAGE_TAG: $CI_COMMIT_SHORT_SHA
# Build Docker image
docker-build:
stage: build
image: docker:24-dind
timeout: 20 minutes
services:
- docker:24-dind
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- docker build
--cache-from $IMAGE_NAME:latest
--tag $IMAGE_NAME:$IMAGE_TAG
--tag $IMAGE_NAME:latest
.
- docker push $IMAGE_NAME:$IMAGE_TAG
- docker push $IMAGE_NAME:latest
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
retry:
max: 2
when:
- runner_system_failure
# Scan for vulnerabilities
container-scan:
stage: scan
image: aquasec/trivy:0.49.0
timeout: 15 minutes
script:
- trivy image --exit-code 0 --severity HIGH,CRITICAL $IMAGE_NAME:$IMAGE_TAG
needs: [docker-build]
allow_failure: true
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
```
### 3. Generate Kubernetes Deployment Pipelines
Create pipelines that deploy applications to Kubernetes clusters.
**When to use:**
- User requests: "Deploy to Kubernetes...", "Create K8s deployment pipeline..."
- Scenarios: Kubernetes deployments, Helm deployments, kubectl operations
**Process:**
1. Identify the Kubernetes deployment method (kubectl, Helm, Kustomize)
2. Use `assets/templates/kubernetes-deploy.yml` as foundation
3. Configure cluster authentication (service accounts, kubeconfig)
4. Implement proper environment management
5. Add rollback capabilities
6. **ALWAYS validate** using devops-skills:gitlab-ci-validator skill
**Example:**
```yaml
stages:
- build
- deploy
# Kubernetes deployment job
deploy-k8s:
stage: deploy
image: bitnami/kubectl:1.29
timeout: 10 minutes
before_script:
- kubectl config use-context $KUBE_CONTEXT
script:
- kubectl set image deployment/myapp myapp=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA -n $KUBE_NAMESPACE
- kubectl rollout status deployment/myapp -n $KUBE_NAMESPACE --timeout=5m
environment:
name: production
url: https://example.com
kubernetes:
namespace: production
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual
resource_group: k8s-production
retry:
max: 2
when:
- runner_system_failure
```
### 4. Generate Multi-Project Pipelines
Create pipelines that trigger other projects or use parent-child pipeline patterns.
**When to use:**
- User requests: "Create multi-project pipeline...", "Trigger other pipelines..."
- Scenarios: Monorepos, microservices, orchestration pipelines
**Process:**
1. Identify the pipeline orchestration needs
2. Use `assets/templates/multi-project.yml` or parent-child templates
3. Configure proper artifact passing
4. Implement parallel execution where appropriate
5. **ALWAYS validate** using devops-skills:gitlab-ci-validator skill
**Example (Parent-Child):**
```yaml
# Parent pipeline
stages:
- trigger
generate-child-pipeline:
stage: trigger
script:
- echo "Generating child pipeline config"
- |
cat > child-pipeline.yml <<EOF
stages:
- build
child-job:
stage: build
script:
- echo "Running child job"
EOF
artifacts:
paths:
- child-pipeline.yml
trigger-child:
stage: trigger
trigger:
include:
- artifact: child-pipeline.yml
job: generate-child-pipeline
strategy: depend
needs: [generate-child-pipeline]
```
### 5. Generate Template-Based Configurations
Create reusable templates using extends, YAML anchors, and includes.
**When to use:**
- User requests: "Create reusable templates...", "Build modular pipeline config..."
- Scenarios: Template libraries, DRY configurations, shared CI/CD logic
**Process:**
1. Identify common patterns to extract
2. Create hidden jobs (prefixed with .)
3. Use `extends` keyword for inheritance
4. Organize into separate files with `include`
5. **ALWAYS validate** using devops-skills:gitlab-ci-validator skill
**Example:**
```yaml
# Hidden template jobs (include timeout in templates)
.node-template:
image: node:20-alpine
timeout: 15 minutes # Default timeout for jobs using this template
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
before_script:
- npm ci
interruptible: true
.deploy-template:
timeout: 10 minutes # Deploy jobs should have explicit timeout
before_script:
- echo "Deploying to ${ENVIRONMENT}"
after_script:
- echo "Deployment complete"
retry:
max: 2
when:
- runner_system_failure
- stuck_or_timeout_failure
interruptible: false # Deploys should not be interrupted
# Actual jobs using templates
build:
extends: .node-template
stage: build
script:
- npm run build
deploy-staging:
extends: .deploy-template
stage: deploy
variables:
ENVIRONMENT: staging
script:
- ./deploy.sh staging
resource_group: staging
```
### 6. Handling GitLab CI/CD Documentation Lookup
Use this flow only when local references do not cover requested features or version-sensitive behavior.
**Detection:**
- User mentions specific GitLab features (e.g., "Auto DevOps", "SAST", "dependency scanning")
- User requests integration with GitLab templates
- Pipeline requires specific GitLab runner features
**Process:**
1. **Identify the feature:**
- Extract the GitLab feature or template name
- Determine if version-specific information is needed
2. **Check local references first (Tier 1/Tier 2):**
- `references/common-patterns.md`
- `references/gitlab-ci-reference.md`
- `references/security-guidelines.md`
3. **Use Context7 first when external lookup is needed:**
- Resolve library: `mcp__context7__resolve-library-id`
- Query docs: `mcp__context7__query-docs`
- Prefer GitLab official/library docs over secondary sources
4. **Fallback to web search when Context7 is unavailable or insufficient:**
- Use `web.search_query`
- Query pattern: `"GitLab CI/CD [feature] documentation"`
- Prefer results from `docs.gitlab.com`
5. **Open and extract from specific docs pages when needed:**
- Use `web.open` for selected documentation pages
- Capture required syntax, variables, and version constraints
6. **Analyze discovered documentation for:**
- Current recommended approach
- Required variables and configuration
- Template include syntax
- Best practices and security recommendations
- Example usage
7. **If network tools are unavailable (offline/constrained environment):**
- Continue using local references only
- State that external version verification could not be performed
- Add a version-assumption note in the final output
8. **Generate pipeline using discovered information:**
- Use correct template include syntax
- Configure required variables
- Add security best practices
- Include comments about versions and choices
**Example with GitLab templates:**
```yaml
# Include GitLab's security templates (use Jobs/ prefix for current templates)
include:
- template: Jobs/SAST.gitlab-ci.yml
- template: Jobs/Dependency-Scanning.gitlab-ci.yml
# Customize SAST behavior via global variables
# Note: Set variables globally rather than overriding template jobs
# to avoid validation issues with partial job definitions
variables:
SAST_EXCLUDED_PATHS: "spec, test, tests, tmp, node_modules"
DS_EXCLUDED_PATHS: "node_modules, vendor"
SECURE_LOG_LEVEL: "info"
```
> **Important:** When using `include` with GitLab templates, the included jobs are
> fully defined in the template. If you need to customize them, prefer setting
> variables globally rather than creating partial job overrides (which will fail
> local validation because the validator cannot resolve the included template).
> GitLab merges the configuration at runtime, but local validators only see
> your `.gitlab-ci.yml` file.
## Validation Workflow
**CRITICAL:** Every generated GitLab CI/CD configuration MUST be validated before presenting to the user.
### Validation Process
1. **Primary validation path:** after generating a complete pipeline, invoke the `devops-skills:gitlab-ci-validator` skill:
```
Skill: devops-skills:gitlab-ci-validator
```
2. **Script fallback path (if validator skill cannot be invoked):**
```bash
PIPELINE_FILE="<generated-output-path>"
```
- Set `PIPELINE_FILE` to the exact generated file path (for example, `pipelines/review.yml` or `.gitlab-ci.yml`).
- Fail fast if that file does not exist:
```bash
if [[ ! -f "$PIPELINE_FILE" ]]; then
echo "ERROR: CI file not found: $PIPELINE_FILE" >&2
exit 1
fi
```
```bash
# From repository root
bash devops-skills-plugin/skills/gitlab-ci-validator/scripts/validate_gitlab_ci.sh "$PIPELINE_FILE"
```
```bash
# From skills/gitlab-ci-generator directory
bash ../gitlab-ci-validator/scripts/validate_gitlab_ci.sh "$PIPELINE_FILE"
```
- If the script is not executable:
```bash
chmod +x devops-skills-plugin/skills/gitlab-ci-validator/scripts/validate_gitlab_ci.sh
```
- Optional API lint fallback when GitLab project context is available:
```bash
jq --null-input --arg yaml "$(<"$PIPELINE_FILE")" '.content=$yaml' \
| curl --header "Content-Type: application/json" \
--url "https://gitlab.com/api/v4/projects/:id/ci/lint?include_merged_yaml=true" \
--data @-
```
3. **Manual fallback path (only if both primary and script paths are unavailable):**
- Run manual checks for YAML validity, stage/job references, and obvious secret exposure.
- Mark output as `Validation status: Manual fallback (not fully verified)`.
- Do not claim production-ready status if Critical/High risk cannot be confidently ruled out.
4. **The validator skill/script checks:**
- Validate YAML syntax
- Check GitLab CI/CD schema compliance
- Verify job references and dependencies
- Check for best practices violations
- Perform security scanning
- Report any errors, warnings, or issues
5. **Analyze validation results and take action based on severity:**
| Severity | Action Required |
|----------|-----------------|
| **CRITICAL** | MUST fix before presenting. Pipeline is broken or severely insecure. |
| **HIGH** | MUST fix before presenting. Significant security or functionality issues. |
| **MEDIUM** | SHOULD fix before presenting. Apply fixes or explain why not applicable. |
| **LOW** | MAY fix or acknowledge. Inform user of recommendations. |
| **SUGGESTIONS** | Review and apply if beneficial. No fix required. |
6. **Fix-and-Revalidate Loop (MANDATORY for Critical/High issues):**
```
While validation has CRITICAL or HIGH issues:
1. Edit the generated file to fix the issue
2. Re-run validation
3. Repeat until no CRITICAL or HIGH issues remain
```
7. **Before presenting to user, ensure:**
- Zero CRITICAL issues
- Zero HIGH issues
- MEDIUM issues either fixed OR explained why they're acceptable
- LOW issues and suggestions acknowledged
8. **When presenting the validated configuration:**
- State validation status clearly
- State validation path used (skill, script fallback, or manual fallback)
- List any remaining MEDIUM/LOW issues with explanations
- Include template/version freshness notes
- Provide usage instructions
- Mention any trade-offs made
**Critical/High gate is strict and never optional for production-ready claims.**
### Validation Pass Criteria
**Pipeline is READY to present when:**
- ✅ Validation path executed (validator skill or script fallback)
- ✅ Syntax validation: PASSED
- ✅ Security scan: No CRITICAL or HIGH issues
- ✅ Best practices: Reviewed (warnings acceptable with explanation)
**Pipeline is NOT READY when:**
- ❌ Any syntax errors exist
- ❌ Any CRITICAL security issues exist
- ❌ Any HIGH security issues exist
- ❌ Job references are broken
- ❌ Only manual fallback was used and Critical/High risks cannot be ruled out
### When to Skip Validation
Only skip validation when:
- Generating partial code snippets (not complete files)
- Creating examples for documentation purposes
- User explicitly requests to skip validation
### Handling MEDIUM Severity Issues (REQUIRED OUTPUT)
When the validator reports MEDIUM severity issues, you MUST either fix them OR explain why they're acceptable. This explanation is REQUIRED in your output.
**Required format for MEDIUM issue handling:**
```
## Validation Issues Addressed
### MEDIUM Severity Issues
| Issue | Status | Explanation |
|-------|--------|-------------|
| [Issue code] | Fixed/Acceptable | [Why it was fixed OR why it's acceptable] |
```
**Example MEDIUM issue explanations:**
```
## Validation Issues Addressed
### MEDIUM Severity Issues
| Issue | Status | Explanation |
|-------|--------|-------------|
| `image-variable-no-digest` | Acceptable | Using `python:${PYTHON_VERSION}-alpine` allows flexible version management via CI/CD variables. The PYTHON_VERSION variable is controlled internally and pinned to "3.12". SHA digest pinning would require updating the digest with every image update, adding maintenance burden without significant security benefit for this use case. |
| `pip-without-hashes` | Acceptable | This pipeline installs well-known packages (pytest, flake8) from PyPI. Using `--require-hashes` would require maintaining hash files for all transitive dependencies. For internal CI/CD, the security trade-off is acceptable. For higher security environments, consider using a private PyPI mirror with verified packages. |
| `git-strategy-none` | Acceptable | The `stop-staging` and `rollback-production` jobs use `GIT_STRATEGY: none` because they only run kubectl commands that don't require source code. The scripts are inline in the YAML (not from the repo), so there's no risk of executing untrusted code. |
```
**When to FIX vs ACCEPT:**
| Scenario | Action |
|----------|--------|
| Production/high-security environment | FIX the issue |
| Issue has simple fix with no downside | FIX the issue |
| Fix adds significant complexity | ACCEPT with explanation |
| Fix requires external changes (e.g., CI/CD variables) | ACCEPT with explanation |
| Issue is false positive for this context | ACCEPT with explanation |
### Reviewing Suggestions (REQUIRED OUTPUT)
When the validator provides suggestions, you MUST briefly acknowledge them and explain whether they should be applied.
**Required format:**
```
## Validator Suggestions Review
| Suggestion | Recommendation | Reason |
|------------|----------------|--------|
| [suggestion] | Apply/Skip | [Why] |
```
**Example suggestions review:**
```
## Validator Suggestions Review
| Suggestion | Recommendation | Reason |
|------------|----------------|--------|
| `missing-retry` on test jobs | Skip | Test jobs are deterministic and don't interact with external services. Retry would mask flaky tests rather than fail fast. |
| `parallel-opportunity` for test-unit | Apply if beneficial | Could be added if pytest supports sharding. Add `parallel: 3` with `pytest --shard=${CI_NODE_INDEX}/${CI_NODE_TOTAL}` if test suite is large enough to benefit. |
| `dag-optimization` for stop-staging | Skip | This job is manual and only runs on environment cleanup. DAG optimization wouldn't provide meaningful speedup. |
| `no-dependency-proxy` | Apply for production | Consider using `$CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX` to avoid Docker Hub rate limits. Requires GitLab Premium. |
| `environment-no-url` for rollback | Skip | Rollback jobs don't deploy new versions, so a URL would be misleading. |
| `missing-coverage` for lint job | Skip | Linting doesn't produce coverage data. This is a false positive. |
```
### Template and Version Notes (REQUIRED OUTPUT)
After validation results, include a concise freshness note for templates and documentation assumptions.
**Required format:**
```markdown
## Template and Version Notes
- **Template base:** [assets/templates/<file>.yml]
- **Template customization scope:** [what changed from template]
- **Version/doc basis:** [Context7, docs.gitlab.com, or local references only]
- **Freshness note:** [exact date checked, or "external lookup unavailable"]
- **Version-sensitive assumptions:** [if any]
```
**Example:**
```markdown
## Template and Version Notes
- **Template base:** assets/templates/docker-build.yml
- **Template customization scope:** Added unit-test stage and environment-specific deploy rules
- **Version/doc basis:** docs.gitlab.com include-template docs + local references
- **Freshness note:** Verified template syntax on 2026-02-28
- **Version-sensitive assumptions:** Uses `Jobs/SAST.gitlab-ci.yml` template path
```
### Usage Instructions Template (REQUIRED OUTPUT)
After presenting the validated pipeline, you MUST provide usage instructions. This is NOT optional.
**Required format:**
```
## Usage Instructions
### Required CI/CD Variables
Configure these variables in **Settings → CI/CD → Variables**:
| Variable | Description | Masked | Protected |
|----------|-------------|--------|-----------|
| [VARIABLE_NAME] | [Description] | Yes/No | Yes/No |
### Setup Steps
1. [First setup step]
2. [Second setup step]
...
### Pipeline Behavior
- **On push to `develop`:** [What happens]
- **On push to `main`:** [What happens]
- **On tag `vX.Y.Z`:** [What happens]
### Customization
[Any customization notes]
```
**Example usage instructions:**
```
## Usage Instructions
### Required CI/CD Variables
Configure these variables in **Settings → CI/CD → Variables**:
| Variable | Description | Masked | Protected |
|----------|-------------|--------|-----------|
| `KUBE_CONTEXT` | Kubernetes cluster context name | No | Yes |
| `KUBE_NAMESPACE_STAGING` | Staging namespace (default: staging) | No | No |
| `KUBE_NAMESPACE_PRODUCTION` | Production namespace (default: production) | No | Yes |
**Note:** `CI_REGISTRY_USER`, `CI_REGISTRY_PASSWORD`, and `CI_REGISTRY` are automatically provided by GitLab.
### Kubernetes Integration Setup
1. **Enable Kubernetes integration** in **Settings → Infrastructure → Kubernetes clusters**
2. **Add your cluster** using the agent-based or certificate-based method
3. **Create namespaces** for staging and production if they don't exist:
```bash
kubectl create namespace staging
kubectl create namespace production
```
4. **Ensure deployment exists** in the target namespaces before running the pipeline
### Pipeline Behavior
- **On push to `develop`:** Runs tests → builds Docker image → deploys to staging automatically
- **On push to `main`:** Runs tests → builds Docker image → manual deployment to production
- **On tag `vX.Y.Z`:** Runs tests → builds Docker image → manual deployment to production
### Customization
- Update `APP_NAME` variable to match your Kubernetes deployment name
- Modify environment URLs in `deploy-staging` and `deploy-production` jobs
- Add Helm deployment by uncommenting the Helm jobs in the template
```
## Best Practices to Enforce
Reference `references/best-practices.md` for comprehensive guidelines. Key principles:
### Mandatory Sta...
© akin-ozer · Apache-2.0 · akin-ozer/cc-devops-skills