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

如何通过C#代码为Azure DevOps工件关联并上传文件?

解决Azure DevOps工件上传文件的问题

你当前的代码存在核心问题:直接把本地文件路径赋值给ArtifactResource.Data是无效的——Azure DevOps服务器无法访问你的本地文件系统。要完成文件上传,需要先把文件上传到Azure DevOps提供的临时Blob存储,再将这个Blob的关联信息绑定到工件上。

以下是修改后的完整代码,包含文件上传和工件创建的完整流程:

using Microsoft.VisualStudio.Services.Artifacts.WebApi;
using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.WebApi;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;

class Program
{
    static async Task Main(string[] args)
    {
        string collectionUri = "https://dev.azure.com/yourorganization";
        string project = "YourProjectName";
        string buildId = "123";
        string artifactName = "MyArtifact";
        string localPath = @"C:\path\to\your\file.txt";
        string pat = "YourPersonalAccessToken"; // 替换为你的PAT

        // 建立VSS连接
        var connection = new VssConnection(new Uri(collectionUri), new VssBasicCredential(string.Empty, pat));
        
        // 获取Artifact客户端和Build客户端
        var artifactClient = connection.GetClient<ArtifactHttpClient>();
        var buildClient = connection.GetClient<BuildHttpClient>();

        // 1. 创建工件的临时上传位置(获取Blob上传URL)
        var uploadRequest = new PackageUploadRequest
        {
            Type = "FilePath",
            Name = Path.GetFileName(localPath),
            ContainerId = $"build_{buildId}"
        };
        var uploadResponse = await artifactClient.CreateUploadAsync(uploadRequest, project);

        // 2. 上传本地文件到获取到的Blob URL
        using (var httpClient = new HttpClient())
        using (var fileStream = File.OpenRead(localPath))
        using (var content = new StreamContent(fileStream))
        {
            content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");
            var uploadResult = await httpClient.PutAsync(uploadResponse.UploadUrl, content);
            uploadResult.EnsureSuccessStatusCode(); // 确保上传成功
        }

        // 3. 创建并关联工件到已上传的文件
        var artifactResource = new ArtifactResource
        {
            Type = "FilePath",
            Data = uploadResponse.Resource.Data,
            Properties = uploadResponse.Resource.Properties
        };

        var buildArtifact = new BuildArtifact
        {
            Name = artifactName,
            Resource = artifactResource
        };

        // 发布工件
        await buildClient.CreateArtifactAsync(buildArtifact, project, int.Parse(buildId));

        Console.WriteLine("工件创建并上传文件成功!");
    }
}

关键步骤说明:

  • 获取上传URL:通过ArtifactHttpClient.CreateUploadAsync请求Azure DevOps生成一个临时的Blob上传地址,这个地址是服务器可访问的。
  • 上传文件到Blob:用标准的HttpClient把本地文件PUT到这个临时URL,完成文件上传到Azure DevOps的存储系统。
  • 关联工件:将上传返回的Resource信息(包含Blob的标识)赋值给ArtifactResource,再创建工件,这样Azure DevOps就能关联到已上传的文件。

注意事项:

  • 确保你的PAT拥有**Build (Read & Write)和Artifacts (Read & Write)**权限。
  • 如果要上传多个文件,建议打包成ZIP文件后上传(减少请求次数),再重复上述流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:43:12