Простое развертывание проекта с помощью Bitbucket pipelines.
При пул-реквесте в ветку master обновлять код на сервере.
1. Генерируем SSH ключ
На сервере выполняем следующее:
cd ~/ ssh-keygen # Enter file in which to save the key (~/.ssh/id_rsa): [Press enter] # Enter passphrase (empty for no passphrase): # Enter same passphrase again: cd .ssh cat id_rsa.pub >> authorized_keys chmod 600 authorized_keys
ssh-keygen - Генерирует ssh ключ (при его создании не вводим пароль) приватный id_rsa (без пароля - empty for noe passphrase - просто жмем Enter) и публичный id_rsa.pub
2. Добавляем созданный ssh ключ в Bitbucket
На сервере выполняем следующее:
base64 < id_rsa
Эта команда выведет содержимое приватного ключа, его Вы копируете и вставляется в настройки Pipelines . Они находятся в настройках репозитория, на скриншоте должно быть видно.
Обзываете переменную name = DEPLOY_SSH_KEY, в value = <содержимое скопированного приватного ключа> и ставим галочку Secured
Эту переменную мы будем использовать дальше
3. Добавляем known_hosts
На сервере выполняем следующее:
ssh-keyscan -t rsa server.example.com > deploy_known_hosts cat deploy_known_hosts
server.example.com - Ваш сервер (может быть IP адрес)
Эта команда добавить ваш урл или IP в файл deploy_know_hosts и выведет в консоль его содержимое. Копируем содержимое файла в локальный проект, предварительно создав в корне проекта файл deploy_known_hosts.
4. Добавляем файл bitbucket-pipelines.yml
В BitBucket также необходимо включить опцию Enable Pipelines
В разделе настроек Deployments мы добавляем свою ветку в один из раздел environments, либо используем уже существующие.
Теперь, в локальном проекте, рядом с файлом deploy_known_hosts создаем файл bitbucket-pipelines.yml - в нем будут прописываться задания, которые будет выполнятся после пулла в репозиторий
Пример файла:
image: atlassian/default-image:latest pipelines: branches: 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@server.example.com 'cd /path/you/project && git pull origin master' - echo "MASTER SUCCESS!"
Где:
- deployment: Master - из настроек Deployments
- $DEPLOY_SSH_KEY наша переменная из Bitbucket pipelines Repository variables
- user@server.example.com - пользователь от которого мы создали ключ ssh на сервере и сам сервер (IP или url)
- /path/you/project - путь к каталогу на сервере в котором развернут git проект
- git pull origin master - команда выполняемая автоматически, у Вас может быть любой другой
В текущем примере git репозиторий уже должен быть инициализирован и привязан к вашему репозиторию на BitBucket - иначе будет ошибка
5. Настраиваем config на сервере
Я бы сразу настроил файл ~/.ssh/config - т.к. без него у меня возникали проблемы при подключении
На сервере содержимое файла ~/.ssh/config должно быть примерно такое:
Host bitbucket.org IdentityFile ~/.ssh/id_rsa Port 22 User user@server.example.com
У меня была проблема с портом и с пользователем, поэтому я прописал 22й порт, до этого почему то пыталось подключится на 777й порт, а также прописал пользователя, от которого у меня был создан ssh ключ
6. Доп. настройки в репозитории на BitBucket
Также я указал ssh ключ (приватный и публичный) в другом разделе настроек, он нам понадобится ниже, а также добавил Known hosts всех возможных вариантов своего сервер (возможно это лишнее).
7. Настройка репозитория на выполнение команд по ssh без ввода пароля каждый раз
Добавляем ключи ssh в ssh-агент, выполняем команду на сервере:
ssh-agent -s
Должен быть однострочный вывод с примерно таким содержанием, кроме цифр, цифры у Вас буду Ваши:
Agent pid 434321
Если по каким то причинам такого содержимого не выведется, тогда в консоль пишем:
eval $(ssh-agent -s)
После того, как надпись появилась с номером агента, выполняем следующее:
ssh-add ~/.ssh/id_rsa
Эта команда добавляет приватный ключ в агент, публичный ключ (~/.ssh/id_rsa.pub) мы добавляем в Bitbucket на 6м шаге - выше на скриншоте показано.
Теперь активируем ключи, для bitbucket это выглядит так:
ssh -t git@bitbucket.org # у меня так не сработало, поэтому я сделал вот так, с указанием порта и без указания нового окна терминала ssh git@bitbucket.org -p22
В ответ будет сообщение продолжат или нет, соглашаемся и пишем yes в консоль
Следующий шаг - это найти на сервере файл ~/.bashrc который обычно находится в корне, этот файл будет содержать настройки для запуска агента и активации наших ключей, дописываем такое содержимое в конец этого файла:
# Note: ~/.ssh/environment should not be used, as it # already has a different purpose in SSH. env=~/.ssh/agent.env # Note: Don't bother checking SSH_AGENT_PID. It's not used # by SSH itself, and it might even be incorrect # (for example, when using agent-forwarding over SSH). agent_is_running() { if [ "$SSH_AUTH_SOCK" ]; then # ssh-add returns: # 0 = agent running, has keys # 1 = agent running, no keys # 2 = agent not running ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ] else false fi } agent_has_keys() { ssh-add -l >/dev/null 2>&1 } agent_load_env() { . "$env" >/dev/null } agent_start() { (umask 077; ssh-agent >"$env") . "$env" >/dev/null } if ! agent_is_running; then agent_load_env fi # if your keys are not stored in ~/.ssh/id_rsa or ~/.ssh/id_dsa, you'll need # to paste the proper path after ssh-add if ! agent_is_running; then agent_start ssh-add elif ! agent_has_keys; then ssh-add fi unset env
Теперь осталось проверить подключение к репозиторию, на сервере из каталога с репозиторием в консоли выполняем:
git remote -v
Эта команда покажет каким способом вы подключены к удаленному репозиторию на BitBucket - обычно это http/https и в ответ вам придет что то вроде:
origin https://<your_username>@bitbucket.org/<workspace_ID>/<repo_name>.git (fetch)
origin https://<your_username>@bitbucket.org/<workspace_ID>/<repo_name>.git (push)
Если это так, то меняем подключение на ssh вариант, один из:
git@bitbucket.org:<workspace_ID>/<repo_name>.git
or
ssh://git@bitbucket.org/<workspace_ID>/<repo_name>.git
делается это так, в консоли пишем:
git remote set-url origin git@bitbucket.org:<workspace_ID>/<repo_name>.git # или пишем так, будет одинаково верно git remote set-url origin ssh://git@bitbucket.org/<workspace_ID>/<repo_name>.git
После этих всех действий, у Вас должно все работать, а именно - когда вы запушите коммит в репозиторий, то он автоматически зальется на сервер. Эта инструкция является лишь одним из простых вариантов настройки авто деплоя на сервер через ssh с Bitbucket'а, буду рад если она Вам помогла как и мне понять и разобраться немного в этом.