我在 Azure DevOps 中有一个管道,运行两个环境:QA 和 DEV,我需要它在 Azure DevOps 上选择从单个阶段运行哪个环境,而不是使用 QA 和 DEV 的两个单独阶段
这是我在两种环境中使用的阶段代码:
# BUILD ENVIRONMENTS
- stage: build_envs
dependsOn: quality_control
displayName: Build Envs
condition: |
or
(
and(eq(variables.isQa, true), ne(variables['Build.Reason'], 'PullRequest')), eq(variables['Build.Reason'], 'Manual'),
and(eq(variables.isDev, true), ne(variables['Build.Reason'], 'PullRequest')), eq(variables['Build.Reason'], 'Manual')
)
jobs:
- job: Job_build
displayName: Application Build
steps:
- ${{ if eq(variables.isQa, true) }}:
- checkout: backend-qa
path: enext-data-platform-backend
- script: rm -rf enext-data-platform-backend/enext-data-platform-frontend
- checkout: frontend-qa
path: enext-data-platform-backend/enext-data-platform-frontend
#submodules: true
- script: |
ls -la $(Pipeline.Workspace)/enext-data-platform-backend
ls -la $(Pipeline.Workspace)/enext-data-platform-backend/enext-data-platform-frontend
- powershell: |
Write-Host "##vso[build.addbuildtag]qa"
#displayName: Application Build DEV
- ${{ elseif eq(variables.isDev, true) }}:
- checkout: backend-dev
submodules: true
- script: git rev-parse HEAD
- script: ls -la
- powershell: |
Write-Host "##vso[build.addbuildtag]dev"
#displayName: 'Build Tag'
- task: npmAuthenticate@0
displayName: npm Authenticate enext-data-platform-backend/.npmrc
inputs:
${{ if eq(variables.isQa, true) }}:
workingFile: $(Pipeline.Workspace)/enext-data-platform-backend/.npmrc
${{ elseif eq(variables.isDev, true) }}:
workingFile: .npmrc
- task: npmAuthenticate@0
displayName: npm Authenticate enext-data-platform-backend/enext-data-platform-frontend/.npmrc
inputs:
${{ if eq(variables.isQa, true) }}:
workingFile: $(Pipeline.Workspace)/enext-data-platform-backend/enext-data-platform-frontend/.npmrc
${{ elseif eq(variables.isDev, true) }}:
workingFile: enext-data-platform-frontend/.npmrc
- task: Docker@0
displayName: 'Build an image'
inputs:
command: 'buildAndPush'
containerregistrytype: 'Container Registry'
imageName: "$(Build.Repository.Name):$(Build.BuildId)"
${{ if eq(variables.isQa, true) }}:
buildContext: $(Pipeline.Workspace)/enext-data-platform-backend/
Dockerfile: $(Pipeline.Workspace)/enext-data-platform-backend/Dockerfile
${{ elseif eq(variables.isDev, true) }}:
buildContext: enext-data-platform-backend
Dockerfile: 'Dockerfile'
- script: |
set -x
env
pwd
echo "CONTAINER_APP=$(Build.Repository. Name):$(Build.BuildId)" > artifact.txt
source ./artifact.txt
docker save $CONTAINER_APP > container.tar
ls -la
displayName: 'Shell Script: APP'
- task: PublishPipelineArtifact@1
displayName: 'Publish Pipeline Artifact - container id'
inputs:
targetPath: artifact.txt
artifact: artifact
- task: PublishPipelineArtifact@1
displayName: 'Publish Pipeline Artifact - container data'
inputs:
targetPath: container.tar
artifact: container
- task: Docker@0
displayName: 'Build an image'
inputs:
command: 'buildAndPush'
containerregistrytype: 'Container Registry'
imageName: "$(Build.Repository.Name):$(Build.BuildId)"
${{ if eq(variables.isQa, true) }}:
buildContext: $(Pipeline.Workspace)/enext-data-platform-backend/
Dockerfile: $(Pipeline.Workspace)/enext-data-platform-backend/Dockerfile
${{ elseif eq(variables.isDev, true) }}:
buildContext: enext-data-platform-backend
Dockerfile: 'Dockerfile'
- script: |
echo "CONTAINER_KNEX=$(Build.Repository.Name):$(Build.BuildId)" > artifact-knex.txt
source ./artifact-knex.txt
docker save $CONTAINER_KNEX > container-knex.tar
ls -la
displayName: 'Shell Script: knex'
- task: PublishPipelineArtifact@1
displayName: 'Publish Pipeline Artifact - container id: knex'
inputs:
targetPath: artifact-knex.txt
artifact: artifact-knex
- task: PublishPipelineArtifact@1
displayName: 'Publish Pipeline Artifact - container data: knex'
inputs:
targetPath: container-knex.tar
artifact: container-knex
- job: dbschema
displayName: DB Schema
steps:
- checkout: dbschema
submodules: true
- script: ls -la
- task: Docker@0
displayName: 'Build an image'
inputs:
command: 'buildAndPush'
buildContext: enext-matflow-dbschema
containerregistrytype: 'Container Registry'
imageName: "$(Build.Repository.Name):$(Build.BuildId)"
Dockerfile: 'Dockerfile'
- script: |
echo "CONTAINER_DB=$(Build.Repository.Name):$(Build.BuildId)" > sql_artifact.txt
source ./sql_artifact.txt
docker save $CONTAINER_DB > sql_container.tar
ls -la
displayName: 'Shell Script: DB'
- task: PublishPipelineArtifact@1
displayName: 'Publish Pipeline Artifact - sql container id'
inputs:
targetPath: sql_artifact.txt
artifact: sql_artifact
- task: PublishPipelineArtifact@1
displayName: 'Publish Pipeline Artifact - sql container data'
inputs:
targetPath: sql_container.tar
artifact: sql_container
在 Azure DevOps 中,当我运行管道时,如下所示:
它同时运行两个环境,我想做的是我可以在 Azure DevOPs 上选择要运行的环境,如下所示:
到目前为止,我正在尝试使用条件语句,但我很迷失。
我一直在尝试使用条件,但我对 Azure 还很陌生,我不知道如何以正确的方式设置它们
Stages to run
函数only 显示 YAML 定义的 - stage
下的每个 stages
。从您共享的 YAML 定义来看,它只包含一个阶段 - stage: build_envs
并且 ${if}
插入不会将一个阶段扩展为两个阶段。
为此,您可以考虑使用
${each}
表达式来扩展舞台。请参考下面的示例。由于只有两个环境,您还可以考虑评估 object 类型参数的值。
parameters:
- name: Envs
type: object
default:
- QA
- DEV
stages:
- stage: quality_control
displayName: Quality Control
jobs:
- job: Job1
steps:
- checkout: none
# BUILD ENVIRONMENTS
- ${{ each env in parameters.Envs }}:
- stage: build_${{ env }}
dependsOn: quality_control
displayName: Build ${{ env }}
condition: eq(variables['Build.Reason'], 'Manual')
jobs:
- job: Job_build
displayName: Application Build
steps:
- ${{ if eq(env, 'QA') }}:
- checkout: backend-qa
path: enext-data-platform-backend
- script: echo ${{ env }}
- ${{ elseif eq(env, 'Dev') }}:
- checkout: backend-dev
submodules: true
- script: echo ${{ env }}
- stage: publish_artifact
displayName: Pulish Artifact
jobs:
- job: Job1
steps:
- checkout: none
此外,由于您的管道将使用
QA
或 DEV
环境,并且 build_envs
阶段仅在手动触发管道时执行,因此您可以考虑在队列时设置 Envs
参数值并运行不同的组相应地采取步骤。这是另一个示例供您参考。
parameters:
- name: Envs
type: string
default: QA
values:
- QA
- DEV
stages:
- stage: quality_control
displayName: Quality Control
jobs:
- job: Job1
steps:
- checkout: none
# BUILD ENVIRONMENTS
- stage: build_${{ parameters.Envs}}
dependsOn: quality_control
displayName: Build ${{ parameters.Envs }}
condition: eq(variables['Build.Reason'], 'Manual')
jobs:
- job: Job_build
displayName: Application Build
steps:
- ${{ if eq(parameters.Envs, 'QA') }}:
- checkout: backend-qa
path: enext-data-platform-backend
- script: echo ${{ parameters.Envs}}
- ${{ elseif eq(parameters.Envs, 'Dev') }}:
- checkout: backend-dev
submodules: true
- script: echo ${{ parameters.Envs }}