Авто деплой с Bitbucket на сайт

Настройка авто деплоя при пуле в репозиторий Bitbucket и последующая авто выгрузка изменений на сервер (сайт).

Простое развертывание проекта с помощью Bitbucket pipelines.

 

При пул-реквесте в ветку master обновлять код на сервере.

 

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

 

На сервере выполняем следующее:

plaintext

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

 

На сервере выполняем следующее:

plaintext

base64 < id_rsa

Эта команда выведет содержимое приватного ключа, его Вы копируете и вставляется в настройки Pipelines . Они находятся в настройках репозитория, на скриншоте должно быть видно.

 

Обзываете переменную name = DEPLOY_SSH_KEY, в value = <содержимое скопированного приватного ключа> и ставим галочку Secured

 

Эту переменную мы будем использовать дальше

 

3. Добавляем known_hosts

 

На сервере выполняем следующее:

plaintext

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

cat deploy_known_hosts

plaintext

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 - в нем будут прописываться задания, которые будет выполнятся после пулла в репозиторий

 

Пример файла:

plaintext

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 должно быть примерно такое:

plaintext

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-агент, выполняем команду на сервере:

plaintext

ssh-agent -s

Должен быть однострочный вывод с примерно таким содержанием, кроме цифр, цифры у Вас буду Ваши:

plaintext

Agent pid 434321

Если по каким то причинам такого содержимого не выведется, тогда в консоль пишем:

plaintext

eval $(ssh-agent -s)

После того, как надпись появилась с номером агента, выполняем следующее:

plaintext

ssh-add ~/.ssh/id_rsa

Эта команда добавляет приватный ключ в агент, публичный ключ (~/.ssh/id_rsa.pub) мы добавляем в Bitbucket на 6м шаге - выше на скриншоте показано.

 

Теперь активируем ключи, для  bitbucket это выглядит так:

plaintext

ssh -t git@bitbucket.org

 

# у меня так не сработало, поэтому я сделал вот так, с указанием порта и без указания нового окна терминала

ssh git@bitbucket.org -p22

В ответ будет сообщение продолжат или нет, соглашаемся и пишем yes в консоль

 

Следующий шаг - это найти на сервере файл ~/.bashrc который обычно находится в корне, этот файл будет содержать настройки для запуска агента и активации наших ключей, дописываем такое содержимое в конец этого файла:

plaintext

# 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

Теперь осталось проверить подключение к репозиторию, на сервере из каталога с репозиторием в консоли выполняем:

plaintext

git remote -v

Эта команда покажет каким способом вы подключены к удаленному репозиторию на BitBucket - обычно это http/https и в ответ вам придет что то вроде:

plaintext

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 вариант, один из:

plaintext

git@bitbucket.org:<workspace_ID>/<repo_name>.git

 

or

 

ssh://git@bitbucket.org/<workspace_ID>/<repo_name>.git

делается это так, в консоли пишем:

plaintext

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'а, буду рад если она Вам помогла как и мне понять и разобраться немного в этом.