Рубрики
Uncategorized

Как подготовить ваше приложение Elixir для CI/CD

В сегодняшнем посте мы рассмотрим, что такое непрерывная интеграция и непрерывная доставка, преимущества … Tagged with Elixir, начинающие, DevOps.

В сегодняшнем посте мы рассмотрим, что такое непрерывная интеграция и непрерывная доставка, преимущества, которые сопровождаются использованием CI/CD, и некоторые лучшие практики, которыми вы должны следовать. Мы также рассмотрим широкий спектр экосистемных инструментов, которые помогут вам создать первоклассные трубопроводы CI. Чтобы экспериментировать с несколькими инструментами, которые мы будем обсуждать, мы будем использовать библиотеку Elixir Git Hooks для выполнения наших шагов проверки CI/CD, но на нашей локальной машине.

Давай прыгнем прямо!

Что такое CI/CD и когда вы его используете?

Непрерывная интеграция — это процесс, с помощью которого новые функции и исправления ошибок часто объединяются в основные ветви. Для каждого изменения в базе кода выполняется набор проверки проекта, чтобы убедиться, что он соответствует стандартам команды и не вводит никаких регрессий.

Непрерывная доставка — это процесс, посредством которого проверенный код, после объединения, генерирует новый артефакт сборки. Артефакт сборки с новым кодом затем автоматически развернут в ваших непроизводственных средах. Обратите внимание, что непрерывная доставка развертывается в непроизводственных средах. Акт внедрения в производство напрямую называется достаточно запутанным, постоянным развертыванием.

CI и CD являются критическими инструментами для вашего распоряжения, поскольку они позволяют вам и вашей команде двигаться быстрее и с более высокой степенью уверенности. Они позволяют вам ловить ошибки на раннем этапе и гарантировать, что они не влияют на клиентов.

Как CI/CD влияет на дизайн приложения?

С объяснением словаря давайте перейдем к обсуждению 12 факторное приложение Анкет Это набор методов и руководящих принципов, которые можно использовать для создания устойчивых и масштабируемых веб -сервисов. Как следует из названия, есть 12 концепций, которые составляют манифест. В целях CI/CD мы сосредоточимся на «конфигурации» и «кодовой базе», но я настоятельно рекомендую прочитать 12 -факторное приложение, если вы не знакомы с ним.

В разделе Codebase говорится, что один репозиторий кода должен содержать только одно приложение. Если вся ваша система состоит из нескольких приложений, то каждое из этих приложений должно содержаться в их собственных репозиториях. Это особенно актуально для CI/CD, поскольку, следуя этому соглашению, очень легко убедиться, что только необходимые приложения созданы, протестированы и развернуты. Если в одном и том же репозитории содержится несколько приложений, становится все сложнее определить, какое приложение должно быть построено, протестировано и развернуто.

В разделе конфигурации говорится, что любой вид данных конфигурации, учетных данных и секретов необходимо удерживать от кода. Вместо этого эти биты данных должны быть установлены в среде приложения через переменные среды. Это важно с точки зрения CI/CD, так как вы сможете развернуть вспомогательные службы для тестирования и легко указать ваше приложение на эти службы с помощью конфигурации времени выполнения. Вы можете сделать это с широким спектром услуг, таких как Postgres, Redis и Rabbitmq. Мало того, что это сделает ваше приложение переносимым между средами с более высоким обновлением, но также облегчит тестирование.

Лучшие практики CI/CD

Прежде чем перейти к какому -либо экосистему экосистемы, давайте рассмотрим некоторые лучшие практики, к которым мы должны придерживаться при разработке наших конвейеров CI/CD (для разъяснения, трубопровод CI/CD определяется как серия шагов, которые выполняются для того, чтобы взять код из кода принять участие в развертывании):

  • Убедитесь, что ваши тесты являются детерминированными, поскольку наличие ненадежного набора тестов может иметь ужасные последствия для скорости команды и надежности проверки программного обеспечения.
  • Запустите дешевые проверки в первую очередь, а дорогие проверки длится так, чтобы трубопровод CI/CD вышел из строя как можно раньше. Вы не хотите принимать ресурсы сервера CI/CD, запуская тесты снова и снова, когда у вас есть другие более дешевые проблемы, которые необходимо разобраться.
  • Продвигайте тот же артефакт сборки в средах более высокого уровня, который дает вам наибольшую уверенность в том, что то, что вы протестировали, является тем, что вы развертываете. Используя философию конфигурации из приложения из 12 факторов, должно быть возможно продвигать тот же артефакт сборки, только изменив некоторые переменные среды.

Инструменты эликсира для непрерывной интеграции

