Урок 1: GitLab CI/CD - Основы автоматизации
Что такое CI/CD?
CI/CD — это автоматизированный процесс проверки, тестирования и развертывания кода.
Расшифровка
| Аббревиатура | Расшифровка | Описание |
|---|---|---|
| CI | Continuous Integration | Постоянная интеграция кода |
| CD | Continuous Deployment | Постоянное развертывание |
CI/CD Pipeline этапы
┌─────────────────────────────────────────┐
│ Developer pushed code │
└────────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Stage: BUILD │
│ - Compile code │
│ - Build Docker image │
│ - Create artifacts │
└────────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Stage: TEST │
│ - Unit tests │
│ - Integration tests │
│ - Code quality checks │
└────────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Stage: DEPLOY │
│ - Deploy to staging │
│ - Deploy to production │
│ - Smoke tests │
└─────────────────────────────────────────┘
Что такое GitLab CI/CD?
GitLab CI/CD — это встроенная система автоматизации в GitLab для запуска тестов, сборки и развертывания приложений.
Основные преимущества
| Преимущество | Описание |
|---|---|
| Встроенный | Не нужен отдельный сервер (как Jenkins) |
| Бесплатный | 400 минут в месяц бесплатно |
| Простой | YAML конфигурация |
| Open Source | Можно установить свой GitLab сервер |
| Docker поддержка | Использует Docker контейнеры |
| Scalable | Можно добавить свои GitLab Runners |
Бесплатный лимит
✅ 400 минут в месяц (на GitLab.com)
✅ Неограниченно на self-hosted GitLab
✅ Можно регистрировать свои Runner'ы (серверы)
GitLab CI/CD vs GitHub Actions vs Jenkins
| Критерий | GitLab CI/CD | GitHub Actions | Jenkins |
|---|---|---|---|
| Встроенность | Да (в GitLab) | Да (в GitHub) | Нет (отдельный сервер) |
| Цена | Бесплатно 400 мин/мес | Бесплатно 2000 мин/мес | Бесплатно (самостоятельно) |
| Простота | Очень простой | Очень простой | Сложнее |
| YAML конфиг | Да | Да | Groovy конфиг |
| Docker поддержка | Встроена | Встроена | Плагины |
| Self-hosted | Да (GitLab) | Нет (только GitHub Enterprise) | Да |
Файл .gitlab-ci.yml
Что это?
.gitlab-ci.yml — это файл конфигурации в корне репозитория, который описывает: - Какие этапы (stages) нужно выполнить - Какие задачи (jobs) нужно запустить - Какие команды выполнять - Когда и на чем это все запускать
Местоположение
my-project/
├── .gitlab-ci.yml # ← ЗДЕСЬ!
├── Dockerfile
├── src/
├── tests/
└── README.md
Простейший пример
# .gitlab-ci.yml
stages:
- build
- test
build_job:
stage: build
script:
- echo "Building..."
test_job:
stage: test
script:
- echo "Testing..."
Основные компоненты .gitlab-ci.yml
1. Stages (Этапы)
stages:
- build # Первый этап
- test # Второй этап
- deploy # Третий этап
Порядок выполнения:
- Сначала все jobs из build (параллельно)
- Потом все jobs из test (параллельно)
- Потом все jobs из deploy (параллельно)
2. Variables (Переменные)
variables:
OWNER_NAME: "CI/CD Pipeline"
VERSION: "1.0"
LOG_FILENAME: "build.log"
DOCKER_IMAGE: "ubuntu:20.04"
Использование в jobs:
script:
- echo "Owner: $OWNER_NAME"
- echo "Version: $VERSION"
3. Jobs (Задачи)
build_job: # Имя job'а
stage: build # К какому этапу относится
script: # Команды которые нужно выполнить
- echo "Building..."
- make build
4. Script (Команды)
script:
- echo "Step 1"
- npm install
- npm run build
- npm test
Пример pipeline с несколькими stages
stages:
- build
- test
- deploy
variables:
VERSION: "1.0"
build_job:
stage: build
script:
- echo "🔨 Building application..."
- make build
test_job_1:
stage: test
script:
- echo "✅ Running test 1..."
- npm test
test_job_2:
stage: test
script:
- echo "✅ Running test 2..."
- npm lint
deploy_dev_job:
stage: deploy
script:
- echo "🚀 Deploying to dev..."
- ./deploy.sh dev
deploy_prod_job:
stage: deploy
script:
- echo "🚀 Deploying to production..."
- ./deploy.sh prod
Docker Image для jobs
По умолчанию
GitLab использует `ruby:2.7` по умолчанию
Не очень полезно для большинства проектов
Указание своего Docker образа
image: ubuntu:20.04 # Глобально для всех jobs
jobs:
build_job:
image: node:16 # Только для этого job'а
script:
- npm install
Примеры популярных образов
# Python
image: python:3.9
# Node.js
image: node:16
# Java
image: openjdk:11
# Go
image: golang:1.19
# Docker with AWS CLI
image: registry.gitlab.com/gitlab-org/gitlab-runner/alpine:latest
Parallel Jobs (Параллельное выполнение)
По умолчанию jobs в одном stage выполняются параллельно
stages:
- test
test_1:
stage: test
script:
- echo "Test 1..."
- sleep 30
test_2:
stage: test
script:
- echo "Test 2..."
- sleep 30
# ✅ Оба выполняются ОДНОВРЕМЕННО (общее время ~30 сек, а не 60)
Зависимости между jobs (needs)
stages:
- build
- test
- deploy
build_job:
stage: build
script:
- echo "Building..."
test_1:
stage: test
needs: ["build_job"] # Дождись build_job
script:
- echo "Test 1..."
test_2:
stage: test
needs: ["build_job"] # Дождись build_job
script:
- echo "Test 2..."
test_3:
stage: test
needs: ["test_1", "test_2"] # Дождись обоих тестов
script:
- echo "Final test..."
# Порядок:
# 1. build_job (1 минута)
# 2. test_1 и test_2 (параллельно, 2 минуты)
# 3. test_3 (1 минута)
# Итого: ~4 минуты
Rules (Условия выполнения)
Когда запускать pipeline
build_job:
stage: build
script:
- echo "Building..."
rules:
- if: '$CI_COMMIT_BRANCH == "main"' # Только на main branch
when: always
Примеры правил
# Запустить только при merge в main
deploy_prod:
stage: deploy
script:
- ./deploy.sh prod
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
when: always
# Запустить только при merge в develop
deploy_dev:
stage: deploy
script:
- ./deploy.sh dev
rules:
- if: '$CI_COMMIT_BRANCH == "develop"'
when: always
# Запустить для всех веток КРОМЕ main
test_job:
stage: test
script:
- npm test
rules:
- if: '$CI_COMMIT_BRANCH != "main"'
when: always
Predefined Variables (Встроенные переменные)
Основные переменные которые предоставляет GitLab
$CI_COMMIT_BRANCH # Текущая ветка (develop, main)
$CI_COMMIT_SHA # Полный commit hash
$CI_COMMIT_SHORT_SHA # Короткий commit hash (первые 8 символов)
$CI_PROJECT_NAME # Имя проекта
$CI_PROJECT_NAMESPACE # Namespace проекта
$CI_JOB_NAME # Имя job'а
$CI_JOB_ID # ID job'а
$CI_PIPELINE_ID # ID pipeline'а
Примеры использования
variables:
LOG_FILE: "build-${CI_COMMIT_BRANCH}-${CI_COMMIT_SHORT_SHA}.log"
build_job:
stage: build
script:
- echo "Building for branch: $CI_COMMIT_BRANCH"
- echo "Commit: $CI_COMMIT_SHA"
- echo "Job: $CI_JOB_NAME"
- echo "Pipeline: $CI_PIPELINE_ID"
- echo "Log file will be: $LOG_FILE"
Artifacts (Артефакты)
Сохранение и передача файлов между jobs
build_job:
stage: build
script:
- mkdir -p build
- echo "Built successfully" > build/output.txt
artifacts:
paths:
- build/output.txt # Сохранить этот файл
test_job:
stage: test
needs: ["build_job"] # Получить артефакты от build_job
script:
- cat build/output.txt # Читаем файл из предыдущего job'а
Retention (Сколько хранить)
artifacts:
paths:
- build/
expire_in: 1 week # Удалить через неделю
Default (Значения по умолчанию)
Избегаем повторений
# ❌ ПЛОХО - Повторяем одно и то же
build_job:
stage: build
image: ubuntu:20.04
script:
- echo "Building..."
test_job:
stage: test
image: ubuntu:20.04
script:
- echo "Testing..."
deploy_job:
stage: deploy
image: ubuntu:20.04
script:
- echo "Deploying..."
# ✅ ХОРОШО - Используем default
default:
image: ubuntu:20.04
build_job:
stage: build
script:
- echo "Building..."
test_job:
stage: test
script:
- echo "Testing..."
deploy_job:
stage: deploy
script:
- echo "Deploying..."
Проверочный список
- [ ] Понимаете что такое CI/CD
- [ ] Знаете структуру .gitlab-ci.yml
- [ ] Пишете простые pipeline'ы
- [ ] Используете stages и jobs
- [ ] Знаете про Docker images
- [ ] Используете переменные
- [ ] Понимаете parallel execution
- [ ] Готовы к более сложным pipeline'ам
Готовы? Переходите к Уроку 2 - Установка и первый pipeline! 🚀