Home » Настройка конвейера непрерывного деплоя с GitLab на Ubuntu
Настройка конвейера непрерывного деплоя с GitLab на Ubuntu

Настройка конвейера непрерывного деплоя с GitLab на Ubuntu

Настройка CI/CD конвейера — это один из тех навыков, которые отделяют настоящих сисадминов от тех, кто до сих пор деплоит через FileZilla. Если вы устали от ручного копирования файлов, забытых миграций и багов, которые попадают в продакшн, то эта статья для вас. Мы разберём настройку полноценного конвейера непрерывного деплоя с GitLab на Ubuntu — от установки до автоматизации деплоя в несколько сред.

Почему именно GitLab? Потому что это open-source решение с встроенным CI/CD, которое можно развернуть на своём железе. Никаких лимитов на приватные репозитории, полный контроль над процессом и возможность кастомизации под любые нужды. Плюс интеграция с Docker, Kubernetes и кучей других инструментов из коробки.

Как это работает: архитектура GitLab CI/CD

Перед тем как лезть в настройки, давайте разберёмся с базовой архитектурой. GitLab CI/CD состоит из трёх основных компонентов:

  • GitLab Server — центральный сервер, который хранит код и управляет пайплайнами
  • GitLab Runner — агент, который выполняет задачи CI/CD
  • .gitlab-ci.yml — файл конфигурации пайплайна в корне проекта

Когда вы пушите код в репозиторий, GitLab автоматически запускает пайплайн согласно настройкам в .gitlab-ci.yml. Runner подхватывает задачи и выполняет их: сборка, тестирование, деплой. Всё это происходит в изолированных контейнерах или виртуальных машинах.

Подготовка сервера Ubuntu

Для начала нам понадобится сервер с Ubuntu 20.04 LTS или новее. Если у вас ещё нет подходящего сервера, можете заказать VPS или выделенный сервер под свои нужды.

Обновляем систему и устанавливаем необходимые пакеты:

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl openssh-server ca-certificates tzdata perl
sudo apt install -y postfix # выбираем "Internet Site" при установке

Добавляем официальный репозиторий GitLab:

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

Устанавливаем GitLab Community Edition:

sudo EXTERNAL_URL="http://your-domain.com" apt install gitlab-ce

Замените your-domain.com на ваш домен или IP-адрес. После установки GitLab автоматически настроит конфигурацию.

Настройка GitLab Runner

Теперь устанавливаем GitLab Runner — это можно сделать как на том же сервере, так и на отдельной машине:

curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
sudo apt install gitlab-runner

Регистрируем Runner в GitLab:

sudo gitlab-runner register

