Архитектура

GitLab CE для инфраструктуры

Контекст

Платформе нужна инфраструктура для:

  • Хранения кода (Git)
  • CI/CD пайплайнов
  • Приватного npm registry для внутренних модулей
  • Container registry для Docker образов

Решение

Использовать GitLab CE (Community Edition) как единую платформу для всей инфраструктуры разработки.

Обоснование

Почему GitLab CE

КритерийОбоснование
Self-hostedПолный контроль над данными
БесплатноCE версия без лицензионных платежей
Всё в одномGit + CI/CD + Registry + Wiki
Package RegistryВстроенный npm/Docker registry
МасштабируемостьГоризонтальное масштабирование GitLab Runners

Альтернативы

РешениеПочему не подходит
GitHub + npmПлатный npm registry, нет self-hosted
BitbucketМеньше возможностей CI/CD
Jenkins + NexusНесколько систем вместо одной

Компоненты

1. Git Repository

Хранение кода всех проектов:

  • Приложения платформы (dashboard, landing и другие)
  • platform-core — Монорепо с общими модулями

2. GitLab CI/CD

# .gitlab-ci.yml
stages:
  - install
  - lint
  - test
  - build
  - publish
  - deploy

variables:
  PNPM_CACHE_DIR: .pnpm-store

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - .pnpm-store
    - node_modules

install:
  stage: install
  script:
    - corepack enable
    - pnpm install --frozen-lockfile
  artifacts:
    paths:
      - node_modules
    expire_in: 1 hour

lint:
  stage: lint
  script:
    - pnpm lint

test:
  stage: test
  script:
    - pnpm test
  coverage: '/All files[^|]*\|[^|]*\s+([\d\.]+)/'

build:
  stage: build
  script:
    - pnpm build
  artifacts:
    paths:
      - .output
    expire_in: 1 week

deploy:staging:
  stage: deploy
  script:
    - rsync -avz .output/ $STAGING_SERVER:/var/www/app/
  environment:
    name: staging
  only:
    - develop

deploy:production:
  stage: deploy
  script:
    - rsync -avz .output/ $PRODUCTION_SERVER:/var/www/app/
  environment:
    name: production
  only:
    - main
  when: manual

3. Package Registry (npm)

GitLab Package Registry для приватных npm пакетов.

Настройка в монорепо

# platform-core/.npmrc
@scope:registry=https://gitlab.example.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/
//gitlab.example.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${CI_JOB_TOKEN}

Публикация пакетов

# platform-core/.gitlab-ci.yml
publish:
  stage: publish
  script:
    - echo "@scope:registry=https://gitlab.example.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/" > .npmrc
    - echo "//gitlab.example.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${CI_JOB_TOKEN}" >> .npmrc
    - pnpm build
    - pnpm publish -r --no-git-checks
  only:
    - tags

Использование в приложениях

# app-admin/.npmrc
@scope:registry=https://gitlab.example.com/api/v4/packages/npm/
//gitlab.example.com/api/v4/packages/npm/:_authToken=${GITLAB_TOKEN}
// app-admin/package.json
{
  "dependencies": {
    "@scope/helpers": "^1.0.0",
    "@scope/types": "^1.0.0"
  }
}

4. Container Registry

GitLab Container Registry для Docker образов.

# .gitlab-ci.yml
build:docker:
  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 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  only:
    - main

Структура проектов в GitLab

GitLab
├── platform/                           # Группа
│   ├── app-one                         # Приложение 1
│   ├── app-two                         # Приложение 2
│   ├── app-three                       # Приложение 3
│   └── platform-core                   # Монорепо с модулями
│       └── packages/
│           ├── @scope/helpers
│           ├── @scope/types
│           └── @scope/ui

Настройка локальной разработки

Аутентификация для npm

# Получить токен в GitLab → User Settings → Access Tokens
# Scopes: read_api, read_registry

# Добавить в ~/.npmrc
@scope:registry=https://gitlab.example.com/api/v4/packages/npm/
//gitlab.example.com/api/v4/packages/npm/:_authToken=YOUR_TOKEN

Клонирование проектов

git clone git@gitlab.example.com:platform/app-admin.git
git clone git@gitlab.example.com:platform/platform-core.git

Последствия

Положительные

  • Единая платформа для всего DevOps
  • Приватный npm registry без дополнительных затрат
  • Интеграция CI/CD с registry из коробки
  • Полный контроль над данными (self-hosted)

Отрицательные

  • Требуется поддержка инфраструктуры GitLab
  • Нужен сервер для GitLab и Runners

Связанные решения