Как реализовать 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-приложения.