CI/CD стал неотъемлемой частью процесса разработки ПО, как в крупных, так и в небольших компаниях и проектах, в том числе open source.

Самыми популярными CI/CD-системами является GitLab и Jenkins. Обе эти системы являются мощными, расширяемыми и включают множество дополнительных возможностей. С помощью этих систем можно построить CI/CD любой сложности.

Но часто бывает, особенно на небольших проектах, что необходимо максимально простое и прямолинейное решение, а не функциональность. В этом случае Ansible Semaphore является хорошей альтернативой GitHub и Jenkins.

Ansible Semaphore – это веб-интерфейс для запуска Ansible-сценариев с зачатками CI/CD. С помощью него можно превратить плейбук в простую CI/CD систему. Это open source проект, он развивается с 2015 года и на данный момент у него 5200 звезд на GitHub.

Интерфейс Ansible Semaphore напоминает интерфейс Jenkins и AWX. Описание интерфейса можно найти в документации.

Далее предполагается что читатель знаком с Ansible.

Так как предполагается небольшой проект, то возьмем модель разработки Trunk. В отличие от Git-flow такая модель предполагает одну и ту же ветвь для разработки и для продакшна. Это сильно упрощает CI/CD.

Наш pipeline будет выглядеть так:

Все элементы схемы легко реализуются на Ansible. А благодаря версионированию и вызову задач по расписанию, все это будет работать автоматически.

Создадим репозиторий на GitHub

Нам потребуется два плейбука и соответствующие роли для них:

  • build.yml – для сборки приложения и отправки его в S3-хранилище.

  • deploy.yml – для доставки приложения на сервера dev- и production-окружения.

Вот исходный код: github.com/fiftin/ansible-semaphore-deploy-test.

Интерфейс Ansible Semaphore

Для тех кто знаком с AWX, интерфейс будет понятен. Для остальных коротко расскажу. Интерфейс имеет следующие ключевые сущности:

  • Задача (Task) – Процесс выполнения Ansible-плейбука.

  • Шаблон задачи (Task Template) – шаблон, на основе которого создается задача.

  • Inventory – список серверов, для которых будет выполняться задача.

  • Environment – переменные окружения (extra vars в терминологии Ansible).

  • Ключ (Key) – SSH-ключ или логин/пароль, по которому Ansible будет подключаться к серверам.

  • Репозиторий (Repository) – git-репозиторий, где хранится код Ansible-плейбуков.

Настройка проекта

Создадим 3 Inventory (вот они):

  • Build – указывает на каком сервере будет собираться приложение.

  • Dev – список серверов, на которые будет разворачиваться приложение в dev-окружении.

  • Production – список серверов, на которые будет разворачиваться приложение в production-окружении.

Создадим 3 окружения (вот они): Build, Dev, Production.

Создадим 3 шаблона задач (вот они):

  • Build – для сборки приложения и отправки его в S3-хранилище.

  • Deploy to Dev – для доставки приложения на сервера dev-окружения.

  • Deploy to Production – для доставки приложения на сервера production-окружения.

Разворачивать будем вот это нехитрое веб-приложение: https://github.com/fiftin/ansible-semaphore-test-app :)

Запуск

Задача Build выполняется автоматически при появлении нового коммита в репозитории. Успешные сборки загружаются в S3-хранилище.

После каждой успешной сборки автоматически запускается задача Deploy to Dev, которая разворачивает приложение в Dev-окружении. Демонстрационный dev-сайт доступен по адресу demo-dev.ansible-semaphore.com.

Задачу Deploy to Production нужно запускать вручную. Она доставляет приложение в Production-окружение, только если оно было успешно развернуто в Dev-окружении.

Если захотите установить у себя:

Поиграться с описанным выше примером можно на сайте demo.ansible-semaphore.com.

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


  1. hard2018
    17.09.2022 02:29

    Один вопрос, это единственный сервис. Есть ли подобные, где можно запустить те же сценарии в yml.
    Если единственный, я лучше поищу решения отдельно для репы/докера, отдельно для деплоя. Просто для взаимозаменяемости в случае чего.


    1. fiftin Автор
      17.09.2022 10:21
      +1

       Это не сервис, а open source проект.


  1. celebrate
    17.09.2022 10:34

    Зачем это, если есть AWX?


    1. fiftin Автор
      17.09.2022 10:39
      +2

      1) Ansible Semaphore появился до AWX, это довольно известный проект (5200 звезд на GitHub) и не я его автор.

      2) Для запуска Semaphore, в отличие от AWX, не нужен Docker и Kubernetes.

      3) Semaphore на много проще и симпатичнее AWX :) Он написан на Go и распространяется всего 1 исполняемым файлом.


  1. strangeman
    17.09.2022 13:28
    +3

    Как человек, в прошлом причастный к разработке Semaphore, рад, что проект живёт и развивается.
    Мы в своё время ушли на Rundeck, потому что не хватало хранения конфигурации в коде и местами начала мешать завязка на Ansible, но Rundeck тоже не без минусов.


    1. fiftin Автор
      17.09.2022 13:43
      +1

      Привет, да, помню :) С тех пор я перевел его на Vue.JS и добавил поддержку Postgres и BoltDB. Возвращайся, будем добавлять чего не хватает ))