В этом руководстве мы создадим авторазвертывание на основе коммитов и pull request, сделанных в ветке.
Это базовая версия, в которой мы синхронизируем новые и измененные файлы из репозитория bitbucket в digitalocean. Без использования docker
Для этого примера у нас будет 2 Droplets, один для тестирования и один для производства. У меня есть bitbucket на английском языке
Шаги, которые должны произойти
- При обновлении мастер-ветки мы будем копировать новые файлы на дроплет
- мы собираемся запустить скрипт, который установит зависимости, запустит тест, добавит правильные разрешения и другие задачи, которые нам необходимо выполнить
- Мы сообщим через канал Slack, когда развертывание будет завершено.
Определите филиалы и среды
Первый шаг — решить, какие ветви будут развернуты в той или иной среде. Для данного примера мы будем использовать следующую конфигурацию
Филиал | Окружающая среда | Описание |
---|---|---|
развивать | — | Филиал для интеграции функций |
мастер | Остановка | Тестирование / Предпроизводственная среда |
prod-v1 | Производство | Производственная среда |
Включить конвейеры
Вход в систему
Вы увидите следующий экран:
- Мы продолжаем работу с помощью кнопки Commit File. Это создаст файл
bitbucket-pipelines.yml
в корне проекта для настройки развертывания.
ОЧЕНЬ ВАЖНО НЕ ВНОСИТЬ СЧЕТЧИКИ И АПИКЕИ В ФАЙЛ bitbucket-pipelines.yml.
Чувствительные данные будут обрабатываться с помощью переменных, которые будут описаны позже.
Аутентификация Bitbucket с помощью DigitalOcean
-
Мы создадим SSH, войдя в систему под именем
Мы увидим следующий экран
-
Нажмите на кнопку Генерировать ключи
-
Войдите в дроплет и откройте файл авторизованных ключей с помощью следующей команды
-
Скопируйте открытый ключ, который мы сгенерировали в bitbucket, и вставьте его в файл, который мы открыли в дроплет-системе.
-
Вставьте IP-адрес дроплета в поле ввода адреса хоста и нажмите кнопку Fetch, в результате чего будет сгенерирован отпечаток пальца.
-
Кнопка Add Host будет включена, нажмите на нее, и это добавит реестр в bitbucket.
Этими шагами мы соединили по SSH bitbucket с нашим дроплетом Digital Ocean.
Настройка сред
По следующему адресу
мы найдем окружения по умолчанию, а именно: Тестирование, постановка на поток и производство
переменные окружения
Переменные среды — это значения, которые могут быть использованы только в той среде, которую мы определяем через атрибут Deployment
файла bitbucket-pipelines.yml.
Если нам нужно хранить глобальные переменные для всех окружений, они должны находиться по следующему пути
Чтобы узнать больше о переменных, вы можете перейти по этой ссылке
Для этого примера мы создадим следующие переменные
Имя | Описание |
---|---|
SSH_USER | имя пользователя для аутентификации SSH |
SERVER_IP | IP капли |
SCRIPT_PATH | Путь в дроплете, где находится скрипт, который мы запустим после копирования файлов |
WEBHOOK_URL | URL веб-крючка Slack |
файл bitbucket-pipelines.yml
В интернете и на bitbucket есть много примеров использования этого файла, но для того, что нам нужно, мы объясним основы его работы. Конфигурация, которую мы будем использовать, выглядит следующим образом:
pipelines:
branches:
master:
- step:
name: Deploy to droplet
deployment: Staging
script:
- pipe: atlassian/rsync-deploy:0.7.0
variables:
USER: $SSH_USER
REMOTE_PATH: '/var/www/app'
LOCAL_PATH: '${BITBUCKET_CLONE_DIR}'
SERVER: $SERVER_IP
DEBUG: 'true'
- pipe: atlassian/ssh-run:0.4.0
variables:
SSH_USER: $SSH_USER
SERVER: $SERVER_IP
COMMAND: $SCRIPT_PATH
- pipe: atlassian/slack-notify:2.0.0
variables:
WEBHOOK_URL: $WEBHOOK_URL
MESSAGE: '"Se ha desplegado correctemente la rama master en el entorno de stagging"'
Вы заметите, что здесь нет образа, поскольку я не использую docker, я не видел необходимости ставить его и избегать задержки загрузки образа.
Имя | Описание |
---|---|
филиалы | название, которое группирует ветви |
шаг | Шаг, выполняющий действие |
имя | название выполняемого шага |
развертывание | среда, из которой будут использоваться переменные |
скрипт | Группа действий, которые должны быть выполнены |
труба | Интеграция, облегчающая использование внешнего сервиса |
Вы можете найти множество интеграций труб по этой ссылке
Конфигурация на сервере (Droplet)
Для этого примера мы создадим папку app
по следующему адресу /var/www/app/
. Внутри этой папки мы создадим два файла.
Структура должна выглядеть следующим образом:
/var/www/
└───app
│ │ .env
│ │ deploy.sh
Rsync
При правильно установленных переменных rsync скопирует изменения на сервер в папку build
, а если она не существует, то создаст ее.
Запуск bash в дроплете
В качестве второго шага я запущу на сервере команду, которая сделает приложение готовым к использованию.
Мой файл будет называться deploy.sh
и вот что он будет содержать
#!/bin/bash
## Copiar archivo de variables de entorno dentro del proyecto
cp /var/www/app/.env /var/www/app/build/.env
## Ingresar a la carpeta del proyecto para ejecutar los
## siguientes comandos.
cd /var/www/app/build
## instalar composer
composer install --no-interaction --no-progress --optimize-autoloader --no-dev
## Actualizar archivo de dependencias.
composer dump-autoload -n
php artisan migrate --seed --force
## Asignar los permisos adecuados para un proyecto laravel
sudo chown -R $USER:www-data .
sudo find . -type f -exec chmod 664 {} ;
sudo find . -type d -exec chmod 775 {} ;
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
уведомление в slack
Наконец, с помощью webhook канала slack будет отправлено уведомление о завершении процесса.