В данной статье разберем как сделать простейший деплой(развертывание) вашего проекта на 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 и добавить ваш скопированный ключ.