Skip to content

Commit a9d0cfb

Browse files
committed
fix CI validation for project deployment tags
Avoid gosec taint-analysis blowups from debug logging and update the provision-state playback recording with the project tag emitted by the first upgraded deployment. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f8fec20-564b-4f35-8720-6c8f88bc9f08
1 parent 46ac592 commit a9d0cfb

2 files changed

Lines changed: 30 additions & 23 deletions

File tree

cli/azd/pkg/infra/deployment_manager.go

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"context"
88
"errors"
99
"fmt"
10-
"log"
1110
"slices"
1211
"strings"
1312

@@ -118,27 +117,15 @@ func (dm *DeploymentManager) CompletedDeployments(
118117
continue
119118
}
120119

121-
projectTag, projectTagHas := deployment.Tags[azure.TagKeyAzdProjectName]
122-
if projectName != "" && projectTagHas {
123-
if projectTag == nil || *projectTag != projectName {
124-
// A deployment explicitly owned by another project must never be
125-
// considered by the legacy matching strategies below.
126-
continue
127-
}
120+
projectTag, projectTagHas := deploymentTag(deployment, azure.TagKeyAzdProjectName)
121+
if projectName != "" && projectTagHas && projectTag != projectName {
122+
// A deployment explicitly owned by another project must never be
123+
// considered by the legacy matching strategies below.
124+
continue
128125
}
129126

130-
envTag, envTagHas := deployment.Tags[azure.TagKeyAzdEnvName]
131-
layerTag, layerTagHas := deployment.Tags[azure.TagKeyAzdLayerName]
132-
133-
tagsMatch := envTagHas && envTag != nil && *envTag == envName &&
134-
((layerTagHas && layerTag != nil && *layerTag == layerName) ||
135-
(layerName == "" && !layerTagHas))
136-
137-
if tagsMatch {
127+
if deploymentTagsMatch(deployment, envName, layerName) {
138128
if projectName == "" || projectTagHas {
139-
log.Printf(
140-
"completedDeployments: matched deployment '%s' using projectName: %s, envName: %s, layerName: %s",
141-
deployment.Name, projectName, envName, layerName)
142129
return []*azapi.ResourceDeployment{deployment}, nil
143130
}
144131

@@ -161,9 +148,6 @@ func (dm *DeploymentManager) CompletedDeployments(
161148
}
162149

163150
if legacyDeployment != nil {
164-
log.Printf(
165-
"completedDeployments: matched legacy deployment '%s' using envName: %s, layerName: %s",
166-
legacyDeployment.Name, envName, layerName)
167151
return []*azapi.ResourceDeployment{legacyDeployment}, nil
168152
}
169153

@@ -173,3 +157,26 @@ func (dm *DeploymentManager) CompletedDeployments(
173157

174158
return matchingDeployments, nil
175159
}
160+
161+
func deploymentTag(deployment *azapi.ResourceDeployment, key string) (string, bool) {
162+
value, hasTag := deployment.Tags[key]
163+
if !hasTag || value == nil {
164+
return "", false
165+
}
166+
167+
return *value, true
168+
}
169+
170+
func deploymentTagsMatch(deployment *azapi.ResourceDeployment, envName string, layerName string) bool {
171+
envTag, hasEnvTag := deploymentTag(deployment, azure.TagKeyAzdEnvName)
172+
if !hasEnvTag || envTag != envName {
173+
return false
174+
}
175+
176+
layerTag, hasLayerTag := deploymentTag(deployment, azure.TagKeyAzdLayerName)
177+
if hasLayerTag {
178+
return layerTag == layerName
179+
}
180+
181+
return layerName == ""
182+
}

cli/azd/test/functional/testdata/recordings/Test_CLI_ProvisionStateWithDown.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,7 @@ interactions:
863863
trailer: {}
864864
content_length: 963717
865865
uncompressed: false
866-
body: '{"nextLink":"https://management.azure.com/subscriptions/5ca082f3-38f2-4bb0-b0a4-c401184ae3a8/providers/Microsoft.Resources/deployments/?api-version=2021-04-01\u0026%24skiptoken=1c%2fBbsIwDAbgZ2nORUqAw9RbRzypjLgksTX1iKaOFVAqbUVtivruW4d4iJ1s%2bf8P%2fm7ivQ1dE66HrmkDtec6fIvsJiD3xH45r6Eeuv3hq2vmxmsdRSZU8pRYgmhktRDpX8O1%2fSNTapkg47PRx%2bhOZiyhigjbjYGit%2bQ06nwwdJSWebT0%2beEUljsv%2b1LzGrWVpTbSkBmROJqTUSYqIolbywMxvHg%2fttFpWCFVKxyL3wkLMaUiZ08u3xX5%2fLzIwvVyScUbeAJ25R4elzvtX8lmxAZw1rG%2fO6bpBw%3d%3d","value":[{"id":"/subscriptions/5ca082f3-38f2-4bb0-b0a4-c401184ae3a8/providers/Microsoft.Resources/deployments/azdtest-d7f3516-1775755989","location":"eastus2","name":"azdtest-d7f3516-1775755989","properties":{"correlationId":"cb0b7914b98a4a7b9ef35b04586ed120","dependencies":[{"dependsOn":[{"id":"/subscriptions/5ca082f3-38f2-4bb0-b0a4-c401184ae3a8/resourceGroups/rg-azdtest-d7f3516","resourceName":"rg-azdtest-d7f3516","resourceType":"Microsoft.Resources/resourceGroups"}],"id":"/subscriptions/5ca082f3-38f2-4bb0-b0a4-c401184ae3a8/resourceGroups/rg-azdtest-d7f3516/providers/Microsoft.Resources/deployments/resources","resourceName":"resources","resourceType":"Microsoft.Resources/deployments"}],"duration":"PT26.5307597S","mode":"Incremental","outputResources":[{"id":"/subscriptions/5ca082f3-38f2-4bb0-b0a4-c401184ae3a8/resourceGroups/rg-azdtest-d7f3516"},{"id":"/subscriptions/5ca082f3-38f2-4bb0-b0a4-c401184ae3a8/resourceGroups/rg-azdtest-d7f3516/providers/Microsoft.Storage/storageAccounts/sthgngsljiw7i2k"}],"outputs":{"arraY_INT":{"type":"Array","value":[1,2,3]},"arraY_PARAM":{"type":"Array","value":[]},"arraY_STRING":{"type":"Array","value":["elem1","elem2","elem3"]},"array":{"type":"Array","value":[true,"abc",1234]},"azurE_STORAGE_ACCOUNT_ID":{"type":"String","value":"/subscriptions/5ca082f3-38f2-4bb0-b0a4-c401184ae3a8/resourceGroups/rg-azdtest-d7f3516/providers/Microsoft.Storage/storageAccounts/sthgngsljiw7i2k"},"azurE_STORAGE_ACCOUNT_NAME":{"type":"String","value":"sthgngsljiw7i2k"},"bool":{"type":"Bool","value":true},"int":{"type":"Int","value":1234},"nullableParamOutput":{"type":"String"},"objecT_PARAM":{"type":"Object","value":{}},"object":{"type":"Object","value":{"array":[true,"abc",1234],"foo":"bar","inner":{"foo":"bar"}}},"string":{"type":"String","value":"abc"}},"parameters":{"arrayValue":{"type":"Array","value":[]},"boolTagValue":{"type":"Bool","value":false},"deleteAfterTime":{"type":"String","value":"2026-04-09T18:33:28Z"},"environmentName":{"type":"String","value":"azdtest-d7f3516"},"intTagValue":{"type":"Int","value":678},"location":{"type":"String","value":"eastus2"},"nullableParam":{"type":"String"},"objectValue":{"type":"Object","value":{}},"secureObject":{"type":"SecureObject"},"secureValue":{"type":"SecureString"}},"providers":[{"namespace":"Microsoft.Resources","resourceTypes":[{"locations":["eastus2"],"resourceType":"resourceGroups"},{"locations":[null],"resourceType":"deployments"}]}],"provisioningState":"Succeeded","templateHash":"4488259817381607990","timestamp":"2026-04-09T17:33:55.2995246Z"},"tags":{"azd-env-name":"azdtest-d7f3516","azd-layer-name":"","azd-provision-param-hash":"d965096b5a2205f3c41c9af8184c507340547db22c4a12560b723511d771a960"},"type":"Microsoft.Resources/deployments"}]}'
866+
body: '{"nextLink":"https://management.azure.com/subscriptions/5ca082f3-38f2-4bb0-b0a4-c401184ae3a8/providers/Microsoft.Resources/deployments/?api-version=2021-04-01\u0026%24skiptoken=1c%2fBbsIwDAbgZ2nORUqAw9RbRzypjLgksTX1iKaOFVAqbUVtivruW4d4iJ1s%2bf8P%2fm7ivQ1dE66HrmkDtec6fIvsJiD3xH45r6Eeuv3hq2vmxmsdRSZU8pRYgmhktRDpX8O1%2fSNTapkg47PRx%2bhOZiyhigjbjYGit%2bQ06nwwdJSWebT0%2beEUljsv%2b1LzGrWVpTbSkBmROJqTUSYqIolbywMxvHg%2fttFpWCFVKxyL3wkLMaUiZ08u3xX5%2fLzIwvVyScUbeAJ25R4elzvtX8lmxAZw1rG%2fO6bpBw%3d%3d","value":[{"id":"/subscriptions/5ca082f3-38f2-4bb0-b0a4-c401184ae3a8/providers/Microsoft.Resources/deployments/azdtest-d7f3516-1775755989","location":"eastus2","name":"azdtest-d7f3516-1775755989","properties":{"correlationId":"cb0b7914b98a4a7b9ef35b04586ed120","dependencies":[{"dependsOn":[{"id":"/subscriptions/5ca082f3-38f2-4bb0-b0a4-c401184ae3a8/resourceGroups/rg-azdtest-d7f3516","resourceName":"rg-azdtest-d7f3516","resourceType":"Microsoft.Resources/resourceGroups"}],"id":"/subscriptions/5ca082f3-38f2-4bb0-b0a4-c401184ae3a8/resourceGroups/rg-azdtest-d7f3516/providers/Microsoft.Resources/deployments/resources","resourceName":"resources","resourceType":"Microsoft.Resources/deployments"}],"duration":"PT26.5307597S","mode":"Incremental","outputResources":[{"id":"/subscriptions/5ca082f3-38f2-4bb0-b0a4-c401184ae3a8/resourceGroups/rg-azdtest-d7f3516"},{"id":"/subscriptions/5ca082f3-38f2-4bb0-b0a4-c401184ae3a8/resourceGroups/rg-azdtest-d7f3516/providers/Microsoft.Storage/storageAccounts/sthgngsljiw7i2k"}],"outputs":{"arraY_INT":{"type":"Array","value":[1,2,3]},"arraY_PARAM":{"type":"Array","value":[]},"arraY_STRING":{"type":"Array","value":["elem1","elem2","elem3"]},"array":{"type":"Array","value":[true,"abc",1234]},"azurE_STORAGE_ACCOUNT_ID":{"type":"String","value":"/subscriptions/5ca082f3-38f2-4bb0-b0a4-c401184ae3a8/resourceGroups/rg-azdtest-d7f3516/providers/Microsoft.Storage/storageAccounts/sthgngsljiw7i2k"},"azurE_STORAGE_ACCOUNT_NAME":{"type":"String","value":"sthgngsljiw7i2k"},"bool":{"type":"Bool","value":true},"int":{"type":"Int","value":1234},"nullableParamOutput":{"type":"String"},"objecT_PARAM":{"type":"Object","value":{}},"object":{"type":"Object","value":{"array":[true,"abc",1234],"foo":"bar","inner":{"foo":"bar"}}},"string":{"type":"String","value":"abc"}},"parameters":{"arrayValue":{"type":"Array","value":[]},"boolTagValue":{"type":"Bool","value":false},"deleteAfterTime":{"type":"String","value":"2026-04-09T18:33:28Z"},"environmentName":{"type":"String","value":"azdtest-d7f3516"},"intTagValue":{"type":"Int","value":678},"location":{"type":"String","value":"eastus2"},"nullableParam":{"type":"String"},"objectValue":{"type":"Object","value":{}},"secureObject":{"type":"SecureObject"},"secureValue":{"type":"SecureString"}},"providers":[{"namespace":"Microsoft.Resources","resourceTypes":[{"locations":["eastus2"],"resourceType":"resourceGroups"},{"locations":[null],"resourceType":"deployments"}]}],"provisioningState":"Succeeded","templateHash":"4488259817381607990","timestamp":"2026-04-09T17:33:55.2995246Z"},"tags":{"azd-env-name":"azdtest-d7f3516","azd-layer-name":"","azd-project-name":"storage","azd-provision-param-hash":"d965096b5a2205f3c41c9af8184c507340547db22c4a12560b723511d771a960"},"type":"Microsoft.Resources/deployments"}]}'
867867
headers:
868868
Cache-Control:
869869
- no-cache

0 commit comments

Comments
 (0)