Azure DevOps 多级管道 YAML:如何检查多个存储库?
Azure DevOps multistage pipeline YAML: how to checkout multiple repos?
我的 Azure DevOps 管道使用来自两个不同存储库的 yaml 模板,其配置如下。
- 有一个应用程序存储库,其中包含可部署的应用程序和一个 yaml 文件 - 管道的 "root" 模板
- 模板存储库。根模板调用模板存储库中的其他模板和阶段。然后此存储库中的模板调用其他模板和脚本(来自同一存储库)
模板存储库被引用为根模板中的资源。我没有找到一种方法来检查模板回购一次,然后在所有管道阶段使用模板和脚本。现在,我必须在需要使用其他模板或脚本的每个阶段手动克隆模板存储库。在每个阶段结束时,Azure Devops 都会清除克隆的存储库。有没有一种简单的方法可以只检查一次模板回购,或者以其他方式从子阶段引用其资源?
我不确定,因为你没有显示你的 YAML 文件,但你是否使用了结帐步骤:
resources:
repositories:
- repository: devops
type: github
name: kmadof/devops-templates
endpoint: kmadof
steps:
- checkout: self
- checkout: devops
- script: |
echo $(Build.SourcesDirectory)
ls $(Build.SourcesDirectory) *
- template: templates/template.yaml@devops
parameters:
repo: devops-templates
以上脚本检查了两个回购协议。在 devops-templates
中,我有用于主要构建 yaml 文件的模板(位于 self
存储库中)。
也请看看here
编辑
我对此做了一些工作并尝试了一些东西。让我描述文件之间的第一个关系:
- build.yaml(主要回购)
- templates/start.yml(模板回购 - 带阶段的模板)
- 工作一 - templates/process.yaml(模板回购)
- 步骤 - templates/another-template.yaml(模板回购)
- 作业二 - 在start.yaml
中直接定义的步骤
而且您不必实际签出模板存储库,因为在 运行 中所有模板都已完成并创建了构建计划。如果你要 运行 一些脚本(例如 powershell 脚本),你只需要检查模板 repo。这里有我的 yaml 文件:
build.yaml
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
start.yaml
# File: start.yml
parameters:
- name: repo # defaults for any parameters that aren't specified
default: ''
- name: buildSteps # the name of the parameter is buildSteps
type: stepList # data type is StepList
default: [] # default value of buildSteps
stages:
- stage: secure_buildstage
pool: Hosted VS2017
jobs:
- template: process.yaml
parameters:
pool: # this parameter is called `pool`
vmImage: ubuntu-latest # and it's a mapping rather than a string
- job: secure_buildjob
steps:
- script: echo This happens before code
displayName: 'Base: Pre-build'
- script: echo Building
displayName: 'Base: Build'
- ${{ each step in parameters.buildSteps }}:
- ${{ each pair in step }}:
${{ pair.key }}: ${{ pair.value }}
- script: echo This happens after code
displayName: 'Base: Signing'
process.yaml
parameters:
- name: 'pool'
type: object
default: {}
jobs:
- job: build
pool: ${{ parameters.pool }}
steps:
- template: another-template.yaml
parameters:
repo: devops-templates
另一个-template.yaml
parameters:
- name: repo # defaults for any parameters that aren't specified
default: ''
steps:
- pwsh: Write-Host 'Hello form another template'
请看这里:
构建作业使用来自 devops-template repo 的模板,但我没有在此作业中检出 repo。
您可能想知道为什么我们不能对每个构建进行一次检查。这是因为每个工作可以 运行 不同的代理人。
这里你有几个链接:
最后一点,当您从该回购模板调用文件时,您确实需要使用模板检出回购。例如:
steps:
- task: PowerShell@2
inputs:
filePath: /scripts/myscript.ps1
我的 Azure DevOps 管道使用来自两个不同存储库的 yaml 模板,其配置如下。
- 有一个应用程序存储库,其中包含可部署的应用程序和一个 yaml 文件 - 管道的 "root" 模板
- 模板存储库。根模板调用模板存储库中的其他模板和阶段。然后此存储库中的模板调用其他模板和脚本(来自同一存储库)
模板存储库被引用为根模板中的资源。我没有找到一种方法来检查模板回购一次,然后在所有管道阶段使用模板和脚本。现在,我必须在需要使用其他模板或脚本的每个阶段手动克隆模板存储库。在每个阶段结束时,Azure Devops 都会清除克隆的存储库。有没有一种简单的方法可以只检查一次模板回购,或者以其他方式从子阶段引用其资源?
我不确定,因为你没有显示你的 YAML 文件,但你是否使用了结帐步骤:
resources:
repositories:
- repository: devops
type: github
name: kmadof/devops-templates
endpoint: kmadof
steps:
- checkout: self
- checkout: devops
- script: |
echo $(Build.SourcesDirectory)
ls $(Build.SourcesDirectory) *
- template: templates/template.yaml@devops
parameters:
repo: devops-templates
以上脚本检查了两个回购协议。在 devops-templates
中,我有用于主要构建 yaml 文件的模板(位于 self
存储库中)。
也请看看here
编辑
我对此做了一些工作并尝试了一些东西。让我描述文件之间的第一个关系:
- build.yaml(主要回购)
- templates/start.yml(模板回购 - 带阶段的模板)
- 工作一 - templates/process.yaml(模板回购)
- 步骤 - templates/another-template.yaml(模板回购)
- 作业二 - 在start.yaml 中直接定义的步骤
- 工作一 - templates/process.yaml(模板回购)
- templates/start.yml(模板回购 - 带阶段的模板)
而且您不必实际签出模板存储库,因为在 运行 中所有模板都已完成并创建了构建计划。如果你要 运行 一些脚本(例如 powershell 脚本),你只需要检查模板 repo。这里有我的 yaml 文件:
build.yaml
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
start.yaml
# File: start.yml
parameters:
- name: repo # defaults for any parameters that aren't specified
default: ''
- name: buildSteps # the name of the parameter is buildSteps
type: stepList # data type is StepList
default: [] # default value of buildSteps
stages:
- stage: secure_buildstage
pool: Hosted VS2017
jobs:
- template: process.yaml
parameters:
pool: # this parameter is called `pool`
vmImage: ubuntu-latest # and it's a mapping rather than a string
- job: secure_buildjob
steps:
- script: echo This happens before code
displayName: 'Base: Pre-build'
- script: echo Building
displayName: 'Base: Build'
- ${{ each step in parameters.buildSteps }}:
- ${{ each pair in step }}:
${{ pair.key }}: ${{ pair.value }}
- script: echo This happens after code
displayName: 'Base: Signing'
process.yaml
parameters:
- name: 'pool'
type: object
default: {}
jobs:
- job: build
pool: ${{ parameters.pool }}
steps:
- template: another-template.yaml
parameters:
repo: devops-templates
另一个-template.yaml
parameters:
- name: repo # defaults for any parameters that aren't specified
default: ''
steps:
- pwsh: Write-Host 'Hello form another template'
请看这里:
构建作业使用来自 devops-template repo 的模板,但我没有在此作业中检出 repo。
您可能想知道为什么我们不能对每个构建进行一次检查。这是因为每个工作可以 运行 不同的代理人。
这里你有几个链接:
最后一点,当您从该回购模板调用文件时,您确实需要使用模板检出回购。例如:
steps:
- task: PowerShell@2
inputs:
filePath: /scripts/myscript.ps1