К счастью, в нашем распоряжении есть много инструментов, которые выходят из коробки с Elixir. Некоторые из этих инструментов включают в себя:

  • Смешайте компиляцию-Warnings-as-errors -Запуск этого вернет ненулевой существующий статус, если ваш код содержит какие-либо предупреждения.
  • Смешайте Xref Unreachable-Abort-if-Eny -Запуск этого вернет ненулевой статус выхода, если ваш код дает какие-либо ссылки на функции/модули, которые не существуют. Если вы используете Elixir 1.10+, эта задача с миксом установилась, и ее функциональность была подключена в Смешайте компиляцию-Warnings-as-errors Анкет
  • Смешайте Xref устаревшего-Abort-if-Eny -Запуск этого вернет ненулевой статус выхода, если ваш код использует любые функции, которые были помечены как устаревшие. Если вы используете Elixir 1.10+, эта задача с миксом установилась, и ее функциональность была подключена в Смешайте компиляцию-Warnings-as-errors Анкет
  • Формат микса-проверка проверки -Запуск этого вернет ненулевой существующий статус, если какой-либо из ваших исходных файлов не придерживается конфигурации формата, указанной в вашем .formatter.exs . Это помогает гарантировать, что кодовая база имеет единый вид и ощущение всех членов команды.
  • Смешайте тест — Elixir имеет удивительную встроенную структуру тестирования под названием Exunit Анкет Запустив предыдущую команду, вы можете выполнить все тесты вашего проекта, и статус выхода будет ненулевым, если какие-либо тесты не удались.

После того, как вы включили вышеупомянутые элементы в свой поток CI, пришло время достичь некоторых инструментов сообщества. К счастью, экосистема Elixir заполнена отличными инструментами! Ниже приведен список нескольких инструментов, которые я использую изо дня в день:

  • Credo является настраиваемым инструментом статического анализа, который проверяет ваш код на наличие вопросов проектирования, читаемости и согласованности. Кроме того, он также обеспечивает соблюдение его собственного руководства по стилю, которое может помочь базе кодовой базы оставаться единой, даже если в коде и из кода есть много разработчиков.
  • Диаликсир это удивительный инструмент статического анализа, который мы наследуем от Erlang. Чтобы упростить его использование в Elixir, библиотека Dialyxir обеспечивает хорошую обертку вокруг диализера, что облегчает потребление с точки зрения эликсира. Если вы делаете тяжелое использование типов, то это отличный инструмент для вас, чтобы убедиться, что вы не представляете какие -либо ошибки, связанные с типом в свой код.
  • Доктор это статический инструмент анализа, который фокусируется на сканировании документации вашего проекта. Он может быть использован для обеспечения соблюдения наличия типов, функциональных документов и модульных документов. Кроме того, его можно настроить, чтобы вернуть ненулевой статус выхода, если охват документации падает ниже определенного порога.
  • Обход это полезная библиотека, когда вы хотите издеваться над внешними услугами HTTP для целей ваших тестов. Ваш фиктивный сервер может быть поднят во время ваших тестов и может вернуть предварительно зарегистрированные ответы.
  • Faker Отличная библиотека, когда вам нужно генерировать поддельные данные, такие как имена, адрес, номера телефонов и т. Д.
  • Exmachina — Если вы используете ECTO в своем приложении и хотите оптимизированный способ создания тестовых данных вместе с ассоциациями, то Exmachina — это то, что вы ищете. В сочетании с Faker Exmachina может создать отличный инструмент создания тестовых данных.

Инструменты эликсира для непрерывной доставки

После того, как ваша приложение будет протестировано и статически проанализировано, вы захотите как -то развернуть ее. Ниже приведены несколько вариантов, которые вам доступны для этого:

  • Смешивание выпусков -По состоянию на Elixir 1.9, способность создавать автономные выпуски приложений была приведена в Core Elixir (исторически вам нужно использовать отдельные инструменты, такие как Distillery ). Эликсир интересен с точки зрения развертывания, учитывая, что у вас есть возможность упаковать свое приложение и виртуальную машину Erlang (луч) в рамках артефакта сборки. Вы должны убедиться, что машина, на которой вы строите, такую же, как и машина, на которой вы развертываете, но, поскольку все время выполнения приложения+выполняется, вам не понадобится эликсир или Erlang, установленная на целевой машине.
  • Docker — Как и многие языки программирования, доступные сегодня, Elixir прекрасно играет с Docker, и это относительно простая задача — создать изображение Docker с вашим приложением. Вы можете использовать изображение Base Elixir Docker и запустить приложение через микс внутри контейнера для целей разработки, или вы можете использовать Миксель релизы и многоступенчатые сборки Чтобы создать легкие изображения только с вашим приложением и виртуальной машиной Erlang.
  • Edeliver это инструмент, который можно использовать для развертывания приложений Elixir для удаленных хостов с использованием обновлений горячих кодов. Используя обновления горячих кодов, вы можете обновить свое приложение с нулевым временем простоя на одном или нескольких хостах.

