Деплой по SSH при помощи Bitbucket Pipelines


Я долго игнорировал функционал Pipelines в Bitbucket: останавливали отсутствие вменяемой документации и некоторая видимая ограниченность. Однажды понадобилось реализовать для одного побочного проекта очень простой кейс: по каждому комиту пересобирать Docker-контейнер на удаленном хосте. Можно было бы конечно это сделать на скриптах, но я всегда был сторонником идеи, что такие простые проекты — это идеальная возможность пробовать что-то новое, поэтому дал шанс этому функционалу. Хотя это и оказалось очень просто, не все шаги были очевидны с самого начала, поэтому зафиксирую основные моменты.

Прежде всего нужно сгенерировать SSH-ключ в настройках репозитория в разделе Pipelines и добавить его на целевую машину в authorized_keys. Затем нужно добавить IP-адрес целевой машины в known host контейнера.

Далее добавим в корень репозитория файл bitbucket-pipelines.yml со следующим содержимым:

image: atlassian/default-image:latest

pipelines:
default:
    - step:
        deployment: staging
        script:
        - cat ./deploy.sh | ssh -T [email protected]

В файле deploy.sh (он также у меня лежит в корне репозитория) пишем скрипт, который должен выполниться на удаленной машине для того, чтобы развернуть билд (содержимое приводить не буду: оно очень специфично для конкретного проекта). Необходимость шага со скриптом обусловлена тем, что код у нас выполняется изолированном контейнере (параметр image), а возможности подключить билд-агентов, как в Jenkins я не нашёл. Параметр, при подключении по SSH, -T используется чтобы отключить псевдо-терминал, для выполнения удаленных команд на сервере.

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