Skip to content

Commit 9fd11d6

Browse files
committed
internal/task: replace reviewers parameter with release coordinators
- Add a check for release coordinators parameter making sure the all coordinators have gerrit user name and github user name. - The first user of the release coordinators will be assigned to the release tracking issues. - All the release coordinators will be added as reviewers for the auto-generated CLs. A local relui screenshot is at golang/vscode-go#3500 (comment) For golang/vscode-go#3500 For golang/go#57643 Change-Id: If528ab3c5bbc2d589c7198cffa0211f4e5db478f Reviewed-on: https://go-review.googlesource.com/c/build/+/616195 Reviewed-by: Robert Findley <[email protected]> Reviewed-by: Hyang-Ah Hana Kim <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent 959e7b5 commit 9fd11d6

File tree

8 files changed

+63
-36
lines changed

8 files changed

+63
-36
lines changed

internal/gophers/gophers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2680,7 +2680,7 @@ func init() {
26802680
addPerson("Taro Aoki", "[email protected]", "@ktr0731")
26812681
addPerson("Tarrant", "[email protected]", "@tarrant")
26822682
addPerson("Taru Karttunen", "[email protected]", "@taruti")
2683-
addPerson("Tatiana Bradley", "[email protected]")
2683+
addPerson("Tatiana Bradley", "[email protected]", "@tatianab")
26842684
addPerson("Tatsuhiro Tsujikawa", "[email protected]", "@tatsuhiro-t")
26852685
addPerson("Taufiq Rahman", "[email protected]", "@Inconnu08")
26862686
addPerson("Ted Hahn", "[email protected]")

internal/task/announce.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ func mapCoordinators(users []string, f func(*gophers.Person) string) ([]string,
288288
}
289289

290290
// CheckCoordinators checks that all users are known
291-
// and have required information (name, Gerrit email).
291+
// and have required information (name, Gerrit email, GitHub user name).
292292
func CheckCoordinators(users []string) error {
293293
var report strings.Builder
294294
for _, user := range users {
@@ -309,9 +309,13 @@ func lookupCoordinator(user string) (*gophers.Person, error) {
309309
}
310310
if person == nil {
311311
return nil, fmt.Errorf("unknown username %q: no @golang or @google account", user)
312-
} else if person.Name == "" {
312+
}
313+
if person.Name == "" {
313314
return nil, fmt.Errorf("release coordinator %q is missing a name", person.Gerrit)
314315
}
316+
if person.GitHub == "" {
317+
return nil, fmt.Errorf("release coordinator %q is missing github user name", person.Gerrit)
318+
}
315319
return person, nil
316320
}
317321

internal/task/privx_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ func TestPrivXPatch(t *testing.T) {
7676
echo "Resolving deltas: 100% (5/5)"
7777
echo "Waiting for private key checker: 1/1 objects left"
7878
echo "Processing changes: refs: 1, new: 1, done"
79-
echo
79+
echo
8080
echo "SUCCESS"
81-
echo
81+
echo
8282
echo " https://go-review.googlesource.com/c/net/+/558675 net/mail: remove obsolete comment [NEW]"
8383
echo`), 0777); err != nil {
8484
t.Fatalf("failed to write git pre-receive hook: %s", err)
@@ -111,7 +111,7 @@ echo`), 0777); err != nil {
111111
wd := p.NewDefinition(&TagXReposTasks{Gerrit: &privxClient{}})
112112
w, err := workflow.Start(wd, map[string]any{
113113
"go-internal CL number": "1234",
114-
"Reviewer usernames (optional)": []string{},
114+
reviewersParam.Name: []string{},
115115
"Repository name": filepath.Base(pubRepo.dir.dir),
116116
"Skip post submit result (optional)": true,
117117
"CVE": "CVE-2024-1234",

internal/task/releasegopls.go

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,16 @@ import (
1919
"golang.org/x/mod/semver"
2020
)
2121

22+
var releaseCoordinatorsParam = wf.ParamDef[[]string]{
23+
Name: "Release Coordinator Usernames",
24+
ParamType: wf.SliceShort,
25+
Doc: `Release Coordinator Usernames is a required list of the coordinators of the release.
26+
27+
The first user in the list will be assigned to the release tracking issue.
28+
All users will be added as reviewers for automatically generated CLs.`,
29+
Check: CheckCoordinators,
30+
}
31+
2232
// ReleaseGoplsTasks provides workflow definitions and tasks for releasing gopls.
2333
type ReleaseGoplsTasks struct {
2434
Github GitHubClientInterface
@@ -41,27 +51,27 @@ func (r *ReleaseGoplsTasks) NewPrereleaseDefinition() *wf.Definition {
4151
// bump strategy.
4252
// Use with caution.
4353
inputVersion := wf.Param(wd, wf.ParamDef[string]{Name: "explicit version (optional)"})
44-
reviewers := wf.Param(wd, reviewersParam)
54+
coordinators := wf.Param(wd, releaseCoordinatorsParam)
4555

4656
release := wf.Task2(wd, "determine the release version", r.determineReleaseVersion, inputVersion, versionBumpStrategy)
4757
prerelease := wf.Task1(wd, "find the next pre-release version", r.nextPrereleaseVersion, release)
4858
approved := wf.Action2(wd, "wait for release coordinator approval", r.approvePrerelease, release, prerelease)
4959

50-
issue := wf.Task2(wd, "create release git issue", r.findOrCreateGitHubIssue, release, wf.Const(true), wf.After(approved))
60+
issue := wf.Task3(wd, "create release git issue", r.findOrCreateGitHubIssue, release, coordinators, wf.Const(true), wf.After(approved))
5161
branchCreated := wf.Action1(wd, "create new branch if minor release", r.createBranchIfMinor, release, wf.After(issue))
5262

53-
configChangeID := wf.Task3(wd, "update branch's codereview.cfg", r.updateCodeReviewConfig, release, reviewers, issue, wf.After(branchCreated))
63+
configChangeID := wf.Task3(wd, "update branch's codereview.cfg", r.updateCodeReviewConfig, release, coordinators, issue, wf.After(branchCreated))
5464
configCommit := wf.Task1(wd, "await config CL submission", clAwaiter{r.Gerrit}.awaitSubmission, configChangeID)
5565

56-
dependencyChangeID := wf.Task4(wd, "update gopls' x/tools dependency", r.updateXToolsDependency, release, prerelease, reviewers, issue, wf.After(configCommit))
66+
dependencyChangeID := wf.Task4(wd, "update gopls' x/tools dependency", r.updateXToolsDependency, release, prerelease, coordinators, issue, wf.After(configCommit))
5767
dependencyCommit := wf.Task1(wd, "await gopls' x/tools dependency CL submission", clAwaiter{r.Gerrit}.awaitSubmission, dependencyChangeID)
5868

5969
verified := wf.Action1(wd, "verify installing latest gopls using release branch dependency commit", r.verifyGoplsInstallation, dependencyCommit)
6070
prereleaseVersion := wf.Task3(wd, "tag pre-release", r.tagPrerelease, release, dependencyCommit, prerelease, wf.After(verified))
6171
prereleaseVerified := wf.Action1(wd, "verify installing latest gopls using release branch pre-release version", r.verifyGoplsInstallation, prereleaseVersion)
6272
wf.Action4(wd, "mail announcement", r.mailPrereleaseAnnouncement, release, prereleaseVersion, dependencyCommit, issue, wf.After(prereleaseVerified))
6373

64-
vscodeGoChanges := wf.Task4(wd, "update gopls version in vscode-go", r.updateVSCodeGoGoplsVersion, reviewers, issue, release, prerelease, wf.After(prereleaseVerified))
74+
vscodeGoChanges := wf.Task4(wd, "update gopls version in vscode-go", r.updateVSCodeGoGoplsVersion, coordinators, issue, release, prerelease, wf.After(prereleaseVerified))
6575
_ = wf.Task1(wd, "await gopls version update CLs submission in vscode-go", clAwaiter{r.Gerrit}.awaitSubmissions, vscodeGoChanges)
6676

6777
wf.Output(wd, "version", prereleaseVersion)
@@ -144,7 +154,7 @@ func (r *ReleaseGoplsTasks) approveRelease(ctx *wf.TaskContext, release releaseV
144154
// If the release issue exists, return the issue ID.
145155
// If 'create' is true and no issue exists, a new one is created.
146156
// If 'create' is false and no issue exists, an error is returned.
147-
func (r *ReleaseGoplsTasks) findOrCreateGitHubIssue(ctx *wf.TaskContext, release releaseVersion, create bool) (int64, error) {
157+
func (r *ReleaseGoplsTasks) findOrCreateGitHubIssue(ctx *wf.TaskContext, release releaseVersion, coordinators []string, create bool) (int64, error) {
148158
versionString := release.String()
149159
milestoneName := fmt.Sprintf("gopls/%s", versionString)
150160
// All milestones and issues resides under go repo.
@@ -186,14 +196,20 @@ func (r *ReleaseGoplsTasks) findOrCreateGitHubIssue(ctx *wf.TaskContext, release
186196
- [ ] tag gopls/%s
187197
- [ ] (if vX.Y.0 release): update dependencies in master for the next release
188198
`, versionString, goplsReleaseBranchName(release), versionString, versionString)
189-
// TODO(hxjiang): accept a new parameter release coordinator.
190-
assignee := "h9jiang"
199+
200+
if len(coordinators) == 0 {
201+
return 0, fmt.Errorf("the input coordinators slice is empty")
202+
}
203+
assignee, err := lookupCoordinator(coordinators[0])
204+
if err != nil {
205+
return 0, fmt.Errorf("failed to find the coordinator %q", coordinators[0])
206+
}
191207
issue, _, err := r.Github.CreateIssue(ctx, "golang", "go", &github.IssueRequest{
192-
Title: &title,
193-
Body: &content,
208+
Title: github.String(title),
209+
Body: github.String(content),
194210
Labels: &[]string{"gopls", "Tools"},
195-
Assignee: &assignee,
196-
Milestone: &milestoneID,
211+
Assignee: github.String(assignee.GitHub),
212+
Milestone: github.Int(milestoneID),
197213
})
198214
if err != nil {
199215
return 0, fmt.Errorf("failed to create release tracking issue for %q: %w", versionString, err)
@@ -620,21 +636,21 @@ func (r *ReleaseGoplsTasks) NewReleaseDefinition() *wf.Definition {
620636
// bump strategy.
621637
// Use with caution.
622638
inputVersion := wf.Param(wd, wf.ParamDef[string]{Name: "explicit version (optional)"})
623-
reviewers := wf.Param(wd, reviewersParam)
639+
coordinators := wf.Param(wd, releaseCoordinatorsParam)
624640

625641
release := wf.Task2(wd, "determine the release version", r.determineReleaseVersion, inputVersion, versionBumpStrategy)
626642
prerelease := wf.Task1(wd, "find the latest pre-release version", r.latestPrerelease, release)
627643
approved := wf.Action2(wd, "wait for release coordinator approval", r.approveRelease, release, prerelease)
628644

629645
tagged := wf.Action2(wd, "tag the release", r.tagRelease, release, prerelease, wf.After(approved))
630646

631-
issue := wf.Task2(wd, "find release git issue", r.findOrCreateGitHubIssue, release, wf.Const(false))
647+
issue := wf.Task3(wd, "find release git issue", r.findOrCreateGitHubIssue, release, wf.Const([]string{}), wf.Const(false))
632648
_ = wf.Action1(wd, "mail announcement", r.mailReleaseAnnouncement, release, wf.After(tagged))
633649

634-
changeID := wf.Task3(wd, "updating x/tools dependency in master branch in gopls sub dir", r.updateDependencyIfMinor, reviewers, release, issue, wf.After(tagged))
650+
changeID := wf.Task3(wd, "updating x/tools dependency in master branch in gopls sub dir", r.updateDependencyIfMinor, coordinators, release, issue, wf.After(tagged))
635651
_ = wf.Task1(wd, "await x/tools gopls dependency CL submission in gopls sub dir", clAwaiter{r.Gerrit}.awaitSubmission, changeID)
636652

637-
vscodeGoChanges := wf.Task4(wd, "update gopls version in vscode-go", r.updateVSCodeGoGoplsVersion, reviewers, issue, release, wf.Const(""), wf.After(tagged))
653+
vscodeGoChanges := wf.Task4(wd, "update gopls version in vscode-go", r.updateVSCodeGoGoplsVersion, coordinators, issue, release, wf.Const(""), wf.After(tagged))
638654
_ = wf.Task1(wd, "await gopls version update CLs submission in vscode-go", clAwaiter{r.Gerrit}.awaitSubmissions, vscodeGoChanges)
639655

640656
return wd

internal/task/releasegopls_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ func TestFindOrCreateReleaseIssue(t *testing.T) {
511511
if !ok {
512512
t.Fatalf("parseVersion(%q) failed", tc.version)
513513
}
514-
gotIssue, err := tasks.findOrCreateGitHubIssue(&workflow.TaskContext{Context: ctx, Logger: &testLogger{t, ""}}, release, tc.create)
514+
gotIssue, err := tasks.findOrCreateGitHubIssue(&workflow.TaskContext{Context: ctx, Logger: &testLogger{t, ""}}, release, []string{"gobot"}, tc.create)
515515

516516
if tc.wantErr && err == nil {
517517
t.Errorf("createReleaseIssue(%s) should return error but return nil", tc.version)
@@ -825,7 +825,7 @@ esac`, tc.wantVersion)
825825

826826
t.Run("manual input version: "+tc.name, func(t *testing.T) {
827827
runTestWithInput(map[string]any{
828-
reviewersParam.Name: []string(nil),
828+
releaseCoordinatorsParam.Name: []string{"gobot"},
829829
"explicit version (optional)": tc.release.String(),
830830
"next version": "use explicit version",
831831
})
@@ -836,7 +836,7 @@ esac`, tc.wantVersion)
836836
}
837837
t.Run("interpret version "+versionBump+" : "+tc.name, func(t *testing.T) {
838838
runTestWithInput(map[string]any{
839-
reviewersParam.Name: []string(nil),
839+
releaseCoordinatorsParam.Name: []string{"gobot"},
840840
"explicit version (optional)": "",
841841
"next version": versionBump,
842842
})
@@ -1317,7 +1317,7 @@ esac
13171317
}
13181318
t.Run("manual input version: "+tc.name, func(t *testing.T) {
13191319
runTestWithInput(map[string]any{
1320-
reviewersParam.Name: []string(nil),
1320+
releaseCoordinatorsParam.Name: []string{"gobot"},
13211321
"explicit version (optional)": tc.release.String(),
13221322
"next version": "use explicit version",
13231323
})
@@ -1328,7 +1328,7 @@ esac
13281328
}
13291329
t.Run("interpret version "+versionBump+": "+tc.name, func(t *testing.T) {
13301330
runTestWithInput(map[string]any{
1331-
reviewersParam.Name: []string(nil),
1331+
releaseCoordinatorsParam.Name: []string{"gobot"},
13321332
"explicit version (optional)": "",
13331333
"next version": versionBump,
13341334
})

internal/task/releasevscodego.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ func (r *ReleaseVSCodeGoTasks) NewPrereleaseDefinition() *wf.Definition {
142142
wd := wf.New(wf.ACL{Groups: []string{groups.ToolsTeam}})
143143

144144
versionBumpStrategy := wf.Param(wd, nextVersionParam)
145+
coordinators := wf.Param(wd, releaseCoordinatorsParam)
145146

146147
release := wf.Task1(wd, "determine the release version", r.determineReleaseVersion, versionBumpStrategy)
147148
prerelease := wf.Task1(wd, "find the next pre-release version", r.nextPrereleaseVersion, release)
@@ -150,7 +151,7 @@ func (r *ReleaseVSCodeGoTasks) NewPrereleaseDefinition() *wf.Definition {
150151

151152
verified := wf.Action1(wd, "verify the release candidate", r.verifyTestResults, revision, wf.After(approved))
152153

153-
issue := wf.Task1(wd, "create release milestone and issue", r.createReleaseMilestoneAndIssue, release, wf.After(verified))
154+
issue := wf.Task2(wd, "create release milestone and issue", r.createReleaseMilestoneAndIssue, release, coordinators, wf.After(verified))
154155
branched := wf.Action2(wd, "create release branch", r.createReleaseBranch, release, prerelease, wf.After(verified))
155156
build := wf.Task3(wd, "generate package extension (.vsix) for release candidate", r.generatePackageExtension, release, prerelease, revision, wf.After(verified))
156157

@@ -221,7 +222,7 @@ chown -R 1000:1000 .
221222
return nil
222223
}
223224

224-
func (r *ReleaseVSCodeGoTasks) createReleaseMilestoneAndIssue(ctx *wf.TaskContext, semv releaseVersion) (int, error) {
225+
func (r *ReleaseVSCodeGoTasks) createReleaseMilestoneAndIssue(ctx *wf.TaskContext, semv releaseVersion, coordinators []string) (int, error) {
225226
version := fmt.Sprintf("v%v.%v.%v", semv.Major, semv.Minor, semv.Patch)
226227

227228
// The vscode-go release milestone name matches the release version.
@@ -246,12 +247,18 @@ func (r *ReleaseVSCodeGoTasks) createReleaseMilestoneAndIssue(ctx *wf.TaskContex
246247
}
247248
}
248249

249-
content := fmt.Sprintf(vscodeGoReleaseIssueTmplStr, version)
250+
if len(coordinators) == 0 {
251+
return 0, fmt.Errorf("the input coordinators slice is empty")
252+
}
253+
assignee, err := lookupCoordinator(coordinators[0])
254+
if err != nil {
255+
return 0, fmt.Errorf("failed to find the coordinator %q", coordinators[0])
256+
}
250257
issue, _, err := r.GitHub.CreateIssue(ctx, "golang", "vscode-go", &github.IssueRequest{
251-
Title: &title,
252-
Body: &content,
253-
Assignee: github.String("h9jiang"),
254-
Milestone: &milestoneID,
258+
Title: github.String(title),
259+
Body: github.String(fmt.Sprintf(vscodeGoReleaseIssueTmplStr, version)),
260+
Assignee: github.String(assignee.GitHub),
261+
Milestone: github.Int(milestoneID),
255262
})
256263
if err != nil {
257264
return 0, fmt.Errorf("failed to create release tracking issue for %q: %w", version, err)

internal/task/releasevscodego_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func TestCreateReleaseMilestoneAndIssue(t *testing.T) {
136136
if !ok {
137137
t.Fatalf("parseVersion(%q) failed", tc.version)
138138
}
139-
issueNumber, err := tasks.createReleaseMilestoneAndIssue(&workflow.TaskContext{Context: context.Background(), Logger: &testLogger{t, ""}}, release)
139+
issueNumber, err := tasks.createReleaseMilestoneAndIssue(&workflow.TaskContext{Context: context.Background(), Logger: &testLogger{t, ""}}, release, []string{"gobot"})
140140
if err != nil {
141141
t.Fatal(err)
142142
}

internal/task/tagx.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func (x *TagXReposTasks) NewSingleDefinition() *wf.Definition {
5757
}
5858

5959
var reviewersParam = wf.ParamDef[[]string]{
60-
Name: "Reviewer usernames (optional)",
60+
Name: "Reviewer Gerrit Usernames (optional)",
6161
ParamType: wf.SliceShort,
6262
Doc: `Send code reviews to these users.`,
6363
Example: "heschi",

0 commit comments

Comments
 (0)