Запуск нового контейнера Docker с каждым новым запуском сборки Bamboo и использование контейнера для запуска сборки
Я новичок в Bamboo и пытаюсь получить следующий поток процессов с помощью Bamboo и Docker:
- Разработчик записывает код в ветку Bitbucket
- План сборки обнаруживает изменение
- План сборки затем запускает контейнер Docker в специальном экземпляре AWS, где установлен Docker. В контейнере Docker также запускается удаленный агент. Я использую контейнер docker
atlassian/bamboo-java-agent:latest
.
- Удаленный агент регистрируется с помощью Bamboo
- Остальная часть плана сборки выполняется в контейнере
- Контейнер и агент удаляются при завершении плана
Я настраиваю план сборки тестов и в плане. Моя первая задача - запустить экземпляр Docker, например:
sudo docker run -d --name "${bamboo.buildKey}_${bamboo.buildNumber}" \
-e HOME=/root/ -e BAMBOO_SERVER=http://x.x.x.x:8085/ \
-i -t atlassian/bamboo-java-agent:latest
Вторая задача - получить исходный код и развернуть. Третья задача - тест, а четвертая задача - закрыть контейнер.
В Bamboo также есть другие агенты, и мой план сборки иногда использует те, а не контейнер Docker, который я начал в рамках плана сборки.
Есть ли способ сделать это выше?
Надеюсь, все это имеет смысл. Я действительно новичок в этом, и любая помощь будет оценена.
Ответы
Ответ 1
Мы (Atlassian Build Engineering) создали набор плагинов для запуска агентов на основе Docker в кластере (ECS), который поступает в сеть, строит одно задание и затем выходит. Недавно мы открыли решение.
Подробнее см. https://bitbucket.org/atlassian/per-build-container.
Ответ 2
сначала вам нужно убедиться, что "основной" контейнер докеров не выйдет, когда вы его запустите.
проверить с помощью
docker ps -a
вы должны увидеть, что он работает
теперь, полагая, что он запущен, вы можете выполнять команды внутри контейнера
чтобы попасть в контейнер
docker exec -it containerName bash
для выполнения команд внутри контейнера извне контейнера
docker exec -it containerName commandToExecuteInsideTheContainer
вы могли бы как часть контейнера dockerfile COPY a script в нем что-то делать.
Затем вы можете выполнить это script извне контейнера, используя описанный выше подход.
Надеюсь, это даст некоторое представление.