@hivehub/rulebook 5.3.3 → 5.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/analysis.md +35 -35
- package/.claude/commands/continue.md +33 -33
- package/.claude/commands/ralph-config.md +112 -112
- package/.claude/commands/ralph-history.md +110 -110
- package/.claude/commands/ralph-init.md +72 -72
- package/.claude/commands/ralph-pause-resume.md +105 -105
- package/.claude/commands/ralph-run.md +101 -101
- package/.claude/commands/ralph-status.md +76 -76
- package/.claude/commands/rulebook-decision-create.md +55 -55
- package/.claude/commands/rulebook-decision-list.md +15 -15
- package/.claude/commands/rulebook-knowledge-add.md +41 -41
- package/.claude/commands/rulebook-knowledge-list.md +15 -15
- package/.claude/commands/rulebook-learn-capture.md +48 -48
- package/.claude/commands/rulebook-learn-list.md +13 -13
- package/.claude/commands/rulebook-memory-save.md +48 -48
- package/.claude/commands/rulebook-memory-search.md +47 -47
- package/.claude/commands/rulebook-task-apply.md +67 -67
- package/.claude/commands/rulebook-task-archive.md +94 -94
- package/.claude/commands/rulebook-task-create.md +93 -93
- package/.claude/commands/rulebook-task-list.md +42 -42
- package/.claude/commands/rulebook-task-show.md +52 -52
- package/.claude/commands/rulebook-task-validate.md +53 -53
- package/.claude-plugin/marketplace.json +28 -28
- package/.claude-plugin/plugin.json +8 -8
- package/LICENSE +191 -191
- package/README.md +42 -3
- package/dist/cli/commands/compress.d.ts +18 -0
- package/dist/cli/commands/compress.d.ts.map +1 -0
- package/dist/cli/commands/compress.js +100 -0
- package/dist/cli/commands/compress.js.map +1 -0
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +2 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +2 -0
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/core/claude-settings-manager.d.ts +7 -0
- package/dist/core/claude-settings-manager.d.ts.map +1 -1
- package/dist/core/claude-settings-manager.js +31 -14
- package/dist/core/claude-settings-manager.js.map +1 -1
- package/dist/core/compress/compressor.d.ts +60 -0
- package/dist/core/compress/compressor.d.ts.map +1 -0
- package/dist/core/compress/compressor.js +232 -0
- package/dist/core/compress/compressor.js.map +1 -0
- package/dist/core/compress/discover.d.ts +19 -0
- package/dist/core/compress/discover.d.ts.map +1 -0
- package/dist/core/compress/discover.js +100 -0
- package/dist/core/compress/discover.js.map +1 -0
- package/dist/core/compress/validator.d.ts +47 -0
- package/dist/core/compress/validator.d.ts.map +1 -0
- package/dist/core/compress/validator.js +131 -0
- package/dist/core/compress/validator.js.map +1 -0
- package/dist/core/doctor.d.ts.map +1 -1
- package/dist/core/doctor.js +66 -0
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/generator.d.ts +16 -0
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +36 -11
- package/dist/core/generator.js.map +1 -1
- package/dist/hooks/safe-flag-io.d.ts +77 -0
- package/dist/hooks/safe-flag-io.d.ts.map +1 -0
- package/dist/hooks/safe-flag-io.js +169 -0
- package/dist/hooks/safe-flag-io.js.map +1 -0
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +236 -0
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +23 -21
- package/templates/agents/accessibility-reviewer.md +43 -43
- package/templates/agents/api-designer.md +42 -42
- package/templates/agents/architect.md +51 -51
- package/templates/agents/build-engineer.md +36 -36
- package/templates/agents/code-reviewer.md +47 -47
- package/templates/agents/compiler/codegen-debugger.md +34 -34
- package/templates/agents/compiler/stdlib-engineer.md +28 -28
- package/templates/agents/compiler/test-coverage-guardian.md +31 -31
- package/templates/agents/context-intelligence.md +52 -52
- package/templates/agents/database-architect.md +41 -41
- package/templates/agents/devops-engineer.md +42 -42
- package/templates/agents/docs-writer.md +38 -38
- package/templates/agents/game-engine/cpp-core-expert.md +35 -35
- package/templates/agents/game-engine/render-engineer.md +22 -22
- package/templates/agents/game-engine/shader-engineer.md +38 -38
- package/templates/agents/game-engine/systems-integration.md +43 -43
- package/templates/agents/generic/code-reviewer.md +41 -41
- package/templates/agents/generic/docs-writer.md +25 -25
- package/templates/agents/generic/project-manager.md +36 -36
- package/templates/agents/generic/researcher.md +34 -34
- package/templates/agents/generic/test-engineer.md +41 -41
- package/templates/agents/i18n-engineer.md +42 -42
- package/templates/agents/implementer.md +42 -42
- package/templates/agents/migration-engineer.md +42 -42
- package/templates/agents/mobile/platform-specialist.md +22 -22
- package/templates/agents/mobile/ui-engineer.md +22 -22
- package/templates/agents/performance-engineer.md +49 -49
- package/templates/agents/refactoring-agent.md +41 -41
- package/templates/agents/researcher.md +38 -38
- package/templates/agents/security-reviewer.md +40 -40
- package/templates/agents/team-lead.md +37 -37
- package/templates/agents/tester.md +48 -48
- package/templates/agents/ux-reviewer.md +43 -43
- package/templates/agents/web-app/api-designer.md +22 -22
- package/templates/agents/web-app/backend-engineer.md +30 -30
- package/templates/agents/web-app/database-engineer.md +22 -22
- package/templates/agents/web-app/frontend-engineer.md +29 -29
- package/templates/agents/web-app/security-reviewer.md +32 -32
- package/templates/ci/rulebook-review.yml +26 -26
- package/templates/cli/AIDER.md +49 -49
- package/templates/cli/AMAZON_Q.md +25 -25
- package/templates/cli/AUGGIE.md +32 -32
- package/templates/cli/CLAUDE.md +117 -117
- package/templates/cli/CLINE.md +99 -99
- package/templates/cli/CODEBUDDY.md +20 -20
- package/templates/cli/CODEIUM.md +20 -20
- package/templates/cli/CODEX.md +21 -21
- package/templates/cli/CONTINUE.md +34 -34
- package/templates/cli/CURSOR_CLI.md +62 -62
- package/templates/cli/FACTORY.md +18 -18
- package/templates/cli/GEMINI.md +35 -35
- package/templates/cli/KILOCODE.md +18 -18
- package/templates/cli/OPENCODE.md +18 -18
- package/templates/cli/_GENERIC_TEMPLATE.md +29 -29
- package/templates/cli/gemini-extension.json +77 -77
- package/templates/commands/rulebook-decision-create.md +55 -55
- package/templates/commands/rulebook-decision-list.md +15 -15
- package/templates/commands/rulebook-knowledge-add.md +41 -41
- package/templates/commands/rulebook-knowledge-list.md +15 -15
- package/templates/commands/rulebook-learn-capture.md +48 -48
- package/templates/commands/rulebook-learn-list.md +13 -13
- package/templates/commands/rulebook-memory-save.md +48 -48
- package/templates/commands/rulebook-memory-search.md +47 -47
- package/templates/commands/rulebook-task-apply.md +67 -67
- package/templates/commands/rulebook-task-archive.md +94 -94
- package/templates/commands/rulebook-task-create.md +93 -93
- package/templates/commands/rulebook-task-list.md +42 -42
- package/templates/commands/rulebook-task-show.md +52 -52
- package/templates/commands/rulebook-task-validate.md +53 -53
- package/templates/compact-context/_default.md +23 -23
- package/templates/compact-context/cpp.md +26 -26
- package/templates/compact-context/go.md +26 -26
- package/templates/compact-context/python.md +26 -26
- package/templates/compact-context/rust.md +28 -28
- package/templates/compact-context/typescript.md +29 -29
- package/templates/core/AGENTS_OVERRIDE.md +16 -16
- package/templates/core/AGENT_AUTOMATION.md +296 -296
- package/templates/core/CLAUDE_MD_v2.md +71 -71
- package/templates/core/DAG.md +304 -304
- package/templates/core/DECISIONS.md +38 -38
- package/templates/core/DOCUMENTATION_RULES.md +36 -36
- package/templates/core/KNOWLEDGE.md +49 -49
- package/templates/core/MULTI_AGENT.md +74 -74
- package/templates/core/PLANS.md +28 -28
- package/templates/core/QUALITY_ENFORCEMENT.md +68 -68
- package/templates/core/RALPH.md +471 -471
- package/templates/core/RULEBOOK.md +1947 -1947
- package/templates/core/TIER1_PROHIBITIONS.md +154 -154
- package/templates/core/TOKEN_OPTIMIZATION.md +49 -49
- package/templates/core/WORKSPACE.md +69 -69
- package/templates/frameworks/ANGULAR.md +36 -36
- package/templates/frameworks/DJANGO.md +83 -83
- package/templates/frameworks/ELECTRON.md +147 -147
- package/templates/frameworks/FLASK.md +38 -38
- package/templates/frameworks/FLUTTER.md +55 -55
- package/templates/frameworks/JQUERY.md +32 -32
- package/templates/frameworks/LARAVEL.md +38 -38
- package/templates/frameworks/NESTJS.md +43 -43
- package/templates/frameworks/NEXTJS.md +127 -127
- package/templates/frameworks/NUXT.md +40 -40
- package/templates/frameworks/RAILS.md +66 -66
- package/templates/frameworks/REACT.md +38 -38
- package/templates/frameworks/REACT_NATIVE.md +47 -47
- package/templates/frameworks/SPRING.md +39 -39
- package/templates/frameworks/SYMFONY.md +36 -36
- package/templates/frameworks/VUE.md +36 -36
- package/templates/frameworks/ZEND.md +35 -35
- package/templates/git/CI_CD_PATTERNS.md +661 -661
- package/templates/git/GITHUB_ACTIONS.md +728 -728
- package/templates/git/GITLAB_CI.md +730 -730
- package/templates/git/GIT_WORKFLOW.md +1192 -1192
- package/templates/git/SECRETS_MANAGEMENT.md +585 -585
- package/templates/hooks/COMMIT_MSG.md +530 -530
- package/templates/hooks/POST_CHECKOUT.md +546 -546
- package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -619
- package/templates/hooks/PRE_COMMIT.md +414 -414
- package/templates/hooks/PRE_PUSH.md +601 -601
- package/templates/hooks/check-context-and-handoff.ps1 +58 -58
- package/templates/hooks/check-context-and-handoff.sh +76 -76
- package/templates/hooks/enforce-team-for-background-agents.ps1 +63 -63
- package/templates/hooks/enforce-team-for-background-agents.sh +55 -55
- package/templates/hooks/on-compact-reinject.sh +34 -34
- package/templates/hooks/resume-from-handoff.ps1 +40 -40
- package/templates/hooks/resume-from-handoff.sh +61 -61
- package/templates/hooks/terse-activate.ps1 +143 -0
- package/templates/hooks/terse-activate.sh +197 -0
- package/templates/hooks/terse-mode-tracker.ps1 +153 -0
- package/templates/hooks/terse-mode-tracker.sh +187 -0
- package/templates/ides/CONTINUE_RULES.md +16 -16
- package/templates/ides/COPILOT.md +37 -37
- package/templates/ides/COPILOT_INSTRUCTIONS.md +23 -23
- package/templates/ides/CURSOR.md +43 -43
- package/templates/ides/GEMINI_RULES.md +17 -17
- package/templates/ides/JETBRAINS_AI.md +35 -35
- package/templates/ides/REPLIT.md +36 -36
- package/templates/ides/TABNINE.md +29 -29
- package/templates/ides/VSCODE.md +40 -40
- package/templates/ides/WINDSURF.md +36 -36
- package/templates/ides/WINDSURF_RULES.md +14 -14
- package/templates/ides/ZED.md +32 -32
- package/templates/ides/cursor-mdc/go.mdc +24 -24
- package/templates/ides/cursor-mdc/python.mdc +24 -24
- package/templates/ides/cursor-mdc/quality.mdc +25 -25
- package/templates/ides/cursor-mdc/ralph.mdc +39 -39
- package/templates/ides/cursor-mdc/rulebook.mdc +38 -38
- package/templates/ides/cursor-mdc/rust.mdc +24 -24
- package/templates/ides/cursor-mdc/typescript.mdc +25 -25
- package/templates/languages/C.md +333 -333
- package/templates/languages/CPP.md +743 -743
- package/templates/languages/CSHARP.md +417 -417
- package/templates/languages/ELIXIR.md +454 -454
- package/templates/languages/ERLANG.md +361 -361
- package/templates/languages/GO.md +645 -645
- package/templates/languages/HASKELL.md +177 -177
- package/templates/languages/JAVA.md +607 -607
- package/templates/languages/JAVASCRIPT.md +631 -631
- package/templates/languages/JULIA.md +97 -97
- package/templates/languages/KOTLIN.md +511 -511
- package/templates/languages/LISP.md +100 -100
- package/templates/languages/LUA.md +74 -74
- package/templates/languages/OBJECTIVEC.md +90 -90
- package/templates/languages/PHP.md +416 -416
- package/templates/languages/PYTHON.md +682 -682
- package/templates/languages/RUBY.md +421 -421
- package/templates/languages/RUST.md +477 -477
- package/templates/languages/SAS.md +73 -73
- package/templates/languages/SCALA.md +348 -348
- package/templates/languages/SOLIDITY.md +580 -580
- package/templates/languages/SQL.md +137 -137
- package/templates/languages/SWIFT.md +466 -466
- package/templates/languages/TYPESCRIPT.md +591 -591
- package/templates/languages/ZIG.md +265 -265
- package/templates/modules/ATLASSIAN.md +255 -255
- package/templates/modules/CONTEXT7.md +54 -54
- package/templates/modules/FIGMA.md +267 -267
- package/templates/modules/GITHUB_MCP.md +64 -64
- package/templates/modules/GRAFANA.md +328 -328
- package/templates/modules/MEMORY.md +126 -126
- package/templates/modules/NOTION.md +247 -247
- package/templates/modules/PLAYWRIGHT.md +90 -90
- package/templates/modules/RULEBOOK_MCP.md +208 -156
- package/templates/modules/SERENA.md +337 -337
- package/templates/modules/SUPABASE.md +223 -223
- package/templates/modules/SYNAP.md +69 -69
- package/templates/modules/VECTORIZER.md +63 -63
- package/templates/modules/sequential-thinking.md +42 -42
- package/templates/ralph/ralph-history.bat +4 -4
- package/templates/ralph/ralph-history.sh +5 -5
- package/templates/ralph/ralph-init.bat +5 -5
- package/templates/ralph/ralph-init.sh +5 -5
- package/templates/ralph/ralph-pause.bat +5 -5
- package/templates/ralph/ralph-pause.sh +5 -5
- package/templates/ralph/ralph-run.bat +5 -5
- package/templates/ralph/ralph-run.sh +5 -5
- package/templates/ralph/ralph-status.bat +4 -4
- package/templates/ralph/ralph-status.sh +5 -5
- package/templates/rules/consult-analysis-before-implementing.md +23 -23
- package/templates/rules/cpp.md +46 -46
- package/templates/rules/csharp.md +44 -44
- package/templates/rules/diagnostic-first.md +39 -39
- package/templates/rules/fail-twice-escalate.md +46 -46
- package/templates/rules/follow-task-sequence.md +36 -36
- package/templates/rules/git-safety.md +29 -29
- package/templates/rules/go.md +40 -40
- package/templates/rules/incremental-implementation.md +56 -56
- package/templates/rules/incremental-tests.md +29 -29
- package/templates/rules/java.md +43 -43
- package/templates/rules/javascript.md +39 -39
- package/templates/rules/knowledge-base-usage.md +41 -41
- package/templates/rules/multi-agent-teams.md +75 -75
- package/templates/rules/no-deferred.md +31 -31
- package/templates/rules/no-shortcuts.md +30 -30
- package/templates/rules/python.md +43 -43
- package/templates/rules/research-first.md +30 -30
- package/templates/rules/respect-handoff-trigger.md +41 -41
- package/templates/rules/rust.md +40 -40
- package/templates/rules/sequential-editing.md +21 -21
- package/templates/rules/session-workflow.md +24 -24
- package/templates/rules/task-decomposition.md +32 -32
- package/templates/rules/typescript.md +40 -40
- package/templates/services/AZURE_BLOB.md +184 -184
- package/templates/services/CASSANDRA.md +239 -239
- package/templates/services/DATADOG.md +26 -26
- package/templates/services/DOCKER.md +124 -124
- package/templates/services/DOCKER_COMPOSE.md +168 -168
- package/templates/services/DYNAMODB.md +308 -308
- package/templates/services/ELASTICSEARCH.md +347 -347
- package/templates/services/GCS.md +178 -178
- package/templates/services/HELM.md +194 -194
- package/templates/services/INFLUXDB.md +265 -265
- package/templates/services/KAFKA.md +341 -341
- package/templates/services/KUBERNETES.md +208 -208
- package/templates/services/MARIADB.md +183 -183
- package/templates/services/MEMCACHED.md +242 -242
- package/templates/services/MINIO.md +201 -201
- package/templates/services/MONGODB.md +268 -268
- package/templates/services/MYSQL.md +358 -358
- package/templates/services/NEO4J.md +247 -247
- package/templates/services/OPENTELEMETRY.md +25 -25
- package/templates/services/ORACLE.md +290 -290
- package/templates/services/PINO.md +24 -24
- package/templates/services/POSTGRESQL.md +326 -326
- package/templates/services/PROMETHEUS.md +33 -33
- package/templates/services/RABBITMQ.md +286 -286
- package/templates/services/REDIS.md +292 -292
- package/templates/services/S3.md +298 -298
- package/templates/services/SENTRY.md +23 -23
- package/templates/services/SQLITE.md +294 -294
- package/templates/services/SQLSERVER.md +294 -294
- package/templates/services/WINSTON.md +30 -30
- package/templates/skills/cli/aider/SKILL.md +59 -59
- package/templates/skills/cli/amazon-q/SKILL.md +35 -35
- package/templates/skills/cli/auggie/SKILL.md +42 -42
- package/templates/skills/cli/claude/SKILL.md +42 -42
- package/templates/skills/cli/cline/SKILL.md +42 -42
- package/templates/skills/cli/codebuddy/SKILL.md +30 -30
- package/templates/skills/cli/codeium/SKILL.md +30 -30
- package/templates/skills/cli/codex/SKILL.md +31 -31
- package/templates/skills/cli/continue/SKILL.md +44 -44
- package/templates/skills/cli/cursor-cli/SKILL.md +38 -38
- package/templates/skills/cli/factory/SKILL.md +28 -28
- package/templates/skills/cli/gemini/SKILL.md +45 -45
- package/templates/skills/cli/kilocode/SKILL.md +28 -28
- package/templates/skills/cli/opencode/SKILL.md +28 -28
- package/templates/skills/core/agent-automation/SKILL.md +194 -194
- package/templates/skills/core/dag/SKILL.md +314 -314
- package/templates/skills/core/documentation-rules/SKILL.md +46 -46
- package/templates/skills/core/quality-enforcement/SKILL.md +78 -78
- package/templates/skills/core/rulebook/SKILL.md +176 -176
- package/templates/skills/core/rulebook-terse/SKILL.md +116 -0
- package/templates/skills/core/rulebook-terse-commit/SKILL.md +96 -0
- package/templates/skills/core/rulebook-terse-review/SKILL.md +112 -0
- package/templates/skills/dev/accessibility/SKILL.md +17 -17
- package/templates/skills/dev/analysis/SKILL.md +19 -19
- package/templates/skills/dev/api-design/SKILL.md +15 -15
- package/templates/skills/dev/architect/SKILL.md +17 -17
- package/templates/skills/dev/build-fix/SKILL.md +17 -17
- package/templates/skills/dev/db-design/SKILL.md +15 -15
- package/templates/skills/dev/debug/SKILL.md +16 -16
- package/templates/skills/dev/deploy/SKILL.md +17 -17
- package/templates/skills/dev/docs/SKILL.md +17 -17
- package/templates/skills/dev/handoff/SKILL.md +27 -27
- package/templates/skills/dev/migrate/SKILL.md +15 -15
- package/templates/skills/dev/perf/SKILL.md +17 -17
- package/templates/skills/dev/refactor/SKILL.md +17 -17
- package/templates/skills/dev/research/SKILL.md +14 -14
- package/templates/skills/dev/review/SKILL.md +18 -18
- package/templates/skills/dev/security-audit/SKILL.md +17 -17
- package/templates/skills/frameworks/angular/SKILL.md +46 -46
- package/templates/skills/frameworks/django/SKILL.md +93 -93
- package/templates/skills/frameworks/electron/SKILL.md +157 -157
- package/templates/skills/frameworks/flask/SKILL.md +48 -48
- package/templates/skills/frameworks/flutter/SKILL.md +65 -65
- package/templates/skills/frameworks/jquery/SKILL.md +42 -42
- package/templates/skills/frameworks/laravel/SKILL.md +48 -48
- package/templates/skills/frameworks/nestjs/SKILL.md +53 -53
- package/templates/skills/frameworks/nextjs/SKILL.md +137 -137
- package/templates/skills/frameworks/nuxt/SKILL.md +50 -50
- package/templates/skills/frameworks/rails/SKILL.md +76 -76
- package/templates/skills/frameworks/react/SKILL.md +48 -48
- package/templates/skills/frameworks/react-native/SKILL.md +57 -57
- package/templates/skills/frameworks/spring/SKILL.md +49 -49
- package/templates/skills/frameworks/symfony/SKILL.md +46 -46
- package/templates/skills/frameworks/vue/SKILL.md +46 -46
- package/templates/skills/frameworks/zend/SKILL.md +45 -45
- package/templates/skills/ides/copilot/SKILL.md +47 -47
- package/templates/skills/ides/cursor/SKILL.md +53 -53
- package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -45
- package/templates/skills/ides/replit/SKILL.md +46 -46
- package/templates/skills/ides/tabnine/SKILL.md +39 -39
- package/templates/skills/ides/vscode/SKILL.md +50 -50
- package/templates/skills/ides/windsurf/SKILL.md +46 -46
- package/templates/skills/ides/zed/SKILL.md +42 -42
- package/templates/skills/languages/c/SKILL.md +343 -343
- package/templates/skills/languages/cpp/SKILL.md +753 -753
- package/templates/skills/languages/csharp/SKILL.md +427 -427
- package/templates/skills/languages/elixir/SKILL.md +464 -464
- package/templates/skills/languages/erlang/SKILL.md +371 -371
- package/templates/skills/languages/go/SKILL.md +655 -655
- package/templates/skills/languages/haskell/SKILL.md +187 -187
- package/templates/skills/languages/java/SKILL.md +617 -617
- package/templates/skills/languages/javascript/SKILL.md +641 -641
- package/templates/skills/languages/julia/SKILL.md +107 -107
- package/templates/skills/languages/kotlin/SKILL.md +521 -521
- package/templates/skills/languages/lisp/SKILL.md +110 -110
- package/templates/skills/languages/lua/SKILL.md +84 -84
- package/templates/skills/languages/objectivec/SKILL.md +100 -100
- package/templates/skills/languages/php/SKILL.md +426 -426
- package/templates/skills/languages/python/SKILL.md +692 -692
- package/templates/skills/languages/ruby/SKILL.md +431 -431
- package/templates/skills/languages/rust/SKILL.md +487 -487
- package/templates/skills/languages/sas/SKILL.md +83 -83
- package/templates/skills/languages/scala/SKILL.md +358 -358
- package/templates/skills/languages/solidity/SKILL.md +590 -590
- package/templates/skills/languages/sql/SKILL.md +147 -147
- package/templates/skills/languages/swift/SKILL.md +476 -476
- package/templates/skills/languages/typescript/SKILL.md +302 -302
- package/templates/skills/languages/zig/SKILL.md +275 -275
- package/templates/skills/modules/atlassian/SKILL.md +265 -265
- package/templates/skills/modules/context7/SKILL.md +64 -64
- package/templates/skills/modules/figma/SKILL.md +277 -277
- package/templates/skills/modules/github-mcp/SKILL.md +74 -74
- package/templates/skills/modules/grafana/SKILL.md +338 -338
- package/templates/skills/modules/memory/SKILL.md +73 -73
- package/templates/skills/modules/notion/SKILL.md +257 -257
- package/templates/skills/modules/playwright/SKILL.md +100 -100
- package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -166
- package/templates/skills/modules/serena/SKILL.md +347 -347
- package/templates/skills/modules/supabase/SKILL.md +233 -233
- package/templates/skills/modules/synap/SKILL.md +79 -79
- package/templates/skills/modules/vectorizer/SKILL.md +73 -73
- package/templates/skills/services/azure-blob/SKILL.md +194 -194
- package/templates/skills/services/cassandra/SKILL.md +249 -249
- package/templates/skills/services/dynamodb/SKILL.md +318 -318
- package/templates/skills/services/elasticsearch/SKILL.md +357 -357
- package/templates/skills/services/gcs/SKILL.md +188 -188
- package/templates/skills/services/influxdb/SKILL.md +275 -275
- package/templates/skills/services/kafka/SKILL.md +351 -351
- package/templates/skills/services/mariadb/SKILL.md +193 -193
- package/templates/skills/services/memcached/SKILL.md +252 -252
- package/templates/skills/services/minio/SKILL.md +211 -211
- package/templates/skills/services/mongodb/SKILL.md +278 -278
- package/templates/skills/services/mysql/SKILL.md +368 -368
- package/templates/skills/services/neo4j/SKILL.md +257 -257
- package/templates/skills/services/oracle/SKILL.md +300 -300
- package/templates/skills/services/postgresql/SKILL.md +336 -336
- package/templates/skills/services/rabbitmq/SKILL.md +296 -296
- package/templates/skills/services/redis/SKILL.md +302 -302
- package/templates/skills/services/s3/SKILL.md +308 -308
- package/templates/skills/services/sqlite/SKILL.md +304 -304
- package/templates/skills/services/sqlserver/SKILL.md +304 -304
- package/templates/skills/workflows/ralph/SKILL.md +309 -309
- package/templates/skills/workflows/ralph/install.sh +87 -87
- package/templates/skills/workflows/ralph/manifest.json +158 -158
- package/templates/workflows/codespell.yml +31 -31
- package/templates/workflows/cpp-lint.yml +47 -47
- package/templates/workflows/cpp-publish.yml +119 -119
- package/templates/workflows/cpp-test.yml +77 -77
- package/templates/workflows/dotnet-lint.yml +29 -29
- package/templates/workflows/dotnet-publish.yml +40 -40
- package/templates/workflows/dotnet-test.yml +41 -41
- package/templates/workflows/elixir-lint.yml +45 -45
- package/templates/workflows/elixir-publish.yml +49 -49
- package/templates/workflows/elixir-test.yml +54 -54
- package/templates/workflows/erlang-lint.yml +47 -47
- package/templates/workflows/erlang-test.yml +62 -62
- package/templates/workflows/go-lint.yml +39 -39
- package/templates/workflows/go-publish.yml +95 -95
- package/templates/workflows/go-test.yml +59 -59
- package/templates/workflows/java-lint.yml +60 -60
- package/templates/workflows/java-publish.yml +120 -120
- package/templates/workflows/java-test.yml +85 -85
- package/templates/workflows/kotlin-lint.yml +34 -34
- package/templates/workflows/kotlin-publish.yml +56 -56
- package/templates/workflows/kotlin-test.yml +48 -48
- package/templates/workflows/php-lint.yml +39 -39
- package/templates/workflows/php-publish.yml +50 -50
- package/templates/workflows/php-test.yml +54 -54
- package/templates/workflows/python-lint.yml +47 -47
- package/templates/workflows/python-publish.yml +91 -91
- package/templates/workflows/python-test.yml +59 -59
- package/templates/workflows/rust-lint.yml +54 -54
- package/templates/workflows/rust-publish.yml +66 -66
- package/templates/workflows/rust-test.yml +75 -75
- package/templates/workflows/solidity-lint.yml +41 -41
- package/templates/workflows/solidity-test.yml +47 -47
- package/templates/workflows/swift-lint.yml +32 -32
- package/templates/workflows/swift-publish.yml +58 -58
- package/templates/workflows/swift-test.yml +44 -44
- package/templates/workflows/typescript-publish.yml +60 -60
- package/templates/workflows/typescript-test.yml +73 -73
- package/templates/workflows/zig-lint.yml +27 -27
- package/templates/workflows/zig-test.yml +40 -40
- package/dist/cli/commands.d.ts +0 -225
- package/dist/cli/commands.d.ts.map +0 -1
- package/dist/cli/commands.js +0 -3984
- package/dist/cli/commands.js.map +0 -1
|
@@ -1,730 +1,730 @@
|
|
|
1
|
-
# GitLab CI/CD
|
|
2
|
-
|
|
3
|
-
This template provides guidance for implementing GitLab CI/CD pipelines with best practices for multi-stage pipelines, caching, and artifacts.
|
|
4
|
-
|
|
5
|
-
## Purpose
|
|
6
|
-
|
|
7
|
-
GitLab CI/CD enables:
|
|
8
|
-
- Automated testing and building
|
|
9
|
-
- Continuous deployment
|
|
10
|
-
- Container registry integration
|
|
11
|
-
- Built-in security scanning
|
|
12
|
-
- Kubernetes deployment
|
|
13
|
-
|
|
14
|
-
## Agent Automation Commands
|
|
15
|
-
|
|
16
|
-
When implementing or modifying GitLab CI pipelines:
|
|
17
|
-
|
|
18
|
-
### Local Testing
|
|
19
|
-
```bash
|
|
20
|
-
# Validate .gitlab-ci.yml syntax
|
|
21
|
-
gitlab-ci-lint .gitlab-ci.yml
|
|
22
|
-
|
|
23
|
-
# Or via API
|
|
24
|
-
curl --header "Content-Type: application/json" \
|
|
25
|
-
--data @.gitlab-ci.yml \
|
|
26
|
-
https://gitlab.com/api/v4/ci/lint
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
### Pipeline Management
|
|
30
|
-
```bash
|
|
31
|
-
# Trigger pipeline
|
|
32
|
-
gitlab-runner exec shell build
|
|
33
|
-
|
|
34
|
-
# View pipeline status
|
|
35
|
-
git lab pipeline status
|
|
36
|
-
|
|
37
|
-
# View pipeline logs
|
|
38
|
-
gitlab-runner exec shell test --debug
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Basic Pipeline Structure
|
|
42
|
-
|
|
43
|
-
### Minimal CI Pipeline
|
|
44
|
-
|
|
45
|
-
**`.gitlab-ci.yml`**:
|
|
46
|
-
```yaml
|
|
47
|
-
image: node:20
|
|
48
|
-
|
|
49
|
-
stages:
|
|
50
|
-
- test
|
|
51
|
-
- build
|
|
52
|
-
- deploy
|
|
53
|
-
|
|
54
|
-
test:
|
|
55
|
-
stage: test
|
|
56
|
-
script:
|
|
57
|
-
- npm ci
|
|
58
|
-
- npm test
|
|
59
|
-
|
|
60
|
-
build:
|
|
61
|
-
stage: build
|
|
62
|
-
script:
|
|
63
|
-
- npm run build
|
|
64
|
-
artifacts:
|
|
65
|
-
paths:
|
|
66
|
-
- dist/
|
|
67
|
-
expire_in: 1 week
|
|
68
|
-
|
|
69
|
-
deploy:
|
|
70
|
-
stage: deploy
|
|
71
|
-
script:
|
|
72
|
-
- echo "Deploying to production"
|
|
73
|
-
environment:
|
|
74
|
-
name: production
|
|
75
|
-
url: https://example.com
|
|
76
|
-
only:
|
|
77
|
-
- main
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### Complete CI/CD Pipeline
|
|
81
|
-
|
|
82
|
-
**`.gitlab-ci.yml`**:
|
|
83
|
-
```yaml
|
|
84
|
-
image: node:20
|
|
85
|
-
|
|
86
|
-
variables:
|
|
87
|
-
NPM_CONFIG_CACHE: "$CI_PROJECT_DIR/.npm"
|
|
88
|
-
CYPRESS_CACHE_FOLDER: "$CI_PROJECT_DIR/.cypress"
|
|
89
|
-
|
|
90
|
-
stages:
|
|
91
|
-
- validate
|
|
92
|
-
- build
|
|
93
|
-
- test
|
|
94
|
-
- security
|
|
95
|
-
- deploy
|
|
96
|
-
|
|
97
|
-
# Template for node jobs
|
|
98
|
-
.node-template:
|
|
99
|
-
before_script:
|
|
100
|
-
- npm ci --prefer-offline
|
|
101
|
-
cache:
|
|
102
|
-
key:
|
|
103
|
-
files:
|
|
104
|
-
- package-lock.json
|
|
105
|
-
paths:
|
|
106
|
-
- .npm/
|
|
107
|
-
- node_modules/
|
|
108
|
-
|
|
109
|
-
lint:
|
|
110
|
-
extends: .node-template
|
|
111
|
-
stage: validate
|
|
112
|
-
script:
|
|
113
|
-
- npm run lint
|
|
114
|
-
- npm run format:check
|
|
115
|
-
|
|
116
|
-
typecheck:
|
|
117
|
-
extends: .node-template
|
|
118
|
-
stage: validate
|
|
119
|
-
script:
|
|
120
|
-
- npm run type-check
|
|
121
|
-
|
|
122
|
-
build:
|
|
123
|
-
extends: .node-template
|
|
124
|
-
stage: build
|
|
125
|
-
script:
|
|
126
|
-
- npm run build
|
|
127
|
-
artifacts:
|
|
128
|
-
paths:
|
|
129
|
-
- dist/
|
|
130
|
-
expire_in: 1 week
|
|
131
|
-
|
|
132
|
-
test:unit:
|
|
133
|
-
extends: .node-template
|
|
134
|
-
stage: test
|
|
135
|
-
parallel:
|
|
136
|
-
matrix:
|
|
137
|
-
- NODE_VERSION: ['18', '20', '22']
|
|
138
|
-
image: node:$NODE_VERSION
|
|
139
|
-
script:
|
|
140
|
-
- npm test
|
|
141
|
-
coverage: '/Statements\s*:\s*(\d+\.\d+)%/'
|
|
142
|
-
artifacts:
|
|
143
|
-
reports:
|
|
144
|
-
junit: junit.xml
|
|
145
|
-
coverage_report:
|
|
146
|
-
coverage_format: cobertura
|
|
147
|
-
path: coverage/cobertura-coverage.xml
|
|
148
|
-
|
|
149
|
-
test:e2e:
|
|
150
|
-
extends: .node-template
|
|
151
|
-
stage: test
|
|
152
|
-
script:
|
|
153
|
-
- npm run test:e2e
|
|
154
|
-
artifacts:
|
|
155
|
-
when: on_failure
|
|
156
|
-
paths:
|
|
157
|
-
- cypress/screenshots/
|
|
158
|
-
- cypress/videos/
|
|
159
|
-
expire_in: 1 week
|
|
160
|
-
|
|
161
|
-
security:dependencies:
|
|
162
|
-
stage: security
|
|
163
|
-
script:
|
|
164
|
-
- npm audit --audit-level=high
|
|
165
|
-
allow_failure: true
|
|
166
|
-
|
|
167
|
-
security:sast:
|
|
168
|
-
stage: security
|
|
169
|
-
image: registry.gitlab.com/gitlab-org/security-products/analyzers/semgrep:latest
|
|
170
|
-
script:
|
|
171
|
-
- /analyzer run
|
|
172
|
-
artifacts:
|
|
173
|
-
reports:
|
|
174
|
-
sast: gl-sast-report.json
|
|
175
|
-
|
|
176
|
-
deploy:staging:
|
|
177
|
-
stage: deploy
|
|
178
|
-
script:
|
|
179
|
-
- npm run deploy:staging
|
|
180
|
-
environment:
|
|
181
|
-
name: staging
|
|
182
|
-
url: https://staging.example.com
|
|
183
|
-
only:
|
|
184
|
-
- develop
|
|
185
|
-
|
|
186
|
-
deploy:production:
|
|
187
|
-
stage: deploy
|
|
188
|
-
script:
|
|
189
|
-
- npm run deploy:production
|
|
190
|
-
environment:
|
|
191
|
-
name: production
|
|
192
|
-
url: https://example.com
|
|
193
|
-
when: manual
|
|
194
|
-
only:
|
|
195
|
-
- main
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
## Best Practices
|
|
199
|
-
|
|
200
|
-
### ✅ DO
|
|
201
|
-
|
|
202
|
-
1. **Use Caching**
|
|
203
|
-
```yaml
|
|
204
|
-
cache:
|
|
205
|
-
key:
|
|
206
|
-
files:
|
|
207
|
-
- package-lock.json
|
|
208
|
-
paths:
|
|
209
|
-
- node_modules/
|
|
210
|
-
- .npm/
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
2. **Use Job Templates (DRY)**
|
|
214
|
-
```yaml
|
|
215
|
-
.deploy-template:
|
|
216
|
-
stage: deploy
|
|
217
|
-
script:
|
|
218
|
-
- deploy.sh $ENVIRONMENT
|
|
219
|
-
only:
|
|
220
|
-
- main
|
|
221
|
-
|
|
222
|
-
deploy:staging:
|
|
223
|
-
extends: .deploy-template
|
|
224
|
-
variables:
|
|
225
|
-
ENVIRONMENT: staging
|
|
226
|
-
|
|
227
|
-
deploy:production:
|
|
228
|
-
extends: .deploy-template
|
|
229
|
-
variables:
|
|
230
|
-
ENVIRONMENT: production
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
3. **Use Parallel Matrix**
|
|
234
|
-
```yaml
|
|
235
|
-
test:
|
|
236
|
-
parallel:
|
|
237
|
-
matrix:
|
|
238
|
-
- NODE_VERSION: ['18', '20', '22']
|
|
239
|
-
OS: ['ubuntu', 'alpine']
|
|
240
|
-
image: node:$NODE_VERSION-$OS
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
4. **Use Pipeline-Specific Variables**
|
|
244
|
-
```yaml
|
|
245
|
-
variables:
|
|
246
|
-
DEPLOY_ENV: "production"
|
|
247
|
-
API_ENDPOINT: "https://api.example.com"
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
5. **Use Artifacts for Build Outputs**
|
|
251
|
-
```yaml
|
|
252
|
-
build:
|
|
253
|
-
artifacts:
|
|
254
|
-
paths:
|
|
255
|
-
- dist/
|
|
256
|
-
expire_in: 1 week
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
### ❌ DON'T
|
|
260
|
-
|
|
261
|
-
1. **Don't hardcode secrets**
|
|
262
|
-
```yaml
|
|
263
|
-
# Bad
|
|
264
|
-
script:
|
|
265
|
-
- export API_KEY="sk_live_abc123"
|
|
266
|
-
|
|
267
|
-
# Good
|
|
268
|
-
script:
|
|
269
|
-
- export API_KEY="$API_KEY" # From CI/CD variables
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
2. **Don't use `latest` tags**
|
|
273
|
-
```yaml
|
|
274
|
-
# Bad
|
|
275
|
-
image: node:latest
|
|
276
|
-
|
|
277
|
-
# Good
|
|
278
|
-
image: node:20.11.0
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
3. **Don't run unnecessary jobs**
|
|
282
|
-
```yaml
|
|
283
|
-
# Good - only run on specific branches
|
|
284
|
-
deploy:
|
|
285
|
-
only:
|
|
286
|
-
- main
|
|
287
|
-
except:
|
|
288
|
-
- schedules
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
## Caching Strategies
|
|
292
|
-
|
|
293
|
-
### Global Cache
|
|
294
|
-
|
|
295
|
-
```yaml
|
|
296
|
-
# Apply to all jobs
|
|
297
|
-
cache:
|
|
298
|
-
key: ${CI_COMMIT_REF_SLUG}
|
|
299
|
-
paths:
|
|
300
|
-
- node_modules/
|
|
301
|
-
- .npm/
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
### Job-Specific Cache
|
|
305
|
-
|
|
306
|
-
```yaml
|
|
307
|
-
test:
|
|
308
|
-
cache:
|
|
309
|
-
key: test-cache
|
|
310
|
-
paths:
|
|
311
|
-
- node_modules/
|
|
312
|
-
- .cache/
|
|
313
|
-
|
|
314
|
-
build:
|
|
315
|
-
cache:
|
|
316
|
-
key: build-cache
|
|
317
|
-
paths:
|
|
318
|
-
- dist/
|
|
319
|
-
- .webpack-cache/
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
### Cache with Fallback
|
|
323
|
-
|
|
324
|
-
```yaml
|
|
325
|
-
cache:
|
|
326
|
-
key: ${CI_COMMIT_REF_SLUG}
|
|
327
|
-
paths:
|
|
328
|
-
- node_modules/
|
|
329
|
-
policy: pull # Only pull, don't push
|
|
330
|
-
|
|
331
|
-
build:
|
|
332
|
-
cache:
|
|
333
|
-
key: ${CI_COMMIT_REF_SLUG}
|
|
334
|
-
paths:
|
|
335
|
-
- node_modules/
|
|
336
|
-
policy: pull-push # Pull and push cache
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
## Artifacts and Dependencies
|
|
340
|
-
|
|
341
|
-
### Uploading Artifacts
|
|
342
|
-
|
|
343
|
-
```yaml
|
|
344
|
-
build:
|
|
345
|
-
script:
|
|
346
|
-
- npm run build
|
|
347
|
-
artifacts:
|
|
348
|
-
name: "dist-$CI_COMMIT_SHORT_SHA"
|
|
349
|
-
paths:
|
|
350
|
-
- dist/
|
|
351
|
-
expire_in: 1 week
|
|
352
|
-
when: on_success # or always, on_failure
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
### Downloading Artifacts
|
|
356
|
-
|
|
357
|
-
```yaml
|
|
358
|
-
deploy:
|
|
359
|
-
dependencies:
|
|
360
|
-
- build # Downloads artifacts from 'build' job
|
|
361
|
-
script:
|
|
362
|
-
- ls dist/ # Artifact available
|
|
363
|
-
- deploy.sh
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
### Artifact Reports
|
|
367
|
-
|
|
368
|
-
```yaml
|
|
369
|
-
test:
|
|
370
|
-
script:
|
|
371
|
-
- npm test
|
|
372
|
-
artifacts:
|
|
373
|
-
reports:
|
|
374
|
-
junit: junit.xml
|
|
375
|
-
coverage_report:
|
|
376
|
-
coverage_format: cobertura
|
|
377
|
-
path: coverage/cobertura-coverage.xml
|
|
378
|
-
dotenv: build.env # Export variables to other jobs
|
|
379
|
-
```
|
|
380
|
-
|
|
381
|
-
## Multi-Project Pipelines
|
|
382
|
-
|
|
383
|
-
### Parent Pipeline
|
|
384
|
-
|
|
385
|
-
```yaml
|
|
386
|
-
# .gitlab-ci.yml
|
|
387
|
-
trigger:frontend:
|
|
388
|
-
stage: deploy
|
|
389
|
-
trigger:
|
|
390
|
-
project: mygroup/frontend
|
|
391
|
-
strategy: depend
|
|
392
|
-
|
|
393
|
-
trigger:backend:
|
|
394
|
-
stage: deploy
|
|
395
|
-
trigger:
|
|
396
|
-
project: mygroup/backend
|
|
397
|
-
strategy: depend
|
|
398
|
-
```
|
|
399
|
-
|
|
400
|
-
### Child Pipelines
|
|
401
|
-
|
|
402
|
-
```yaml
|
|
403
|
-
# Parent pipeline
|
|
404
|
-
generate-config:
|
|
405
|
-
script:
|
|
406
|
-
- generate-dynamic-config.sh > dynamic.yml
|
|
407
|
-
artifacts:
|
|
408
|
-
paths:
|
|
409
|
-
- dynamic.yml
|
|
410
|
-
|
|
411
|
-
trigger-child:
|
|
412
|
-
trigger:
|
|
413
|
-
include:
|
|
414
|
-
- artifact: dynamic.yml
|
|
415
|
-
job: generate-config
|
|
416
|
-
strategy: depend
|
|
417
|
-
```
|
|
418
|
-
|
|
419
|
-
## Docker Integration
|
|
420
|
-
|
|
421
|
-
### Build and Push Docker Image
|
|
422
|
-
|
|
423
|
-
```yaml
|
|
424
|
-
docker-build:
|
|
425
|
-
image: docker:latest
|
|
426
|
-
services:
|
|
427
|
-
- docker:dind
|
|
428
|
-
variables:
|
|
429
|
-
DOCKER_DRIVER: overlay2
|
|
430
|
-
DOCKER_TLS_CERTDIR: "/certs"
|
|
431
|
-
before_script:
|
|
432
|
-
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
|
|
433
|
-
script:
|
|
434
|
-
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
|
|
435
|
-
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
|
|
436
|
-
```
|
|
437
|
-
|
|
438
|
-
### Use GitLab Container Registry
|
|
439
|
-
|
|
440
|
-
```yaml
|
|
441
|
-
build:
|
|
442
|
-
image: docker:latest
|
|
443
|
-
services:
|
|
444
|
-
- docker:dind
|
|
445
|
-
script:
|
|
446
|
-
# Login to GitLab Container Registry
|
|
447
|
-
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
|
|
448
|
-
|
|
449
|
-
# Build and tag
|
|
450
|
-
- docker build -t $CI_REGISTRY_IMAGE:latest .
|
|
451
|
-
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG .
|
|
452
|
-
|
|
453
|
-
# Push
|
|
454
|
-
- docker push $CI_REGISTRY_IMAGE:latest
|
|
455
|
-
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
|
|
456
|
-
```
|
|
457
|
-
|
|
458
|
-
## Kubernetes Deployment
|
|
459
|
-
|
|
460
|
-
### Deploy to Kubernetes
|
|
461
|
-
|
|
462
|
-
```yaml
|
|
463
|
-
deploy:k8s:
|
|
464
|
-
image: bitnami/kubectl:latest
|
|
465
|
-
stage: deploy
|
|
466
|
-
script:
|
|
467
|
-
# Configure kubectl
|
|
468
|
-
- kubectl config set-cluster k8s --server="$KUBE_URL" --insecure-skip-tls-verify=true
|
|
469
|
-
- kubectl config set-credentials admin --token="$KUBE_TOKEN"
|
|
470
|
-
- kubectl config set-context default --cluster=k8s --user=admin
|
|
471
|
-
- kubectl config use-context default
|
|
472
|
-
|
|
473
|
-
# Deploy
|
|
474
|
-
- kubectl set image deployment/app app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
|
|
475
|
-
- kubectl rollout status deployment/app
|
|
476
|
-
environment:
|
|
477
|
-
name: production
|
|
478
|
-
kubernetes:
|
|
479
|
-
namespace: production
|
|
480
|
-
```
|
|
481
|
-
|
|
482
|
-
### Helm Deployment
|
|
483
|
-
|
|
484
|
-
```yaml
|
|
485
|
-
deploy:helm:
|
|
486
|
-
image: alpine/helm:latest
|
|
487
|
-
stage: deploy
|
|
488
|
-
script:
|
|
489
|
-
- helm upgrade --install myapp ./charts/myapp \
|
|
490
|
-
--set image.tag=$CI_COMMIT_SHORT_SHA \
|
|
491
|
-
--namespace production
|
|
492
|
-
environment:
|
|
493
|
-
name: production
|
|
494
|
-
```
|
|
495
|
-
|
|
496
|
-
## Rules and Conditions
|
|
497
|
-
|
|
498
|
-
### Complex Rules
|
|
499
|
-
|
|
500
|
-
```yaml
|
|
501
|
-
test:
|
|
502
|
-
script:
|
|
503
|
-
- npm test
|
|
504
|
-
rules:
|
|
505
|
-
# Run on main branch
|
|
506
|
-
- if: $CI_COMMIT_BRANCH == "main"
|
|
507
|
-
when: always
|
|
508
|
-
|
|
509
|
-
# Run on merge requests
|
|
510
|
-
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
|
511
|
-
when: always
|
|
512
|
-
|
|
513
|
-
# Run on tags starting with 'v'
|
|
514
|
-
- if: $CI_COMMIT_TAG =~ /^v/
|
|
515
|
-
when: always
|
|
516
|
-
|
|
517
|
-
# Skip on schedules
|
|
518
|
-
- if: $CI_PIPELINE_SOURCE == "schedule"
|
|
519
|
-
when: never
|
|
520
|
-
|
|
521
|
-
# Manual for feature branches
|
|
522
|
-
- if: $CI_COMMIT_BRANCH =~ /^feature\//
|
|
523
|
-
when: manual
|
|
524
|
-
|
|
525
|
-
# Otherwise skip
|
|
526
|
-
- when: never
|
|
527
|
-
```
|
|
528
|
-
|
|
529
|
-
### Changes-Based Execution
|
|
530
|
-
|
|
531
|
-
```yaml
|
|
532
|
-
test:backend:
|
|
533
|
-
script:
|
|
534
|
-
- cd backend && npm test
|
|
535
|
-
rules:
|
|
536
|
-
- changes:
|
|
537
|
-
- backend/**/*
|
|
538
|
-
when: always
|
|
539
|
-
|
|
540
|
-
test:frontend:
|
|
541
|
-
script:
|
|
542
|
-
- cd frontend && npm test
|
|
543
|
-
rules:
|
|
544
|
-
- changes:
|
|
545
|
-
- frontend/**/*
|
|
546
|
-
when: always
|
|
547
|
-
```
|
|
548
|
-
|
|
549
|
-
## Security Scanning
|
|
550
|
-
|
|
551
|
-
### SAST (Static Application Security Testing)
|
|
552
|
-
|
|
553
|
-
```yaml
|
|
554
|
-
include:
|
|
555
|
-
- template: Security/SAST.gitlab-ci.yml
|
|
556
|
-
|
|
557
|
-
sast:
|
|
558
|
-
stage: security
|
|
559
|
-
variables:
|
|
560
|
-
SAST_EXCLUDED_PATHS: "spec, test, tests, tmp, node_modules"
|
|
561
|
-
```
|
|
562
|
-
|
|
563
|
-
### Dependency Scanning
|
|
564
|
-
|
|
565
|
-
```yaml
|
|
566
|
-
include:
|
|
567
|
-
- template: Security/Dependency-Scanning.gitlab-ci.yml
|
|
568
|
-
|
|
569
|
-
dependency_scanning:
|
|
570
|
-
stage: security
|
|
571
|
-
```
|
|
572
|
-
|
|
573
|
-
### Container Scanning
|
|
574
|
-
|
|
575
|
-
```yaml
|
|
576
|
-
include:
|
|
577
|
-
- template: Security/Container-Scanning.gitlab-ci.yml
|
|
578
|
-
|
|
579
|
-
container_scanning:
|
|
580
|
-
stage: security
|
|
581
|
-
variables:
|
|
582
|
-
CS_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
|
|
583
|
-
```
|
|
584
|
-
|
|
585
|
-
## Optimization Patterns
|
|
586
|
-
|
|
587
|
-
### Skip Pipeline for Docs
|
|
588
|
-
|
|
589
|
-
```yaml
|
|
590
|
-
# Skip pipeline if only docs changed
|
|
591
|
-
workflow:
|
|
592
|
-
rules:
|
|
593
|
-
- if: $CI_PIPELINE_SOURCE == "push"
|
|
594
|
-
changes:
|
|
595
|
-
- "**/*.md"
|
|
596
|
-
- "docs/**/*"
|
|
597
|
-
when: never
|
|
598
|
-
- when: always
|
|
599
|
-
```
|
|
600
|
-
|
|
601
|
-
### Interruptible Jobs
|
|
602
|
-
|
|
603
|
-
```yaml
|
|
604
|
-
test:
|
|
605
|
-
interruptible: true # Cancel if new pipeline starts
|
|
606
|
-
script:
|
|
607
|
-
- npm test
|
|
608
|
-
```
|
|
609
|
-
|
|
610
|
-
### Retry Failed Jobs
|
|
611
|
-
|
|
612
|
-
```yaml
|
|
613
|
-
test:
|
|
614
|
-
script:
|
|
615
|
-
- npm test
|
|
616
|
-
retry:
|
|
617
|
-
max: 2
|
|
618
|
-
when:
|
|
619
|
-
- runner_system_failure
|
|
620
|
-
- stuck_or_timeout_failure
|
|
621
|
-
```
|
|
622
|
-
|
|
623
|
-
## CI/CD Variables
|
|
624
|
-
|
|
625
|
-
### Predefined Variables
|
|
626
|
-
|
|
627
|
-
```yaml
|
|
628
|
-
test:
|
|
629
|
-
script:
|
|
630
|
-
- echo "Pipeline ID: $CI_PIPELINE_ID"
|
|
631
|
-
- echo "Commit SHA: $CI_COMMIT_SHA"
|
|
632
|
-
- echo "Commit Branch: $CI_COMMIT_BRANCH"
|
|
633
|
-
- echo "Commit Tag: $CI_COMMIT_TAG"
|
|
634
|
-
- echo "Project Name: $CI_PROJECT_NAME"
|
|
635
|
-
- echo "Registry: $CI_REGISTRY_IMAGE"
|
|
636
|
-
```
|
|
637
|
-
|
|
638
|
-
### Custom Variables
|
|
639
|
-
|
|
640
|
-
```yaml
|
|
641
|
-
variables:
|
|
642
|
-
ENVIRONMENT: "production"
|
|
643
|
-
API_ENDPOINT: "https://api.example.com"
|
|
644
|
-
|
|
645
|
-
deploy:
|
|
646
|
-
script:
|
|
647
|
-
- deploy.sh --env $ENVIRONMENT --api $API_ENDPOINT
|
|
648
|
-
```
|
|
649
|
-
|
|
650
|
-
### Protected Variables
|
|
651
|
-
|
|
652
|
-
**Add via UI**: Settings → CI/CD → Variables
|
|
653
|
-
|
|
654
|
-
```yaml
|
|
655
|
-
deploy:
|
|
656
|
-
script:
|
|
657
|
-
- echo "Deploying with token: $DEPLOY_TOKEN"
|
|
658
|
-
only:
|
|
659
|
-
- main # Protected variables only available on protected branches
|
|
660
|
-
```
|
|
661
|
-
|
|
662
|
-
## Troubleshooting
|
|
663
|
-
|
|
664
|
-
### Pipeline Not Triggered
|
|
665
|
-
|
|
666
|
-
**Check**:
|
|
667
|
-
1. `.gitlab-ci.yml` syntax valid
|
|
668
|
-
2. Rules/only/except conditions met
|
|
669
|
-
3. CI/CD enabled for project
|
|
670
|
-
4. GitLab Runner available
|
|
671
|
-
|
|
672
|
-
### Cache Not Working
|
|
673
|
-
|
|
674
|
-
**Solutions**:
|
|
675
|
-
```yaml
|
|
676
|
-
# Use specific cache key
|
|
677
|
-
cache:
|
|
678
|
-
key:
|
|
679
|
-
files:
|
|
680
|
-
- package-lock.json
|
|
681
|
-
paths:
|
|
682
|
-
- node_modules/
|
|
683
|
-
|
|
684
|
-
# Clear cache if corrupted
|
|
685
|
-
# Settings → CI/CD → Clear runner caches
|
|
686
|
-
```
|
|
687
|
-
|
|
688
|
-
### Artifacts Not Available
|
|
689
|
-
|
|
690
|
-
**Check**:
|
|
691
|
-
1. Artifact expiration not exceeded
|
|
692
|
-
2. Job succeeded (artifacts only uploaded on success by default)
|
|
693
|
-
3. Dependencies declared correctly
|
|
694
|
-
|
|
695
|
-
```yaml
|
|
696
|
-
deploy:
|
|
697
|
-
dependencies:
|
|
698
|
-
- build # Must match job name exactly
|
|
699
|
-
```
|
|
700
|
-
|
|
701
|
-
## Common Pitfalls
|
|
702
|
-
|
|
703
|
-
1. **❌ No caching**: Slow pipelines
|
|
704
|
-
2. **❌ Not using templates**: Duplication
|
|
705
|
-
3. **❌ Artifacts too large**: Slow uploads/downloads
|
|
706
|
-
4. **❌ No retry logic**: Flaky tests fail pipeline
|
|
707
|
-
5. **❌ Running all jobs always**: Wasted resources
|
|
708
|
-
6. **❌ No manual gates for production**: Risky deployments
|
|
709
|
-
|
|
710
|
-
## Integration with Rulebook
|
|
711
|
-
|
|
712
|
-
If using `@hivehub/rulebook`, GitLab CI pipelines are generated automatically:
|
|
713
|
-
|
|
714
|
-
```bash
|
|
715
|
-
# Generate GitLab CI pipeline
|
|
716
|
-
npx @hivehub/rulebook workflows
|
|
717
|
-
|
|
718
|
-
# Creates .gitlab-ci.yml with:
|
|
719
|
-
# - Language-specific stages
|
|
720
|
-
# - Caching configured
|
|
721
|
-
# - Artifacts management
|
|
722
|
-
# - Security scanning
|
|
723
|
-
```
|
|
724
|
-
|
|
725
|
-
## Related Templates
|
|
726
|
-
|
|
727
|
-
- See `/.rulebook/specs/GITHUB_ACTIONS.md` for GitHub Actions comparison
|
|
728
|
-
- See `/.rulebook/specs/CI_CD_PATTERNS.md` for general CI/CD patterns
|
|
729
|
-
- See `/.rulebook/specs/SECRETS_MANAGEMENT.md` for secrets handling
|
|
730
|
-
- See `/.rulebook/specs/QUALITY_ENFORCEMENT.md` for quality gates
|
|
1
|
+
# GitLab CI/CD
|
|
2
|
+
|
|
3
|
+
This template provides guidance for implementing GitLab CI/CD pipelines with best practices for multi-stage pipelines, caching, and artifacts.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
GitLab CI/CD enables:
|
|
8
|
+
- Automated testing and building
|
|
9
|
+
- Continuous deployment
|
|
10
|
+
- Container registry integration
|
|
11
|
+
- Built-in security scanning
|
|
12
|
+
- Kubernetes deployment
|
|
13
|
+
|
|
14
|
+
## Agent Automation Commands
|
|
15
|
+
|
|
16
|
+
When implementing or modifying GitLab CI pipelines:
|
|
17
|
+
|
|
18
|
+
### Local Testing
|
|
19
|
+
```bash
|
|
20
|
+
# Validate .gitlab-ci.yml syntax
|
|
21
|
+
gitlab-ci-lint .gitlab-ci.yml
|
|
22
|
+
|
|
23
|
+
# Or via API
|
|
24
|
+
curl --header "Content-Type: application/json" \
|
|
25
|
+
--data @.gitlab-ci.yml \
|
|
26
|
+
https://gitlab.com/api/v4/ci/lint
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Pipeline Management
|
|
30
|
+
```bash
|
|
31
|
+
# Trigger pipeline
|
|
32
|
+
gitlab-runner exec shell build
|
|
33
|
+
|
|
34
|
+
# View pipeline status
|
|
35
|
+
git lab pipeline status
|
|
36
|
+
|
|
37
|
+
# View pipeline logs
|
|
38
|
+
gitlab-runner exec shell test --debug
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Basic Pipeline Structure
|
|
42
|
+
|
|
43
|
+
### Minimal CI Pipeline
|
|
44
|
+
|
|
45
|
+
**`.gitlab-ci.yml`**:
|
|
46
|
+
```yaml
|
|
47
|
+
image: node:20
|
|
48
|
+
|
|
49
|
+
stages:
|
|
50
|
+
- test
|
|
51
|
+
- build
|
|
52
|
+
- deploy
|
|
53
|
+
|
|
54
|
+
test:
|
|
55
|
+
stage: test
|
|
56
|
+
script:
|
|
57
|
+
- npm ci
|
|
58
|
+
- npm test
|
|
59
|
+
|
|
60
|
+
build:
|
|
61
|
+
stage: build
|
|
62
|
+
script:
|
|
63
|
+
- npm run build
|
|
64
|
+
artifacts:
|
|
65
|
+
paths:
|
|
66
|
+
- dist/
|
|
67
|
+
expire_in: 1 week
|
|
68
|
+
|
|
69
|
+
deploy:
|
|
70
|
+
stage: deploy
|
|
71
|
+
script:
|
|
72
|
+
- echo "Deploying to production"
|
|
73
|
+
environment:
|
|
74
|
+
name: production
|
|
75
|
+
url: https://example.com
|
|
76
|
+
only:
|
|
77
|
+
- main
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Complete CI/CD Pipeline
|
|
81
|
+
|
|
82
|
+
**`.gitlab-ci.yml`**:
|
|
83
|
+
```yaml
|
|
84
|
+
image: node:20
|
|
85
|
+
|
|
86
|
+
variables:
|
|
87
|
+
NPM_CONFIG_CACHE: "$CI_PROJECT_DIR/.npm"
|
|
88
|
+
CYPRESS_CACHE_FOLDER: "$CI_PROJECT_DIR/.cypress"
|
|
89
|
+
|
|
90
|
+
stages:
|
|
91
|
+
- validate
|
|
92
|
+
- build
|
|
93
|
+
- test
|
|
94
|
+
- security
|
|
95
|
+
- deploy
|
|
96
|
+
|
|
97
|
+
# Template for node jobs
|
|
98
|
+
.node-template:
|
|
99
|
+
before_script:
|
|
100
|
+
- npm ci --prefer-offline
|
|
101
|
+
cache:
|
|
102
|
+
key:
|
|
103
|
+
files:
|
|
104
|
+
- package-lock.json
|
|
105
|
+
paths:
|
|
106
|
+
- .npm/
|
|
107
|
+
- node_modules/
|
|
108
|
+
|
|
109
|
+
lint:
|
|
110
|
+
extends: .node-template
|
|
111
|
+
stage: validate
|
|
112
|
+
script:
|
|
113
|
+
- npm run lint
|
|
114
|
+
- npm run format:check
|
|
115
|
+
|
|
116
|
+
typecheck:
|
|
117
|
+
extends: .node-template
|
|
118
|
+
stage: validate
|
|
119
|
+
script:
|
|
120
|
+
- npm run type-check
|
|
121
|
+
|
|
122
|
+
build:
|
|
123
|
+
extends: .node-template
|
|
124
|
+
stage: build
|
|
125
|
+
script:
|
|
126
|
+
- npm run build
|
|
127
|
+
artifacts:
|
|
128
|
+
paths:
|
|
129
|
+
- dist/
|
|
130
|
+
expire_in: 1 week
|
|
131
|
+
|
|
132
|
+
test:unit:
|
|
133
|
+
extends: .node-template
|
|
134
|
+
stage: test
|
|
135
|
+
parallel:
|
|
136
|
+
matrix:
|
|
137
|
+
- NODE_VERSION: ['18', '20', '22']
|
|
138
|
+
image: node:$NODE_VERSION
|
|
139
|
+
script:
|
|
140
|
+
- npm test
|
|
141
|
+
coverage: '/Statements\s*:\s*(\d+\.\d+)%/'
|
|
142
|
+
artifacts:
|
|
143
|
+
reports:
|
|
144
|
+
junit: junit.xml
|
|
145
|
+
coverage_report:
|
|
146
|
+
coverage_format: cobertura
|
|
147
|
+
path: coverage/cobertura-coverage.xml
|
|
148
|
+
|
|
149
|
+
test:e2e:
|
|
150
|
+
extends: .node-template
|
|
151
|
+
stage: test
|
|
152
|
+
script:
|
|
153
|
+
- npm run test:e2e
|
|
154
|
+
artifacts:
|
|
155
|
+
when: on_failure
|
|
156
|
+
paths:
|
|
157
|
+
- cypress/screenshots/
|
|
158
|
+
- cypress/videos/
|
|
159
|
+
expire_in: 1 week
|
|
160
|
+
|
|
161
|
+
security:dependencies:
|
|
162
|
+
stage: security
|
|
163
|
+
script:
|
|
164
|
+
- npm audit --audit-level=high
|
|
165
|
+
allow_failure: true
|
|
166
|
+
|
|
167
|
+
security:sast:
|
|
168
|
+
stage: security
|
|
169
|
+
image: registry.gitlab.com/gitlab-org/security-products/analyzers/semgrep:latest
|
|
170
|
+
script:
|
|
171
|
+
- /analyzer run
|
|
172
|
+
artifacts:
|
|
173
|
+
reports:
|
|
174
|
+
sast: gl-sast-report.json
|
|
175
|
+
|
|
176
|
+
deploy:staging:
|
|
177
|
+
stage: deploy
|
|
178
|
+
script:
|
|
179
|
+
- npm run deploy:staging
|
|
180
|
+
environment:
|
|
181
|
+
name: staging
|
|
182
|
+
url: https://staging.example.com
|
|
183
|
+
only:
|
|
184
|
+
- develop
|
|
185
|
+
|
|
186
|
+
deploy:production:
|
|
187
|
+
stage: deploy
|
|
188
|
+
script:
|
|
189
|
+
- npm run deploy:production
|
|
190
|
+
environment:
|
|
191
|
+
name: production
|
|
192
|
+
url: https://example.com
|
|
193
|
+
when: manual
|
|
194
|
+
only:
|
|
195
|
+
- main
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Best Practices
|
|
199
|
+
|
|
200
|
+
### ✅ DO
|
|
201
|
+
|
|
202
|
+
1. **Use Caching**
|
|
203
|
+
```yaml
|
|
204
|
+
cache:
|
|
205
|
+
key:
|
|
206
|
+
files:
|
|
207
|
+
- package-lock.json
|
|
208
|
+
paths:
|
|
209
|
+
- node_modules/
|
|
210
|
+
- .npm/
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
2. **Use Job Templates (DRY)**
|
|
214
|
+
```yaml
|
|
215
|
+
.deploy-template:
|
|
216
|
+
stage: deploy
|
|
217
|
+
script:
|
|
218
|
+
- deploy.sh $ENVIRONMENT
|
|
219
|
+
only:
|
|
220
|
+
- main
|
|
221
|
+
|
|
222
|
+
deploy:staging:
|
|
223
|
+
extends: .deploy-template
|
|
224
|
+
variables:
|
|
225
|
+
ENVIRONMENT: staging
|
|
226
|
+
|
|
227
|
+
deploy:production:
|
|
228
|
+
extends: .deploy-template
|
|
229
|
+
variables:
|
|
230
|
+
ENVIRONMENT: production
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
3. **Use Parallel Matrix**
|
|
234
|
+
```yaml
|
|
235
|
+
test:
|
|
236
|
+
parallel:
|
|
237
|
+
matrix:
|
|
238
|
+
- NODE_VERSION: ['18', '20', '22']
|
|
239
|
+
OS: ['ubuntu', 'alpine']
|
|
240
|
+
image: node:$NODE_VERSION-$OS
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
4. **Use Pipeline-Specific Variables**
|
|
244
|
+
```yaml
|
|
245
|
+
variables:
|
|
246
|
+
DEPLOY_ENV: "production"
|
|
247
|
+
API_ENDPOINT: "https://api.example.com"
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
5. **Use Artifacts for Build Outputs**
|
|
251
|
+
```yaml
|
|
252
|
+
build:
|
|
253
|
+
artifacts:
|
|
254
|
+
paths:
|
|
255
|
+
- dist/
|
|
256
|
+
expire_in: 1 week
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### ❌ DON'T
|
|
260
|
+
|
|
261
|
+
1. **Don't hardcode secrets**
|
|
262
|
+
```yaml
|
|
263
|
+
# Bad
|
|
264
|
+
script:
|
|
265
|
+
- export API_KEY="sk_live_abc123"
|
|
266
|
+
|
|
267
|
+
# Good
|
|
268
|
+
script:
|
|
269
|
+
- export API_KEY="$API_KEY" # From CI/CD variables
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
2. **Don't use `latest` tags**
|
|
273
|
+
```yaml
|
|
274
|
+
# Bad
|
|
275
|
+
image: node:latest
|
|
276
|
+
|
|
277
|
+
# Good
|
|
278
|
+
image: node:20.11.0
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
3. **Don't run unnecessary jobs**
|
|
282
|
+
```yaml
|
|
283
|
+
# Good - only run on specific branches
|
|
284
|
+
deploy:
|
|
285
|
+
only:
|
|
286
|
+
- main
|
|
287
|
+
except:
|
|
288
|
+
- schedules
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## Caching Strategies
|
|
292
|
+
|
|
293
|
+
### Global Cache
|
|
294
|
+
|
|
295
|
+
```yaml
|
|
296
|
+
# Apply to all jobs
|
|
297
|
+
cache:
|
|
298
|
+
key: ${CI_COMMIT_REF_SLUG}
|
|
299
|
+
paths:
|
|
300
|
+
- node_modules/
|
|
301
|
+
- .npm/
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### Job-Specific Cache
|
|
305
|
+
|
|
306
|
+
```yaml
|
|
307
|
+
test:
|
|
308
|
+
cache:
|
|
309
|
+
key: test-cache
|
|
310
|
+
paths:
|
|
311
|
+
- node_modules/
|
|
312
|
+
- .cache/
|
|
313
|
+
|
|
314
|
+
build:
|
|
315
|
+
cache:
|
|
316
|
+
key: build-cache
|
|
317
|
+
paths:
|
|
318
|
+
- dist/
|
|
319
|
+
- .webpack-cache/
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Cache with Fallback
|
|
323
|
+
|
|
324
|
+
```yaml
|
|
325
|
+
cache:
|
|
326
|
+
key: ${CI_COMMIT_REF_SLUG}
|
|
327
|
+
paths:
|
|
328
|
+
- node_modules/
|
|
329
|
+
policy: pull # Only pull, don't push
|
|
330
|
+
|
|
331
|
+
build:
|
|
332
|
+
cache:
|
|
333
|
+
key: ${CI_COMMIT_REF_SLUG}
|
|
334
|
+
paths:
|
|
335
|
+
- node_modules/
|
|
336
|
+
policy: pull-push # Pull and push cache
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
## Artifacts and Dependencies
|
|
340
|
+
|
|
341
|
+
### Uploading Artifacts
|
|
342
|
+
|
|
343
|
+
```yaml
|
|
344
|
+
build:
|
|
345
|
+
script:
|
|
346
|
+
- npm run build
|
|
347
|
+
artifacts:
|
|
348
|
+
name: "dist-$CI_COMMIT_SHORT_SHA"
|
|
349
|
+
paths:
|
|
350
|
+
- dist/
|
|
351
|
+
expire_in: 1 week
|
|
352
|
+
when: on_success # or always, on_failure
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### Downloading Artifacts
|
|
356
|
+
|
|
357
|
+
```yaml
|
|
358
|
+
deploy:
|
|
359
|
+
dependencies:
|
|
360
|
+
- build # Downloads artifacts from 'build' job
|
|
361
|
+
script:
|
|
362
|
+
- ls dist/ # Artifact available
|
|
363
|
+
- deploy.sh
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### Artifact Reports
|
|
367
|
+
|
|
368
|
+
```yaml
|
|
369
|
+
test:
|
|
370
|
+
script:
|
|
371
|
+
- npm test
|
|
372
|
+
artifacts:
|
|
373
|
+
reports:
|
|
374
|
+
junit: junit.xml
|
|
375
|
+
coverage_report:
|
|
376
|
+
coverage_format: cobertura
|
|
377
|
+
path: coverage/cobertura-coverage.xml
|
|
378
|
+
dotenv: build.env # Export variables to other jobs
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
## Multi-Project Pipelines
|
|
382
|
+
|
|
383
|
+
### Parent Pipeline
|
|
384
|
+
|
|
385
|
+
```yaml
|
|
386
|
+
# .gitlab-ci.yml
|
|
387
|
+
trigger:frontend:
|
|
388
|
+
stage: deploy
|
|
389
|
+
trigger:
|
|
390
|
+
project: mygroup/frontend
|
|
391
|
+
strategy: depend
|
|
392
|
+
|
|
393
|
+
trigger:backend:
|
|
394
|
+
stage: deploy
|
|
395
|
+
trigger:
|
|
396
|
+
project: mygroup/backend
|
|
397
|
+
strategy: depend
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### Child Pipelines
|
|
401
|
+
|
|
402
|
+
```yaml
|
|
403
|
+
# Parent pipeline
|
|
404
|
+
generate-config:
|
|
405
|
+
script:
|
|
406
|
+
- generate-dynamic-config.sh > dynamic.yml
|
|
407
|
+
artifacts:
|
|
408
|
+
paths:
|
|
409
|
+
- dynamic.yml
|
|
410
|
+
|
|
411
|
+
trigger-child:
|
|
412
|
+
trigger:
|
|
413
|
+
include:
|
|
414
|
+
- artifact: dynamic.yml
|
|
415
|
+
job: generate-config
|
|
416
|
+
strategy: depend
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
## Docker Integration
|
|
420
|
+
|
|
421
|
+
### Build and Push Docker Image
|
|
422
|
+
|
|
423
|
+
```yaml
|
|
424
|
+
docker-build:
|
|
425
|
+
image: docker:latest
|
|
426
|
+
services:
|
|
427
|
+
- docker:dind
|
|
428
|
+
variables:
|
|
429
|
+
DOCKER_DRIVER: overlay2
|
|
430
|
+
DOCKER_TLS_CERTDIR: "/certs"
|
|
431
|
+
before_script:
|
|
432
|
+
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
|
|
433
|
+
script:
|
|
434
|
+
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
|
|
435
|
+
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### Use GitLab Container Registry
|
|
439
|
+
|
|
440
|
+
```yaml
|
|
441
|
+
build:
|
|
442
|
+
image: docker:latest
|
|
443
|
+
services:
|
|
444
|
+
- docker:dind
|
|
445
|
+
script:
|
|
446
|
+
# Login to GitLab Container Registry
|
|
447
|
+
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
|
|
448
|
+
|
|
449
|
+
# Build and tag
|
|
450
|
+
- docker build -t $CI_REGISTRY_IMAGE:latest .
|
|
451
|
+
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG .
|
|
452
|
+
|
|
453
|
+
# Push
|
|
454
|
+
- docker push $CI_REGISTRY_IMAGE:latest
|
|
455
|
+
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
## Kubernetes Deployment
|
|
459
|
+
|
|
460
|
+
### Deploy to Kubernetes
|
|
461
|
+
|
|
462
|
+
```yaml
|
|
463
|
+
deploy:k8s:
|
|
464
|
+
image: bitnami/kubectl:latest
|
|
465
|
+
stage: deploy
|
|
466
|
+
script:
|
|
467
|
+
# Configure kubectl
|
|
468
|
+
- kubectl config set-cluster k8s --server="$KUBE_URL" --insecure-skip-tls-verify=true
|
|
469
|
+
- kubectl config set-credentials admin --token="$KUBE_TOKEN"
|
|
470
|
+
- kubectl config set-context default --cluster=k8s --user=admin
|
|
471
|
+
- kubectl config use-context default
|
|
472
|
+
|
|
473
|
+
# Deploy
|
|
474
|
+
- kubectl set image deployment/app app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
|
|
475
|
+
- kubectl rollout status deployment/app
|
|
476
|
+
environment:
|
|
477
|
+
name: production
|
|
478
|
+
kubernetes:
|
|
479
|
+
namespace: production
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
### Helm Deployment
|
|
483
|
+
|
|
484
|
+
```yaml
|
|
485
|
+
deploy:helm:
|
|
486
|
+
image: alpine/helm:latest
|
|
487
|
+
stage: deploy
|
|
488
|
+
script:
|
|
489
|
+
- helm upgrade --install myapp ./charts/myapp \
|
|
490
|
+
--set image.tag=$CI_COMMIT_SHORT_SHA \
|
|
491
|
+
--namespace production
|
|
492
|
+
environment:
|
|
493
|
+
name: production
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
## Rules and Conditions
|
|
497
|
+
|
|
498
|
+
### Complex Rules
|
|
499
|
+
|
|
500
|
+
```yaml
|
|
501
|
+
test:
|
|
502
|
+
script:
|
|
503
|
+
- npm test
|
|
504
|
+
rules:
|
|
505
|
+
# Run on main branch
|
|
506
|
+
- if: $CI_COMMIT_BRANCH == "main"
|
|
507
|
+
when: always
|
|
508
|
+
|
|
509
|
+
# Run on merge requests
|
|
510
|
+
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
|
511
|
+
when: always
|
|
512
|
+
|
|
513
|
+
# Run on tags starting with 'v'
|
|
514
|
+
- if: $CI_COMMIT_TAG =~ /^v/
|
|
515
|
+
when: always
|
|
516
|
+
|
|
517
|
+
# Skip on schedules
|
|
518
|
+
- if: $CI_PIPELINE_SOURCE == "schedule"
|
|
519
|
+
when: never
|
|
520
|
+
|
|
521
|
+
# Manual for feature branches
|
|
522
|
+
- if: $CI_COMMIT_BRANCH =~ /^feature\//
|
|
523
|
+
when: manual
|
|
524
|
+
|
|
525
|
+
# Otherwise skip
|
|
526
|
+
- when: never
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
### Changes-Based Execution
|
|
530
|
+
|
|
531
|
+
```yaml
|
|
532
|
+
test:backend:
|
|
533
|
+
script:
|
|
534
|
+
- cd backend && npm test
|
|
535
|
+
rules:
|
|
536
|
+
- changes:
|
|
537
|
+
- backend/**/*
|
|
538
|
+
when: always
|
|
539
|
+
|
|
540
|
+
test:frontend:
|
|
541
|
+
script:
|
|
542
|
+
- cd frontend && npm test
|
|
543
|
+
rules:
|
|
544
|
+
- changes:
|
|
545
|
+
- frontend/**/*
|
|
546
|
+
when: always
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
## Security Scanning
|
|
550
|
+
|
|
551
|
+
### SAST (Static Application Security Testing)
|
|
552
|
+
|
|
553
|
+
```yaml
|
|
554
|
+
include:
|
|
555
|
+
- template: Security/SAST.gitlab-ci.yml
|
|
556
|
+
|
|
557
|
+
sast:
|
|
558
|
+
stage: security
|
|
559
|
+
variables:
|
|
560
|
+
SAST_EXCLUDED_PATHS: "spec, test, tests, tmp, node_modules"
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
### Dependency Scanning
|
|
564
|
+
|
|
565
|
+
```yaml
|
|
566
|
+
include:
|
|
567
|
+
- template: Security/Dependency-Scanning.gitlab-ci.yml
|
|
568
|
+
|
|
569
|
+
dependency_scanning:
|
|
570
|
+
stage: security
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
### Container Scanning
|
|
574
|
+
|
|
575
|
+
```yaml
|
|
576
|
+
include:
|
|
577
|
+
- template: Security/Container-Scanning.gitlab-ci.yml
|
|
578
|
+
|
|
579
|
+
container_scanning:
|
|
580
|
+
stage: security
|
|
581
|
+
variables:
|
|
582
|
+
CS_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
## Optimization Patterns
|
|
586
|
+
|
|
587
|
+
### Skip Pipeline for Docs
|
|
588
|
+
|
|
589
|
+
```yaml
|
|
590
|
+
# Skip pipeline if only docs changed
|
|
591
|
+
workflow:
|
|
592
|
+
rules:
|
|
593
|
+
- if: $CI_PIPELINE_SOURCE == "push"
|
|
594
|
+
changes:
|
|
595
|
+
- "**/*.md"
|
|
596
|
+
- "docs/**/*"
|
|
597
|
+
when: never
|
|
598
|
+
- when: always
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
### Interruptible Jobs
|
|
602
|
+
|
|
603
|
+
```yaml
|
|
604
|
+
test:
|
|
605
|
+
interruptible: true # Cancel if new pipeline starts
|
|
606
|
+
script:
|
|
607
|
+
- npm test
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
### Retry Failed Jobs
|
|
611
|
+
|
|
612
|
+
```yaml
|
|
613
|
+
test:
|
|
614
|
+
script:
|
|
615
|
+
- npm test
|
|
616
|
+
retry:
|
|
617
|
+
max: 2
|
|
618
|
+
when:
|
|
619
|
+
- runner_system_failure
|
|
620
|
+
- stuck_or_timeout_failure
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
## CI/CD Variables
|
|
624
|
+
|
|
625
|
+
### Predefined Variables
|
|
626
|
+
|
|
627
|
+
```yaml
|
|
628
|
+
test:
|
|
629
|
+
script:
|
|
630
|
+
- echo "Pipeline ID: $CI_PIPELINE_ID"
|
|
631
|
+
- echo "Commit SHA: $CI_COMMIT_SHA"
|
|
632
|
+
- echo "Commit Branch: $CI_COMMIT_BRANCH"
|
|
633
|
+
- echo "Commit Tag: $CI_COMMIT_TAG"
|
|
634
|
+
- echo "Project Name: $CI_PROJECT_NAME"
|
|
635
|
+
- echo "Registry: $CI_REGISTRY_IMAGE"
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
### Custom Variables
|
|
639
|
+
|
|
640
|
+
```yaml
|
|
641
|
+
variables:
|
|
642
|
+
ENVIRONMENT: "production"
|
|
643
|
+
API_ENDPOINT: "https://api.example.com"
|
|
644
|
+
|
|
645
|
+
deploy:
|
|
646
|
+
script:
|
|
647
|
+
- deploy.sh --env $ENVIRONMENT --api $API_ENDPOINT
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
### Protected Variables
|
|
651
|
+
|
|
652
|
+
**Add via UI**: Settings → CI/CD → Variables
|
|
653
|
+
|
|
654
|
+
```yaml
|
|
655
|
+
deploy:
|
|
656
|
+
script:
|
|
657
|
+
- echo "Deploying with token: $DEPLOY_TOKEN"
|
|
658
|
+
only:
|
|
659
|
+
- main # Protected variables only available on protected branches
|
|
660
|
+
```
|
|
661
|
+
|
|
662
|
+
## Troubleshooting
|
|
663
|
+
|
|
664
|
+
### Pipeline Not Triggered
|
|
665
|
+
|
|
666
|
+
**Check**:
|
|
667
|
+
1. `.gitlab-ci.yml` syntax valid
|
|
668
|
+
2. Rules/only/except conditions met
|
|
669
|
+
3. CI/CD enabled for project
|
|
670
|
+
4. GitLab Runner available
|
|
671
|
+
|
|
672
|
+
### Cache Not Working
|
|
673
|
+
|
|
674
|
+
**Solutions**:
|
|
675
|
+
```yaml
|
|
676
|
+
# Use specific cache key
|
|
677
|
+
cache:
|
|
678
|
+
key:
|
|
679
|
+
files:
|
|
680
|
+
- package-lock.json
|
|
681
|
+
paths:
|
|
682
|
+
- node_modules/
|
|
683
|
+
|
|
684
|
+
# Clear cache if corrupted
|
|
685
|
+
# Settings → CI/CD → Clear runner caches
|
|
686
|
+
```
|
|
687
|
+
|
|
688
|
+
### Artifacts Not Available
|
|
689
|
+
|
|
690
|
+
**Check**:
|
|
691
|
+
1. Artifact expiration not exceeded
|
|
692
|
+
2. Job succeeded (artifacts only uploaded on success by default)
|
|
693
|
+
3. Dependencies declared correctly
|
|
694
|
+
|
|
695
|
+
```yaml
|
|
696
|
+
deploy:
|
|
697
|
+
dependencies:
|
|
698
|
+
- build # Must match job name exactly
|
|
699
|
+
```
|
|
700
|
+
|
|
701
|
+
## Common Pitfalls
|
|
702
|
+
|
|
703
|
+
1. **❌ No caching**: Slow pipelines
|
|
704
|
+
2. **❌ Not using templates**: Duplication
|
|
705
|
+
3. **❌ Artifacts too large**: Slow uploads/downloads
|
|
706
|
+
4. **❌ No retry logic**: Flaky tests fail pipeline
|
|
707
|
+
5. **❌ Running all jobs always**: Wasted resources
|
|
708
|
+
6. **❌ No manual gates for production**: Risky deployments
|
|
709
|
+
|
|
710
|
+
## Integration with Rulebook
|
|
711
|
+
|
|
712
|
+
If using `@hivehub/rulebook`, GitLab CI pipelines are generated automatically:
|
|
713
|
+
|
|
714
|
+
```bash
|
|
715
|
+
# Generate GitLab CI pipeline
|
|
716
|
+
npx @hivehub/rulebook workflows
|
|
717
|
+
|
|
718
|
+
# Creates .gitlab-ci.yml with:
|
|
719
|
+
# - Language-specific stages
|
|
720
|
+
# - Caching configured
|
|
721
|
+
# - Artifacts management
|
|
722
|
+
# - Security scanning
|
|
723
|
+
```
|
|
724
|
+
|
|
725
|
+
## Related Templates
|
|
726
|
+
|
|
727
|
+
- See `/.rulebook/specs/GITHUB_ACTIONS.md` for GitHub Actions comparison
|
|
728
|
+
- See `/.rulebook/specs/CI_CD_PATTERNS.md` for general CI/CD patterns
|
|
729
|
+
- See `/.rulebook/specs/SECRETS_MANAGEMENT.md` for secrets handling
|
|
730
|
+
- See `/.rulebook/specs/QUALITY_ENFORCEMENT.md` for quality gates
|