Skip to content

Commit 4d3a945

Browse files
committed
internal/relui: choose major versions dynamically
For convenience, I originally hardcoded Go1.17, 18, and 19 as the live major Go versions. We're about to release 1.19, so that's not so convenient any more. Extract a function to read the live major version, and use it to choose what workflows to create. While I'm here, add workflows to do a single minor release in case we need to do that at some point. For golang/go#51797. Change-Id: I1e73e42b6c78df7f3e8deb0a191893ff3c887297 Reviewed-on: https://go-review.googlesource.com/c/build/+/418789 Reviewed-by: Dmitri Shuralyov <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]> Run-TryBot: Heschi Kreinick <[email protected]>
1 parent a3d9d89 commit 4d3a945

File tree

4 files changed

+68
-49
lines changed

4 files changed

+68
-49
lines changed

cmd/relui/main.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,9 @@ func main() {
161161
RepoOwner: "golang",
162162
RepoName: "go",
163163
}
164-
relui.RegisterReleaseWorkflows(dh, buildTasks, milestoneTasks, versionTasks, commTasks)
164+
if err := relui.RegisterReleaseWorkflows(ctx, dh, buildTasks, milestoneTasks, versionTasks, commTasks); err != nil {
165+
log.Fatalf("RegisterReleaseWorkflows: %v", err)
166+
}
165167

166168
w := relui.NewWorker(dh, db, relui.NewPGListener(db))
167169
go w.Run(ctx)

