Azure / Azure/apiops

[BUG] One or more fields contain incorrect values:","details":[{"code":"ValidationError","target":"name","message":"Tag with the same name already exists.

Đang mở
#855 3 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
C#
Star
448
Fork
247
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

### Release version

APIOps release version 6.0.2

### Describe the bug

##[error]Unhandled exception. System.Net.Http.HttpRequestException: HTTP request to URI https://management.azure.com/subscriptions/***/resourceGroups/prd-int-it-rg-eaiapim/providers/Microsoft.ApiManagement/service/prd-eaiapimint-apim-01/tags/programs-673e0548c5f6294c3c3daf2f?api-version=2023-09-01-preview failed with status code 400. Content is '{"error":{"code":"ValidationError","message":"One or more fields contain incorrect values:","details":[{"code":"ValidationError","target":"name","message":"Tag with the same name already exists."}]}}'.

### Expected behavior

I am trying to publish artifacts from test to prod. This APIM instance already exist and it should be fine and I should be able to overwrite the instance somehow.

### Actual behavior

But it keeps failing with these errors that already exist, It should overwrite it without complaining. I am try to sync the changes from test to PROD.

### Reproduction Steps

parameters:
- name: API_MANAGEMENT_SERVICE_OUTPUT_FOLDER_PATH
type: string
displayName: Folder where the artifacts reside
- name: ENVIRONMENT
type: string
displayName: Environment to display
- name: RESOURCE_GROUP_NAME
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
default: ""
- name: SUBSCRIPTION_ID
type: string
displayName: Azure Subscription ID
default: ""
- name: COMMIT_ID
type: string
default: publish-artifacts-in-last-commit

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: "$(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"
$paramSubscriptionId = "${{ parameters.SUBSCRIPTION_ID }}"
if ($paramSubscriptionId) {
Write-Host "Using subscription ID from parameter: $paramSubscriptionId"
Write-Host "##vso[task.setvariable issecret=true;variable=AZURE_SUBSCRIPTION_ID]$paramSubscriptionId"
}
elseif (-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

# replacetokens@6 task will need to be installed to use
- ${{ 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
verbosity: "off"
missingVarAction: "none"
missingVarLog: "warn"
tokenPattern: "custom"
tokenPrefix: "{#"
tokenSuffix: "#}"

- task: PowerShell@2
displayName: Fetch publisher
inputs:
targetType: "inline"
script: |
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
$VerbosePreference = "Continue"
$InformationPreference = "Continue"

Write-Information "Setting name variables..."
$releaseFileName = "publisher-linux-x64.zip"
$executableFileName = "publisher"

if ("$(Agent.OS)" -like "*win*") {
$releaseFileName = "publisher-win-x64.zip"
$executableFileName = "publisher.exe"
}
elseif ("$(Agent.OS)" -like "*mac*" -and "$(Agent.OSArchitecture)" -like "*arm*") {
$releaseFileName = "publisher-osx-arm64.zip"
}
elseif ("$(Agent.OS)" -like "*mac*" -and "$(Agent.OSArchitecture)" -like "*x86_64*") {
$releaseFileName = "publisher-osx-x64.zip"
}

Write-Information "Downloading release..."
$uri = "https://github.com/Azure/apiops/releases/download/$(apiops_release_version)/$releaseFileName"
$downloadFilePath = Join-Path "$(Agent.TempDirectory)" $releaseFileName
Invoke-WebRequest -Uri "$uri" -OutFile "$downloadFilePath"

Write-Information "Extracting release..."
$executableFolderPath = Join-Path "$(Agent.TempDirectory)" "publisher"
Expand-Archive -Path "$downloadFilePath" -DestinationPath "$executableFolderPath"
$executableFilePath = Join-Path "$executableFolderPath" $executableFileName

Write-Information "Setting file permissions..."
if ("$(Agent.OS)" -like "*linux*")
{
& chmod +x "$executableFilePath"
if ($LASTEXITCODE -ne 0) { throw "Setting file permissions failed."}
}

Write-Host "##vso[task.setvariable variable=PUBLISHER_FILE_PATH]$executableFilePath"
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 }}

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Bắt đầu bằng cách tái hiện lỗi với pipeline Azure DevOps được hiển thị và tệp thực thi publisher trên một phiên bản APIM có chứa một tag hiện có. Đọc phần xử lý tag API Management của publisher và xác minh rằng quá trình đồng bộ hóa cập nhật hoặc thay thế an toàn các tag trùng lặp; công việc được xem là hoàn tất khi việc phát hành các tạo tác kiểm thử lên môi trường production thành công mà không có lỗi xác thực tên trùng lặp.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
azure, csharp, powershell
Lĩnh vực
api, ci-cd, cloud
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
42/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.