Урок 1: GitLab CI/CD - Основы автоматизации

Pavel 08.12.2025 19:25 6 просмотров

Что такое 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! 🚀

Комментарии (0)

Для добавления комментария необходимо войти в аккаунт

Войти / Зарегистрироваться