Автоматизируем Elixir: Пошаговое построение CI/CD-конвейера с GitHub Actions и Docker

Пошаговое руководство по настройке полноценного CI/CD-конвейера для приложений на Elixir и Phoenix с использованием GitHub Actions и Docker, от написания Dockerfile до автоматического деплоя.
В мире разработки на Elixir, известном своей отказоустойчивостью и конкурентной моделью, стабильный и предсказуемый процесс поставки кода (CI/CD) — не роскошь, а необходимость. Он превращает рутинные задачи тестирования, сборки и деплоя в автоматизированный поток, минимизируя человеческие ошибки и ускоряя выход новых фич. В этой статье мы шаг за шагом построим полноценный CI/CD-конвейер для типичного Phoenix-приложения, используя GitHub Actions и Docker.

Начнем с основ. CI (Continuous Integration) — это практика автоматического тестирования каждого изменения в коде. CD (Continuous Delivery/Deployment) расширяет эту идею, автоматизируя сборку, упаковку и развертывание приложения. Для Elixir-проекта это особенно важно из-за особенностей компиляции, зависимостей (Mix) и необходимости работы с базой данных, например, PostgreSQL, в тестовом окружении.

Шаг 1: Подготовка проекта. Убедитесь, что ваш проект имеет стандартную структуру и ключевые файлы: `mix.exs` с прописанными зависимостями и `Dockerfile` для контейнеризации. Для тестов используем ExUnit. Важно настроить конфигурации (`config/test.exs`) для работы с тестовой БД, возможно, используя временные контейнеры или сервисы GitHub Actions.

Шаг 2: Создание базового Dockerfile. Многостадийная сборка — лучший практикс. Первая стадия использует образ `elixir:1.16-alpine` для компиляции релиза. Устанавливаем Mix, копируем конфиги, загружаем зависимости и компилируем проект. Вторая стадия создает минимальный образ на основе `alpine:latest`, куда копируются только скомпилированные артефакты и рантайм. Это значительно уменьшает итоговый размер образа.

Шаг 3: Настройка GitHub Actions. В каталоге `.github/workflows/` создаем файл `ci-cd-pipeline.yml`. Определяем три основных джобы: `test`, `build` и `deploy`. Джоба `test` запускается на каждом пуше в ветки `main` и `develop`. В ней мы настраиваем сервисы (например, контейнер с PostgreSQL), устанавливаем Elixir, восстанавливаем зависимости Mix (`mix deps.get`), создаем и мигрируем тестовую базу (`mix ecto.setup`), и запускаем тесты (`mix test`).

Шаг 4: Сборка и публикация Docker-образа. Джоба `build` зависит от успешного прохождения `test`. Здесь мы логинимся в Docker Hub (или другой Container Registry), используя секреты GitHub, собираем образ по нашему Dockerfile и пушим его с тегом, соответствующим хэшу коммита или номеру версии. Это создает артефакт, готовый к деплою.

Шаг 5: Деплой. Джоба `deploy` — самая вариативная часть. В качестве примера рассмотрим деплой на виртуальную машину через SSH. При успешной сборке мы можем подключиться к целевому серверу, остановить старый контейнер, скачать новый образ и запустить его с обновленными переменными окружения. Для более сложных сценариев можно интегрироваться с Kubernetes (Helm) или облачными платформами вроде Gigalixir, специализирующейся на Elixir.

Важные нюансы для Elixir: Кэширование зависимостей Mix и скомпилированных артефактов (`_build`, `deps`) между запусками пайплайна через `actions/cache` ускорит процесс в разы. Также стоит обратить внимание на статический анализ кода с помощью `credo` и проверку форматирования `mix format --check-formatted`, которые можно добавить в этап тестирования.

Отладка и мониторинг. Настройте уведомления о неудачных сборках в Slack или Telegram. В продакшене используйте инструменты мониторинга самого Elixir, такие как Telemetry, для интеграции с пайплайном (например, запуск нагрузочных тестов на этапе CD). Помните, что главная цель — создать надежный, повторяемый процесс, который освобождает команду от рутины и позволяет сосредоточиться на написании качественного кода для ваших Elixir-приложений.
330 3

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

avatar
skxwj93w1 01.04.2026
Спасибо за конкретные шаги. Особенно полезно видеть примеры конфигурационных файлов .yml для новичков.
avatar
8bwhgt 02.04.2026
Хорошо, но стоило бы сравнить GitHub Actions с альтернативами, например, GitLab CI. У каждого свои нюансы.
avatar
q53asy0nxgi 02.04.2026
Актуально. Вопрос: как вы рекомендуете управлять секретами (secrets) в GitHub Actions для продакшена?
avatar
3pgytvh3tf 03.04.2026
Полезный материал, но хотелось бы больше деталей по тестированию, особенно для E2E-сценариев в Phoenix.
avatar
95hgfl 03.04.2026
Для маленьких проектов это может быть избыточно. Иногда простой скрипт для деплоя решает те же задачи.
avatar
y2kiq3b3o 03.04.2026
Жду часть про деплой в облако (например, на Fly.io или Gigalixir). Надеюсь, автор планирует продолжение.
avatar
g86czt 03.04.2026
Всегда сомневался, нужен ли Docker для Elixir-приложений в CI. Статья убедила в его пользе для консистентности.
avatar
c8fjh70nzatx 03.04.2026
Статья хорошая, но для сложных микросервисных архитектур этого может быть недостаточно. Нужны дополнительные этапы.
avatar
252fcehwqy28 04.04.2026
Отличный фундамент. Добавил бы этап проверки форматирования кода (mix format) и статического анализа (credo).
avatar
bg9u957w 04.04.2026
Интересно, а насколько сильно увеличивается время сборки из-за Docker? Есть ли способы его оптимизировать?
Вы просмотрели все комментарии