运行 通过 YAML 发布管道的 azure powershell 脚本
Running azure powershell script through YAML release pipeline
我有我的正常工作发布管道,通过给定某个部署组,它执行一些任务:
- 复制脚本
- 执行该 powershell 脚本(在部署组中定义的目标机器上)
- 删除脚本
我知道 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..'
我有我的正常工作发布管道,通过给定某个部署组,它执行一些任务:
- 复制脚本
- 执行该 powershell 脚本(在部署组中定义的目标机器上)
- 删除脚本
我知道 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..'