{"id":"b1a2860e-e8fb-4bbf-9a23-d6c6b56e4872","shortId":"NrkApB","kind":"skill","title":"gitlab-ci-patterns","tagline":"Comprehensive GitLab CI/CD pipeline patterns for automated testing, building, and deployment.","description":"# GitLab CI Patterns\n\nComprehensive GitLab CI/CD pipeline patterns for automated testing, building, and deployment.\n\n## Do not use this skill when\n\n- The task is unrelated to gitlab ci patterns\n- You need a different domain or tool outside this scope\n\n## Instructions\n\n- Clarify goals, constraints, and required inputs.\n- Apply relevant best practices and validate outcomes.\n- Provide actionable steps and verification.\n- If detailed examples are required, open `resources/implementation-playbook.md`.\n\n## Purpose\n\nCreate efficient GitLab CI pipelines with proper stage organization, caching, and deployment strategies.\n\n## Use this skill when\n\n- Automate GitLab-based CI/CD\n- Implement multi-stage pipelines\n- Configure GitLab Runners\n- Deploy to Kubernetes from GitLab\n- Implement GitOps workflows\n\n## Basic Pipeline Structure\n\n```yaml\nstages:\n  - build\n  - test\n  - deploy\n\nvariables:\n  DOCKER_DRIVER: overlay2\n  DOCKER_TLS_CERTDIR: \"/certs\"\n\nbuild:\n  stage: build\n  image: node:20\n  script:\n    - npm ci\n    - npm run build\n  artifacts:\n    paths:\n      - dist/\n    expire_in: 1 hour\n  cache:\n    key: ${CI_COMMIT_REF_SLUG}\n    paths:\n      - node_modules/\n\ntest:\n  stage: test\n  image: node:20\n  script:\n    - npm ci\n    - npm run lint\n    - npm test\n  coverage: '/Lines\\s*:\\s*(\\d+\\.\\d+)%/'\n  artifacts:\n    reports:\n      coverage_report:\n        coverage_format: cobertura\n        path: coverage/cobertura-coverage.xml\n\ndeploy:\n  stage: deploy\n  image: bitnami/kubectl:latest\n  script:\n    - kubectl apply -f k8s/\n    - kubectl rollout status deployment/my-app\n  only:\n    - main\n  environment:\n    name: production\n    url: https://app.example.com\n```\n\n## Docker Build and Push\n\n```yaml\nbuild-docker:\n  stage: build\n  image: docker:24\n  services:\n    - docker:24-dind\n  before_script:\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n  script:\n    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .\n    - docker build -t $CI_REGISTRY_IMAGE:latest .\n    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA\n    - docker push $CI_REGISTRY_IMAGE:latest\n  only:\n    - main\n    - tags\n```\n\n## Multi-Environment Deployment\n\n```yaml\n.deploy_template: &deploy_template\n  image: bitnami/kubectl:latest\n  before_script:\n    - kubectl config set-cluster k8s --server=\"$KUBE_URL\" --insecure-skip-tls-verify=true\n    - kubectl config set-credentials admin --token=\"$KUBE_TOKEN\"\n    - kubectl config set-context default --cluster=k8s --user=admin\n    - kubectl config use-context default\n\ndeploy:staging:\n  <<: *deploy_template\n  stage: deploy\n  script:\n    - kubectl apply -f k8s/ -n staging\n    - kubectl rollout status deployment/my-app -n staging\n  environment:\n    name: staging\n    url: https://staging.example.com\n  only:\n    - develop\n\ndeploy:production:\n  <<: *deploy_template\n  stage: deploy\n  script:\n    - kubectl apply -f k8s/ -n production\n    - kubectl rollout status deployment/my-app -n production\n  environment:\n    name: production\n    url: https://app.example.com\n  when: manual\n  only:\n    - main\n```\n\n## Terraform Pipeline\n\n```yaml\nstages:\n  - validate\n  - plan\n  - apply\n\nvariables:\n  TF_ROOT: ${CI_PROJECT_DIR}/terraform\n  TF_VERSION: \"1.6.0\"\n\nbefore_script:\n  - cd ${TF_ROOT}\n  - terraform --version\n\nvalidate:\n  stage: validate\n  image: hashicorp/terraform:${TF_VERSION}\n  script:\n    - terraform init -backend=false\n    - terraform validate\n    - terraform fmt -check\n\nplan:\n  stage: plan\n  image: hashicorp/terraform:${TF_VERSION}\n  script:\n    - terraform init\n    - terraform plan -out=tfplan\n  artifacts:\n    paths:\n      - ${TF_ROOT}/tfplan\n    expire_in: 1 day\n\napply:\n  stage: apply\n  image: hashicorp/terraform:${TF_VERSION}\n  script:\n    - terraform init\n    - terraform apply -auto-approve tfplan\n  dependencies:\n    - plan\n  when: manual\n  only:\n    - main\n```\n\n## Security Scanning\n\n```yaml\ninclude:\n  - template: Security/SAST.gitlab-ci.yml\n  - template: Security/Dependency-Scanning.gitlab-ci.yml\n  - template: Security/Container-Scanning.gitlab-ci.yml\n\ntrivy-scan:\n  stage: test\n  image: aquasec/trivy:latest\n  script:\n    - trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA\n  allow_failure: true\n```\n\n## Caching Strategies\n\n```yaml\n# Cache node_modules\nbuild:\n  cache:\n    key: ${CI_COMMIT_REF_SLUG}\n    paths:\n      - node_modules/\n    policy: pull-push\n\n# Global cache\ncache:\n  key: ${CI_COMMIT_REF_SLUG}\n  paths:\n    - .cache/\n    - vendor/\n\n# Separate cache per job\njob1:\n  cache:\n    key: job1-cache\n    paths:\n      - build/\n\njob2:\n  cache:\n    key: job2-cache\n    paths:\n      - dist/\n```\n\n## Dynamic Child Pipelines\n\n```yaml\ngenerate-pipeline:\n  stage: build\n  script:\n    - python generate_pipeline.py > child-pipeline.yml\n  artifacts:\n    paths:\n      - child-pipeline.yml\n\ntrigger-child:\n  stage: deploy\n  trigger:\n    include:\n      - artifact: child-pipeline.yml\n        job: generate-pipeline\n    strategy: depend\n```\n\n## Reference Files\n\n- `assets/gitlab-ci.yml.template` - Complete pipeline template\n- `references/pipeline-stages.md` - Stage organization patterns\n\n## Best Practices\n\n1. **Use specific image tags** (node:20, not node:latest)\n2. **Cache dependencies** appropriately\n3. **Use artifacts** for build outputs\n4. **Implement manual gates** for production\n5. **Use environments** for deployment tracking\n6. **Enable merge request pipelines**\n7. **Use pipeline schedules** for recurring jobs\n8. **Implement security scanning**\n9. **Use CI/CD variables** for secrets\n10. **Monitor pipeline performance**\n\n## Related Skills\n\n- `github-actions-templates` - For GitHub Actions\n- `deployment-pipeline-design` - For architecture\n- `secrets-management` - For secrets handling\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["gitlab","patterns","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows"],"capabilities":["skill","source-sickn33","skill-gitlab-ci-patterns","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/gitlab-ci-patterns","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34768 github stars · SKILL.md body (6,011 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-23T18:51:23.480Z","embedding":null,"createdAt":"2026-04-18T21:38:02.142Z","updatedAt":"2026-04-23T18:51:23.480Z","lastSeenAt":"2026-04-23T18:51:23.480Z","tsv":"'/certs':134 '/lines':178 '/terraform':400 '/tfplan':446 '1':152,449,497,604 '1.6.0':403 '10':658 '2':614 '20':140,168,610 '24':226,229 '3':618 '4':624 '5':630 '6':636 '7':641 '8':648 '9':652 'action':69,666,670 'admin':313,326 'allow':507 'app.example.com':213,382 'appli':61,200,341,367,393,451,453,462 'appropri':617 'approv':465 'aquasec/trivy':489 'architectur':676 'artifact':147,183,442,574,584,620 'ask':716 'assets/gitlab-ci.yml.template':594 'auto':464 'auto-approv':463 'autom':11,25,98 'backend':421 'base':101 'basic':119 'best':63,602 'bitnami/kubectl':196,289 'boundari':724 'build':13,27,124,135,137,146,215,220,223,247,256,516,552,569,622 'build-dock':219 'cach':90,154,510,513,517,531,532,539,542,546,550,554,558,615 'cd':406 'certdir':133 'check':427 'child':562,579 'child-pipeline.yml':573,576,585 'ci':3,17,42,84,143,156,171,236,240,243,249,252,258,264,267,272,397,501,504,519,534 'ci/cd':7,21,102,654 'clarif':718 'clarifi':55 'clear':691 'cluster':297,323 'cobertura':189 'code':496 'commit':157,253,268,505,520,535 'complet':595 'comprehens':5,19 'config':294,309,318,328 'configur':108 'constraint':57 'context':321,331 'coverag':177,185,187 'coverage/cobertura-coverage.xml':191 'creat':81 'credenti':312 'criteria':727 'critic':500 'd':181,182 'day':450 'default':322,332 'depend':467,591,616 'deploy':15,29,92,111,126,192,194,282,284,286,333,335,338,359,361,364,581,634,672 'deployment-pipeline-design':671 'deployment/my-app':206,349,375 'describ':695 'design':674 'detail':74 'develop':358 'differ':47 'dind':230 'dir':399 'dist':149,560 'docker':128,131,214,221,225,228,233,246,255,262,270 'domain':48 'driver':129 'dynam':561 'effici':82 'enabl':637 'environ':209,281,352,378,632,707 'environment-specif':706 'exampl':75 'exit':495 'exit-cod':494 'expert':712 'expir':150,447 'f':201,342,368 'failur':508 'fals':422 'file':593 'fmt':426 'format':188 'gate':627 'generat':566,588 'generate-pipelin':565,587 'generate_pipeline.py':572 'github':665,669 'github-actions-templ':664 'gitlab':2,6,16,20,41,83,100,109,115 'gitlab-bas':99 'gitlab-ci-pattern':1 'gitop':117 'global':530 'goal':56 'handl':682 'hashicorp/terraform':415,432,455 'high':499 'hour':153 'imag':138,166,195,224,251,260,266,274,288,414,431,454,488,493,503,607 'implement':103,116,625,649 'includ':476,583 'init':420,437,460 'input':60,721 'insecur':303 'insecure-skip-tls-verifi':302 'instruct':54 'job':544,586,647 'job1':545,549 'job1-cache':548 'job2':553,557 'job2-cache':556 'k8s':202,298,324,343,369 'key':155,518,533,547,555 'kube':300,315 'kubectl':199,203,293,308,317,327,340,346,366,372 'kubernet':113 'latest':197,261,275,290,490,613 'limit':683 'lint':174 'login':234 'main':208,277,386,472 'manag':679 'manual':384,470,626 'match':692 'merg':638 'miss':729 'modul':162,515,525 'monitor':659 'multi':105,280 'multi-environ':279 'multi-stag':104 'n':344,350,370,376 'name':210,353,379 'need':45 'node':139,161,167,514,524,609,612 'npm':142,144,170,172,175 'open':78 'organ':89,600 'outcom':67 'output':623,701 'outsid':51 'overlay2':130 'p':239 'password':242 'path':148,160,190,443,523,538,551,559,575 'pattern':4,9,18,23,43,601 'per':543 'perform':661 'permiss':722 'pipelin':8,22,85,107,120,388,563,567,589,596,640,643,660,673 'plan':392,428,430,439,468 'polici':526 'practic':64,603 'product':211,360,371,377,380,629 'project':398 'proper':87 'provid':68 'pull':528 'pull-push':527 'purpos':80 'push':217,263,271,529 'python':571 'recur':646 'ref':158,521,536 'refer':592 'references/pipeline-stages.md':598 'registri':237,241,244,250,259,265,273,502 'relat':662 'relev':62 'report':184,186 'request':639 'requir':59,77,720 'resources/implementation-playbook.md':79 'review':713 'rollout':204,347,373 'root':396,408,445 'run':145,173 'runner':110 'safeti':723 'scan':474,485,651 'schedul':644 'scope':53,694 'script':141,169,198,232,245,292,339,365,405,418,435,458,491,570 'secret':657,678,681 'secrets-manag':677 'secur':473,650 'security/container-scanning.gitlab-ci.yml':482 'security/dependency-scanning.gitlab-ci.yml':480 'security/sast.gitlab-ci.yml':478 'separ':541 'server':299 'servic':227 'set':296,311,320 'set-clust':295 'set-context':319 'set-credenti':310 'sever':498 'sha':254,269,506 'skill':34,96,663,686 'skill-gitlab-ci-patterns' 'skip':304 'slug':159,522,537 'source-sickn33' 'specif':606,708 'stage':88,106,123,136,164,193,222,334,337,345,351,354,363,390,412,429,452,486,568,580,599 'staging.example.com':356 'status':205,348,374 'step':70 'stop':714 'strategi':93,511,590 'structur':121 'substitut':704 'success':726 'tag':278,608 'task':37,690 'templat':285,287,336,362,477,479,481,597,667 'terraform':387,409,419,423,425,436,438,459,461 'test':12,26,125,163,165,176,487,710 'tf':395,401,407,416,433,444,456 'tfplan':441,466 'tls':132,305 'token':314,316 'tool':50 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'track':635 'treat':699 'trigger':578,582 'trigger-child':577 'trivi':484,492 'trivy-scan':483 'true':307,509 'u':235 'unrel':39 'url':212,301,355,381 'use':32,94,330,605,619,631,642,653,684 'use-context':329 'user':238,325 'valid':66,391,411,413,424,709 'variabl':127,394,655 'vendor':540 'verif':72 'verifi':306 'version':402,410,417,434,457 'workflow':118 'yaml':122,218,283,389,475,512,564","prices":[{"id":"44233a14-726b-418b-bf74-e2f0b65472c3","listingId":"b1a2860e-e8fb-4bbf-9a23-d6c6b56e4872","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:38:02.142Z"}],"sources":[{"listingId":"b1a2860e-e8fb-4bbf-9a23-d6c6b56e4872","source":"github","sourceId":"sickn33/antigravity-awesome-skills/gitlab-ci-patterns","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/gitlab-ci-patterns","isPrimary":false,"firstSeenAt":"2026-04-18T21:38:02.142Z","lastSeenAt":"2026-04-23T18:51:23.480Z"}],"details":{"listingId":"b1a2860e-e8fb-4bbf-9a23-d6c6b56e4872","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"gitlab-ci-patterns","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34768,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-23T06:41:03Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"e77f6178d50360c299f3286795133613c50054b1","skill_md_path":"skills/gitlab-ci-patterns/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/gitlab-ci-patterns"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"gitlab-ci-patterns","description":"Comprehensive GitLab CI/CD pipeline patterns for automated testing, building, and deployment."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/gitlab-ci-patterns"},"updatedAt":"2026-04-23T18:51:23.480Z"}}