#azure-devops #azure-vm-scale-set #azure-devops-pipelines
#azure-devops #azure-vm-scale-set #azure-devops-pipelines
Вопрос:
Недавно мы перенастроили наш процесс сборки, чтобы он полностью выполнялся в контейнерах, и теперь мы планируем перейти от локальных агентов сборки к использованию агентов в наборе Azure Scale.
Мы хотим избежать необходимости поддерживать наши собственные образы виртуальных машин для набора масштаба Azure и решили использовать образ Ubuntu 18.04 LTS по умолчанию, который доступен в Azure.
Этот образ не включает Docker, поэтому мы настроили набор Azure Scale на использование скрипта облачной конфигурации, который установит Docker при первой загрузке виртуальной машины:
#cloud-config
apt:
sources:
docker.list:
source: deb [arch=amd64] https://download.docker.com/linux/ubuntu $RELEASE stable
keyid: 9DC858229FC7DD38854AE2D88D81803C0EBFCD88
packages:
- docker-ce
- docker-ce-cli
groups:
- docker
Кажется, что это работает хорошо, но иногда задания сборки завершаются неудачно:
Starting: Initialize containers
/usr/bin/docker version --format '{{.Server.APIVersion}}'
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
'
##[error]Exit code 1 returned from process: file name '/usr/bin/docker', arguments 'version --format '{{.Server.APIVersion}}''.
Finishing: Initialize containers
Похоже, что либо произошел сбой сценария инициализации в облаке, либо агент Azure DevOps запустился на виртуальной машине до завершения сценария инициализации в облаке.
До сих пор я видел следующие сценарии:
- Подготовка новой виртуальной машины работает нормально, и задания выполняются правильно
- Первые несколько заданий завершаются ошибкой на недавно подготовленной виртуальной машине, а затем выполняются правильно. (Возможно, потому, что сценарий инициализации облака выполнялся параллельно с расширением Azure DevOps, которое развертывает агент на виртуальной машине, и у вас есть состояние гонки?)
- Все задания завершаются сбоем, даже, скажем, через 30 минут. Иногда переосмысление виртуальной машины помогает, иногда нет.
У кого-нибудь есть подобная настройка? Работает ли это правильно? Если нет, то каковы альтернативные способы развертывания Docker на виртуальных машинах до того, как виртуальная машина запустит задание контейнера?
Комментарии:
1. Что вы имеете в виду
sometimes
? Была ли виртуальная машина запущена при запуске конвейера? Хотя эта проблема, похоже, больше связана с настройкой вашей виртуальной машины, не могли бы вы поделиться некоторыми подробностями о вашем конвейере?2. «Иногда», примерно в 1 из каждых 3 заданий? Это агент набора масштаба, поэтому, возможно, при запуске задания вообще не было никакой виртуальной машины. Но конвейер действительно запускался на агенте (который, возможно, был подготовлен по требованию), и сообщение об ошибке было сгенерировано кодом, запущенным на агенте. Само задание является заданием контейнера, и сбой происходит на шаге «Инициализировать контейнеры». После этого конвейер содержит кучу сценариев оболочки, которые никогда не выполняются, потому что задание контейнера не запустилось успешно (потому что Docker каким-то образом не был установлен правильно / вовремя).
3.
Initialize containers
Ошибка на этомInitialize containers
шаге вызвана неправильным запуском виртуальной машины, поэтому Azure devops завершилась с ошибкойIs the docker daemon running?
. Причина этой проблемы, похоже, связана с виртуальной машиной Azure, с которой я не знаком…4. Да, похоже, что это ошибка / ограничение агента автоматического масштабирования: github.com/microsoft/azure-pipelines-agent/issues/2866 , github.com/Azure/WALinuxAgent/issues/1938
Ответ №1:
При настройке пула агентов Azure DevOps для использования набора масштаба Azure для подготовки машин сборки расширение Microsoft.Azure.DevOps.Pipelines.Agent
/ TeamServicesAgentLinux
автоматически добавляется к вашему набору масштаба.
Это расширение отвечает за установку агента Azure DevOps на ваших виртуальных машинах и добавление его в ваш пул агентов.
Расширение запускается при загрузке виртуальной машины примерно в то же время, что и сценарий инициализации в облаке. Это может вызвать условия гонки.
Чтобы обойти это, добавьте bootcmd
скрипт в свой сценарий облачной конфигурации, который запускает walinuxagent
службу агента (которая запустит расширение Azure DevOps) после сценария облачной конфигурации, например:
#cloud-config
bootcmd:
- mkdir -p /etc/systemd/system/walinuxagent.service.d
- echo "[Unit]nAfter=cloud-final.service" > /etc/systemd/system/walinuxagent.service.d/override.conf
- sed "s/After=multi-user.target//g" /lib/systemd/system/cloud-final.service > /etc/systemd/system/cloud-final.service
- systemctl daemon-reload
apt:
sources:
docker.list:
source: deb [arch=amd64] https://download.docker.com/linux/ubuntu $RELEASE stable
keyid: 9DC858229FC7DD38854AE2D88D81803C0EBFCD88
packages:
- docker-ce
- docker-ce-cli
groups:
- docker
Это позволяет создать пул агентов набора масштаба Azure DevOps, который использует стандартный образ Ubuntu 18.04 и устанавливает docker поверх этого образа.
Смотрите https://github.com/microsoft/azure-pipelines-agent/issues/2866 и https://github.com/Azure/WALinuxAgent/issues/1938#issuecomment-657293920 для получения дополнительной информации.
Пока вы работаете над этим, вы также можете смонтировать /agent
на диске ресурсов вашей виртуальной машины, который обычно имеет лучшую производительность, чем диск операционной системы. Для этого вы можете добавить это в свой скрипт инициализации в облаке:
disk_setup:
ephemeral0:
table_type: gpt
layout: [66, [33,82]]
overwrite: true
fs_setup:
- device: ephemeral0.1
filesystem: ext4
mounts:
- ["ephemeral0.1", "/agent"]