internal/relui/buildrelease_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ func newReleaseTestDeps(t *testing.T, wantVersion string) *releaseTestDeps {
165165
func testRelease(t *testing.T, wantVersion string, kind task.ReleaseKind) {
166166
deps := newReleaseTestDeps(t, wantVersion)
167167
wd := workflow.New()
168-
v, err := addSingleReleaseWorkflow(deps.buildTasks, deps.milestoneTasks, deps.versionTasks, wd, "go1.18", kind)
168+
v, err := addSingleReleaseWorkflow(deps.buildTasks, deps.milestoneTasks, deps.versionTasks, wd, 18, kind)
169169
if err != nil {
170170
t.Fatal(err)
171171
}
@@ -284,7 +284,7 @@ func testSecurity(t *testing.T, mergeFixes bool) {
284284

285285
// Run the release.
286286
wd := workflow.New()
287-
v, err := addSingleReleaseWorkflow(deps.buildTasks, deps.milestoneTasks, deps.versionTasks, wd, "go1.18", task.KindRC)
287+
v, err := addSingleReleaseWorkflow(deps.buildTasks, deps.milestoneTasks, deps.versionTasks, wd, 18, task.KindRC)
288288
if err != nil {
289289
t.Fatal(err)
290290
}

internal/relui/workflows.go

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -555,16 +555,31 @@ func ApproveActionDep(p *pgxpool.Pool) func(*workflow.TaskContext, interface{})
555555
const mergeCommTasksIntoReleaseWorkflows = false
556556

557557
// RegisterReleaseWorkflows registers workflows for issuing Go releases.
558-
func RegisterReleaseWorkflows(h *DefinitionHolder, build *BuildReleaseTasks, milestone *task.MilestoneTasks, version *task.VersionTasks, comm task.CommunicationTasks) error {
559-
createSingle := func(name, major string, kind task.ReleaseKind) error {
558+
func RegisterReleaseWorkflows(ctx context.Context, h *DefinitionHolder, build *BuildReleaseTasks, milestone *task.MilestoneTasks, version *task.VersionTasks, comm task.CommunicationTasks) error {
559+
currentMajor, err := version.GetCurrentMajor(ctx)
560+
if err != nil {
561+
return err
562+
}
563+
releases := []struct {
564+
kind task.ReleaseKind
565+
major int
566+
suffix string
567+
}{
568+
{task.KindMajor, currentMajor + 1, "final"},
569+
{task.KindRC, currentMajor + 1, "next RC"},
570+
{task.KindBeta, currentMajor + 1, "next beta"},
571+
{task.KindCurrentMinor, currentMajor, "next minor"},
572+
{task.KindPrevMinor, currentMajor - 1, "next minor"},
573+
}
574+
for _, r := range releases {
560575
wd := workflow.New()
561576

562577
var names workflow.Value
563578
if mergeCommTasksIntoReleaseWorkflows {
564579
names = wd.Parameter(releaseCoordinatorNames)
565580
}
566581

567-
versionPublished, err := addSingleReleaseWorkflow(build, milestone, version, wd, major, kind)
582+
versionPublished, err := addSingleReleaseWorkflow(build, milestone, version, wd, r.major, r.kind)
568583
if err != nil {
569584
return err
570585
}
@@ -574,64 +589,56 @@ func RegisterReleaseWorkflows(h *DefinitionHolder, build *BuildReleaseTasks, mil
574589

575590
// Announce that a new Go release has been published.
576591
sentMail := wd.Task("mail-announcement", func(ctx *workflow.TaskContext, v string, names []string) (task.SentMail, error) {
577-
switch kind {
592+
switch r.kind {
578593
case task.KindMajor:
579594
return comm.AnnounceMajorRelease(ctx, task.ReleaseAnnouncement{Version: v, Names: names})
580595
case task.KindRC:
581596
return comm.AnnounceRCRelease(ctx, task.ReleaseAnnouncement{Version: v, Names: names})
582597
case task.KindBeta:
583598
return comm.AnnounceBetaRelease(ctx, task.ReleaseAnnouncement{Version: v, Names: names})
584599
default:
585-
return task.SentMail{}, fmt.Errorf("unknown release kind %v", kind)
600+
return task.SentMail{}, fmt.Errorf("unknown release kind %v", r.kind)
586601
}
587602
}, versionPublished, names, okayToAnnounceAndTweet)
588603
announcementURL := wd.Task("await-announcement", comm.AwaitAnnounceMail, sentMail)
589604
tweetURL := wd.Task("post-tweet", func(ctx *workflow.TaskContext, v, ann string) (string, error) {
590-
switch kind {
605+
switch r.kind {
591606
case task.KindMajor:
592607
return comm.TweetMajorRelease(ctx, task.ReleaseTweet{Version: v})
593608
case task.KindRC:
594609
return comm.TweetRCRelease(ctx, task.ReleaseTweet{Version: v, Announcement: ann})
595610
case task.KindBeta:
596611
return comm.TweetBetaRelease(ctx, task.ReleaseTweet{Version: v, Announcement: ann})
597612
default:
598-
return "", fmt.Errorf("unknown release kind %v", kind)
613+
return "", fmt.Errorf("unknown release kind %v", r.kind)
599614
}
600615
}, versionPublished, announcementURL, okayToAnnounceAndTweet)
601616

602617
wd.Output("Announcement URL", announcementURL)
603618
wd.Output("Tweet URL", tweetURL)
604619
}
605620

606-
h.RegisterDefinition(name, wd)
607-
return nil
608-
}
609-
if err := createSingle("Go 1.19 final", "go1.19", task.KindMajor); err != nil {
610-
return err
611-
}
612-
if err := createSingle("Go 1.19 next RC", "go1.19", task.KindRC); err != nil {
613-
return err
614-
}
615-
if err := createSingle("Go 1.19 next beta", "go1.19", task.KindBeta); err != nil {
616-
return err
621+
h.RegisterDefinition(fmt.Sprintf("Go 1.%d %s", r.major, r.suffix), wd)
617622
}
618-
wd, err := createMinorReleaseWorkflow(build, milestone, version, comm, "go1.17", "go1.18")
623+
624+
wd, err := createMinorReleaseWorkflow(build, milestone, version, comm, currentMajor-1, currentMajor)
619625
if err != nil {
620626
return err
621627
}
622-
h.RegisterDefinition("Minor releases for Go 1.17 and 1.18", wd)
628+
h.RegisterDefinition(fmt.Sprintf("Minor releases for Go 1.%d and 1.%d", currentMajor-1, currentMajor), wd)
629+
623630
wd = workflow.New()
624-
if err := addBuildAndTestOnlyWorkflow(wd, version, build, "go1.19", task.KindBeta); err != nil {
631+
if err := addBuildAndTestOnlyWorkflow(wd, version, build, currentMajor+1, task.KindBeta); err != nil {
625632
return err
626633
}
627-
h.RegisterDefinition("dry-run (test and build only): Go 1.19 next beta", wd)
634+
h.RegisterDefinition(fmt.Sprintf("dry-run (test and build only): Go 1.%d next beta", currentMajor+1), wd)
628635

629636
return nil
630637
}
631638

632-
func addBuildAndTestOnlyWorkflow(wd *workflow.Definition, version *task.VersionTasks, build *BuildReleaseTasks, major string, kind task.ReleaseKind) error {
639+
func addBuildAndTestOnlyWorkflow(wd *workflow.Definition, version *task.VersionTasks, build *BuildReleaseTasks, major int, kind task.ReleaseKind) error {
633640
nextVersion := wd.Task("Get next version", version.GetNextVersion, wd.Constant(kind))
634-
branch := fmt.Sprintf("release-branch.%v", major)
641+
branch := fmt.Sprintf("release-branch.go1.%d", major)
635642
if kind == task.KindBeta {
636643
branch = "master"
637644
}
@@ -645,7 +652,7 @@ func addBuildAndTestOnlyWorkflow(wd *workflow.Definition, version *task.VersionT
645652
return nil
646653
}
647654

648-
func createMinorReleaseWorkflow(build *BuildReleaseTasks, milestone *task.MilestoneTasks, version *task.VersionTasks, comm task.CommunicationTasks, prev, current string) (*workflow.Definition, error) {
655+
func createMinorReleaseWorkflow(build *BuildReleaseTasks, milestone *task.MilestoneTasks, version *task.VersionTasks, comm task.CommunicationTasks, prevMajor, currentMajor int) (*workflow.Definition, error) {
649656
wd := workflow.New()
650657

651658
var securitySummary, securityFixes, names workflow.Value
@@ -655,11 +662,11 @@ func createMinorReleaseWorkflow(build *BuildReleaseTasks, milestone *task.Milest
655662
names = wd.Parameter(releaseCoordinatorNames)
656663
}
657664

658-
v1Published, err := addSingleReleaseWorkflow(build, milestone, version, wd.Sub(current), current, task.KindCurrentMinor)
665+
v1Published, err := addSingleReleaseWorkflow(build, milestone, version, wd.Sub(fmt.Sprintf("Go 1.%d", currentMajor)), currentMajor, task.KindCurrentMinor)
659666
if err != nil {
660667
return nil, err
661668
}
662-
v2Published, err := addSingleReleaseWorkflow(build, milestone, version, wd.Sub(prev), prev, task.KindPrevMinor)
669+
v2Published, err := addSingleReleaseWorkflow(build, milestone, version, wd.Sub(fmt.Sprintf("Go 1.%d", prevMajor)), prevMajor, task.KindPrevMinor)
663670
if err != nil {
664671
return nil, err
665672
}
@@ -685,10 +692,10 @@ func createMinorReleaseWorkflow(build *BuildReleaseTasks, milestone *task.Milest
685692

686693
func addSingleReleaseWorkflow(
687694
build *BuildReleaseTasks, milestone *task.MilestoneTasks, version *task.VersionTasks,
688-
wd *workflow.Definition, major string, kind task.ReleaseKind,
695+
wd *workflow.Definition, major int, kind task.ReleaseKind,
689696
) (versionPublished workflow.Value, _ error) {
690697
kindVal := wd.Constant(kind)
691-
branch := fmt.Sprintf("release-branch.%v", major)
698+
branch := fmt.Sprintf("release-branch.go1.%d", major)
692699
if kind == task.KindBeta {
693700
branch = "master"
694701
}
@@ -710,7 +717,7 @@ func addSingleReleaseWorkflow(
710717
source := wd.Task("Build source archive", build.buildSource, startingHead, securityRef, nextVersion, checked)
711718

712719
// Build, test, and sign release.
713-
signedAndTestedArtifacts, err := build.addBuildTasks(wd, "go1.19", nextVersion, source, false)
720+
signedAndTestedArtifacts, err := build.addBuildTasks(wd, major, nextVersion, source, false)
714721
if err != nil {
715722
return nil, err
716723
}
@@ -740,12 +747,8 @@ func addSingleReleaseWorkflow(
740747

741748
// addBuildTasks registers tasks to build, test, and sign the release onto wd.
742749
// It returns the output from the last task, a slice of signed and tested artifacts.
743-
func (tasks *BuildReleaseTasks) addBuildTasks(wd *workflow.Definition, majorVersion string, version, source workflow.Value, skipSigning bool) (workflow.Value, error) {
744-
targets, ok := releasetargets.TargetsForVersion(majorVersion)
745-
if !ok {
746-
return nil, fmt.Errorf("malformed/unknown version %q", majorVersion)
747-
}
748-
750+
func (tasks *BuildReleaseTasks) addBuildTasks(wd *workflow.Definition, major int, version, source workflow.Value, skipSigning bool) (workflow.Value, error) {
751+
targets := releasetargets.TargetsForGo1Point(major)
749752
skipTests := wd.Parameter(workflow.Parameter{Name: "Targets to skip testing (or 'all') (optional)", ParameterType: workflow.SliceShort})
750753
// Artifact file paths.
751754
artifacts := []workflow.Value{source}

internal/task/version.go

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"golang.org/x/build/gerrit"
99
"golang.org/x/build/internal/workflow"
10+
"golang.org/x/net/context"
1011
)
1112

1213
// VersionTasks contains tasks related to versioning the release.
@@ -15,27 +16,40 @@ type VersionTasks struct {
1516
GoProject string
1617
}
1718

18-
// GetNextVersion returns the next for the given type of release.
19-
func (t *VersionTasks) GetNextVersion(ctx *workflow.TaskContext, kind ReleaseKind) (string, error) {
20-
tags, err := t.Gerrit.ListTags(ctx, t.GoProject)
19+
func (t *VersionTasks) GetCurrentMajor(ctx context.Context) (int, error) {
20+
_, currentMajor, err := t.tagInfo(ctx)
21+
return currentMajor, err
22+
}
23+
24+
func (t *VersionTasks) tagInfo(ctx context.Context) (tags map[string]bool, currentMajor int, _ error) {
25+
tagList, err := t.Gerrit.ListTags(ctx, t.GoProject)
2126
if err != nil {
22-
return "", err
27+
return nil, 0, err
2328
}
24-
tagSet := map[string]bool{}
25-
for _, tag := range tags {
26-
tagSet[tag] = true
29+
tags = map[string]bool{}
30+
for _, tag := range tagList {
31+
tags[tag] = true
2732
}
2833
// Find the most recently released major version.
2934
// Going down from a high number is convenient for testing.
30-
currentMajor := 100
35+
currentMajor = 100
3136
for ; ; currentMajor-- {
32-
if tagSet[fmt.Sprintf("go1.%d", currentMajor)] {
37+
if tags[fmt.Sprintf("go1.%d", currentMajor)] {
3338
break
3439
}
3540
}
41+
return tags, currentMajor, nil
42+
}
43+
44+
// GetNextVersion returns the next for the given type of release.
45+
func (t *VersionTasks) GetNextVersion(ctx context.Context, kind ReleaseKind) (string, error) {
46+
tags, currentMajor, err := t.tagInfo(ctx)
47+
if err != nil {
48+
return "", err
49+
}
3650
findUnused := func(v string) (string, error) {
3751
for {
38-
if !tagSet[v] {
52+
if !tags[v] {
3953
return v, nil
4054
}
4155
v, err = nextVersion(v)

0 commit comments

Comments
 (0)