通过 API 提交状态不适用于 Azure Release 中的持续部署触发器

Commit Status not working with Continuous Deployment Trigger in Azure Release via API

我们有一个 Azure 存储库,它会在每次将某些内容推送到主分支时触发发布管道。 触发发布时,它会在 Azure Repos 中的提交右侧显示其状态(成功),如下图所示:

它甚至显示了哪个阶段已经升级等等,这太棒了。当使用以下 CD-Trigger 配置手动配置发布管道时,这一切工作正常:

即使在导出 Pipeline JSON 文件并重新导入它时,一切都按预期工作。

但是,当通过 API 使用完全相同的设置创建版本时,我看不到版本的状态。触发器本身按预期工作,但提交中的状态根本不存在:

有人知道 Release-Pipeline.json 中的哪个确切设置是造成此状态的原因吗?

这是我通过 API 发送的 json 正文的某些部分,其中可能缺少某些内容?

编辑:我想还需要一些信息。我使用 cli 工具创建正文并发送 api 请求。这些值是模板化的。 该模板从以前的 api 调用或用户输入中获取其值。这是完整的模板。我根据手动配置的 relase-pipeline JSON 创建了它(它工作正常并显示了我想要的状态)。

{
"name": "{{.BuildProjectName}}/{{.BuildServiceName}}",
"path": "\",
"isDeleted": false,
"source": "restApi",
"releaseNameFormat": "{{.BuildServiceName}}-$(rev:r)",
"properties": {
    "DefinitionCreationSource": {
        "$type": "System.String",
        "$value": "ReleaseNew"
    },
    "IntegrateBoardsWorkItems": {
        "$type": "System.String",
        "$value": "False"
    },
    "IntegrateJiraWorkItems": {
        "$type": "System.String",
        "$value": "false"
    }
},
"artifacts": [
    {
        "sourceId":  "{{.BuildProjectID}}:{{.BuildRepoID}}",
        "type": "Git",
        "alias": "BuildRepo",
        "definitionReference": {
            "branches": {
                "id": "{{.BuildRepoDefaultBranch}}",
                "name": "{{.BuildRepoDefaultBranch}}"
            },
            "checkoutNestedSubmodules": {
                "id": "True",
                "name": "Any nested submodules within"
            },
            "defaultVersionType": {
                "id": "latestFromBranchType",
                "name": "Latest from the default branch"
            },
            "definition": {
                "id": "{{.BuildRepoID}}",
                "name": "{{.BuildServiceName}}"
            },
            "project": {
                "id": "{{.BuildProjectID}}",
                "name": "{{.BuildProjectName}}"
            }
        },
        "isPrimary": true,
        "isRetained": false
    },
    {
        "type": "Git",
        "alias": "FluxDeployScript",
        "definitionReference": {
            "branches": {
                "id": "master",
                "name": "master"
            },
            "checkoutNestedSubmodules": {
                "id": "True",
                "name": "Any nested submodules within"
            },
            "defaultVersionType": {
                "id": "latestFromBranchType",
                "name": "Latest from the default branch"
            },
            "definition": {
                "id": "black-washed",
                "name": "azure-pipeline-templates"
            },
            "project": {
                "id": "black-washed",
                "name": "Operations"
            }
        },
        "isRetained": false
    },
    {
        "type": "Build",
        "alias": "BuildPipeline",
        "definitionReference": {
            "defaultVersionType": {
                "id": "latestType",
                "name": "Latest"
            },
            "definition": {
                "id": "{{.BuildPipelineID}}",
                "name": "{{.BuildServiceName}}"
            },
            "IsMultiDefinitionType": {
                "id": "False",
                "name": "False"
            },
            "project": {
                "id": "{{.BuildProjectID}}",
                "name": "{{.BuildProjectName}}"
            }
        },
        "isRetained": false
    }
],
"environments": [
    {
        "name": "dev",
        "rank": 1,
        "conditions": [
            {
                "name": "ReleaseStarted",
                "conditionType": 1,
                "value": ""
            }
        ],
        "deployPhases": [
            {
                "rank": 1,
                "phaseType": 1,
                "name": "Agent job",
                "refName": null,
                "deploymentInput": {
                    "queueId": "{{.QueueID}}",
                    "agentSpecification": {
                        "identifier": "ubuntu-20.04"
                    }
                },
                "workflowTasks": [
                    {
                        "environment": {},
                        "taskId": "2a6ca863-f2ce-4f4d-8bcb-15e64608ec4b",
                        "version": "1.*",
                        "name": "Download flux creds",
                        "refName": "fluxCreds",
                        "enabled": true,
                        "alwaysRun": false,
                        "continueOnError": false,
                        "timeoutInMinutes": 0,
                        "definitionType": "task",
                        "overrideInputs": {},
                        "condition": "succeeded()",
                        "inputs": {
                            "secureFile": "black-washed",
                            "retryCount": "8",
                            "socketTimeout": ""
                        }
                    },
                    {
                        "environment": {
                            "USER_EMAIL": "{{.ApproverMail}}",
                            "ENVIRONMENT": "$(Release.EnvironmentName)",
                            "DESCRIPTION": "$(Release.ReleaseDescription)",
                            "URL": "$(Release.ReleaseWebURL)",
                            "PROJECT": "{{.BuildProjectName}}",
                            "CONTAINER": "{{.BuildServiceName}}",
                            "TAG": "$(Release.Artifacts.BuildPipeline.BuildNumber)",
                            "REPOSITORY": "finodigital.azurecr.io",
                            "WORKLOAD_TYPE": "deployment",
                            "NAMESPACE": "{{.BuildProjectName}}",
                            "WORKLOAD_NAME": "{{.BuildProjectName}}-{{.BuildServiceName}}",
                            "USER_NAME": "{{.ApproverName}}",
                            "FLUX_CREDS": "$(fluxCreds.secureFilePath)"
                        },
                        "taskId": "6c731c3c-3c68-459a-a5c9-bde6e6595b5b",
                        "version": "3.*",
                        "name": "Bash Script",
                        "refName": "",
                        "enabled": true,
                        "alwaysRun": false,
                        "continueOnError": false,
                        "timeoutInMinutes": 0,
                        "definitionType": "task",
                        "overrideInputs": {},
                        "condition": "succeeded()",
                        "inputs": {
                            "targetType": "filePath",
                            "filePath": "$(System.DefaultWorkingDirectory)/FluxDeployScript/flux-release.sh",
                            "arguments": "",
                            "workingDirectory": "",
                            "failOnStderr": "false",
                            "noProfile": "true",
                            "noRc": "true"
                        }
                    }
                ]
            }
        ],
        "retentionPolicy": {
            "daysToKeep": 30,
            "releasesToKeep": 3,
            "retainBuild": true
        },
        "preDeployApprovals": {
            "approvals": [
                {
                    "rank": 1,
                    "isAutomated": true,
                    "isNotificationOn": false
                }
            ],
            "approvalOptions": {
                "requiredApproverCount": null,
                "releaseCreatorCanBeApprover": false,
                "autoTriggeredAndPreviousEnvironmentApprovedCanBeSkipped": false,
                "enforceIdentityRevalidation": false,
                "timeoutInMinutes": 0,
                "executionOrder": 1
            }
        },
        "postDeployApprovals": {
            "approvals": [
                {
                    "rank": 1,
                    "isAutomated": true,
                    "isNotificationOn": false
                }
            ],
            "approvalOptions": {
                "requiredApproverCount": null,
                "releaseCreatorCanBeApprover": false,
                "autoTriggeredAndPreviousEnvironmentApprovedCanBeSkipped": false,
                "enforceIdentityRevalidation": false,
                "timeoutInMinutes": 0,
                "executionOrder": 2
            }
        }
    },
    {
        "name": "test",
        "rank": 2,
        "conditions": [
            {
                "name": "dev",
                "conditionType": 2,
                "value": "4"
            }
        ],
        "deployPhases": [
            {
                "rank": 1,
                "phaseType": 1,
                "name": "Agent job",
                "refName": null,
                "deploymentInput": {
                    "queueId": "{{.QueueID}}",
                    "agentSpecification": {
                        "identifier": "ubuntu-20.04"
                    }
                },
                "workflowTasks": [
                    {
                        "environment": {},
                        "taskId": "2a6ca863-f2ce-4f4d-8bcb-15e64608ec4b",
                        "version": "1.*",
                        "name": "Download flux creds",
                        "refName": "fluxCreds",
                        "enabled": true,
                        "alwaysRun": false,
                        "continueOnError": false,
                        "timeoutInMinutes": 0,
                        "definitionType": "task",
                        "overrideInputs": {},
                        "condition": "succeeded()",
                        "inputs": {
                            "secureFile": "black-washed",
                            "retryCount": "8",
                            "socketTimeout": ""
                        }
                    },
                    {
                        "environment": {
                            "USER_EMAIL": "{{.ApproverMail}}",
                            "ENVIRONMENT": "$(Release.EnvironmentName)",
                            "DESCRIPTION": "$(Release.ReleaseDescription)",
                            "URL": "$(Release.ReleaseWebURL)",
                            "PROJECT": "{{.BuildProjectName}}",
                            "CONTAINER": "{{.BuildServiceName}}",
                            "TAG": "$(Release.Artifacts.BuildPipeline.BuildNumber)",
                            "REPOSITORY": "finodigital.azurecr.io",
                            "WORKLOAD_TYPE": "deployment",
                            "NAMESPACE": "{{.BuildProjectName}}",
                            "WORKLOAD_NAME": "{{.BuildProjectName}}-{{.BuildServiceName}}",
                            "USER_NAME": "{{.ApproverName}}",
                            "FLUX_CREDS": "$(fluxCreds.secureFilePath)"
                        },
                        "taskId": "6c731c3c-3c68-459a-a5c9-bde6e6595b5b",
                        "version": "3.*",
                        "name": "Bash Script",
                        "refName": "",
                        "enabled": true,
                        "alwaysRun": false,
                        "continueOnError": false,
                        "timeoutInMinutes": 0,
                        "definitionType": "task",
                        "overrideInputs": {},
                        "condition": "succeeded()",
                        "inputs": {
                            "targetType": "filePath",
                            "filePath": "$(System.DefaultWorkingDirectory)/FluxDeployScript/flux-release.sh",
                            "arguments": "",
                            "workingDirectory": "",
                            "failOnStderr": "false",
                            "noProfile": "true",
                            "noRc": "true"
                        }
                    }
                ]
            }
        ],
        "retentionPolicy": {
            "daysToKeep": 30,
            "releasesToKeep": 3,
            "retainBuild": true
        },
        "preDeployApprovals": {
            "approvals": [
                {
                    "rank": 1,
                    "isAutomated": false,
                    "isNotificationOn": false,
                    "approver": {
                        "displayName": null,
                        "id": "{{.ApproverID}}"
                    }
                }
            ],
            "approvalOptions": {
                "requiredApproverCount": null,
                "releaseCreatorCanBeApprover": false,
                "autoTriggeredAndPreviousEnvironmentApprovedCanBeSkipped": false,
                "enforceIdentityRevalidation": false,
                "timeoutInMinutes": 0,
                "executionOrder": 1
            }
        },
        "postDeployApprovals": {
            "approvals": [
                {
                    "rank": 1,
                    "isAutomated": true,
                    "isNotificationOn": false
                }
            ],
            "approvalOptions": {
                "requiredApproverCount": null,
                "releaseCreatorCanBeApprover": false,
                "autoTriggeredAndPreviousEnvironmentApprovedCanBeSkipped": false,
                "enforceIdentityRevalidation": false,
                "timeoutInMinutes": 0,
                "executionOrder": 2
            }
        }
    },
    {
        "name": "prod",
        "rank": 3,
        "conditions": [
            {
                "name": "test",
                "conditionType": 2,
                "value": "4"
            }
        ],
        "deployPhases": [
            {
                "rank": 1,
                "phaseType": 1,
                "name": "Agent job",
                "refName": null,
                "deploymentInput": {
                    "queueId": "{{.QueueID}}",
                    "agentSpecification": {
                        "identifier": "ubuntu-20.04"
                    }
                },
                "workflowTasks": [
                    {
                        "environment": {},
                        "taskId": "2a6ca863-f2ce-4f4d-8bcb-15e64608ec4b",
                        "version": "1.*",
                        "name": "Download flux creds",
                        "refName": "fluxCreds",
                        "enabled": true,
                        "alwaysRun": false,
                        "continueOnError": false,
                        "timeoutInMinutes": 0,
                        "definitionType": "task",
                        "overrideInputs": {},
                        "condition": "succeeded()",
                        "inputs": {
                            "secureFile": "black-wahsed",
                            "retryCount": "8",
                            "socketTimeout": ""
                        }
                    },
                    {
                        "environment": {
                            "USER_EMAIL": "{{.ApproverMail}}",
                            "ENVIRONMENT": "$(Release.EnvironmentName)",
                            "DESCRIPTION": "$(Release.ReleaseDescription)",
                            "URL": "$(Release.ReleaseWebURL)",
                            "PROJECT": "{{.BuildProjectName}}",
                            "CONTAINER": "{{.BuildServiceName}}",
                            "TAG": "$(Release.Artifacts.BuildPipeline.BuildNumber)",
                            "REPOSITORY": "finodigital.azurecr.io",
                            "WORKLOAD_TYPE": "deployment",
                            "NAMESPACE": "{{.BuildProjectName}}",
                            "WORKLOAD_NAME": "{{.BuildProjectName}}-{{.BuildServiceName}}",
                            "USER_NAME": "{{.ApproverName}}",
                            "FLUX_CREDS": "$(fluxCreds.secureFilePath)"
                        },
                        "taskId": "6c731c3c-3c68-459a-a5c9-bde6e6595b5b",
                        "version": "3.*",
                        "name": "Bash Script",
                        "refName": "",
                        "enabled": true,
                        "alwaysRun": false,
                        "continueOnError": false,
                        "timeoutInMinutes": 0,
                        "definitionType": "task",
                        "overrideInputs": {},
                        "condition": "succeeded()",
                        "inputs": {
                            "targetType": "filePath",
                            "filePath": "$(System.DefaultWorkingDirectory)/FluxDeployScript/flux-release.sh",
                            "arguments": "",
                            "workingDirectory": "",
                            "failOnStderr": "false",
                            "noProfile": "true",
                            "noRc": "true"
                        }
                    }
                ]
            }
        ],
        "retentionPolicy": {
            "daysToKeep": 30,
            "releasesToKeep": 3,
            "retainBuild": true
        },
        "preDeployApprovals": {
            "approvals": [
                {
                    "rank": 1,
                    "isAutomated": false,
                    "isNotificationOn": false,
                    "approver": {
                        "displayName": null,
                        "id": "{{.ApproverID}}"
                    }
                }
            ],
            "approvalOptions": {
                "requiredApproverCount": null,
                "releaseCreatorCanBeApprover": false,
                "autoTriggeredAndPreviousEnvironmentApprovedCanBeSkipped": false,
                "enforceIdentityRevalidation": false,
                "timeoutInMinutes": 0,
                "executionOrder": 1
            }
        },
        "postDeployApprovals": {
            "approvals": [
                {
                    "rank": 1,
                    "isAutomated": true,
                    "isNotificationOn": false
                }
            ],
            "approvalOptions": {
                "requiredApproverCount": null,
                "releaseCreatorCanBeApprover": false,
                "autoTriggeredAndPreviousEnvironmentApprovedCanBeSkipped": false,
                "enforceIdentityRevalidation": false,
                "timeoutInMinutes": 0,
                "executionOrder": 2
            }
        }
    }
],
"triggers": [
    {
        "branchFilters": [
            "{{.BuildRepoDefaultBranch}}"
        ],
        "alias": "BuildRepo",
        "triggerType": 3
    }
]

根据您的描述,我进行了测试,一切正常。

步骤:

通过 REST API Definitions - Get 获取发布定义并复制响应正文。

GET https://vsrm.dev.azure.com/{organization}/{project}/_apis/release/definitions/{definitionId}?api-version=6.1-preview.4

通过 REST 创建新的发布管道 API Definitions - Create

POST https://vsrm.dev.azure.com/{organization}/{project}/_apis/release/definitions?api-version=6.1-preview.4

复制响应主体并将字段name重命名为New release pipeline2,然后将其标记为请求主体。

我正在使用 PostMan。

结果:

更新1

您似乎缺少请求正文中的 environmentOptions 字段,其中包含 publishDeploymentStatus,它控制您缺少的功能。

如果不配置或将值设为false,提交页面将看不到Release的Status。

"environmentOptions": {
                "emailNotificationType": "OnlyOnFailure",
                "emailRecipients": "release.environment.owner;release.creator",
                "skipArtifactsDownload": false,
                "timeoutInMinutes": 0,
                "enableAccessToken": false,
                "publishDeploymentStatus": false,
                "badgeEnabled": false,
                "autoLinkWorkItems": false,
                "pullRequestDeploymentEnabled": false
            },

结果: