Azure DevOps 管道 - 规模集代理:安装 Docker
Azure DevOps Pipelines - Scale Set Agents: Installing Docker
我们最近将我们的构建过程重新配置为 运行 完全在容器中,我们现在正在寻求从本地构建代理迁移到使用 Azure 规模集中的代理。
我们希望避免为 Azure 规模集维护我们自己的 VM 映像,并选择使用 Azure 中提供的默认 Ubuntu 18.04 LTS 映像。
此映像不包含 Docker,因此我们已将 Azure 规模集配置为使用云配置脚本,该脚本将在 VM 首次启动时安装 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
看起来是 cloud-init 脚本失败,或者 Azure DevOps 代理在 cloud-init 脚本完成之前在 VM 上启动。
到目前为止,我见过以下场景:
- 配置新 VM 工作正常,作业 运行 正确
- 前几个作业在新配置的 VM 上失败,然后 运行 正确。 (可能是因为 cloud-init 脚本 运行 与将代理部署到 VM 的 Azure DevOps 扩展并行,并且您有竞争条件?)
- 所有作业都失败了,即使在 30 分钟后也是如此。有时重新构想 VM 会有所帮助,有时则无济于事。
有没有人有类似的设置?它工作正常吗?如果不是,在 VM 运行 成为容器作业之前将 Docker 部署到 VM 的替代方法是什么?
当您将 Azure DevOps 代理池配置为使用 Azure 规模集来预配构建计算机时,Microsoft.Azure.DevOps.Pipelines.Agent
/TeamServicesAgentLinux
扩展会自动添加到您的规模集中。
此扩展负责在您的 VM 上安装 Azure DevOps 代理并将其添加到您的代理池中。
扩展在 VM 启动时运行,与 cloud-init 脚本几乎同时运行。这可能会导致竞争条件。
要解决此问题,请将 bootcmd
脚本添加到您的 cloud-config 脚本,该脚本会强制 walinuxagent
代理服务(这将启动 Azure DevOps 扩展)在 cloud-config 脚本之后,像这样:
#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
这允许您创建使用标准 Ubuntu 18.04 映像的 Azure DevOps 规模集代理池,并在该映像之上安装 docker。
有关更多背景信息,请参阅 https://github.com/microsoft/azure-pipelines-agent/issues/2866 and https://github.com/Azure/WALinuxAgent/issues/1938#issuecomment-657293920。
当您这样做时,您可能还想将 /agent
装载到 VM 的资源磁盘上,这通常比 OS 磁盘具有更好的性能。您可以将此添加到您的 cloud-init 脚本中:
disk_setup:
ephemeral0:
table_type: gpt
layout: [66, [33,82]]
overwrite: true
fs_setup:
- device: ephemeral0.1
filesystem: ext4
mounts:
- ["ephemeral0.1", "/agent"]
我们最近将我们的构建过程重新配置为 运行 完全在容器中,我们现在正在寻求从本地构建代理迁移到使用 Azure 规模集中的代理。
我们希望避免为 Azure 规模集维护我们自己的 VM 映像,并选择使用 Azure 中提供的默认 Ubuntu 18.04 LTS 映像。
此映像不包含 Docker,因此我们已将 Azure 规模集配置为使用云配置脚本,该脚本将在 VM 首次启动时安装 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
看起来是 cloud-init 脚本失败,或者 Azure DevOps 代理在 cloud-init 脚本完成之前在 VM 上启动。
到目前为止,我见过以下场景:
- 配置新 VM 工作正常,作业 运行 正确
- 前几个作业在新配置的 VM 上失败,然后 运行 正确。 (可能是因为 cloud-init 脚本 运行 与将代理部署到 VM 的 Azure DevOps 扩展并行,并且您有竞争条件?)
- 所有作业都失败了,即使在 30 分钟后也是如此。有时重新构想 VM 会有所帮助,有时则无济于事。
有没有人有类似的设置?它工作正常吗?如果不是,在 VM 运行 成为容器作业之前将 Docker 部署到 VM 的替代方法是什么?
当您将 Azure DevOps 代理池配置为使用 Azure 规模集来预配构建计算机时,Microsoft.Azure.DevOps.Pipelines.Agent
/TeamServicesAgentLinux
扩展会自动添加到您的规模集中。
此扩展负责在您的 VM 上安装 Azure DevOps 代理并将其添加到您的代理池中。
扩展在 VM 启动时运行,与 cloud-init 脚本几乎同时运行。这可能会导致竞争条件。
要解决此问题,请将 bootcmd
脚本添加到您的 cloud-config 脚本,该脚本会强制 walinuxagent
代理服务(这将启动 Azure DevOps 扩展)在 cloud-config 脚本之后,像这样:
#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
这允许您创建使用标准 Ubuntu 18.04 映像的 Azure DevOps 规模集代理池,并在该映像之上安装 docker。
有关更多背景信息,请参阅 https://github.com/microsoft/azure-pipelines-agent/issues/2866 and https://github.com/Azure/WALinuxAgent/issues/1938#issuecomment-657293920。
当您这样做时,您可能还想将 /agent
装载到 VM 的资源磁盘上,这通常比 OS 磁盘具有更好的性能。您可以将此添加到您的 cloud-init 脚本中:
disk_setup:
ephemeral0:
table_type: gpt
layout: [66, [33,82]]
overwrite: true
fs_setup:
- device: ephemeral0.1
filesystem: ext4
mounts:
- ["ephemeral0.1", "/agent"]