运行 通过 YAML 发布管道的 azure powershell 脚本

Running azure powershell script through YAML release pipeline

我有我的正常工作发布管道,通过给定某个部署组,它执行一些任务:

  1. 复制脚本
  2. 执行该 powershell 脚本(在部署组中定义的目标机器上)
  3. 删除脚本

我知道 YAML 不支持部署组,但是(幸运的是我!)到目前为止我的部署组只有一台机器,我们称之为 MyTestVM

所以我想要实现的主要是在那个 vm 上简单地执行一个 powershell 脚本。通常,发布管道发生的情况是,您在 VM 上安装了一个 tentacle/release 代理,您的部署目标(位于部署组内)连接到该代理,并且您的发布管道(由于部署组规范)能够在机器上使用该发布代理并在 VM 本身上做任何它想做的事情。

我需要同样的...但通过 YAML!我知道 YAML 中有 PowerShellOnTargetMachines 命令可用,但我不想使用它。它使用 PSSession,需要 SSL 证书和许多其他东西。我只想使用虚拟机上已有的代理!

到目前为止我已经准备好的:

pool: 'Private Pool'

steps:
- task: DownloadPipelineArtifact@2
  inputs:
    buildType: 'specific'
    project: 'blahblah'
    definition: 'blah'
    buildVersionToDownload: 'latest'
    targetPath: '$(Pipeline.Workspace)'
    
- task: CopyFiles@2
  displayName: 'Copy Files to: C:\TestScript'
  inputs:
    SourceFolder: '$(Pipeline.Workspace)/Scripts/'
    Contents: '**/*.ps1'
    TargetFolder: 'C:\TestScript'
    CleanTargetFolder: true
    OverWrite: true

第一部分只是下载包含我的脚本的工件。老实说,我什至不确定我是否需要在第二部分中复制脚本。首先,因为我认为它不是将脚本复制到 VM 目标工作区,而是将它复制到 VM 所在的 VM安装了 azure 管道代理。第二:我想我可以从我的神器中引用它..但这不是重要的部分。 如何让我的 YAML 管道以与普通发布管道相同的方式使用安装在 VM 上的发布代理?

要在您想要的特定脱模剂上 运行 工作,您可以做两件事:

创建一个池,只将你的脱模剂放入其中。

pool: 'My Pool with only one release agent'

使用现有池,publish/demand 代理的功能。

在代理机器上,添加一个系统环境变量(例如,MyCustomCapability。给它一个像1

这样的值

然后您的管道变为:

pool:
  name: 'My pool with potentially more than one agent'
  demands: 'MyCustomCapability'

如果只有这个代理设置了这个环境变量,那么只有这个代理可以执行作业

以某种方式达成了解决方案。首先值得一提的是,由于部署组不使用 YAML 管道,因此继续的方法是创建一个 Environment 并将目标 VM 添加为资源。

所以我不需要创建自己的托管代理或任何特殊的东西,因为问题是目标本身而不是代理 运行 管道。 通过创建环境并向该环境添加资源(在我的例子中是 VM),我们还在目标本身上创建了一个新的发布代理。所以我的目标 VM 现在将有 2 个发布代理:旧的可以被正常发布管道使用,新的,附加到 Azure Devops 上的环境资源,可以被 YAML 管道使用。

现在我终于可以访问我的虚拟机了:

- stage: PerformScriptInVM
  jobs:
  - deployment: VMDeploy
    pool:
      vmImage: 'windows-latest'
    # watch out: this creates an environment if it doesn’t exist
    environment:
      name: My Environment Name
      resourceType: VirtualMachine
    strategy:
      runOnce:
        deploy:
        steps:
        - task: DownloadPipelineArtifact@2
          inputs:
            buildType: 'specific'
            project: 'blahblahblah'
            definition: 'blah'
            buildVersionToDownload: 'latest'
            targetPath: '$(Pipeline.Workspace)'
        - task: PowerShell@2
          displayName: 'PowerShell Script'
          inputs:
            targetType: filePath
            filePath: '$(Pipeline.Workspace)/Scripts/TestScript.ps1'
            arguments: 'whatever your script needs..'