Skip to content

Commit 7689d41

Browse files
rolandshoemakergopherbot
authored andcommitted
internal/task: update private x patch workflow
To match our new checkpoint branch based workflow, this now matches the same workflow we use when constructing the internal release branches for minor releases. Updates golang/go#65756 Change-Id: I4a58e1f66b909a51e498e924023d3a776a920ed7 Reviewed-on: https://go-review.googlesource.com/c/build/+/647375 Reviewed-by: Dmitri Shuralyov <[email protected]> Auto-Submit: Roland Shoemaker <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent e163af7 commit 7689d41

File tree

2 files changed

+107
-4
lines changed

2 files changed

+107
-4
lines changed

internal/task/privx.go

+84-4
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ func (x *PrivXPatch) NewDefinition(tagx *TagXReposTasks) *wf.Definition {
4646

4747
repos := wf.Task0(wd, "Load all repositories", tagx.SelectRepos)
4848

49-
repos = wf.Task4(wd, "Publish change", func(ctx *wf.TaskContext, clNumber string, reviewers []string, repos []TagRepo, repoName string) ([]TagRepo, error) {
49+
// check change is ready
50+
checkedChange := wf.Task3(wd, "Check change", func(ctx *wf.TaskContext, clNumber string, repoName string, repos []TagRepo) (*gerrit.ChangeInfo, error) {
5051
if !slices.ContainsFunc(repos, func(r TagRepo) bool { return r.Name == repoName }) {
5152
return nil, fmt.Errorf("no repository %q", repoName)
5253
}
@@ -58,6 +59,82 @@ func (x *PrivXPatch) NewDefinition(tagx *TagXReposTasks) *wf.Definition {
5859
if changeInfo.Project != repoName {
5960
return nil, fmt.Errorf("CL is for unexpected project, got: %s, want %s", changeInfo.Project, repoName)
6061
}
62+
63+
if !changeInfo.Submittable {
64+
return nil, fmt.Errorf("Change %s is not submittable", internalGerritChangeURL(clNumber))
65+
}
66+
ra, err := x.PrivateGerrit.GetRevisionActions(ctx.Context, clNumber, "current")
67+
if err != nil {
68+
return nil, err
69+
}
70+
if ra["submit"] == nil || !ra["submit"].Enabled {
71+
return nil, fmt.Errorf("Change %s is not submittable", internalGerritChangeURL(clNumber))
72+
}
73+
74+
return changeInfo, nil
75+
}, clNumber, repoName, repos)
76+
77+
// create checkpoint branch
78+
checkpointBranch := wf.Task1(wd, "Create checkpoint branch", func(ctx *wf.TaskContext, repoName string) (string, error) {
79+
publicHead, err := x.PrivateGerrit.ReadBranchHead(ctx.Context, repoName, "public")
80+
if err != nil {
81+
return "", err
82+
}
83+
checkpointName := fmt.Sprintf("public-%s", time.Now().UTC().Format("2006-01-02-1504"))
84+
if _, err := x.PrivateGerrit.CreateBranch(ctx.Context, "go", checkpointName, gerrit.BranchInput{Revision: publicHead}); err != nil {
85+
return "", err
86+
}
87+
return checkpointName, nil
88+
}, repoName, wf.After(checkedChange))
89+
90+
// move and rebase change onto checkpoint branch
91+
movedChange := wf.Task2(wd, "Move change+rebase onto checkpoint branch", func(ctx *wf.TaskContext, change *gerrit.ChangeInfo, checkpointBranch string) (*gerrit.ChangeInfo, error) {
92+
newCI, err := x.PrivateGerrit.MoveChange(ctx.Context, change.ChangeID, checkpointBranch, true)
93+
if err != nil {
94+
return nil, err
95+
}
96+
newCI, err = x.PrivateGerrit.RebaseChange(ctx.Context, change.ChangeID, "")
97+
if err != nil {
98+
return nil, err
99+
}
100+
return &newCI, nil
101+
}, checkedChange, checkpointBranch)
102+
103+
// wait for change to be submitted
104+
submittedChange := wf.Task1(wd, "Await submission", func(ctx *wf.TaskContext, change *gerrit.ChangeInfo) (*gerrit.ChangeInfo, error) {
105+
var submitted gerrit.ChangeInfo
106+
if _, err := AwaitCondition(ctx, time.Second*10, func() (string, bool, error) {
107+
// The ChangeInfo object returned by RebaseChange doesn't contain
108+
// information about submittability, so we need to refetch it using
109+
// GetChange.
110+
ci, err := x.PrivateGerrit.GetChange(ctx, change.ChangeID, gerrit.QueryChangesOpt{Fields: []string{"SUBMITTABLE"}})
111+
if err != nil {
112+
return "", false, err
113+
}
114+
115+
if !ci.Submittable {
116+
return "", false, nil
117+
}
118+
119+
submitted, err = x.PrivateGerrit.SubmitChange(ctx, ci.ChangeID)
120+
if err != nil {
121+
return "", false, err
122+
}
123+
return "", true, nil
124+
125+
}); err != nil {
126+
return nil, err
127+
}
128+
129+
return &submitted, nil
130+
}, movedChange)
131+
132+
// publish change publicly
133+
publicChange := wf.Task3(wd, "Publish change", func(ctx *wf.TaskContext, change *gerrit.ChangeInfo, reviewers []string, repoName string) (*gerrit.ChangeInfo, error) {
134+
changeInfo, err := x.PrivateGerrit.GetChange(ctx, change.ChangeID, gerrit.QueryChangesOpt{Fields: []string{"CURRENT_REVISION"}})
135+
if err != nil {
136+
return nil, err
137+
}
61138
if changeInfo.Status != gerrit.ChangeStatusMerged {
62139
return nil, fmt.Errorf("CL %s not merged, status is %s", clNumber, changeInfo.Status)
63140
}
@@ -136,13 +213,16 @@ func (x *PrivXPatch) NewDefinition(tagx *TagXReposTasks) *wf.Definition {
136213
if err != nil {
137214
return nil, err
138215
}
139-
return repos, nil
140-
}, clNumber, reviewers, repos, repoName)
216+
return change, nil
217+
}, submittedChange, reviewers, repoName)
141218

142-
tagged := wf.Expand4(wd, "Create single-repo plan", tagx.BuildSingleRepoPlan, repos, repoName, skipPostSubmit, reviewers)
219+
// tag repository
220+
tagged := wf.Expand4(wd, "Create single-repo plan", tagx.BuildSingleRepoPlan, repos, repoName, skipPostSubmit, reviewers, wf.After(publicChange))
143221

222+
// wait for manual approval of the announcement message
144223
okayToAnnoucne := wf.Action0(wd, "Wait to Announce", x.ApproveAction, wf.After(tagged))
145224

225+
// send announcement email
146226
wf.Task5(wd, "Mail announcement", func(ctx *wf.TaskContext, tagged TagRepo, cve string, githubIssue string, relNote string, acknowledgement string) (string, error) {
147227
var buf bytes.Buffer
148228
if err := privXPatchAnnouncementTmpl.Execute(&buf, map[string]string{

internal/task/privx_test.go

+23
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,34 @@ func (c *privxClient) Tag(ctx context.Context, repo string, tag string, commit s
4747
return nil
4848
}
4949

50+
func (c *privxClient) GetRevisionActions(ctx context.Context, changeID, revision string) (map[string]*gerrit.ActionInfo, error) {
51+
return map[string]*gerrit.ActionInfo{
52+
"submit": &gerrit.ActionInfo{Enabled: true},
53+
}, nil
54+
}
55+
56+
func (c *privxClient) CreateBranch(ctx context.Context, project, branch string, input gerrit.BranchInput) (string, error) {
57+
return "", nil
58+
}
59+
60+
func (c *privxClient) MoveChange(ctx context.Context, changeID string, branch string, keepAllVotes bool) (gerrit.ChangeInfo, error) {
61+
return gerrit.ChangeInfo{}, nil
62+
}
63+
64+
func (c *privxClient) RebaseChange(ctx context.Context, changeID string, revision string) (gerrit.ChangeInfo, error) {
65+
return gerrit.ChangeInfo{}, nil
66+
}
67+
68+
func (c *privxClient) SubmitChange(ctx context.Context, changeID string) (gerrit.ChangeInfo, error) {
69+
return gerrit.ChangeInfo{}, nil
70+
}
71+
5072
func (c *privxClient) GetChange(ctx context.Context, changeID string, opts ...gerrit.QueryChangesOpt) (*gerrit.ChangeInfo, error) {
5173
return &gerrit.ChangeInfo{
5274
Project: "net",
5375
Status: gerrit.ChangeStatusMerged,
5476
CurrentRevision: "dead",
77+
Submittable: true,
5578
Revisions: map[string]gerrit.RevisionInfo{
5679
"dead": {
5780
Fetch: map[string]*gerrit.FetchInfo{

0 commit comments

Comments
 (0)