Как реализовать CI/CD пайплайн для Elixir проекта?
Реализация CI/CD пайплайна для Elixir-проекта включает автоматизацию всех этапов разработки — сборка, тестирование, анализ кода, релиз и деплой. Применяются системы вроде GitHub Actions, GitLab CI/CD, CircleCI, Jenkins, а также инструменты сборки и релиза: Mix, Distillery, Burrito, Docker, Fly.io, Render и другие. Ниже приведён полный путь настройки пайплайна на GitHub Actions — как одном из самых популярных решений.
1. Структура проекта Elixir
Перед настройкой убедись, что:
-
проект создан через mix new my_app --sup или mix phx.new (если Phoenix);
-
у тебя есть mix.exs, test/, .formatter.exs, .credo.exs, .tool-versions (если asdf);
-
код собирается и тесты проходят локально.
2. Создание .github/workflows/ci.yml
Создай папку .github/workflows/ и файл ci.yml. Это файл конфигурации пайплайна.
name: Elixir CI
on:
push:
branches: \[ main \]
pull_request:
branches: \[ main \]
jobs:
build:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:14
ports: \["5432:5432"\]
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: my_app_test
options: >-
\--health-cmd pg_isready
\--health-interval 10s
\--health-timeout 5s
\--health-retries 5
steps:
\- uses: actions/checkout@v3
\- name: Set up Elixir
uses: erlef/setup-beam@v1
with:
elixir-version: '1.15.7'
otp-version: '26'
\- name: Install dependencies
run: mix deps.get
\- name: Check formatting
run: mix format --check-formatted
\- name: Run tests
env:
MIX_ENV: test
DATABASE_URL: ecto://postgres:postgres@localhost/my_app_test
run: |
mix ecto.create
mix ecto.migrate
mix test
3. Дополнительные шаги пайплайна
Добавь при необходимости:
- **Credo (линтинг):
**
\- name: Run Credo
run: mix credo --strict
- **ExUnit + coverage (покрытие):
**
\- name: Test coverage
run: mix test --cover
- **Dialyzer (анализ типов):
**
\- name: PLT Cache
uses: actions/cache@v3
with:
path: \_build/dev/dialyxir_erlang-26_elixir-1.15.7.plt
key: ${{ runner.os }}-dialyzer-plt
\- name: Run Dialyzer
run: mix dialyzer
- **Документация:
**
\- name: Build Docs
run: mix docs
4. Добавление релизов
Для деплоя необходимо генерировать сборки. Ты можешь использовать:
-
mix release (встроенный релиз Elixir);
-
distillery (устарел);
-
burrito — для нативной сборки;
-
Docker — если деплой идёт в контейнерах.
Пример Dockerfile:
FROM hexpm/elixir:1.15.7-erlang-26-alpine as build
WORKDIR /app
RUN apk add --no-cache build-base git
COPY mix.exs mix.lock ./
COPY config config
RUN mix deps.get
COPY . .
RUN MIX_ENV=prod mix release
FROM alpine:3.18
WORKDIR /app
RUN apk add --no-cache libstdc++ ncurses
COPY --from=build /app/\_build/prod/rel/my_app ./
CMD \["bin/my_app", "start"\]
Добавь это в пайплайн:
\- name: Build Docker Image
run: docker build -t my_app .
5. Автоматический деплой
Ты можешь интегрировать деплой:
-
**На Fly.io:
**-
flyctl deploy с токеном API.
-
Добавь secrets, fly.toml, и mix release.
-
-
**На Render.com:
**-
просто пуш в репозиторий, если подключён.
-
можно инициировать вебхуки из CI.
-
-
**Heroku (через Elixir buildpack):
**- heroku container:push web --app <app-name>
6. Хранение секретов
GitHub Actions → Settings → Secrets:
-
DATABASE_URL
-
FLY_API_TOKEN
-
SECRET_KEY_BASE
-
GH_TOKEN — если публикуешь пакет или hex release
Обращайся к ним в пайплайне через env:.
7. Мониторинг CI
Проверяй статус в PR, ветке, вкладке Actions. В случае ошибок GitHub укажет, на каком шаге произошёл сбой.
8. Пример пайплайна с релизом и деплоем (с Fly)
\- name: Login to Fly
run: flyctl auth token ${{ secrets.FLY_API_TOKEN }}
\- name: Deploy to Fly
run: flyctl deploy --remote-only
Для Fly обязательно нужен fly.toml и release в mix.exs.
9. Альтернативы
-
GitLab CI/CD — .gitlab-ci.yml, runner, build-steps;
-
CircleCI — config.yml, поддерживает docker, caching;
-
Jenkins — скриптовая настройка, часто через Docker;
-
Docker Compose + cron — если свой сервер.
Эти шаги позволяют построить полный CI/CD пайплайн, покрывающий сборку, тестирование, линтинг, анализ, релиз и автоматический деплой Elixir-приложения.