Автоматический деплой

Деплой сайта
Деплой сайта

В данной стать разберем как сделать простейший деплой(развертывание) вашего проекта на Bitbucket, с помощью Bitbucket pipelines.

О продукте, Вы можете почитать тут: https://bitbucket.org/product/ru/features/pipelines

Задача: все просто, нам нужно при пул-реквесте в ветку develop или master автоматически обновлять код на сервере(дев и боевой).

Как будем реализовывать? Принцип будет простой, мы будем подключаться по ssh к нашим серверам и выполнять нужные нам команды, в нашем случае git pull(можно и другие), для обновления кода проекта из нашего репозитория.

Шаг 1. Генерируем SSH ключ

Подключаемся на наш удаленный сервер по ssh и выполняем следующие команды:

$ cd ~/
$ ssh-keygen // - создаем без пароля
$ cd .ssh
$ cat id_rsa.pub >> authorized_keys
$ chmod 600 authorized_keys

Данные команды создадут два файла: закрытый ключ с именем id_rsa (без пароля) и открытый ключ с именем id_rsa.pub.

Шаг 2. Добавляем ssh ключ в Bitbucket

В командной строке введите следующую команду:

$ base64 < id_rsa

Просто скопируйте и вставьте выходные данные этой команды в переменную окружения Pipelines (не забудьте поставить флажок «secure»). Я предполагаю, что вы назвали переменную DEPLOY_SSH_KEY. Путь к настройкам в битбакете:

Ваш репозиторий > Settings > Repository variables

Шаг 3. Добавляем “known_hosts” файл в ваш репозиторий

В командной строке введите следующую команду:

$ ssh-keyscan -t rsa server.example.com > deploy_known_hosts

server.example.com – хост или ip вашего сервера.

Далее выводим на экран содержание файла deploy_known_hosts

$ cat deploy_known_hosts

Копируем вывод, открываем локально ваш проект, создаем в корне файл deploy_known_hosts и записываем в него скопированное содержимое.

Шаг 4. Создаем файл bitbucket-pipelines.yml

Продолжаем работу локально и в корне нашего проекта(где мы только что создали deploy_known_hosts) создаем файл bitbucket-pipelines.yml

Деплой через ftp


image: php:7.2

pipelines:
 branches:
   master:
     - step:
         name: Deploy to production
         deployment: production
         script:
           - apt-get update
           - apt-get -qq install git-ftp
           - git ftp push --user $ftp_login --passwd $ftp_pass ftp://193.176.78.46

Ниже приведу пример кода файла, под кодом будут имена переменных которые нужно заменить:

image: atlassian/default-image:latest

pipelines:
  branches:
    develop:
      - step:
          name: Deploy develop branch
          deployment: Develop
          script:
            - mkdir -p ~/.ssh
            - cat deploy_known_hosts >> ~/.ssh/known_hosts
            - (umask  077 ; echo $DEPLOY_SSH_KEY | base64 -di > ~/.ssh/id_rsa)
            - ssh -i ~/.ssh/id_rsa user@xxx.xxx.xxx.xxx 'cd /path/you/project && git fetch --all && git reset --hard origin/develop'
            - echo "DEVELOP SUCCESS!"
    master:
      - step:
          name: Deploy master branch
          deployment: Master
          script:
            - mkdir -p ~/.ssh
            - cat deploy_known_hosts >> ~/.ssh/known_hosts
            - (umask  077 ; echo $DEPLOY_SSH_KEY | base64 -di > ~/.ssh/id_rsa)
            - ssh -i ~/.ssh/id_rsa user@xxx.xxx.xxx.xxx 'cd /path/you/project && git fetch --all && git reset --hard origin/master'
            - echo "MASTER SUCCESS!"

Гид по конфигурации bitbucket-pipelines.yml
https://confluence.atlassian.com/bitbucket/configure-bitbucket-pipelines-yml-792298910.html

/path/you/project – путь к вашему проекту на сервере

user@xxx.xxx.xxx.xxx – user – пользователь от которого мы создали ключ ssh(не root я надеюсь) и xxx.xxx.xxx.xxx – ip или хост вашего сайта.

Фиксируем изменения и отправляем в Bitbecket(git add.., git commit.., git push..).

На этом наша работа выполнена. Но хочется отметить несколько ньюансов:

  • Не используйте root пользователя для подключения по ssh
  • В /path/you/project ваших проетов должен быть инициализорован гит репозиторий и добавлены источники(git remote add origin…)
  • В примере я перезаписываю все файлы, возможно вам так делать не стоит(git fetch –all && git reset –hard origin/develop)

Ошибки

Ниже приведу несколько проблем которые могут вам встретиться.

Ошибка: Не тот ключ при подключении по ssh к битбакету

Если при подключении к git репозиторию с вашего сервера, ssh берет не тот ключ, нужно добавить файл ~/.ssh/config и прописать в нем:

Host bitbucket.org
 HostName bitbucket.org
 IdentityFile ~/.ssh/id_rsa_deploy // путь к нужному файлу с ключом
 User admin

Ошибка: при выполнение команды git fetch –all && git reset –hard origin/develop в pipelines

Fetching origin
Warning: Permanently added the RSA host key for IP address '2406:da00:ff00::22c3:9b0a' to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Для выполнения команды на сервере: git fetch –all && git reset –hard origin/develop вам нужно добавить публичный ssh ключ в битбакете. Для этого нужно вывести содержимое созданного ключа: cat id_rsa.pub скопировать вывод, перейти в битбакет: Settings -> Access keys и добавить ваш скопированный ключ.