我正在尝试使用存储在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'
答案 0 :(得分:1)
如果您的管道在另一个存储库中有模板,或者您想将multi-repo checkout与需要服务连接的存储库一起使用,则必须让系统知道该存储库。 repository关键字使您可以指定外部存储库。
您可以参考Repository resource和templates in another repository了解更多详细信息。
例如在模板存储库中,我们希望在根目录下找到test.yml。
resources:
repositories:
- repository: templates
type: git
name: templates
steps:
- template: test.yml@templates
更新1
我更新了您的代码,它可以正常工作,请检查它。
回购协议HelloWord结构和回购协议包含模板文件和PS1文件
参考本地脚本的模板#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'
结果:
答案 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