Гайды

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 (скелет)

yaml
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 (скелет)

yaml
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)

yaml
- 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