Notice: Trying to access array offset on value of type null in /home/httpd/vhosts/praids.ru/httpdocs/application/views/index.php on line 159

Notice: Trying to access array offset on value of type null in /home/httpd/vhosts/praids.ru/httpdocs/application/views/index.php on line 159
24.10.2020

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

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

Поделиться: