Архитектура
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