Выполнение проверки CI на вашей локальной машине

Чтобы поиграть с некоторыми идеями, представленными здесь, не пытаясь выучить новую систему CI/CD, вместо этого мы экспериментируем с проверкой образца Elixir Project с использованием Git Hooks. Использование GIT Hooks — это хорошая привычка, в которой он поможет вам проверить свой код локально, прежде чем подтолкнуть его к хранилищу вашей команды. Это облегчает исправление любых ошибок, учитывая, что вам не нужно копаться через журналы, чтобы выяснить, почему сборки не удались.

Для начала начните с клонирования образца репозитория, который я собрал на GitHub:

$ git clone https://github.com/akoutmos/sample_math.git

Как только у нас будет клонирован наш проект на месте, мы захотим открыть наш Mix.exs файл и добавьте следующую зависимость:

defp deps do
  [
    ...
    {:git_hooks, "~> 0.4.0", only: [:test, :dev], runtime: false}
  ]
end

С этим мы теперь можем открыть наш config/config.exs Файл и добавьте следующее (не стесняйтесь опустить задачи смешивания xref , если вы используете Elixir 1.10+):

...

if Mix.env() != :prod do
  config :git_hooks,
    verbose: true,
    hooks: [
      pre_commit: [
        tasks: [
          "mix clean",
          "mix compile --warnings-as-errors",
          "mix xref deprecated --abort-if-any",
          "mix xref unreachable --abort-if-any",
          "mix format --check-formatted",
          "mix credo --strict",
          "mix doctor --summary",
          "mix test"
        ]
      ]
    ]
end

При этом давайте возьмем нашу новую зависимость и попытаемся совершить наш код через терминал:

$ mix deps.get
$ mix git_hooks.install
$ git add .
$ git commit -m "Added git hooks to sample math project"
↗ Running hooks for :pre_commit
✔ `mix clean` was successful
Compiling 1 file (.ex)
warning: variable "num_2" is unused (if the variable is not meant to be used, prefix it with an underscore)
  lib/sample_math.ex:10: SampleMath.sum/2

Compilation failed due to warnings while using the --warnings-as-errors option
× pre_commit failed on `mix`
** (exit) 1
    lib/mix/tasks/git_hooks/run.ex:175: Mix.Tasks.GitHooks.Run.error_exit/1
    lib/mix/tasks/git_hooks/run.ex:128: Mix.Tasks.GitHooks.Run.run_task/3
    (elixir) lib/enum.ex:783: Enum."-each/2-lists^foreach/1-0-"/2
    (elixir) lib/enum.ex:783: Enum.each/2
    lib/mix/tasks/git_hooks/run.ex:63: Mix.Tasks.GitHooks.Run.run/1
    (mix) lib/mix/task.ex:331: Mix.Task.run_task/3
    (mix) lib/mix/cli.ex:79: Mix.CLI.run_task/2

Как вы уже догадались, есть проблема с нашим проектом, который требует исправления! К счастью, наш коммит не пройдет, пока мы не сможем исправить проблему. Я оставлю исправление проблем в ваших способных руках, но, как мы видим, есть проблема с шагом компиляции из -за наличия неиспользованной переменной. Наши шаги проверки работали так же, как и ожидалось!

В то время как мы выполняли только шаги проверки на нашей локальной машине, предпринятие этих же этапов проверки на фактическую конвейер CI/CD является относительно простой задачей. Библиотека Git Hooks, которую мы используем, позволяет нам запустить все наши настроенные шаги через смешивание git_hooks.run All Анкет Другими словами, мы можем запустить эту команду в нашем решении CI/CD по выбору и подтвердите, что наши изменения кода проходят командные стандарты. Преимущество этого заключается в том, что наши шаги проверки CI/CD можно легко запустить локально для быстрой и легкой отладки.

Резюме

Спасибо, что придерживались меня до конца! Надеемся, что вы узнали кое -что, что связано с CI/CD и как сделать это с приложением Elixir.

Приглашенный автор Алекс Катмос является старшим инженером -программистом, который пишет Backends в Elixir, Frontends in Vuejs и развертывает свои приложения с помощью Kubernetes. Когда он не программирует или ведет блог, он забивает в своем Datsun 280Z 1976 года.

П.с. Если вы хотите прочитать посты Elixir Alchemy, как только они выходят из прессы, Подпишитесь на нашу бюллетени Elixir Alchemy и никогда не пропустите ни одного поста !

Оригинал: «https://dev.to/appsignal/how-to-get-your-elixir-application-ready-for-ci-cd-3dj4»