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