Я долго игнорировал функционал 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 ограниченно, а проект личный, было решено от этого отказаться.