如何通过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
相关产品推荐
相关产品推荐

