Skip to content

Commit 31c4176

Browse files
h9jianggopherbot
authored andcommitted
internal/task: upload generated package extension to release asset
Add a new method UploadReleaseAsset to GitHubClient interface. The method can upload a file in form of fs.File to a GitHub release as a release asset. A local relui screenshot is at golang/vscode-go#3500 (comment) For golang/vscode-go#3500 Change-Id: I16f48573fbb2e3c76d8c5c91bc80ab09c7653e25 Reviewed-on: https://go-review.googlesource.com/c/build/+/613596 LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]> Reviewed-by: Hyang-Ah Hana Kim <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]> Auto-Submit: Hongxiang Jiang <[email protected]>
1 parent 591f2af commit 31c4176

File tree

4 files changed

+74
-8
lines changed

4 files changed

+74
-8
lines changed

internal/task/fakes.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,6 +1027,10 @@ func (f *FakeGitHub) FetchMilestoneIssues(_ context.Context, owner, repo string,
10271027
return issueLabels, nil
10281028
}
10291029

1030+
func (*FakeGitHub) UploadReleaseAsset(ctx context.Context, owner, repo string, releaseID int64, fileName string, file fs.File) (*github.ReleaseAsset, error) {
1031+
return nil, nil
1032+
}
1033+
10301034
func (*FakeGitHub) CreateRelease(ctx context.Context, owner, repo string, release *github.RepositoryRelease) (*github.RepositoryRelease, error) {
10311035
return nil, nil
10321036
}

internal/task/milestones.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ package task
66

