Creates .gitlab-ci.yml files, configures pipeline stages, defines CI jobs and runners, sets up deployment workflows, and generates reusable GitLab CI/CD templates following current best practices and security standards. Use when users ask to create or build a GitLab CI/CD pipeline, CI config, build pipeline, deploy pipeline, GitLab YAML, CI jobs, or any .gitlab-ci.yml configuration from scratch or for a new project.
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Generate production-ready GitLab CI/CD pipeline configurations following current best practices, security standards, and naming conventions. All generated resources are validated using the devops-skills:gitlab-ci-validator skill before delivery.
.gitlab-ci.yml for a project.extends templates or include files..gitlab-ci.yml: use the GitLab CI validator skill instead.CRITICAL: Before generating ANY pipeline, complete these steps in order:
Use the Read tool to load all four reference files plus the relevant template:
1. references/best-practices.md: Security, performance, and naming patterns
2. references/common-patterns.md: Standard pipeline patterns as foundation
3. references/gitlab-ci-reference.md: Syntax reference and keyword details
4. references/security-guidelines.md: Security-sensitive configurationsTemplate selection:
assets/templates/docker-build.ymlassets/templates/kubernetes-deploy.ymlassets/templates/multi-project.ymlassets/templates/basic-pipeline.ymlAfter reading references, output this confirmation before proceeding:
## Reference Analysis Complete
**Pipeline Pattern Identified:** [Pattern name] from common-patterns.md
- [Why this pattern fits]
**Best Practices to Apply:**
- [3–5 key best practices relevant to this pipeline]
**Security Guidelines:**
- [Security measures to implement]
**Template Foundation:** [Template file name]
- [What will be customized]Generate complete .gitlab-ci.yml files with proper structure, security best practices, and efficient CI/CD patterns. Use assets/templates/basic-pipeline.yml as structural foundation, referencing references/best-practices.md and references/common-patterns.md.
Apply these principles:
:latest)expire_in always set)needs keyword for DAG optimizationrules instead of deprecated only/excepttimeout on ALL jobs (10–30 minutes typically)retry for flaky operations (network, external APIs)resource_group for deployment jobsValidate per the Validation Workflow section.
Minimal example:
stages: [build, test, deploy]
variables:
NODE_VERSION: "20"
default:
image: node:20-alpine
timeout: 20 minutes
cache:
key: ${CI_COMMIT_REF_SLUG}
paths: [node_modules/]
interruptible: true
build-application:
stage: build
timeout: 15 minutes
script: [npm ci, npm run build]
artifacts:
paths: [dist/]
expire_in: 1 hour
test-unit:
stage: test
needs: [build-application]
script: [npm run test:unit]
artifacts:
reports:
junit: junit.xml
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
timeout: 15 minutesCreate pipelines for building, scanning, and pushing Docker images to container registries. Use assets/templates/docker-build.yml as foundation with Docker-in-Docker or Kaniko, registry authentication via predefined variables, image tagging strategy ($CI_COMMIT_SHORT_SHA), and container security scanning (Trivy or GitLab template). Validate per the Validation Workflow section.
Minimal example:
variables:
IMAGE_NAME: $CI_REGISTRY_IMAGE
IMAGE_TAG: $CI_COMMIT_SHORT_SHA
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 .
- docker push $IMAGE_NAME:$IMAGE_TAG
retry:
max: 2
when: [runner_system_failure]Create pipelines deploying to Kubernetes clusters via kubectl, Helm, or Kustomize. Use assets/templates/kubernetes-deploy.yml as foundation with cluster authentication via $KUBE_CONTEXT, environment management, and rollback capabilities. Validate per the Validation Workflow section.
Minimal example:
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
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual
resource_group: k8s-productionCreate pipelines that trigger other projects or use parent-child patterns for monorepos and microservices. Use assets/templates/multi-project.yml or parent-child templates with artifact passing between pipelines and parallel execution where appropriate. Validate per the Validation Workflow section.
Create modular, DRY configurations using extends, YAML anchors, and include. Extract common patterns into hidden jobs (.template-name), use extends for inheritance (preferred over YAML anchors), organize into separate files with include, and include explicit timeout in all templates. Validate per the Validation Workflow section.
Minimal example:
.node-template:
image: node:20-alpine
timeout: 15 minutes
cache:
key: ${CI_COMMIT_REF_SLUG}
paths: [node_modules/]
before_script: [npm ci]
interruptible: true
build:
extends: .node-template
stage: build
script: [npm run build]When the user requests specific GitLab features (Auto DevOps, SAST, dependency scanning, etc.):
"GitLab CI/CD [feature] documentation 2025"mcp__context7__resolve-library-id then mcp__context7__get-library-docsdocs.gitlab.comWhen using GitLab include templates:
include:
- template: Jobs/SAST.gitlab-ci.yml
- template: Jobs/Dependency-Scanning.gitlab-ci.yml
variables:
SAST_EXCLUDED_PATHS: "spec, test, tests, tmp"Note: Customize included template jobs via global
variablesrather than partial job overrides. GitLab merges at runtime, but local validators only see your file-partial overrides will fail validation.
Every complete pipeline MUST be validated before presenting to the user.
devops-skills:gitlab-ci-validatorSee references/validation-presentation.md for detailed requirements on presenting validation results, including status tables, issue explanations, and usage instructions.
See references/best-practices.md for the full set of security, performance, reliability, naming, and organization guidelines that all generated pipelines must follow.
only: [master] or only: [main]WHY: only/except are deprecated in GitLab 15+; rules is the current approach and offers more expressive conditions.
BAD: only: - main
GOOD: rules: - if: '$CI_COMMIT_BRANCH == "main"'
WHY: Deploying directly without a GitLab environment loses deployment tracking, approval workflows, and rollback history.
BAD: A deployment job with no environment: key.
GOOD: environment: name: production url: https://example.com combined with when: manual for production jobs.
WHY: Hardcoding forces all jobs onto specific runners even when generic runners would work, reducing parallelism.
BAD: tags: [kubernetes, production] on lint and unit test jobs.
GOOD: Add runner tags only to jobs that genuinely require specific capabilities (GPU, privileged mode, specific OS).
before_script blocks in every jobWHY: Repetitive before_script creates maintenance debt; use YAML anchors or extends to share setup.
BAD: Identical before_script: [npm ci] in every job.
GOOD: Define a .node_setup hidden job with before_script: [npm ci] and use extends: .node_setup in dependent jobs.
expire_in on artifactsWHY: Artifacts without an expiration date are retained indefinitely, consuming storage quota and slowing artifact listing in the GitLab UI.
BAD: artifacts: paths: [dist/] with no expire_in.
GOOD: artifacts: paths: [dist/] expire_in: 7 days
:latest or unpinned image tagsWHY: Floating tags make the same commit build differently on different days, and the validator flags them.
BAD: image: node:latest
GOOD: image: node:20-alpine
WHY: Secrets committed to .gitlab-ci.yml stay in repository history and are visible to everyone with read access.
BAD: variables: { DB_PASSWORD: "hunter2" }
GOOD: Define a masked CI/CD variable in project settings and reference $DB_PASSWORD.
timeout on jobsWHY: A job without an explicit timeout can occupy a runner until the instance default expires, blocking other pipelines.
BAD: A build job with no timeout.
GOOD: Set timeout: 15 minutes on the job, or once under default:.
WHY: Every complete pipeline must be validated with the GitLab CI validator skill, and CRITICAL and HIGH findings fixed, before delivery.
BAD: Generate a full .gitlab-ci.yml and hand it over unchecked.
GOOD: Run the validator, fix CRITICAL and HIGH findings, re-validate, then present the results.
WHY: The pre-generation steps require reading all four reference files and confirming the chosen pattern, so security and naming rules are applied rather than guessed.
BAD: Write the pipeline straight from the request.
GOOD: Read references/best-practices.md, references/common-patterns.md, references/gitlab-ci-reference.md and references/security-guidelines.md, then output the Reference Analysis confirmation.
references/best-practices.md: Security, performance, pipeline design, anti-patternsreferences/common-patterns.md: Standard patterns (basic CI, Docker, K8s, multi-project)references/gitlab-ci-reference.md: Full keyword and syntax referencereferences/security-guidelines.md: Secrets, image, script, and artifact securityreferences/validation-presentation.md: Validation results presentation formatassets/templates/basic-pipeline.yml: Basic pipeline templateassets/templates/docker-build.yml: Docker build pipeline templateassets/templates/kubernetes-deploy.yml: Kubernetes deployment templateassets/templates/multi-project.yml: Multi-project orchestration templateTemplate usage: Copy structure → replace [PLACEHOLDERS] → customize logic → remove unused sections → validate.
pantheon-org/tekhne
c8416e9
Also appears in
last in sync Aug 28, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.