Azure DevOps 管道 - 规模集代理:安装 Docker

Fre*_*ier 2 azure-devops azure-vm-scale-set azure-devops-pipelines

我们最近重新配置了我们的构建过程以完全在容器中运行,我们现在希望从本地构建代理迁移到在 Azure 规模集中使用代理。

我们希望避免为 Azure 规模集维护自己的 VM 映像,并选择使用 Azure 中提供的默认 Ubuntu 18.04 LTS 映像。

此映像不包含 Docker,因此我们已将 Azure 规模集配置为使用 cloud-config 脚本,该脚本将在 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
Run Code Online (Sandbox Code Playgroud)

这似乎运行良好,但有时构建作业会失败:

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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

看起来是 cloud-init 脚本失败,或者在 cloud-init 脚本完成之前 Azure DevOps 代理在 VM 上启动。

到目前为止,我已经看到了以下场景:

  • 配置新 VM 工作正常,并且作业正常运行
  • 前几个作业在新配置的 VM 上失败,然后正常运行。(也许是因为 cloud-init 脚本与将代理部署到 VM 的 Azure DevOps 扩展并行运行,并且您有竞争条件?)
  • 即使在 30 分钟之后,所有作业都失败了。有时重新构想 VM 会有所帮助,有时则不会。

有人有类似的设置吗?它工作正常吗?如果不是,在 VM 运行容器作业之前将 Docker 部署到 VM 的替代方法是什么?

Fre*_*ier 5

将 Azure DevOps 代理池配置为使用 Azure 规模集来预配生成计算机时,Microsoft.Azure.DevOps.Pipelines.Agent/TeamServicesAgentLinux扩展会自动添加到规模集。

此扩展负责在 VM 上安装 Azure DevOps 代理并将其添加到代理池。

该扩展在 VM 启动时运行,大约与 cloud-init 脚本同时运行。这可能会导致竞争条件。

要解决此问题,添加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
Run Code Online (Sandbox Code Playgroud)

这允许你创建一个使用标准 Ubuntu 18.04 映像的 Azure DevOps 规模集代理池,并在该映像之上安装 docker。

有关更多背景信息,请参阅https://github.com/microsoft/azure-pipelines-agent/issues/2866https://github.com/Azure/WALinuxAgent/issues/1938#issuecomment-657293920