Skip to content

Commit bdcf30f

Browse files
dmitshurgopherbot
authored andcommitted
internal/task: move "unwait" task to ReleaseCycleTasks, add "apply wait"
The new "apply wait" task is analogous to the existing "unwait" one, and was tested out during the Go 1.24 freeze two weeks ago. Move both of them into a new release cycle-focused struct where more release-cycle logic will be added next. For golang/go#70655. Change-Id: Id8443f6d3ca366c27b15e0e8e4ef3aa1901d32d2 Reviewed-on: https://go-review.googlesource.com/c/build/+/633579 Reviewed-by: Michael Knyszek <[email protected]> Auto-Submit: Dmitri Shuralyov <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]>
1 parent 05b1cdd commit bdcf30f

File tree

4 files changed

+83
-31
lines changed

4 files changed

+83
-31
lines changed

cmd/relui/main.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,10 @@ func main() {
287287
Branch: "main",
288288
},
289289
}
290-
if err := relui.RegisterReleaseWorkflows(ctx, dh, buildTasks, milestoneTasks, versionTasks, commTasks); err != nil {
290+
cycleTasks := task.ReleaseCycleTasks{
291+
Gerrit: gerritClient,
292+
}
293+
if err := relui.RegisterReleaseWorkflows(ctx, dh, buildTasks, milestoneTasks, versionTasks, cycleTasks, commTasks); err != nil {
291294
log.Fatalf("RegisterReleaseWorkflows: %v", err)
292295
}
293296

internal/relui/workflows.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ func ApproveActionDep(p db.PGDBTX) func(*wf.TaskContext) error {
255255
}
256256

257257
// RegisterReleaseWorkflows registers workflows for issuing Go releases.
258-
func RegisterReleaseWorkflows(ctx context.Context, h *DefinitionHolder, build *BuildReleaseTasks, milestone *task.MilestoneTasks, version *task.VersionTasks, comm task.CommunicationTasks) error {
258+
func RegisterReleaseWorkflows(ctx context.Context, h *DefinitionHolder, build *BuildReleaseTasks, milestone *task.MilestoneTasks, version *task.VersionTasks, cycle task.ReleaseCycleTasks, comm task.CommunicationTasks) error {
259259
// Register prod release workflows.
260260
if err := registerProdReleaseWorkflows(ctx, h, build, milestone, version, comm); err != nil {
261261
return err
@@ -292,7 +292,14 @@ func RegisterReleaseWorkflows(ctx context.Context, h *DefinitionHolder, build *B
292292
h.RegisterDefinition("pre-announce next minor release for Go "+strings.Join(names, " and "), wd)
293293
}
294294

295-
// Register workflows for miscellaneous tasks that happen as part of the Go release cycle.
295+
// Register workflows for miscellaneous tasks that happen as part of the Go release cycle (go.dev/s/release).
296+
{
297+
// Register an "apply wait-release to CLs" workflow.
298+
wd := wf.New(wf.ACL{Groups: []string{groups.ReleaseTeam}})
299+
waited := wf.Task0(wd, "Apply wait-release to CLs", cycle.ApplyWaitReleaseCLs)
300+
wf.Output(wd, "waited", waited)
301+
h.RegisterDefinition("apply wait-release to CLs", wd)
302+
}
296303
{
297304
// Register a "ping early-in-cycle issues" workflow.
298305
wd := wf.New(wf.ACL{Groups: []string{groups.ReleaseTeam}})
@@ -315,7 +322,7 @@ func RegisterReleaseWorkflows(ctx context.Context, h *DefinitionHolder, build *B
315322
{
316323
// Register an "unwait wait-release CLs" workflow.
317324
wd := wf.New(wf.ACL{Groups: []string{groups.ReleaseTeam}})
318-
unwaited := wf.Task0(wd, "Unwait wait-release CLs", version.UnwaitWaitReleaseCLs)
325+
unwaited := wf.Task0(wd, "Unwait wait-release CLs", cycle.UnwaitWaitReleaseCLs)
319326
wf.Output(wd, "unwaited", unwaited)
320327
h.RegisterDefinition("unwait wait-release CLs", wd)
321328
}

internal/task/releasecycle.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// Copyright 2024 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package task
6+
7+
import (
8+
"time"
9+
10+
"golang.org/x/build/gerrit"
11+
"golang.org/x/build/internal/workflow"
12+
)
13+
14+
// ReleaseCycleTasks implements tasks related to the Go release cycle (go.dev/s/release).
15+
type ReleaseCycleTasks struct {
16+
Gerrit GerritClient
17+
}
18+
19+
// ApplyWaitReleaseCLs applies a "wait-release" hashtag to remaining open CLs that are
20+
// adding new APIs and should wait for next release. This is done once at the start of
21+
// the release freeze.
22+
func (t ReleaseCycleTasks) ApplyWaitReleaseCLs(ctx *workflow.TaskContext) (result struct{}, _ error) {
23+
clsToWait, err := t.Gerrit.QueryChanges(ctx, "repo:go status:open -is:wip dir:api/next -hashtag:wait-release")
24+
if err != nil {
25+
return struct{}{}, err
26+
}
27+
ctx.Printf("Processing %d open Gerrit CLs to be marked with wait-release hashtag.", len(clsToWait))
28+
for _, cl := range clsToWait {
29+
const dryRun = false
30+
if dryRun {
31+
ctx.Printf("[dry run] Would've waited CL %d (%.32s…).", cl.ChangeNumber, cl.Subject)
32+
continue
33+
}
34+
err := t.Gerrit.SetHashtags(ctx, cl.ID, gerrit.HashtagsInput{Add: []string{"wait-release"}})
35+
if err != nil {
36+
return struct{}{}, err
37+
}
38+
ctx.Printf("Waited CL %d (%.32s…).", cl.ChangeNumber, cl.Subject)
39+
time.Sleep(3 * time.Second) // Take a moment between updating CLs to avoid a high rate of modify operations.
40+
}
41+
return struct{}{}, nil
42+
}
43+
44+
// UnwaitWaitReleaseCLs changes all open Gerrit CLs with hashtag "wait-release" into "ex-wait-release".
45+
// This is done once at the opening of a release cycle, currently via a standalone workflow.
46+
func (t ReleaseCycleTasks) UnwaitWaitReleaseCLs(ctx *workflow.TaskContext) (result struct{}, _ error) {
47+
waitingCLs, err := t.Gerrit.QueryChanges(ctx, "status:open hashtag:wait-release")
48+
if err != nil {
49+
return struct{}{}, err
50+
}
51+
ctx.Printf("Processing %d open Gerrit CL with wait-release hashtag.", len(waitingCLs))
52+
for _, cl := range waitingCLs {
53+
const dryRun = false
54+
if dryRun {
55+
ctx.Printf("[dry run] Would've unwaited CL %d (%.32s…).", cl.ChangeNumber, cl.Subject)
56+
continue
57+
}
58+
err := t.Gerrit.SetHashtags(ctx, cl.ID, gerrit.HashtagsInput{
59+
Remove: []string{"wait-release"},
60+
Add: []string{"ex-wait-release"},
61+
})
62+
if err != nil {
63+
return struct{}{}, err
64+
}
65+
ctx.Printf("Unwaited CL %d (%.32s…).", cl.ChangeNumber, cl.Subject)
66+
time.Sleep(3 * time.Second) // Take a moment between updating CLs to avoid a high rate of modify operations.
67+
}
68+
return struct{}{}, nil
69+
}

internal/task/version.go

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -233,30 +233,3 @@ func (t *VersionTasks) CreateUpdateStdlibIndexCL(ctx *workflow.TaskContext, revi
233233
}
234234
return t.Gerrit.CreateAutoSubmitChange(ctx, changeInput, reviewers, files)
235235
}
236-
237-
// UnwaitWaitReleaseCLs changes all open Gerrit CLs with hashtag "wait-release" into "ex-wait-release".
238-
// This is done once at the opening of a release cycle, currently via a standalone workflow.
239-
func (t *VersionTasks) UnwaitWaitReleaseCLs(ctx *workflow.TaskContext) (result struct{}, _ error) {
240-
waitingCLs, err := t.Gerrit.QueryChanges(ctx, "status:open hashtag:wait-release")
241-
if err != nil {
242-
return struct{}{}, err
243-
}
244-
ctx.Printf("Processing %d open Gerrit CL with wait-release hashtag.", len(waitingCLs))
245-
for _, cl := range waitingCLs {
246-
const dryRun = false
247-
if dryRun {
248-
ctx.Printf("[dry run] Would've unwaited CL %d (%.32s…).", cl.ChangeNumber, cl.Subject)
249-
continue
250-
}
251-
err := t.Gerrit.SetHashtags(ctx, cl.ID, gerrit.HashtagsInput{
252-
Remove: []string{"wait-release"},
253-
Add: []string{"ex-wait-release"},
254-
})
255-
if err != nil {
256-
return struct{}{}, err
257-
}
258-
ctx.Printf("Unwaited CL %d (%.32s…).", cl.ChangeNumber, cl.Subject)
259-
time.Sleep(3 * time.Second) // Take a moment between updating CLs to avoid a high rate of modify operations.
260-
}
261-
return struct{}{}, nil
262-
}

0 commit comments

Comments
 (0)