Непрерывная доставка с конвейерами Bitbucket, Digital Ocean и Laravel

В этом руководстве мы создадим авторазвертывание на основе коммитов и pull request, сделанных в ветке.

Это базовая версия, в которой мы синхронизируем новые и измененные файлы из репозитория bitbucket в digitalocean. Без использования docker

Для этого примера у нас будет 2 Droplets, один для тестирования и один для производства. У меня есть bitbucket на английском языке

Шаги, которые должны произойти

  1. При обновлении мастер-ветки мы будем копировать новые файлы на дроплет
  2. мы собираемся запустить скрипт, который установит зависимости, запустит тест, добавит правильные разрешения и другие задачи, которые нам необходимо выполнить
  3. Мы сообщим через канал 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 будет отправлено уведомление о завершении процесса.

Оцените статью
Procodings.ru
Добавить комментарий