如何使用条件或其他方式选择要从 Azure Pipeline 中的单个阶段运行的环境

问题描述 投票:0回答:1

我在 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 还很陌生,我不知道如何以正确的方式设置它们

azure-devops conditional-statements yaml pipeline
1个回答
0
投票

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 }}

© www.soinside.com 2019 - 2024. All rights reserved.