DevGang
Авторизоваться

Bitbucket Pipelines и Ansible: непрерывная поставка для вашего Django проекта 

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

Bitbucket Pipelines - это, в основном, Docker контейнеры, размещенные в инфраструктуре Bitbucket, которые вы можете запускать автоматически для создания или развертывания кода. Они могут быть прикреплены к «событиям», происходящим в вашем хранилище, обычно к одной ветке.

Эти инструменты дополняют друг друга, потому что в Ansible вы можете точно определить, что вы хотите сделать на целевом сервере для развертывания приложения, а в Bitbucket Pipelines вы можете настроить и запустить контейнер для фактического развертывания.

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

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

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

Да начнется автоматизация!

Вы можете клонировать этот Bitbucket репозиторий, чтобы следовать этому уроку.

Прежде всего, добавьте файл с именем bitbucket-pipelines.yml в корень вашего хранилища. Содержимое файла должно быть примерно таким:

# use the official Python 2.7.16 docker image
image: python:2.7.16
 
pipelines:
  branches:
    # deploy only when pushing to the master branch
    master:
      - step:
          name: Deploy to prod
          # this is the name of the Bitbucket Deployment
          deployment: Production
          caches:
            # cache the Ansible installation
            - pip
          script:
            # install Ansible
            - pip install ansible==2.8.0
            # go into the ansible directory
            # in this same repository
            - cd ansible
            # perform the actual deploy
            - ansible-playbook -i ./hosts deploy.yaml

Давайте рассмотрим конфигурацию построчно:

  1. В строке 2 вы определяете образ докера, который хотите использовать;
  2. В строке 7 вы определяете ветку, которая будет запускать развертывание (в этом примере master);
  3. В строке 11 вы определяете развертывание, которое в основном является средой (управляемой Bitbucket), где вы можете определить некоторые переменные. Таким образом, вы можете иметь разные развертывания (промежуточные, производственные,…) с разными переменными, которые вы можете использовать на этапах сборки / развертывания. В этом примере я не использую эту функцию, а просто использую одно из развертываний Bitbucket по умолчанию (с именем Production ) без настройки какой-либо переменной в этой среде;
  4. В строке 14 вы просите Bitbucket кэшировать установку пакетов, установленных с помощью pip. Это полезно, чтобы не переустанавливать каждый раз библиотеки Python, необходимые для развертывания (в данном примере Ansible 2.8.0), с нуля. Время сборки для Bitbucket Pipelines ограничено 50 минутами в месяц в бесплатном плане , поэтому важно иметь уже установленные библиотеки, чтобы сэкономить время на сборку / развертывание.
  5. От строки 16 до строки 22 вы определяете фактические шаги для развертывания: установите Ansible (если он еще не кэширован), перейдите в каталог ansible, выполните развертывание. Пожалуйста, проверьте playbook ansible/deploy.yaml, чтобы увидеть, что он будет делать на целевом сервере.

Ansible выполнит фактическое развертывание:

  1. вытащит ветку master из вашего репозитория Git;
  2. установит все необходимых производственных требований;
  3. запустит Django команды migrate и collectstatic;
  4. перезапустит сервера приложений uwsgi.

Пожалуйста, проверьте Ansible playbook ansible/deploy.yaml,  чтобы увидеть, что он будет делать на целевом сервере в деталях.

Зафиксируйте и поместите файл bitbucket-pipelines.yml в корневой каталог своего хранилища Bitbucket.

Настройте свои конвейеры

Теперь зайдите в настройки своего репозитория и нажмите Settings в разделе PIPELINES:

Теперь нажмите на Enable Pipelines:

Чтобы это соединение SSH работало, вы должны настроить пару открытых / закрытых ключей SSH в конвейере Bitbucket и разрешить использование открытого ключа на вашем сервере добавив ключ в author_keys.

Зайдите в настройки вашего репозитория, под PIPELINES перейдите к SSH-ключам:

Теперь нажмите «Generate keys», чтобы Bitbucket сгенерировал для вас новую пару ключей SSH.

Теперь вы можете скопировать сгенерированный открытый ключ и вставить его в файл .ssh/authorized_keys вашей цели развертывания.

Вам также необходимо добавить отпечаток вашего сервера в раздел «Known hosts» на той же странице. Введите имя хоста целевого сервера в поле «Host address», нажмите кнопку «Fetch» и, наконец, кнопку «Add host».

Вы можете обратиться к документации Bitbucket о ключах SSH, если вам нужно больше подробностей.

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

Если вы хотите внести некоторые изменения в master, но не хотите автоматически развертывать это изменение на сервере, вы можете поместить строку [skip-ci] в ваше сообщение о коммите.

Вывод

В этом уроке я объяснил простую, но мощную настройку для непрерывной доставки проекта Django. Это лишь небольшой пример того, что вы можете сделать с помощью Bitbucket Pipelines и Ansible, но я надеюсь, что это помогло вам понять огромный потенциал этих технологий.

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

Источник:

#Ansible
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу