Azure 文件复制任务

Azure Pipelines |Azure DevOps Server 2020 |Azure DevOps Server 2019 |TFS 2018-TFS 2015。3

使用此任务可将文件复制到 Microsoft Azure 存储 blob 或虚拟机) (vm。

注意

此任务是在 PowerShell 中编写的,因此仅当在 Windows 代理上运行时起作用。 如果管道需要 Linux 代理并且需要将文件复制到 Azure 存储帐户,请考虑 az storage blobaz storage blob中运行命令作为替代方法。

注意

在 Microsoft Team Foundation Server (TFS) 2018 和更低版本中,生成和发布管道被称为“定义”,运行被称为“生成”,服务连接被称为“服务终结点”,阶段被称为“环境”,而作业被称为“阶段” 。

此任务用于复制应用程序文件和其他所需的项目,以便安装应用;例如 PowerShell 脚本、PowerShell DSC 模块等。

注意

如果使用的是 Azure 文件复制任务版本3或更低版本,请参阅 azure 文件复制版本3或更早版本

如果目标是 Azure Vm,则首先将文件复制到自动生成的 Azure blob 容器,然后将其下载到 Vm 中。 成功将文件复制到 Vm 后,会删除容器。

该任务使用 AzCopy,它是用于快速将数据从和复制到 Azure 存储帐户的命令行实用工具。 Azure 文件复制任务的第4版使用 AzCopy V10

若要动态部署包含虚拟机的 Azure 资源组,请使用 Azure 资源组部署 任务。 此任务具有一个示例模板,该模板可执行所需的操作,以便在虚拟机上设置 WinRM HTTPS 协议,在防火墙中打开5986端口,然后安装测试证书。

注意

如果要将 Azure 静态网站部署为 blob 存储中的容器,则必须使用该任务的 版本 2 或更高版本,才能保留 $web 容器名称。

该任务支持基于 Azure Active Directory 的身份验证。 可以使用服务主体和托管标识进行身份验证。 对于托管标识,仅支持系统范围的托管标识。

注意

对于授权,必须提供对安全主体的访问权限。 此处可以引用所需的授权级别。

YAML 代码段

# Azure file copy
# Copy files to Azure Blob Storage or virtual machines
- task: AzureFileCopy@4
  inputs:
    sourcePath: 
    azureSubscription: 
    destination: # Options: azureBlob, azureVMs
    storage: 
    #containerName: # Required when destination == AzureBlob
    #blobPrefix: # Optional
    #resourceGroup: # Required when destination == AzureVMs
    #resourceFilteringMethod: 'machineNames' # Optional. Options: machineNames, tags
    #machineNames: # Optional
    #vmsAdminUserName: # Required when destination == AzureVMs
    #vmsAdminPassword: # Required when destination == AzureVMs
    #targetPath: # Required when destination == AzureVMs
    #additionalArgumentsForBlobCopy: # Optional
    #additionalArgumentsForVMCopy: # Optional
    #enableCopyPrerequisites: false # Optional
    #copyFilesInParallel: true # Optional
    #cleanTargetBeforeCopy: false # Optional
    #skipCACheck: true # Optional
    #sasTokenTimeOutInMinutes: # Optional

参数

参数 说明
sourcePath - sourcePath 必需。 要复制的文件的源。 YAML Pipelines 和经典版本支持预定义的系统变量,如LocalPath版本变量 仅在经典版本中受支持。 文件路径或文件名中的任何位置都支持通配符 ( * ) 。
connectedServiceNameARMazureSubscription - connectedServiceNameARM 必需。 为目标 Azure 服务、虚拟机或存储帐户所在的订阅配置的 Azure 资源管理器服务连接 的名称。 有关更多详细信息,请参阅 Azure 资源管理器概述
destination - destination 必需。 文件的目标目标的类型。 选择 " Azure Blob " 或 " azure vm"。
storageAccountRMstorage - storageAccountRM 必需。 Azure 订阅中现有存储帐户的名称。
containerName - containerName 如果选择 " Azure Blob " 作为 目标类型 参数,则需要此参数。 要将文件复制到的容器的名称。 如果不存在具有此名称的容器,则将创建一个新容器。
blobPrefix - blobPrefix 如果选择 " Azure Blob " 作为 目标类型 参数,则为可选。 Blob 名称的前缀,可用于筛选 blob。 例如,使用生成号可以轻松地在下载具有相同生成号的所有 blob 时进行筛选。
environmentNameRMresourceGroup - environmentNameRM 如果选择 azure 资源管理器 用于 azure 连接类型 参数,并选择 azure vm 作为 目标类型 参数,则为必需。 运行虚拟机的 Azure 资源组的名称。
resourceFilteringMethod - resourceFilteringMethod 使用 筛选条件 参数时,根据要如何指定组中的计算机,请选择 " 计算机名称 " 或 " 标记"。
machineNames - machineNames 可选。 标识任务将面向的计算机的计算机名称或标记名称的列表。 筛选条件可以是:
- Azure 资源组的名称。
-上一个任务的输出变量。
-逗号分隔的标记名称或计算机名称的列表。
使用计算机名称时的格式是计算机 Fqdn 或 IP 地址的逗号分隔列表。
将筛选器的标记名称指定为 {TagName}{Value} 示例:
vmsAdminUserName - vmsAdminUserName 如果为目标类型参数选择Azure vm ,则需要此参数。 具有所有目标 Vm 的管理权限的帐户的用户名。
-支持诸如 用户名域 \用户名、 machine-name\username.\username 的格式。
-不支持 UPN 格式(如 username@domain.com 和内置系统帐户,如 username@domain.com )。
vmsAdminPassword - vmsAdminPassword 如果为目标类型参数选择Azure vm ,则需要此参数。 指定为 Admin Login 参数的帐户的密码。 使用 " 变量 " 选项卡中定义的变量的挂锁图标来保护该值,并在此处插入变量名称。
targetPath - targetPath 如果为目标类型参数选择Azure vm ,则需要此参数。 Azure Vm 中要将文件复制到的文件夹。 支持和等环境 $env:windir 变量 $env:systemroot 。 示例:$env:windir\FabrikamFiber\Webc:\FabrikamFiber
additionalArgumentsForBlobCopy - additionalArgumentsForBlobCopy 可选。 要传递到 AzCopy.exe 程序的任何参数,这些参数可在上传到 blob 并下载到 vm 时使用。 有关详细信息,请参阅使用 AzCopy 命令行实用工具传输数据。 如果使用的是仅支持 Azure 页 blob 的高级版存储帐户,请将 "--blob-type = PageBlob" 作为附加参数传递。 默认参数为--log level = INFO (默认) 和--仅当容器名称不 $root) 时,递归 (。
additionalArgumentsForVMCopy - additionalArgumentsForVMCopy 可选。 AzCopy.exe 在下载到 VM (如)时将应用的参数 --check-length=true 。 如果此处未指定可选参数,则默认情况下将添加以下可选参数: --log-level=INFO (如果管道在调试模式下运行,则设置 --log-level=DEBUG) 。 --recursive
enableCopyPrerequisites - enableCopyPrerequisites 如果选择 azure 资源管理器 用于 azure 连接类型 参数,并选择 azure vm 作为 目标类型 参数,则可用。 设置此选项将使用自签名证书在端口5986上通过 HTTPS 协议配置 Windows 远程管理 (WinRM) 侦听器。 在 Azure 虚拟机上执行复制操作时需要此配置。
-如果通过负载平衡器访问目标虚拟机,请确保将入站 NAT 规则配置为允许在端口5986上进行访问。
-如果目标虚拟机与 (NSG) 的网络安全组相关联,请将入站安全规则配置为允许在端口5986上进行访问。
copyFilesInParallel - copyFilesInParallel 如果选择 "Azure VM"作为" 目标类型 "参数,将可用 。 设置此选项会导致进程对复制的文件并行执行。 这可显著减少总时间。
cleanTargetBeforeCopy - cleanTargetBeforeCopy 如果选择 "Azure VM"作为" 目标类型 "参数,将可用 。 设置此选项会导致在复制过程启动之前删除目标文件夹中的所有文件。
skipCACheck - skipCACheck 如果选择 "Azure VM"作为" 目标类型 "参数,将可用 。 将文件从中间存储 Blob 复制到 Azure VM 时,WinRM 需要 HTTPS 传输的证书。 如果设置"使用自签名证书",请设置此选项以防止进程使用 CA 证书颁发机构验证 (证书) 。
sasTokenTimeOutInMinutes - sasTokenTimeOutInMinutes 可选。 提供 SAS 令牌过期时间(以分钟表示)。 仅在所选目标为 Azure Blob 时有效。 默认值应为 4 小时。
控件选项 请参阅 控制选项

常见问题解答

使用此Azure PowerShell的先决条件是什么?

该任务Azure PowerShell在运行自动化代理的计算机上安装。 建议的版本为 1.0.2,但任务将处理版本 0.9.8 及更高版本。 可以使用 Azure PowerShell安装程序 v1.0.2获取此证书。

此任务的 WinRM 先决条件是什么?

该任务Windows远程管理 (WinRM) HTTPS 协议将文件从存储 Blob 容器复制到 Azure VM。 这需要在 VM 上配置 WinRM HTTPS 服务,并安装合适的证书。 在创建虚拟机后配置 WinRM

如果 VM 是在未打开 WinRM HTTPS 端口的情况下创建的,请执行以下步骤:

  1. 配置入站访问规则以允许每个 VM 的端口 5986 上的 HTTPS。
  2. 禁用 UAC 远程限制
  3. 使用管理员级登录名以简单格式的用户名指定任务用于访问 VM 的凭据,而无需任何域部分。
  4. 在运行自动化代理的计算机上安装证书。
  5. 如果使用 签名证书,则设置任务的"测试证书"参数。

应选择哪种类型的服务连接?

  • 对于Azure 资源管理器帐户Azure 资源管理器 VM, 请使用Azure 资源管理器服务 连接类型。 有关更多详细信息,请参阅 使用服务主体 自动执行 Azure 资源组部署

  • 使用服务 Azure 资源管理器 类型时,任务会自动筛选相应的Azure 资源管理器存储帐户和其他字段。 例如,资源组或云服务,以及虚拟机。

如何实现创建用于此任务的学校或工作帐户?

可以轻松创建适合在服务连接中使用的帐户:

  1. 使用 Azure 门户 在 Azure Active Directory 中创建新的用户帐户。
  2. 将Azure Active Directory用户帐户添加到 Azure 订阅中的共同管理员组。
  3. 使用此Azure 门户登录帐户并更改密码。
  4. 在服务连接中使用此帐户的用户名和密码。 将使用此帐户处理部署。

如果任务失败,复制是否继续?

由于 AzCopy V10 不支持日志文件,因此该任务无法恢复副本。 需要再次运行该任务才能复制所有文件。

复制后是否清除日志文件和计划文件?

任务不删除日志和计划文件。 若要显式清除这些文件,可以使用此命令在工作流中添加一个 CLI 步骤。

需要使用代理吗?

至少需要一个代理才能运行生成或发布。

我遇到了问题。 如何对其进行故障排除?

请查看排查生成和发布问题

我无法选择默认代理池,无法将生成或发布排队。 如何修复此问题?

请查看代理池

我的 NuGet 推送任务失败,出现“错误: 无法获取本地颁发者证书”错误。 如何解决此问题?

可通过添加受信任的根证书来解决此问题。 可将环境变量 NODE_EXTRA_CA_CERTS=file 添加到生成代理,也可在管道中添加任务变量 NODE.EXTRA.CA.CERTS=file。 有关此变量的更多详细信息,请参阅 Node.js 文档。 有关在管道中设置变量的说明,请参阅在管道中设置变量

我在本地使用 TFS,但没有看到其中某些功能。 为什么看不到?

其中某些功能仅在 Azure Pipelines 上可用,在本地尚不可用。 如果你已升级到最新版本的 TFS,则可在本地使用这些功能。

如何实现 Azure 文件复制任务将文件复制到没有公共 IP 地址的 Azure 虚拟机?

确保使用的是 Azure 文件复制任务版本 4。 如果任务失败,可以添加生成步骤以执行命令以 azcopy cp "source-file-path" "destination-file-path" 替换源值和目标值。

禁止错误:"AzCopy.exe Azure 文件复制任务时,"在将文件上传到 blob 存储时退出时出现非零退出代码"

每次触发生成时,都会随机分配托管代理,因此每次运行时代理 IP 地址都会不同。 如果这些 IP 地址不在允许的 IP 列表中,则 ip 与Azure DevOps之间的通信将失败。 在这种情况下,请执行概述的以下步骤:

  1. 使用 Azure CLI 添加生成步骤,该步骤将在运行时标识 Microsoft 托管生成代理的 IP,并且它会在 Azure 存储 帐户的网络规则中添加 IP 地址。
  2. 为帐户执行Azure 存储步骤。
  3. 使用 Azure CLI 添加另一个生成步骤,这将从之前添加的 Azure 存储 帐户网络规则中删除生成代理的 IP 地址。

开源

此任务在 上是开源GitHub。 欢迎提供反馈和建议。