如何在Azure DevOps Pipelines的另一个存储库中使用引用脚本的模板?

时间:2020-11-05 02:58:16

标签: azure azure-devops azure-devops-pipelines

我正在尝试使用存储在Azure DevOps的另一个Git存储库中的模板,该模板具有对该存储库中也包含的脚本的引用。虽然我可以从主管道成功使用模板,但它没有引用模板所需的脚本。

请问有什么办法可以做到这一点?

HelloWorld模板/脚本存储在Azure DevOps存储库“ HelloWorld”中的子文件夹“ Templates”中。

HelloWorld.ps1脚本位于与以下模板相同的目录中。

param($Name)

Write-Host "Hello, $Name!"

参考本地脚本的模板#1

  parameters:
  - name: azureSubscription
    type: string
  - name: name
    type: string
  
  jobs:
  - job: HelloWorld
    displayName: Hello World
    variables:
      name: ${{ parameters.name }}
    steps:
    - task: AzurePowerShell@4
      name: HelloWorld
      displayName: Hello World
      inputs:
        azureSubscription: ${{ parameters.azureSubscription }}
        scriptType: filePath
        scriptPath: ./HelloWorld.ps1
        azurePowerShellVersion: latestVersion
        failOnStandardError: true
        scriptArguments:
          -Name "$(name)"

模板#2


resources:
  repositories:
    - repository: helloworld
      type: git
      name: HelloWorld

stages:
- stage: Variables
  jobs:
  - template: Scripts/hello-world.yml@helloworld
    parameters:
      azureSubscription: 'My Subscription'
      name: 'Billy'

2 个答案:

答案 0 :(得分:1)

如果您的管道在另一个存储库中有模板,或者您想将multi-repo checkout与需要服务连接的存储库一起使用,则必须让系统知道该存储库。 repository关键字使您可以指定外部存储库。

您可以参考Repository resourcetemplates in another repository了解更多详细信息。

例如在模板存储库中,我们希望在根目录下找到test.yml。

resources:
  repositories:
  - repository: templates
    type: git
    name: templates
steps:
- template: test.yml@templates

更新1

我更新了您的代码,它可以正常工作,请检查它。

回购协议HelloWord结构和回购协议包含模板文件和PS1文件

enter image description here

参考本地脚本的模板#1。 注意:我添加了检出步骤以检出 HelloWord 和管道自库

  parameters:
  - name: azureSubscription
    type: string
  - name: name
    type: string
  
  jobs:
  - job: HelloWorld
    displayName: Hello World
    variables:
      name: ${{ parameters.name }}
    steps:
    - checkout: self
    - checkout: helloworld
    - task: AzurePowerShell@4
      name: HelloWorld
      displayName: Hello World
      inputs:
        azureSubscription: ${{ parameters.azureSubscription }}
        scriptType: filePath
        scriptPath: $(build.sourcesdirectory)/Helloworld/Subfolder/HelloWorld.ps1
        azurePowerShellVersion: latestVersion
        failOnStandardError: true
        scriptArguments:
          -Name "$(name)"

在另一个仓库中创建yaml构建定义。

resources:
  repositories:
    - repository: helloworld
      type: git
      name: HelloWorld
pool:
  vmImage: 'windows-latest'
 
stages:
 
- stage: Variables
  jobs:
  - template: hello-world.yml@helloworld
    parameters:
      azureSubscription: 'My Subscription'
      name: 'Billy'

结果:

enter image description here

答案 1 :(得分:1)

当您的管道中有多个存储库,而当您使用另一个存储库中的模板时又有它们时,它们将被提取到它们自己的文件夹中而不是根目录中。 It seems to be obvious but we need to have this in mind.

如果您的工作中有多个检出步骤,则源代码会检入到以存储库命名的目录中,作为(Agent.BuildDirectory)中s的子文件夹。如果(Agent.BuildDirectory)是C:\ agent_work \ 1并且您的存储库已命名为工具和代码,则您的代码将签出到C:\ agent_work \ 1 \ s \ tools和C:\ agent_work \ 1 \ s \ code。

因此,当您在另一个存储库中的模板中调用脚本时,可能会被迫为存储库提供别名,以正确定位脚本。

例如:

trigger: none
pr: none

resources:
  repositories:
    - repository: devops
      type: github
      name: kmadof/devops-templates
      endpoint: kmadof

stages:
- template: templates/start.yaml@devops
  parameters:
    repo: devops-templates
    buildSteps:
      - checkout: self
      - checkout: devops
      - bash: echo Test #Passes
        displayName: succeed
      - bash: echo "Test"
        displayName: succeed

我正在传递repo参数以在模板中使用它:

parameters:
- name: repo  # defaults for any parameters that aren't specified
  default: ''

steps:
  - task: PowerShell@2
    inputs:
      filePath: ${{ parameters.repo }}/scripts/myscript.ps1

您可以检查代码here