77
import (
88
"context"
9+
"errors"
910
"fmt"
11+
"io/fs"
12+
"net/url"
1013
"sort"
1114
"strings"
1215
"time"
@@ -318,6 +321,18 @@ type GitHubClientInterface interface {
318321

319322
// See github.Client.Repositories.CreateRelease.
320323
CreateRelease(ctx context.Context, owner, repo string, release *github.RepositoryRelease) (*github.RepositoryRelease, error)
324+
325+
// UploadReleaseAsset uploads an fs.File to a GitHub release as a release
326+
// asset.
327+
// It uses NewUploadRequest as github.Client.Repositories.UploadReleaseAsset
328+
// only supports uploading from an os.File.
329+
// Parameters:
330+
// - owner: The account owner of the repository.
331+
// - repo: The name of the repository.
332+
// - releaseID: The ID of the github release.
333+
// - fileName: The name of the asset as it will appear in the release.
334+
// - file: The content of the file to upload.
335+
UploadReleaseAsset(ctx context.Context, owner, repo string, releaseID int64, fileName string, file fs.File) (*github.ReleaseAsset, error)
321336
}
322337

323338
type GitHubClient struct {
@@ -344,6 +359,31 @@ func (c *GitHubClient) FetchMilestone(ctx context.Context, owner, repo, name str
344359
return *m.Number, nil
345360
}
346361

362+
func (c *GitHubClient) UploadReleaseAsset(ctx context.Context, owner, repo string, releaseID int64, fileName string, file fs.File) (*github.ReleaseAsset, error) {
363+
// Query parameter "name" is used to determine the asset name.
364+
// See details https://docs.github.com/en/rest/releases/assets?apiVersion=2022-11-28#upload-a-release-asset
365+
u := fmt.Sprintf("repos/%s/%s/releases/%d/assets?name=%s", owner, repo, releaseID, url.QueryEscape(fileName))
366+
367+
stat, err := file.Stat()
368+
if err != nil {
369+
return nil, err
370+
}
371+
if stat.IsDir() {
372+
return nil, errors.New("the asset to upload can't be a directory")
373+
}
374+
375+
req, err := c.V3.NewUploadRequest(u, file, stat.Size(), "")
376+
if err != nil {
377+
return nil, err
378+
}
379+
380+
asset := new(github.ReleaseAsset)
381+
if _, err = c.V3.Do(ctx, req, asset); err != nil {
382+
return nil, err
383+
}
384+
return asset, nil
385+
}
386+
347387
func (c *GitHubClient) CreateRelease(ctx context.Context, owner, repo string, release *github.RepositoryRelease) (*github.RepositoryRelease, error) {
348388
release, _, err := c.V3.Repositories.CreateRelease(ctx, owner, repo, release)
349389
return release, err

internal/task/releasevscodego.go

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -307,16 +307,12 @@ go run tools/release/release.go package &> go-output.log
307307
cat npm-output.log
308308
cat go-output.log
309309
`
310-
311310
versionString := release.String()
312311
if prerelease != "" {
313312
versionString += "-" + prerelease
314313
}
315-
// The version inside of vsix does not have prefix "v".
316-
vsix := fmt.Sprintf("go-%s.vsix", versionString[1:])
317-
318314
saveScript := cloudBuildClientScriptPrefix
319-
for _, file := range []string{"npm-output.log", "go-output.log", vsix} {
315+
for _, file := range []string{"npm-output.log", "go-output.log", vsixFileName(release, prerelease)} {
320316
saveScript += fmt.Sprintf("gsutil cp %s %s/%s\n", file, resultURL, file)
321317
}
322318
return []*cloudbuildpb.BuildStep{
@@ -406,6 +402,15 @@ func (r *ReleaseVSCodeGoTasks) nextPrereleaseVersion(ctx *wf.TaskContext, releas
406402
return fmt.Sprintf("rc.%v", pre+1), nil
407403
}
408404

405+
func vsixFileName(release releaseVersion, prerelease string) string {
406+
versionString := release.String()
407+
if prerelease != "" {
408+
versionString += "-" + prerelease
409+
}
410+
// The version inside of vsix does not have prefix "v".
411+
return fmt.Sprintf("go-%s.vsix", versionString[1:])
412+
}
413+
409414
func (r *ReleaseVSCodeGoTasks) createGitHubReleaseAsDraft(ctx *wf.TaskContext, release releaseVersion, prerelease string, build CloudBuild) error {
410415
tags, err := r.Gerrit.ListTags(ctx, "vscode-go")
411416
if err != nil {
@@ -438,7 +443,24 @@ func (r *ReleaseVSCodeGoTasks) createGitHubReleaseAsDraft(ctx *wf.TaskContext, r
438443
if err != nil {
439444
return err
440445
}
441-
ctx.Printf("Find the draft release note in %s", draft.GetHTMLURL())
446+
ctx.Printf("Created the draft release note in %s", draft.GetHTMLURL())
447+
448+
outFS, err := r.CloudBuild.ResultFS(ctx, build)
449+
if err != nil {
450+
return err
451+
}
452+
453+
file, err := outFS.Open(vsixFileName(release, prerelease))
454+
if err != nil {
455+
return err
456+
}
457+
458+
asset, err := r.GitHub.UploadReleaseAsset(ctx, "golang", "vscode-go", draft.GetID(), vsixFileName(release, prerelease), file)
459+
if err != nil {
460+
return err
461+
}
462+
463+
ctx.Printf("Uploaded asset %s to release %v as asset ID %v", asset.GetName(), draft.GetID(), asset.GetID())
442464
return nil
443465
}
444466

internal/task/template/vscode-go-pre-release-note.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
**Milestone**: https://github.com/golang/vscode-go/issues?q=milestone%%3A%s
33

44
* How to test prerelease
5-
* Download the .vsix file from this Releases page.
6-
* Navigate to the Extensions view in VS Code (Ctrl+Shift+X). Click on the "..." in the top-right corner, select "Install from VSIX", and select the .vsix file you downloaded. Alternatively, you can run code --install-extension Go-latest.vsix or open the Command Palette and run the "Extensions: Install from VSIX..." command.
5+
* Download the `.vsix` file from this Releases page.
6+
* Navigate to the Extensions view in VS Code (`Ctrl+Shift+X`). Click on the "..." in the top-right corner, select "Install from VSIX", and select the `.vsix` file you downloaded. Alternatively, you can run `code --install-extension Go-latest.vsix` or open the Command Palette and run the "Extensions: Install from VSIX..." command.
77
* If prompted, reload VS Code.

0 commit comments

Comments
 (0)