Вам понадобится:

  • URL GitLab (например, http://your-domain.com/)
  • Registration token (найдёте в Admin Area → Runners)
  • Описание Runner’а
  • Теги (опционально)
  • Executor — выберите “docker” для максимальной гибкости
  • Default Docker image — можете указать “alpine:latest”

Создание .gitlab-ci.yml файла

Основа любого CI/CD пайплайна — это файл .gitlab-ci.yml. Вот пример базовой конфигурации для веб-проекта:

stages:
  - build
  - test
  - deploy

variables:
  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

build:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE
  only:
    - main
    - develop

test:
  stage: test
  image: node:16
  script:
    - npm install
    - npm run test
  artifacts:
    reports:
      coverage: coverage/
  only:
    - main
    - develop

deploy_staging:
  stage: deploy
  image: alpine:latest
  before_script:
    - apk add --no-cache openssh-client
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
  script:
    - ssh -o StrictHostKeyChecking=no $DEPLOY_USER@$STAGING_SERVER "docker pull $DOCKER_IMAGE"
    - ssh -o StrictHostKeyChecking=no $DEPLOY_USER@$STAGING_SERVER "docker-compose up -d"
  environment:
    name: staging
    url: https://staging.your-domain.com
  only:
    - develop

deploy_production:
  stage: deploy
  image: alpine:latest
  before_script:
    - apk add --no-cache openssh-client
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
  script:
    - ssh -o StrictHostKeyChecking=no $DEPLOY_USER@$PROD_SERVER "docker pull $DOCKER_IMAGE"
    - ssh -o StrictHostKeyChecking=no $DEPLOY_USER@$PROD_SERVER "docker-compose up -d"
  environment:
    name: production
    url: https://your-domain.com
  when: manual
  only:
    - main

Настройка переменных окружения

Для работы пайплайна нужно настроить переменные в GitLab. Идём в Settings → CI/CD → Variables и добавляем:

  • SSH_PRIVATE_KEY — приватный ключ для подключения к серверу
  • DEPLOY_USER — пользователь для деплоя
  • STAGING_SERVER — IP или домен staging сервера
  • PROD_SERVER — IP или домен production сервера

Приватный ключ можно сгенерировать так:

ssh-keygen -t rsa -b 4096 -C "gitlab-ci@your-domain.com"
cat ~/.ssh/id_rsa # приватный ключ — в переменную
cat ~/.ssh/id_rsa.pub # публичный ключ — на сервер деплоя

Практические кейсы и решения

Давайте разберём несколько реальных сценариев использования:

Сценарий Решение Плюсы Минусы
Деплой Laravel приложения Composer install, миграции, кэширование Быстрый деплой, автоматические миграции Нужно настроить очистку кэша
Деплой React SPA npm build, nginx static files Лёгкий деплой, CDN friendly Нужно настроить роутинг
Микросервисы на Docker Docker build, kubernetes deploy Масштабируемость, изоляция Сложность настройки

Продвинутые настройки

Для более сложных проектов можно использовать дополнительные возможности:

Parallel jobs

Для ускорения сборки можно распараллелить задачи:

test:
  stage: test
  parallel: 4
  script:
    - npm run test:split -- --index $CI_NODE_INDEX --total $CI_NODE_TOTAL

Cache и artifacts

Настройка кэширования для ускорения сборки:

cache:
  paths:
    - node_modules/
    - .npm/
  key: 
    files:
      - package-lock.json

Review apps

Автоматические тестовые окружения для каждого merge request:

review:
  stage: deploy
  script:
    - echo "Deploying review app for $CI_COMMIT_REF_NAME"
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: https://$CI_COMMIT_REF_NAME.review.your-domain.com
    on_stop: stop_review
  only:
    - merge_requests

Мониторинг и отладка

Для мониторинга состояния CI/CD используйте встроенные инструменты GitLab:

  • Pipeline graphs — визуализация этапов
  • Job logs — детальные логи выполнения
  • Metrics — статистика производительности
  • Notifications — уведомления в Slack/email

Для отладки проблем с Runner’ом:

sudo gitlab-runner list
sudo gitlab-runner verify
sudo gitlab-runner status
sudo journalctl -u gitlab-runner

Сравнение с альтернативами

Рассмотрим основные альтернативы GitLab CI/CD:

Решение Плюсы Минусы Лучше для
GitHub Actions Интеграция с GitHub, marketplace Только cloud, лимиты Open-source проектов
Jenkins Много плагинов, гибкость Сложная настройка, старый UI Enterprise окружений
GitLab CI/CD Всё в одном, self-hosted Ресурсоёмкий Полного контроля
Drone CI Docker-native, лёгкий Меньше функций Микросервисов

Безопасность CI/CD

Несколько важных аспектов безопасности:

  • Secrets management — используйте переменные GitLab, никогда не коммитьте секреты
  • Runner изоляция — используйте Docker executor для изоляции
  • Права доступа — настройте минимальные права для deploy пользователя
  • Аудит — включите логирование всех действий
# Создание deploy пользователя с минимальными правами
sudo useradd -m -s /bin/bash deploy
sudo usermod -aG docker deploy
sudo -u deploy ssh-keygen -t rsa -b 4096

Автоматизация и скрипты

Для автоматизации рутинных задач можно создать вспомогательные скрипты:

#!/bin/bash
# deploy.sh - скрипт для деплоя
set -e

echo "Starting deployment..."

# Backup current version
docker-compose exec app php artisan backup:run --only-db

# Pull new image
docker-compose pull

# Update containers
docker-compose up -d

# Run migrations
docker-compose exec app php artisan migrate --force

# Clear cache
docker-compose exec app php artisan cache:clear
docker-compose exec app php artisan config:cache

echo "Deployment completed successfully!"

Интеграция с внешними сервисами

GitLab CI/CD отлично интегрируется с различными внешними сервисами:

  • Slack — уведомления о статусе деплоя
  • Sentry — мониторинг ошибок
  • Datadog — метрики производительности
  • Jira — автоматическое закрытие задач

Пример интеграции со Slack:

notify_slack:
  stage: deploy
  script:
    - 'curl -X POST -H "Content-type: application/json" 
      --data "{\"text\":\"Deployment to production completed successfully!\"}" 
      $SLACK_WEBHOOK_URL'
  when: on_success
  only:
    - main

Производительность и оптимизация

Для оптимизации скорости работы CI/CD:

  • Используйте кэширование — особенно для зависимостей
  • Параллелизация — разбивайте тесты на несколько job’ов
  • Оптимизируйте Docker образы — используйте multi-stage builds
  • Настройте local Registry — для быстрого доступа к образам

Пример оптимизированного Dockerfile:

# Multi-stage build for faster CI/CD
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

FROM node:16-alpine AS runtime
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

Заключение и рекомендации

Настройка CI/CD с GitLab на Ubuntu — это инвестиция времени, которая окупается уже с первого месяца использования. Автоматизация деплоя экономит часы рутинной работы, снижает количество ошибок и позволяет сосредоточиться на разработке.

Основные рекомендации:

  • Начните с простого пайплайна и постепенно усложняйте
  • Используйте Docker для изоляции и воспроизводимости
  • Настройте мониторинг и алерты с первого дня
  • Не забывайте про безопасность — особенно управление секретами
  • Регулярно обновляйте GitLab и Runner’ы

GitLab CI/CD отлично подходит для команд любого размера — от solo разработчиков до enterprise компаний. Главное преимущество — полный контроль над процессом и возможность кастомизации под любые нужды. Если вы работаете с чувствительными данными или просто хотите держать всё под контролем, self-hosted GitLab — отличный выбор.

Для получения дополнительной информации рекомендую изучить официальную документацию GitLab CI/CD и документацию по GitLab Runner.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked