Гайды
CI/CD: GitLab CI и GitHub Actions
Стадии и jobs, матрицы, кэш, секреты и OIDC, окружения и чек-лист безопасности пайплайна.
~11 мин чтения
CI/CD: GitLab CI и GitHub Actions
CI/CD — автоматическая сборка, тест, артефакт, выкат. GitLab CI описывается .gitlab-ci.yml, GitHub Actions — .github/workflows/*.yml. Оба поддерживают матрицы, кэш, секреты, окружения. Контейнеры — Docker: контейнеризация.
1. GitLab CI (скелет)
stages: [lint, test, build, deploy]
variables:
DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
lint:
stage: lint
image: python:3.12
script:
- pip install ruff
- ruff check .
test:
stage: test
image: python:3.12
script:
- pip install -r requirements.txt
- pytest -q
build:
stage: build
image: docker:24
services: [docker:24-dind]
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $DOCKER_IMAGE .
- docker push $DOCKER_IMAGE
only/except заменены на rules: в современных версиях.
2. GitHub Actions (скелет)
name: ci
on:
push:
branches: [main]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install -r requirements.txt && pytest -q
build:
needs: test
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- uses: docker/build-push-action@v6
with:
push: true
tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
OIDC в облако вместо long-lived ключей.
3. Окружения и approvals
GitLab environments / GitHub environments + required reviewers для prod.
4. Кэш и артефакты
Кэш зависимостей (pip, npm), артефакты для отчётов coverage — ускоряют пайплайн.
5. Повторное использование и отмена
GitHub: workflow_call и reusable workflows; concurrency с cancel-in-progress: true для веток, чтобы не копить десятки прогонов на каждый push. GitLab: include: для общих шаблонов, workflow:rules чтобы не гонять пайплайн на черновых тегах.
6. Self-hosted runners
Изолируйте раннеры (VM per job, контейнер-драйвер), не давайте им широких cloud-ролей; на GitHub для публичных репозиториев self-hosted для fork'ов опасен (RCE через PR). Регулярно обновляйте runner binary и ограничивайте сеть до минимума.
7. Кэш зависимостей (пример GitHub)
- uses: actions/cache@v4
with:
path: ~/.cache/pip
key: pip-${{ runner.os }}-${{ hashFiles('requirements.txt') }}
Для npm/pnpm кэшируйте ~/.npm или ~/.local/share/pnpm/store. На GitLab — cache: key: files: - package-lock.json. Инвалидируйте ключ при смене мажорных версий toolchain.
Артефакты безопасности: после сборки образа прогоняйте Trivy/Grype и публикуйте SBOM (syft, встроенный docker buildx build --attest type=sbom) — это не заменяет ревью, но ускоряет реакцию на CVE.
8. Чек-лист
- Пайплайн на fork PR не утекает секретами (
if: github.event.pull_request.head.repo.full_name == ...). - Версии action закреплены SHA для supply chain.
- Деплой идемпотентен (Helm upgrade, Terraform apply).
- Таймауты на job/stage, чтобы зависшие шаги не держали очередь.
- Секреты ротируются; OIDC в облако предпочтительнее long-lived ключей.
- После успешного build — тег образа = git SHA для трассировки релиза.
Дальше: Jenkins · GitOps с Argo CD · тег CI/CD