You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过API触发Azure DevOps发布管道中的手动部署

解决方案:通过API触发手动发布环境的部署

当发布定义设置为“仅手动”时,仅激活发布并不会自动触发环境部署,需要单独调用API来发起环境的部署操作。你可以使用Azure DevOps .NET SDK中的DeployReleaseEnvironmentAsync方法来实现这一点。

修改后的代码

在你现有代码的基础上,添加触发环境部署的关键逻辑:

public async Task QueueRelease(string releaseDefinitionName)
{
    string teamProjectName = GetTeamProjectName();

    using (var connection = Authenticate())
    using (var releaseClient = connection.GetClient<ReleaseHttpClient2>())
    using (var buildClient = connection.GetClient<BuildHttpClient>())
    {
        var releaseDefinition = (await releaseClient.GetReleaseDefinitionsAsync2(teamProjectName, releaseDefinitionName, ReleaseDefinitionExpands.Artifacts)).SingleOrDefault();
        var primaryArtifact = releaseDefinition.Artifacts.Where(a => a.IsPrimary).SingleOrDefault();
        var projectName = primaryArtifact.DefinitionReference["project"].Id;
        var buildDefinitionId = Convert.ToInt32(primaryArtifact.DefinitionReference["definition"].Id);

        // 获取对应构建定义的最新成功构建
        var lastBuild = (await buildClient.GetBuildsAsync(projectName, new[] { buildDefinitionId }, statusFilter: BuildStatus.Completed))
                                    .OrderByDescending(b => b.Id)
                                    .FirstOrDefault();

        // 创建草稿发布并关联最新构建
        var metadata = new ReleaseStartMetadata
        {
            DefinitionId = releaseDefinition.Id,
            IsDraft = true,
            Description = "Draft",
            Artifacts = new[]
            {
                new ArtifactMetadata
                {
                    Alias = primaryArtifact.Alias,
                    InstanceReference = new BuildVersion
                    {
                        Id = lastBuild.Id.ToString(),
                        Name = lastBuild.BuildNumber
                    }
                }
            }
        };
        var release = await releaseClient.CreateReleaseAsync(metadata, teamProjectName);

        // 激活发布
        var updateMetadata = new ReleaseUpdateMetadata { Status = ReleaseStatus.Active, Comment = "Test release" };
        release = await releaseClient.UpdateReleaseResourceAsync(updateMetadata, teamProjectName, release.Id);

        // 触发第一个环境的部署(核心步骤)
        var targetEnvironment = release.Environments[0];
        var deployMetadata = new ReleaseEnvironmentUpdateMetadata
        {
            Status = EnvironmentStatus.InProgress,
            Comment = "Trigger deployment via API"
        };
        await releaseClient.DeployReleaseEnvironmentAsync(
            teamProjectName, 
            release.Id, 
            targetEnvironment.Id, 
            deployMetadata);
    }
}

关键说明

  • 核心操作是调用DeployReleaseEnvironmentAsync方法,传入项目名、发布ID、目标环境ID和更新元数据,将环境状态设为InProgress,以此模拟门户中点击“部署”的手动操作。
  • 无需修改发布定义的“仅手动”触发设置,API调用完全兼容该配置。
  • 如果需要部署多个环境,只需循环遍历release.Environments集合,对每个环境执行上述部署逻辑即可。

内容的提问来源于stack exchange,提问作者ItFlyingStart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:13:21