Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

APIOPS Product is not publishing as expected to qa, prd env

未关闭
#794 2 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
25/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
停滞
技术栈
azure, yaml
领域
api, devops

调研方向

先从 publisher.yml、publisher-with-env.yml 以及其中引用的 configuration.qa.yaml 开始,然后检查 artifacts 下提取的产品构件。将目标配置和 publisher 环境变量与发送到 QA 或生产环境的产品数据进行比较。完成的标准是:发布到每个目标环境的产品使用该环境的配置和唯一值。

由索引模型根据 Issue 内容生成。

描述

Release version

APIOPS v5.1.4

Describe the bug

Hi i going to create APIM for Dev, QA, Prod env for my client this is new requirement. i am having issue when i publish the product from dev to qa, and prod. this is below listed activity i have done.

1, created 3 APIM like dev, qa and prod envs.
2, manually create APIs, backends, named values, products, subscriptions in dev env.
3, Extract the dev env APIM resources and entities using extractor pipeline in azure devops pipeline.
4, artifacts were stored in the repos, this contains APIs, backends, named values etc.
5, now i am going to publish the all above created entities in dev to qa using config.qa.yaml. this contains qa env based backend url, named values secrets and product policy yamls. backend and named values were created as expected. but product is publishing as expected from config.qa.yaml file.
6, backend, named values were published from config.qa.yml file, but product has been published which is same like dev env getting from artifacts.
7, so product has not been published as expected

Note:
provide me the exact yaml file for publish the product to another envs, because we are having unique token for individual envs.

kindly provide me the solution ASAP, i have been working for long time. but still issue not resolved.

because we are new for APIOPS and myself only explain about APIOPS to the client. so provide me the detailed step by step solution.

this is my publisher.yml files.

trigger: none

branches:

include:

- main

paths:

exclude:

- tools/*

parameters:

  • name: LOCATION_NAME
    displayName: 'Location name:'
    default: cus
    values:

    • cus
  • name: ENV_CHOICE
    displayName: 'Environment name:'
    default: dev
    values:

    • poc
    • dev
    • qa
    • qa2
    • pims
    • prd

- name: COUNT

displayname: 'count values:'

default: 01

values:

- 01

- 02

- 03

- 04

- name: PROJECT

displayname: 'Project name:'

default: ars

values:

- ars

  • name: COMMIT_ID
    type: string
    displayName: Choose "publish-all-artifacts-in-repo" only when you want to force republishing all artifacts (e.g. after build failure). Otherwise stick with the default behavior of "publish-artifacts-in-last-commit"
    default: publish-artifacts-in-last-commit
    values:
    • publish-artifacts-in-last-commit
    • publish-all-artifacts-in-repo

variables:

  • group: ARS-apim-automation

  • name: System.Debug
    value: false

  • name: API_OUTPUT_FOLDER_PATH
    value: 'artifacts'

  • name: RG_NAME
    ${{ if and(eq(parameters.ENV_CHOICE, 'poc'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_POC)
    ${{ if and(eq(parameters.ENV_CHOICE, 'dev'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_DEV)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_QA)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa2'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_QA2)
    ${{ if and(eq(parameters.ENV_CHOICE, 'pims'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_PIMS)
    ${{ if and(eq(parameters.ENV_CHOICE, 'prd'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_PRD)

  • name: APIM_INSTANCE_NAME
    ${{ if and(eq(parameters.ENV_CHOICE, 'poc'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_POC)
    ${{ if and(eq(parameters.ENV_CHOICE, 'dev'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_DEV)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_QA)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa2'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_QA2)
    ${{ if and(eq(parameters.ENV_CHOICE, 'pims'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_PIMS)
    ${{ if and(eq(parameters.ENV_CHOICE, 'prd'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_PRD)

  • name: SERVICE_CONN_NAME
    ${{ if and(or(eq(parameters.ENV_CHOICE, 'dev'), eq(parameters.ENV_CHOICE, 'poc'), eq(parameters.ENV_CHOICE, 'qa'), eq(parameters.ENV_CHOICE, 'qa2')), eq(parameters.LOCATION_NAME, 'cus')) }}:
    value: $(SERVICE_CONNECTION_NAME_NPRD)
    ${{ else }}:
    value: $(SERVICE_CONNECTION_NAME_PRD)

  • name: ENV_NAME
    value: 'apim-${{ parameters.ENV_CHOICE }}-${{ parameters.LOCATION_NAME }}'

stages:

  • stage: push_APIM_changes_to_${{ parameters.ENV_CHOICE }}
    displayName: Push APIM changes to ${{ parameters.ENV_CHOICE }}
    jobs:
    • deployment: push_APIM_changes_to_${{ parameters.ENV_CHOICE }}
      displayName: Push APIM changes to ${{ parameters.ENV_CHOICE }}
      pool:
      vmImage: ubuntu-latest
      environment: ${{ variables.ENV_NAME }}
      strategy:
      runOnce:
      deploy:
      steps:
      - template: run-publisher-with-env.yml
      parameters:
      API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH: ${{ variables.API_OUTPUT_FOLDER_PATH }}
      RESOURCE_GROUP_NAME: ${{ variables.RG_NAME }}
      API_MANAGEMENT_SERVICE_NAME: ${{ variables.APIM_INSTANCE_NAME }}
      CONFIGURATION_YAML_PATH: $(Build.SourcesDirectory)/tools/configs/${{ parameters.LOCATION_NAME }}/configuration.${{ parameters.ENV_CHOICE }}.yaml
      #CONFIGURATION_YAML_PATH: $(Build.SourcesDirectory)/tools/configs/cus/configuration.qa.yaml
      ENVIRONMENT: ${{ variables.ENV_NAME }}
      COMMIT_ID: ${{ parameters.COMMIT_ID }}
      SERVICE_CONNECTION_NAME: ${{ variables.SERVICE_CONN_NAME }}

this is my publisher-with-env.yml:

parameters:

  • name: API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH
    type: string
    displayName: Folder where the artifacts reside
    default: "artifacts"
  • name: ENVIRONMENT
    type: string
    displayName: Environment to display
  • name: RESOURCE_GROUP_NAME
    default: ant-rg-apim-poc
    type: string
    displayName: Resource Group Name
  • name: API_MANAGEMENT_SERVICE_NAME
    type: string
    displayName: APIM Instance Name
    default: ""
  • name: CONFIGURATION_YAML_PATH
    type: string
    displayName: Optional configuration file (target environment publishing into)
  • name: COMMIT_ID
    type: string
    default: publish-artifacts-in-last-commit
  • name: SERVICE_CONNECTION_NAME
    type: string
    default: ARS-ApiOps

steps:

  • script: echo Provided configuration was ${{ parameters.CONFIGURATION_YAML_PATH }}
    displayName: Print the name of the yaml configuration file if provided

  • script: echo Provided app service name was ${{ parameters.API_MANAGEMENT_SERVICE_NAME }}
    displayName: Print the name of the apim service name if provided

  • checkout: self
    fetchDepth: 0

  • task: AzureCLI@2
    displayName: Set publishing variables
    inputs:
    azureSubscription: "${{parameters.SERVICE_CONNECTION_NAME}}"
    scriptType: pscore
    scriptLocation: inlineScript
    inlineScript: |
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"
    $VerbosePreference = "Continue"
    $InformationPreference = "Continue"

    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_BEARER_TOKEN]$(az account get-access-token --query "accessToken" --output tsv)"
    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_CLIENT_ID]$env:servicePrincipalId"
    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_CLIENT_SECRET]$env:servicePrincipalKey"
    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_TENANT_ID]$env:tenantId"
    if (-not $env:AZURE_SUBSCRIPTION_ID) {
      $subscriptionCount = az account list --query "length([])" --output tsv
      if ($subscriptionCount -eq 1) {
          $subscriptionId = az account list --query "[0].id" --output tsv
          Write-Host "Setting AZURE_SUBSCRIPTION_ID environment variable to: $subscriptionId"
          Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_SUBSCRIPTION_ID]$($subscriptionId)"
      } 
      elseif ($subscriptionCount -gt 1) {
          Write-Host "Multiple subscriptions are accessible. Please set the AZURE_SUBSCRIPTION_ID environment variable manually."
          exit 1
      }
    }
    else {
      Write-Host "AZURE_SUBSCRIPTION_ID is already set to: $env:AZURE_SUBSCRIPTION_ID"
    }
    

    addSpnToEnvironment: true
    failOnStandardError: true

  • ${{ if ne(parameters.CONFIGURATION_YAML_PATH, '') }}:

    • task: qetza.replacetokens.replacetokens-task.replacetokens@6
      displayName: "Perform namevalue secret substitution in ${{ parameters.CONFIGURATION_YAML_PATH }}"
      inputs:
      sources: ${{ parameters.CONFIGURATION_YAML_PATH }}
      encoding: "auto"
      addBOM: true
      logLevel: "off"
      missingVarLog: "warn"
      missingVarAction: "none"
      tokenPrefix: "{#"
      tokenSuffix: "#}"
  • task: PowerShell@2
    displayName: Fetch publisher
    inputs:
    targetType: "inline"
    script: |
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"
    $VerbosePreference = "Continue"
    $InformationPreference = "Continue"

    Write-Information "Downloading publisher..."
    $publisherFileName = "publisher.linux-x64"
    $publisherFinalFileName = "publisher"
    if ("$(Agent.OS)" -like "*win*") {
      $publisherFileName = "publisher.win-x64.exe"
      $publisherFinalFileName = "publisher.exe"
    }
    elseif ("$(Agent.OS)" -like "*mac*" -and "$(Agent.OSArchitecture)" -like "*arm*") {
      $publisherFileName = "publisher.osx-arm64"
    }
    elseif ("$(Agent.OS)" -like "*mac*" -and "$(Agent.OSArchitecture)" -like "*x86_64*") {
      $publisherFileName = "publisher.osx-x64"
    }
    
    $uri = "https://github.com/Azure/apiops/releases/download/$(apiops_release_version)/$publisherFileName"
    $destinationFilePath = Join-Path "$(Agent.TempDirectory)" $publisherFinalFileName
    Invoke-WebRequest -Uri "$uri" -OutFile "$destinationFilePath"
    
    if ("$(Agent.OS)" -like "*linux*")
    {
      Write-Information "Setting file permissions..."
      & chmod +x "$destinationFilePath"
      if ($LASTEXITCODE -ne 0) { throw "Setting file permissions failed."}
    }
    
    Write-Host "##vso[task.setvariable variable=PUBLISHER_FILE_PATH]$destinationFilePath"
    Write-Information "Execution complete."
    

    failOnStderr: true
    pwsh: true

  • task: PowerShell@2
    displayName: Run publisher for ${{ parameters.ENVIRONMENT}} environment
    inputs:
    targetType: "inline"
    script: |
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"
    $VerbosePreference = "Continue"
    $InformationPreference = "Continue"

    & "$(PUBLISHER_FILE_PATH)"                
    if ($LASTEXITCODE -ne 0) { throw "Running publisher failed."}
    
    Write-Information "Execution complete."
    

    failOnStderr: true
    pwsh: true
    env:
    AZURE_BEARER_TOKEN: $(AZURE_BEARER_TOKEN)
    AZURE_CLIENT_ID: $(AZURE_CLIENT_ID)
    AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET)
    AZURE_TENANT_ID: $(AZURE_TENANT_ID)
    AZURE_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID)
    AZURE_RESOURCE_GROUP_NAME: ${{ parameters.RESOURCE_GROUP_NAME }}
    API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH: $(Build.SourcesDirectory)/${{ parameters.API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH }}
    ${{ if ne( parameters['API_MANAGEMENT_SERVICE_NAME'], '' ) }}:
    API_MANAGEMENT_SERVICE_NAME: ${{ parameters.API_MANAGEMENT_SERVICE_NAME }}
    ${{ if eq( parameters['COMMIT_ID'], 'publish-artifacts-in-last-commit' ) }}:
    COMMIT_ID: $(Build.SourceVersion)
    ${{ if ne( parameters['CONFIGURATION_YAML_PATH'], '' ) }}:
    CONFIGURATION_YAML_PATH: ${{ parameters.CONFIGURATION_YAML_PATH }}

check this above mentioned files and provide the steps.

Expected behavior

Hi i going to create APIM for Dev, QA, Prod env for my client this is new requirement. i am having issue when i publish the product from dev to qa, and prod. this is below listed activity i have done.

1, created 3 APIM like dev, qa and prod envs.
2, manually create APIs, backends, named values, products, subscriptions in dev env.
3, Extract the dev env APIM resources and entities using extractor pipeline in azure devops pipeline.
4, artifacts were stored in the repos, this contains APIs, backends, named values etc.
5, now i am going to publish the all above created entities in dev to qa using config.qa.yaml. this contains qa env based backend url, named values secrets and product policy yamls. backend and named values were created as expected. but product is publishing as expected from config.qa.yaml file.
6, backend, named values were published from config.qa.yml file, but product has been published which is same like dev env getting from artifacts.
7, so product has not been published as expected

Note:
provide me the exact yaml file for publish the product to another envs, because we are having unique token for individual envs.

kindly provide me the solution ASAP, i have been working for long time. but still issue not resolved.

because we are new for APIOPS and myself only explain about APIOPS to the client. so provide me the detailed step by step solution.

this is my publisher.yml files.

trigger: none

branches:

include:

- main

paths:

exclude:

- tools/*

parameters:

  • name: LOCATION_NAME
    displayName: 'Location name:'
    default: cus
    values:

    • cus
  • name: ENV_CHOICE
    displayName: 'Environment name:'
    default: dev
    values:

    • poc
    • dev
    • qa
    • qa2
    • pims
    • prd

- name: COUNT

displayname: 'count values:'

default: 01

values:

- 01

- 02

- 03

- 04

- name: PROJECT

displayname: 'Project name:'

default: ars

values:

- ars

  • name: COMMIT_ID
    type: string
    displayName: Choose "publish-all-artifacts-in-repo" only when you want to force republishing all artifacts (e.g. after build failure). Otherwise stick with the default behavior of "publish-artifacts-in-last-commit"
    default: publish-artifacts-in-last-commit
    values:
    • publish-artifacts-in-last-commit
    • publish-all-artifacts-in-repo

variables:

  • group: ARS-apim-automation

  • name: System.Debug
    value: false

  • name: API_OUTPUT_FOLDER_PATH
    value: 'artifacts'

  • name: RG_NAME
    ${{ if and(eq(parameters.ENV_CHOICE, 'poc'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_POC)
    ${{ if and(eq(parameters.ENV_CHOICE, 'dev'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_DEV)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_QA)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa2'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_QA2)
    ${{ if and(eq(parameters.ENV_CHOICE, 'pims'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_PIMS)
    ${{ if and(eq(parameters.ENV_CHOICE, 'prd'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_PRD)

  • name: APIM_INSTANCE_NAME
    ${{ if and(eq(parameters.ENV_CHOICE, 'poc'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_POC)
    ${{ if and(eq(parameters.ENV_CHOICE, 'dev'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_DEV)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_QA)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa2'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_QA2)
    ${{ if and(eq(parameters.ENV_CHOICE, 'pims'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_PIMS)
    ${{ if and(eq(parameters.ENV_CHOICE, 'prd'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_PRD)

  • name: SERVICE_CONN_NAME
    ${{ if and(or(eq(parameters.ENV_CHOICE, 'dev'), eq(parameters.ENV_CHOICE, 'poc'), eq(parameters.ENV_CHOICE, 'qa'), eq(parameters.ENV_CHOICE, 'qa2')), eq(parameters.LOCATION_NAME, 'cus')) }}:
    value: $(SERVICE_CONNECTION_NAME_NPRD)
    ${{ else }}:
    value: $(SERVICE_CONNECTION_NAME_PRD)

  • name: ENV_NAME
    value: 'apim-${{ parameters.ENV_CHOICE }}-${{ parameters.LOCATION_NAME }}'

stages:

  • stage: push_APIM_changes_to_${{ parameters.ENV_CHOICE }}
    displayName: Push APIM changes to ${{ parameters.ENV_CHOICE }}
    jobs:
    • deployment: push_APIM_changes_to_${{ parameters.ENV_CHOICE }}
      displayName: Push APIM changes to ${{ parameters.ENV_CHOICE }}
      pool:
      vmImage: ubuntu-latest
      environment: ${{ variables.ENV_NAME }}
      strategy:
      runOnce:
      deploy:
      steps:
      - template: run-publisher-with-env.yml
      parameters:
      API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH: ${{ variables.API_OUTPUT_FOLDER_PATH }}
      RESOURCE_GROUP_NAME: ${{ variables.RG_NAME }}
      API_MANAGEMENT_SERVICE_NAME: ${{ variables.APIM_INSTANCE_NAME }}
      CONFIGURATION_YAML_PATH: $(Build.SourcesDirectory)/tools/configs/${{ parameters.LOCATION_NAME }}/configuration.${{ parameters.ENV_CHOICE }}.yaml
      #CONFIGURATION_YAML_PATH: $(Build.SourcesDirectory)/tools/configs/cus/configuration.qa.yaml
      ENVIRONMENT: ${{ variables.ENV_NAME }}
      COMMIT_ID: ${{ parameters.COMMIT_ID }}
      SERVICE_CONNECTION_NAME: ${{ variables.SERVICE_CONN_NAME }}

this is my publisher-with-env.yml:

parameters:

  • name: API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH
    type: string
    displayName: Folder where the artifacts reside
    default: "artifacts"
  • name: ENVIRONMENT
    type: string
    displayName: Environment to display
  • name: RESOURCE_GROUP_NAME
    default: ant-rg-apim-poc
    type: string
    displayName: Resource Group Name
  • name: API_MANAGEMENT_SERVICE_NAME
    type: string
    displayName: APIM Instance Name
    default: ""
  • name: CONFIGURATION_YAML_PATH
    type: string
    displayName: Optional configuration file (target environment publishing into)
  • name: COMMIT_ID
    type: string
    default: publish-artifacts-in-last-commit
  • name: SERVICE_CONNECTION_NAME
    type: string
    default: ARS-ApiOps

steps:

  • script: echo Provided configuration was ${{ parameters.CONFIGURATION_YAML_PATH }}
    displayName: Print the name of the yaml configuration file if provided

  • script: echo Provided app service name was ${{ parameters.API_MANAGEMENT_SERVICE_NAME }}
    displayName: Print the name of the apim service name if provided

  • checkout: self
    fetchDepth: 0

  • task: AzureCLI@2
    displayName: Set publishing variables
    inputs:
    azureSubscription: "${{parameters.SERVICE_CONNECTION_NAME}}"
    scriptType: pscore
    scriptLocation: inlineScript
    inlineScript: |
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"
    $VerbosePreference = "Continue"
    $InformationPreference = "Continue"

    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_BEARER_TOKEN]$(az account get-access-token --query "accessToken" --output tsv)"
    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_CLIENT_ID]$env:servicePrincipalId"
    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_CLIENT_SECRET]$env:servicePrincipalKey"
    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_TENANT_ID]$env:tenantId"
    if (-not $env:AZURE_SUBSCRIPTION_ID) {
      $subscriptionCount = az account list --query "length([])" --output tsv
      if ($subscriptionCount -eq 1) {
          $subscriptionId = az account list --query "[0].id" --output tsv
          Write-Host "Setting AZURE_SUBSCRIPTION_ID environment variable to: $subscriptionId"
          Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_SUBSCRIPTION_ID]$($subscriptionId)"
      } 
      elseif ($subscriptionCount -gt 1) {
          Write-Host "Multiple subscriptions are accessible. Please set the AZURE_SUBSCRIPTION_ID environment variable manually."
          exit 1
      }
    }
    else {
      Write-Host "AZURE_SUBSCRIPTION_ID is already set to: $env:AZURE_SUBSCRIPTION_ID"
    }
    

    addSpnToEnvironment: true
    failOnStandardError: true

  • ${{ if ne(parameters.CONFIGURATION_YAML_PATH, '') }}:

    • task: qetza.replacetokens.replacetokens-task.replacetokens@6
      displayName: "Perform namevalue secret substitution in ${{ parameters.CONFIGURATION_YAML_PATH }}"
      inputs:
      sources: ${{ parameters.CONFIGURATION_YAML_PATH }}
      encoding: "auto"
      addBOM: true
      logLevel: "off"
      missingVarLog: "warn"
      missingVarAction: "none"
      tokenPrefix: "{#"
      tokenSuffix: "#}"
  • task: PowerShell@2
    displayName: Fetch publisher
    inputs:
    targetType: "inline"
    script: |
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"
    $VerbosePreference = "Continue"
    $InformationPreference = "Continue"

    Write-Information "Downloading publisher..."
    $publisherFileName = "publisher.linux-x64"
    $publisherFinalFileName = "publisher"
    if ("$(Agent.OS)" -like "*win*") {
      $publisherFileName = "publisher.win-x64.exe"
      $publisherFinalFileName = "publisher.exe"
    }
    elseif ("$(Agent.OS)" -like "*mac*" -and "$(Agent.OSArchitecture)" -like "*arm*") {
      $publisherFileName = "publisher.osx-arm64"
    }
    elseif ("$(Agent.OS)" -like "*mac*" -and "$(Agent.OSArchitecture)" -like "*x86_64*") {
      $publisherFileName = "publisher.osx-x64"
    }
    
    $uri = "https://github.com/Azure/apiops/releases/download/$(apiops_release_version)/$publisherFileName"
    $destinationFilePath = Join-Path "$(Agent.TempDirectory)" $publisherFinalFileName
    Invoke-WebRequest -Uri "$uri" -OutFile "$destinationFilePath"
    
    if ("$(Agent.OS)" -like "*linux*")
    {
      Write-Information "Setting file permissions..."
      & chmod +x "$destinationFilePath"
      if ($LASTEXITCODE -ne 0) { throw "Setting file permissions failed."}
    }
    
    Write-Host "##vso[task.setvariable variable=PUBLISHER_FILE_PATH]$destinationFilePath"
    Write-Information "Execution complete."
    

    failOnStderr: true
    pwsh: true

  • task: PowerShell@2
    displayName: Run publisher for ${{ parameters.ENVIRONMENT}} environment
    inputs:
    targetType: "inline"
    script: |
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"
    $VerbosePreference = "Continue"
    $InformationPreference = "Continue"

    & "$(PUBLISHER_FILE_PATH)"                
    if ($LASTEXITCODE -ne 0) { throw "Running publisher failed."}
    
    Write-Information "Execution complete."
    

    failOnStderr: true
    pwsh: true
    env:
    AZURE_BEARER_TOKEN: $(AZURE_BEARER_TOKEN)
    AZURE_CLIENT_ID: $(AZURE_CLIENT_ID)
    AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET)
    AZURE_TENANT_ID: $(AZURE_TENANT_ID)
    AZURE_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID)
    AZURE_RESOURCE_GROUP_NAME: ${{ parameters.RESOURCE_GROUP_NAME }}
    API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH: $(Build.SourcesDirectory)/${{ parameters.API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH }}
    ${{ if ne( parameters['API_MANAGEMENT_SERVICE_NAME'], '' ) }}:
    API_MANAGEMENT_SERVICE_NAME: ${{ parameters.API_MANAGEMENT_SERVICE_NAME }}
    ${{ if eq( parameters['COMMIT_ID'], 'publish-artifacts-in-last-commit' ) }}:
    COMMIT_ID: $(Build.SourceVersion)
    ${{ if ne( parameters['CONFIGURATION_YAML_PATH'], '' ) }}:
    CONFIGURATION_YAML_PATH: ${{ parameters.CONFIGURATION_YAML_PATH }}

check this above mentioned files and provide the steps.

Actual behavior

Hi i going to create APIM for Dev, QA, Prod env for my client this is new requirement. i am having issue when i publish the product from dev to qa, and prod. this is below listed activity i have done.

1, created 3 APIM like dev, qa and prod envs.
2, manually create APIs, backends, named values, products, subscriptions in dev env.
3, Extract the dev env APIM resources and entities using extractor pipeline in azure devops pipeline.
4, artifacts were stored in the repos, this contains APIs, backends, named values etc.
5, now i am going to publish the all above created entities in dev to qa using config.qa.yaml. this contains qa env based backend url, named values secrets and product policy yamls. backend and named values were created as expected. but product is publishing as expected from config.qa.yaml file.
6, backend, named values were published from config.qa.yml file, but product has been published which is same like dev env getting from artifacts.
7, so product has not been published as expected

Note:
provide me the exact yaml file for publish the product to another envs, because we are having unique token for individual envs.

kindly provide me the solution ASAP, i have been working for long time. but still issue not resolved.

because we are new for APIOPS and myself only explain about APIOPS to the client. so provide me the detailed step by step solution.

this is my publisher.yml files.

trigger: none

branches:

include:

- main

paths:

exclude:

- tools/*

parameters:

  • name: LOCATION_NAME
    displayName: 'Location name:'
    default: cus
    values:

    • cus
  • name: ENV_CHOICE
    displayName: 'Environment name:'
    default: dev
    values:

    • poc
    • dev
    • qa
    • qa2
    • pims
    • prd

- name: COUNT

displayname: 'count values:'

default: 01

values:

- 01

- 02

- 03

- 04

- name: PROJECT

displayname: 'Project name:'

default: ars

values:

- ars

  • name: COMMIT_ID
    type: string
    displayName: Choose "publish-all-artifacts-in-repo" only when you want to force republishing all artifacts (e.g. after build failure). Otherwise stick with the default behavior of "publish-artifacts-in-last-commit"
    default: publish-artifacts-in-last-commit
    values:
    • publish-artifacts-in-last-commit
    • publish-all-artifacts-in-repo

variables:

  • group: ARS-apim-automation

  • name: System.Debug
    value: false

  • name: API_OUTPUT_FOLDER_PATH
    value: 'artifacts'

  • name: RG_NAME
    ${{ if and(eq(parameters.ENV_CHOICE, 'poc'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_POC)
    ${{ if and(eq(parameters.ENV_CHOICE, 'dev'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_DEV)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_QA)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa2'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_QA2)
    ${{ if and(eq(parameters.ENV_CHOICE, 'pims'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_PIMS)
    ${{ if and(eq(parameters.ENV_CHOICE, 'prd'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_PRD)

  • name: APIM_INSTANCE_NAME
    ${{ if and(eq(parameters.ENV_CHOICE, 'poc'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_POC)
    ${{ if and(eq(parameters.ENV_CHOICE, 'dev'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_DEV)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_QA)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa2'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_QA2)
    ${{ if and(eq(parameters.ENV_CHOICE, 'pims'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_PIMS)
    ${{ if and(eq(parameters.ENV_CHOICE, 'prd'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_PRD)

  • name: SERVICE_CONN_NAME
    ${{ if and(or(eq(parameters.ENV_CHOICE, 'dev'), eq(parameters.ENV_CHOICE, 'poc'), eq(parameters.ENV_CHOICE, 'qa'), eq(parameters.ENV_CHOICE, 'qa2')), eq(parameters.LOCATION_NAME, 'cus')) }}:
    value: $(SERVICE_CONNECTION_NAME_NPRD)
    ${{ else }}:
    value: $(SERVICE_CONNECTION_NAME_PRD)

  • name: ENV_NAME
    value: 'apim-${{ parameters.ENV_CHOICE }}-${{ parameters.LOCATION_NAME }}'

stages:

  • stage: push_APIM_changes_to_${{ parameters.ENV_CHOICE }}
    displayName: Push APIM changes to ${{ parameters.ENV_CHOICE }}
    jobs:
    • deployment: push_APIM_changes_to_${{ parameters.ENV_CHOICE }}
      displayName: Push APIM changes to ${{ parameters.ENV_CHOICE }}
      pool:
      vmImage: ubuntu-latest
      environment: ${{ variables.ENV_NAME }}
      strategy:
      runOnce:
      deploy:
      steps:
      - template: run-publisher-with-env.yml
      parameters:
      API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH: ${{ variables.API_OUTPUT_FOLDER_PATH }}
      RESOURCE_GROUP_NAME: ${{ variables.RG_NAME }}
      API_MANAGEMENT_SERVICE_NAME: ${{ variables.APIM_INSTANCE_NAME }}
      CONFIGURATION_YAML_PATH: $(Build.SourcesDirectory)/tools/configs/${{ parameters.LOCATION_NAME }}/configuration.${{ parameters.ENV_CHOICE }}.yaml
      #CONFIGURATION_YAML_PATH: $(Build.SourcesDirectory)/tools/configs/cus/configuration.qa.yaml
      ENVIRONMENT: ${{ variables.ENV_NAME }}
      COMMIT_ID: ${{ parameters.COMMIT_ID }}
      SERVICE_CONNECTION_NAME: ${{ variables.SERVICE_CONN_NAME }}

this is my publisher-with-env.yml:

parameters:

  • name: API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH
    type: string
    displayName: Folder where the artifacts reside
    default: "artifacts"
  • name: ENVIRONMENT
    type: string
    displayName: Environment to display
  • name: RESOURCE_GROUP_NAME
    default: ant-rg-apim-poc
    type: string
    displayName: Resource Group Name
  • name: API_MANAGEMENT_SERVICE_NAME
    type: string
    displayName: APIM Instance Name
    default: ""
  • name: CONFIGURATION_YAML_PATH
    type: string
    displayName: Optional configuration file (target environment publishing into)
  • name: COMMIT_ID
    type: string
    default: publish-artifacts-in-last-commit
  • name: SERVICE_CONNECTION_NAME
    type: string
    default: ARS-ApiOps

steps:

  • script: echo Provided configuration was ${{ parameters.CONFIGURATION_YAML_PATH }}
    displayName: Print the name of the yaml configuration file if provided

  • script: echo Provided app service name was ${{ parameters.API_MANAGEMENT_SERVICE_NAME }}
    displayName: Print the name of the apim service name if provided

  • checkout: self
    fetchDepth: 0

  • task: AzureCLI@2
    displayName: Set publishing variables
    inputs:
    azureSubscription: "${{parameters.SERVICE_CONNECTION_NAME}}"
    scriptType: pscore
    scriptLocation: inlineScript
    inlineScript: |
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"
    $VerbosePreference = "Continue"
    $InformationPreference = "Continue"

    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_BEARER_TOKEN]$(az account get-access-token --query "accessToken" --output tsv)"
    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_CLIENT_ID]$env:servicePrincipalId"
    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_CLIENT_SECRET]$env:servicePrincipalKey"
    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_TENANT_ID]$env:tenantId"
    if (-not $env:AZURE_SUBSCRIPTION_ID) {
      $subscriptionCount = az account list --query "length([])" --output tsv
      if ($subscriptionCount -eq 1) {
          $subscriptionId = az account list --query "[0].id" --output tsv
          Write-Host "Setting AZURE_SUBSCRIPTION_ID environment variable to: $subscriptionId"
          Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_SUBSCRIPTION_ID]$($subscriptionId)"
      } 
      elseif ($subscriptionCount -gt 1) {
          Write-Host "Multiple subscriptions are accessible. Please set the AZURE_SUBSCRIPTION_ID environment variable manually."
          exit 1
      }
    }
    else {
      Write-Host "AZURE_SUBSCRIPTION_ID is already set to: $env:AZURE_SUBSCRIPTION_ID"
    }
    

    addSpnToEnvironment: true
    failOnStandardError: true

  • ${{ if ne(parameters.CONFIGURATION_YAML_PATH, '') }}:

    • task: qetza.replacetokens.replacetokens-task.replacetokens@6
      displayName: "Perform namevalue secret substitution in ${{ parameters.CONFIGURATION_YAML_PATH }}"
      inputs:
      sources: ${{ parameters.CONFIGURATION_YAML_PATH }}
      encoding: "auto"
      addBOM: true
      logLevel: "off"
      missingVarLog: "warn"
      missingVarAction: "none"
      tokenPrefix: "{#"
      tokenSuffix: "#}"
  • task: PowerShell@2
    displayName: Fetch publisher
    inputs:
    targetType: "inline"
    script: |
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"
    $VerbosePreference = "Continue"
    $InformationPreference = "Continue"

    Write-Information "Downloading publisher..."
    $publisherFileName = "publisher.linux-x64"
    $publisherFinalFileName = "publisher"
    if ("$(Agent.OS)" -like "*win*") {
      $publisherFileName = "publisher.win-x64.exe"
      $publisherFinalFileName = "publisher.exe"
    }
    elseif ("$(Agent.OS)" -like "*mac*" -and "$(Agent.OSArchitecture)" -like "*arm*") {
      $publisherFileName = "publisher.osx-arm64"
    }
    elseif ("$(Agent.OS)" -like "*mac*" -and "$(Agent.OSArchitecture)" -like "*x86_64*") {
      $publisherFileName = "publisher.osx-x64"
    }
    
    $uri = "https://github.com/Azure/apiops/releases/download/$(apiops_release_version)/$publisherFileName"
    $destinationFilePath = Join-Path "$(Agent.TempDirectory)" $publisherFinalFileName
    Invoke-WebRequest -Uri "$uri" -OutFile "$destinationFilePath"
    
    if ("$(Agent.OS)" -like "*linux*")
    {
      Write-Information "Setting file permissions..."
      & chmod +x "$destinationFilePath"
      if ($LASTEXITCODE -ne 0) { throw "Setting file permissions failed."}
    }
    
    Write-Host "##vso[task.setvariable variable=PUBLISHER_FILE_PATH]$destinationFilePath"
    Write-Information "Execution complete."
    

    failOnStderr: true
    pwsh: true

  • task: PowerShell@2
    displayName: Run publisher for ${{ parameters.ENVIRONMENT}} environment
    inputs:
    targetType: "inline"
    script: |
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"
    $VerbosePreference = "Continue"
    $InformationPreference = "Continue"

    & "$(PUBLISHER_FILE_PATH)"                
    if ($LASTEXITCODE -ne 0) { throw "Running publisher failed."}
    
    Write-Information "Execution complete."
    

    failOnStderr: true
    pwsh: true
    env:
    AZURE_BEARER_TOKEN: $(AZURE_BEARER_TOKEN)
    AZURE_CLIENT_ID: $(AZURE_CLIENT_ID)
    AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET)
    AZURE_TENANT_ID: $(AZURE_TENANT_ID)
    AZURE_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID)
    AZURE_RESOURCE_GROUP_NAME: ${{ parameters.RESOURCE_GROUP_NAME }}
    API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH: $(Build.SourcesDirectory)/${{ parameters.API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH }}
    ${{ if ne( parameters['API_MANAGEMENT_SERVICE_NAME'], '' ) }}:
    API_MANAGEMENT_SERVICE_NAME: ${{ parameters.API_MANAGEMENT_SERVICE_NAME }}
    ${{ if eq( parameters['COMMIT_ID'], 'publish-artifacts-in-last-commit' ) }}:
    COMMIT_ID: $(Build.SourceVersion)
    ${{ if ne( parameters['CONFIGURATION_YAML_PATH'], '' ) }}:
    CONFIGURATION_YAML_PATH: ${{ parameters.CONFIGURATION_YAML_PATH }}

check this above mentioned files and provide the steps.

Reproduction Steps

Hi i going to create APIM for Dev, QA, Prod env for my client this is new requirement. i am having issue when i publish the product from dev to qa, and prod. this is below listed activity i have done.

1, created 3 APIM like dev, qa and prod envs.
2, manually create APIs, backends, named values, products, subscriptions in dev env.
3, Extract the dev env APIM resources and entities using extractor pipeline in azure devops pipeline.
4, artifacts were stored in the repos, this contains APIs, backends, named values etc.
5, now i am going to publish the all above created entities in dev to qa using config.qa.yaml. this contains qa env based backend url, named values secrets and product policy yamls. backend and named values were created as expected. but product is publishing as expected from config.qa.yaml file.
6, backend, named values were published from config.qa.yml file, but product has been published which is same like dev env getting from artifacts.
7, so product has not been published as expected

Note:
provide me the exact yaml file for publish the product to another envs, because we are having unique token for individual envs.

kindly provide me the solution ASAP, i have been working for long time. but still issue not resolved.

because we are new for APIOPS and myself only explain about APIOPS to the client. so provide me the detailed step by step solution.

this is my publisher.yml files.

trigger: none

branches:

include:

- main

paths:

exclude:

- tools/*

parameters:

  • name: LOCATION_NAME
    displayName: 'Location name:'
    default: cus
    values:

    • cus
  • name: ENV_CHOICE
    displayName: 'Environment name:'
    default: dev
    values:

    • poc
    • dev
    • qa
    • qa2
    • pims
    • prd

- name: COUNT

displayname: 'count values:'

default: 01

values:

- 01

- 02

- 03

- 04

- name: PROJECT

displayname: 'Project name:'

default: ars

values:

- ars

  • name: COMMIT_ID
    type: string
    displayName: Choose "publish-all-artifacts-in-repo" only when you want to force republishing all artifacts (e.g. after build failure). Otherwise stick with the default behavior of "publish-artifacts-in-last-commit"
    default: publish-artifacts-in-last-commit
    values:
    • publish-artifacts-in-last-commit
    • publish-all-artifacts-in-repo

variables:

  • group: ARS-apim-automation

  • name: System.Debug
    value: false

  • name: API_OUTPUT_FOLDER_PATH
    value: 'artifacts'

  • name: RG_NAME
    ${{ if and(eq(parameters.ENV_CHOICE, 'poc'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_POC)
    ${{ if and(eq(parameters.ENV_CHOICE, 'dev'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_DEV)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_QA)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa2'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_QA2)
    ${{ if and(eq(parameters.ENV_CHOICE, 'pims'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_PIMS)
    ${{ if and(eq(parameters.ENV_CHOICE, 'prd'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(RESOURCE_GROUP_NAME_PRD)

  • name: APIM_INSTANCE_NAME
    ${{ if and(eq(parameters.ENV_CHOICE, 'poc'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_POC)
    ${{ if and(eq(parameters.ENV_CHOICE, 'dev'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_DEV)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_QA)
    ${{ if and(eq(parameters.ENV_CHOICE, 'qa2'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_QA2)
    ${{ if and(eq(parameters.ENV_CHOICE, 'pims'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_PIMS)
    ${{ if and(eq(parameters.ENV_CHOICE, 'prd'), eq(parameters.LOCATION_NAME, 'cus') )}}:
    value: $(APIM_NAME_PRD)

  • name: SERVICE_CONN_NAME
    ${{ if and(or(eq(parameters.ENV_CHOICE, 'dev'), eq(parameters.ENV_CHOICE, 'poc'), eq(parameters.ENV_CHOICE, 'qa'), eq(parameters.ENV_CHOICE, 'qa2')), eq(parameters.LOCATION_NAME, 'cus')) }}:
    value: $(SERVICE_CONNECTION_NAME_NPRD)
    ${{ else }}:
    value: $(SERVICE_CONNECTION_NAME_PRD)

  • name: ENV_NAME
    value: 'apim-${{ parameters.ENV_CHOICE }}-${{ parameters.LOCATION_NAME }}'

stages:

  • stage: push_APIM_changes_to_${{ parameters.ENV_CHOICE }}
    displayName: Push APIM changes to ${{ parameters.ENV_CHOICE }}
    jobs:
    • deployment: push_APIM_changes_to_${{ parameters.ENV_CHOICE }}
      displayName: Push APIM changes to ${{ parameters.ENV_CHOICE }}
      pool:
      vmImage: ubuntu-latest
      environment: ${{ variables.ENV_NAME }}
      strategy:
      runOnce:
      deploy:
      steps:
      - template: run-publisher-with-env.yml
      parameters:
      API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH: ${{ variables.API_OUTPUT_FOLDER_PATH }}
      RESOURCE_GROUP_NAME: ${{ variables.RG_NAME }}
      API_MANAGEMENT_SERVICE_NAME: ${{ variables.APIM_INSTANCE_NAME }}
      CONFIGURATION_YAML_PATH: $(Build.SourcesDirectory)/tools/configs/${{ parameters.LOCATION_NAME }}/configuration.${{ parameters.ENV_CHOICE }}.yaml
      #CONFIGURATION_YAML_PATH: $(Build.SourcesDirectory)/tools/configs/cus/configuration.qa.yaml
      ENVIRONMENT: ${{ variables.ENV_NAME }}
      COMMIT_ID: ${{ parameters.COMMIT_ID }}
      SERVICE_CONNECTION_NAME: ${{ variables.SERVICE_CONN_NAME }}

this is my publisher-with-env.yml:

parameters:

  • name: API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH
    type: string
    displayName: Folder where the artifacts reside
    default: "artifacts"
  • name: ENVIRONMENT
    type: string
    displayName: Environment to display
  • name: RESOURCE_GROUP_NAME
    default: ant-rg-apim-poc
    type: string
    displayName: Resource Group Name
  • name: API_MANAGEMENT_SERVICE_NAME
    type: string
    displayName: APIM Instance Name
    default: ""
  • name: CONFIGURATION_YAML_PATH
    type: string
    displayName: Optional configuration file (target environment publishing into)
  • name: COMMIT_ID
    type: string
    default: publish-artifacts-in-last-commit
  • name: SERVICE_CONNECTION_NAME
    type: string
    default: ARS-ApiOps

steps:

  • script: echo Provided configuration was ${{ parameters.CONFIGURATION_YAML_PATH }}
    displayName: Print the name of the yaml configuration file if provided

  • script: echo Provided app service name was ${{ parameters.API_MANAGEMENT_SERVICE_NAME }}
    displayName: Print the name of the apim service name if provided

  • checkout: self
    fetchDepth: 0

  • task: AzureCLI@2
    displayName: Set publishing variables
    inputs:
    azureSubscription: "${{parameters.SERVICE_CONNECTION_NAME}}"
    scriptType: pscore
    scriptLocation: inlineScript
    inlineScript: |
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"
    $VerbosePreference = "Continue"
    $InformationPreference = "Continue"

    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_BEARER_TOKEN]$(az account get-access-token --query "accessToken" --output tsv)"
    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_CLIENT_ID]$env:servicePrincipalId"
    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_CLIENT_SECRET]$env:servicePrincipalKey"
    Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_TENANT_ID]$env:tenantId"
    if (-not $env:AZURE_SUBSCRIPTION_ID) {
      $subscriptionCount = az account list --query "length([])" --output tsv
      if ($subscriptionCount -eq 1) {
          $subscriptionId = az account list --query "[0].id" --output tsv
          Write-Host "Setting AZURE_SUBSCRIPTION_ID environment variable to: $subscriptionId"
          Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_SUBSCRIPTION_ID]$($subscriptionId)"
      } 
      elseif ($subscriptionCount -gt 1) {
          Write-Host "Multiple subscriptions are accessible. Please set the AZURE_SUBSCRIPTION_ID environment variable manually."
          exit 1
      }
    }
    else {
      Write-Host "AZURE_SUBSCRIPTION_ID is already set to: $env:AZURE_SUBSCRIPTION_ID"
    }
    

    addSpnToEnvironment: true
    failOnStandardError: true

  • ${{ if ne(parameters.CONFIGURATION_YAML_PATH, '') }}:

    • task: qetza.replacetokens.replacetokens-task.replacetokens@6
      displayName: "Perform namevalue secret substitution in ${{ parameters.CONFIGURATION_YAML_PATH }}"
      inputs:
      sources: ${{ parameters.CONFIGURATION_YAML_PATH }}
      encoding: "auto"
      addBOM: true
      logLevel: "off"
      missingVarLog: "warn"
      missingVarAction: "none"
      tokenPrefix: "{#"
      tokenSuffix: "#}"
  • task: PowerShell@2
    displayName: Fetch publisher
    inputs:
    targetType: "inline"
    script: |
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"
    $VerbosePreference = "Continue"
    $InformationPreference = "Continue"

    Write-Information "Downloading publisher..."
    $publisherFileName = "publisher.linux-x64"
    $publisherFinalFileName = "publisher"
    if ("$(Agent.OS)" -like "*win*") {
      $publisherFileName = "publisher.win-x64.exe"
      $publisherFinalFileName = "publisher.exe"
    }
    elseif ("$(Agent.OS)" -like "*mac*" -and "$(Agent.OSArchitecture)" -like "*arm*") {
      $publisherFileName = "publisher.osx-arm64"
    }
    elseif ("$(Agent.OS)" -like "*mac*" -and "$(Agent.OSArchitecture)" -like "*x86_64*") {
      $publisherFileName = "publisher.osx-x64"
    }
    
    $uri = "https://github.com/Azure/apiops/releases/download/$(apiops_release_version)/$publisherFileName"
    $destinationFilePath = Join-Path "$(Agent.TempDirectory)" $publisherFinalFileName
    Invoke-WebRequest -Uri "$uri" -OutFile "$destinationFilePath"
    
    if ("$(Agent.OS)" -like "*linux*")
    {
      Write-Information "Setting file permissions..."
      & chmod +x "$destinationFilePath"
      if ($LASTEXITCODE -ne 0) { throw "Setting file permissions failed."}
    }
    
    Write-Host "##vso[task.setvariable variable=PUBLISHER_FILE_PATH]$destinationFilePath"
    Write-Information "Execution complete."
    

    failOnStderr: true
    pwsh: true

  • task: PowerShell@2
    displayName: Run publisher for ${{ parameters.ENVIRONMENT}} environment
    inputs:
    targetType: "inline"
    script: |
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"
    $VerbosePreference = "Continue"
    $InformationPreference = "Continue"

    & "$(PUBLISHER_FILE_PATH)"                
    if ($LASTEXITCODE -ne 0) { throw "Running publisher failed."}
    
    Write-Information "Execution complete."
    

    failOnStderr: true
    pwsh: true
    env:
    AZURE_BEARER_TOKEN: $(AZURE_BEARER_TOKEN)
    AZURE_CLIENT_ID: $(AZURE_CLIENT_ID)
    AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET)
    AZURE_TENANT_ID: $(AZURE_TENANT_ID)
    AZURE_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID)
    AZURE_RESOURCE_GROUP_NAME: ${{ parameters.RESOURCE_GROUP_NAME }}
    API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH: $(Build.SourcesDirectory)/${{ parameters.API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH }}
    ${{ if ne( parameters['API_MANAGEMENT_SERVICE_NAME'], '' ) }}:
    API_MANAGEMENT_SERVICE_NAME: ${{ parameters.API_MANAGEMENT_SERVICE_NAME }}
    ${{ if eq( parameters['COMMIT_ID'], 'publish-artifacts-in-last-commit' ) }}:
    COMMIT_ID: $(Build.SourceVersion)
    ${{ if ne( parameters['CONFIGURATION_YAML_PATH'], '' ) }}:
    CONFIGURATION_YAML_PATH: ${{ parameters.CONFIGURATION_YAML_PATH }}

check this above mentioned files and provide the steps.

主要语言
C#
星标
448
派生
247
PR 合并指标
30 天内没有已合并 PR

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

Azure/apiops 的其他 Issue

查看 Azure/apiops 的全部 Issue

相似的 Issue

更多 C# Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。