Skip to content

Commit 36db46e

Browse files
h9jianggopherbot
authored andcommitted
internal/task: fetch the release issue in gopls release process
The release issue will be referenced by all CLs generated by the gopls release process. For golang/go#57643 Change-Id: Icc44aeab84a7a1fc3c624267cb398729371db068 Reviewed-on: https://go-review.googlesource.com/c/build/+/610236 Auto-Submit: Hongxiang Jiang <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Robert Findley <[email protected]>
1 parent 0988d2a commit 36db46e

File tree

2 files changed

+46
-13
lines changed

2 files changed

+46
-13
lines changed

internal/task/releasegopls.go

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ func (r *ReleaseGoplsTasks) NewPrereleaseDefinition() *wf.Definition {
4747
prerelease := wf.Task1(wd, "find the pre-release version", r.nextPrereleaseVersion, semv)
4848
approved := wf.Action2(wd, "wait for release coordinator approval", r.approveVersion, semv, prerelease)
4949

50-
issue := wf.Task1(wd, "create release git issue", r.createReleaseIssue, semv, wf.After(approved))
50+
issue := wf.Task2(wd, "create release git issue", r.findOrCreateGitHubIssue, semv, wf.Const(true), wf.After(approved))
5151
branchCreated := wf.Action1(wd, "create new branch if minor release", r.createBranchIfMinor, semv, wf.After(issue))
5252

5353
configChangeID := wf.Task3(wd, "update branch's codereview.cfg", r.updateCodeReviewConfig, semv, reviewers, issue, wf.After(branchCreated))
@@ -126,12 +126,13 @@ func (r *ReleaseGoplsTasks) approveVersion(ctx *wf.TaskContext, semv semversion,
126126
return r.ApproveAction(ctx)
127127
}
128128

129-
// createReleaseIssue attempts to locate the release issue associated with the
130-
// given milestone. If no such issue exists, a new one is created.
129+
// findOrCreateGitHubIssue locates or creates the release issue for the given
130+
// release milestone.
131131
//
132-
// Returns the ID of the release issue (either newly created or pre-existing).
133-
// Returns error if the release milestone does not exist or is closed.
134-
func (r *ReleaseGoplsTasks) createReleaseIssue(ctx *wf.TaskContext, semv semversion) (int64, error) {
132+
// If the release issue exists, return the issue ID.
133+
// If 'create' is true and no issue exists, a new one is created.
134+
// If 'create' is false and no issue exists, an error is returned.
135+
func (r *ReleaseGoplsTasks) findOrCreateGitHubIssue(ctx *wf.TaskContext, semv semversion, create bool) (int64, error) {
135136
versionString := fmt.Sprintf("v%v.%v.%v", semv.Major, semv.Minor, semv.Patch)
136137
milestoneName := fmt.Sprintf("gopls/%s", versionString)
137138
// All milestones and issues resides under go repo.
@@ -157,6 +158,11 @@ func (r *ReleaseGoplsTasks) createReleaseIssue(ctx *wf.TaskContext, semv semvers
157158
}
158159
}
159160

161+
if !create {
162+
return 0, fmt.Errorf("could not find any release issue for %s", versionString)
163+
}
164+
165+
ctx.DisableRetries()
160166
content := fmt.Sprintf(`This issue tracks progress toward releasing gopls@%s
161167
162168
- [ ] create or update %s
@@ -635,7 +641,8 @@ func (r *ReleaseGoplsTasks) NewReleaseDefinition() *wf.Definition {
635641
semv := wf.Task1(wd, "validating input version", r.isValidPrereleaseVersion, version)
636642
tagged := wf.Action1(wd, "tag the release", r.tagRelease, semv)
637643

638-
changeID := wf.Task2(wd, "updating x/tools dependency in master branch in gopls sub dir", r.updateDependencyIfMinor, reviewers, semv, wf.After(tagged))
644+
issue := wf.Task2(wd, "find release git issue", r.findOrCreateGitHubIssue, semv, wf.Const(false))
645+
changeID := wf.Task3(wd, "updating x/tools dependency in master branch in gopls sub dir", r.updateDependencyIfMinor, reviewers, semv, issue, wf.After(tagged))
639646
_ = wf.Task1(wd, "await x/tools gopls dependency CL submission in gopls sub dir", clAwaiter{r.Gerrit}.awaitSubmission, changeID)
640647

641648
return wd
@@ -739,7 +746,7 @@ func (r *ReleaseGoplsTasks) tagRelease(ctx *wf.TaskContext, semv semversion) err
739746
// branch.
740747
//
741748
// Returns the change ID.
742-
func (r *ReleaseGoplsTasks) updateDependencyIfMinor(ctx *wf.TaskContext, reviewers []string, semv semversion) (string, error) {
749+
func (r *ReleaseGoplsTasks) updateDependencyIfMinor(ctx *wf.TaskContext, reviewers []string, semv semversion, issue int64) (string, error) {
743750
if semv.Patch != 0 {
744751
return "", nil
745752
}
@@ -774,7 +781,7 @@ go mod tidy -compat=1.19
774781
changeInput := gerrit.ChangeInput{
775782
Project: "tools",
776783
Branch: "master",
777-
Subject: fmt.Sprintf("%s\n\nThis is an automated CL which updates the go.mod and go.sum.", clTitle),
784+
Subject: fmt.Sprintf("%s\n\nThis is an automated CL which updates the go.mod and go.sum.\n\nFor golang/go#%v", clTitle, issue),
778785
}
779786

780787
ctx.Printf("creating auto-submit change under master branch in x/tools repo.")

internal/task/releasegopls_test.go

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -434,42 +434,68 @@ func TestNextPrerelease(t *testing.T) {
434434
}
435435
}
436436

437-
func TestCreateReleaseIssue(t *testing.T) {
437+
func TestFindOrCreateReleaseIssue(t *testing.T) {
438438
ctx := context.Background()
439439
testcases := []struct {
440440
name string
441441
version string
442+
create bool
442443
fakeGithub FakeGitHub
443444
wantErr bool
444445
wantIssue int64
445446
}{
446447
{
447448
name: "milestone does not exist",
448449
version: "v0.16.2",
450+
create: true,
449451
wantErr: true,
450452
wantIssue: 0,
451453
},
452454
{
453455
name: "irrelevant milestone exist",
454456
version: "v0.16.2",
457+
create: true,
455458
fakeGithub: FakeGitHub{
456459
Milestones: map[int]string{1: "gopls/v0.16.1"},
457460
},
458461
wantErr: true,
459462
wantIssue: 0,
460463
},
461464
{
462-
name: "milestone exist, issue is missing, workflow should create this issue",
465+
name: "milestone exist, issue is missing, create true, workflow should create this issue",
463466
version: "v0.16.2",
467+
create: true,
464468
fakeGithub: FakeGitHub{
465469
Milestones: map[int]string{1: "gopls/v0.16.2"},
466470
},
467471
wantErr: false,
468472
wantIssue: 1,
469473
},
470474
{
471-
name: "milestone exist, issue exist, workflow should reuse the issue",
475+
name: "milestone exist, issue is missing, create false, workflow error out",
472476
version: "v0.16.2",
477+
create: false,
478+
fakeGithub: FakeGitHub{
479+
Milestones: map[int]string{1: "gopls/v0.16.2"},
480+
},
481+
wantErr: true,
482+
wantIssue: 0,
483+
},
484+
{
485+
name: "milestone exist, issue exist, create true, workflow should reuse the issue",
486+
version: "v0.16.2",
487+
create: true,
488+
fakeGithub: FakeGitHub{
489+
Milestones: map[int]string{1: "gopls/v0.16.2"},
490+
Issues: map[int]*github.Issue{2: {Number: github.Int(2), Title: github.String("x/tools/gopls: release version v0.16.2"), Milestone: &github.Milestone{ID: github.Int64(1)}}},
491+
},
492+
wantErr: false,
493+
wantIssue: 2,
494+
},
495+
{
496+
name: "milestone exist, issue exist, create false, workflow should reuse the issue",
497+
version: "v0.16.2",
498+
create: false,
473499
fakeGithub: FakeGitHub{
474500
Milestones: map[int]string{1: "gopls/v0.16.2"},
475501
Issues: map[int]*github.Issue{2: {Number: github.Int(2), Title: github.String("x/tools/gopls: release version v0.16.2"), Milestone: &github.Milestone{ID: github.Int64(1)}}},
@@ -489,7 +515,7 @@ func TestCreateReleaseIssue(t *testing.T) {
489515
if !ok {
490516
t.Fatalf("parseSemver(%q) should success", tc.version)
491517
}
492-
gotIssue, err := tasks.createReleaseIssue(&workflow.TaskContext{Context: ctx, Logger: &testLogger{t, ""}}, semv)
518+
gotIssue, err := tasks.findOrCreateGitHubIssue(&workflow.TaskContext{Context: ctx, Logger: &testLogger{t, ""}}, semv, tc.create)
493519

494520
if tc.wantErr && err == nil {
495521
t.Errorf("createReleaseIssue(%s) should return error but return nil", tc.version)

0 commit comments

Comments
 (0)