Skip to content

Commit 00c8f6e

Browse files
committed
cmd/relui: register tweet workflow definitions
Define an external service configuration for tasks. Its starting point has tasks running in dry-run mode. Adjust the site header accordingly, so humans can refer to it to know what to expect from workflows. Use this external service configuration to register twitter workflows. After go.dev/issue/51122 is resolved and cmd/relui in the production environment has access to secret credentials, we can flip the switch so it starts posting tweets at twitter.com/golang. Fixes golang/go#47402. Change-Id: Icccd94518fd7bf39052f67ba1be4db3e42d3d686 Reviewed-on: https://go-review.googlesource.com/c/build/+/385294 Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org> Reviewed-by: Heschi Kreinick <heschi@google.com> Trust: Dmitri Shuralyov <dmitshur@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Alex Rakoczy <alex@golang.org>
1 parent 3861829 commit 00c8f6e

File tree

4 files changed

+65
-3
lines changed

4 files changed

+65
-3
lines changed

cmd/relui/main.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/jackc/pgx/v4/pgxpool"
1515
"golang.org/x/build/internal/https"
1616
"golang.org/x/build/internal/relui"
17+
"golang.org/x/build/internal/task"
1718
)
1819

1920
var (
@@ -39,7 +40,25 @@ func main() {
3940
}
4041
return
4142
}
43+
44+
// Define the site header and external service configuration.
45+
// The site header communicates to humans what will happen
46+
// when workflows run.
47+
// Keep these appropriately in sync.
48+
var (
49+
siteHeader = relui.SiteHeader{
50+
Title: "Go Releases (work in progress)",
51+
CSSClass: "Site-header--workInProgress",
52+
}
53+
extCfg = task.ExternalConfig{
54+
// TODO(go.dev/issue/51122): Once secrets are available from prod deployment and we're ready, pass them here.
55+
// TODO(go.dev/issue/51150): When twitter client creation is factored out from task package, update code here.
56+
DryRun: true,
57+
}
58+
)
59+
4260
dh := relui.NewDefinitionHolder()
61+
relui.RegisterTweetDefinitions(dh, extCfg)
4362
db, err := pgxpool.Connect(ctx, *pgConnect)
4463
if err != nil {
4564
log.Fatal(err)
@@ -57,7 +76,7 @@ func main() {
5776
log.Fatalf("url.Parse(%q) = %v, %v", *baseURL, base, err)
5877
}
5978
}
60-
s := relui.NewServer(db, w, base, relui.SiteHeader{Title: "Go Releases"})
79+
s := relui.NewServer(db, w, base, siteHeader)
6180
if err != nil {
6281
log.Fatalf("relui.NewServer() = %v", err)
6382
}

internal/relui/static/styles.css

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,15 @@ h6 {
4242
flex: none;
4343
}
4444
.Header {
45+
padding: 0.625rem;
46+
}
47+
.Site-header--production .Header {
4548
background: #e0ebf5;
4649
color: #375eab;
47-
padding: 0.625rem;
50+
}
51+
.Site-header--workInProgress .Header {
52+
background: #d6d6d6;
53+
color: #171d27;
4854
}
4955
.Header-title {
5056
font-size: 1.5rem;

internal/relui/web.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,10 @@ func (s *Server) createWorkflowHandler(w http.ResponseWriter, r *http.Request) {
221221
params := make(map[string]string)
222222
for _, n := range d.ParameterNames() {
223223
params[n] = r.FormValue(fmt.Sprintf("workflow.params.%s", n))
224-
if params[n] == "" {
224+
225+
// TODO(go.dev/issue/51191): Create a better mechanism for storing parameter metadata.
226+
requiredParam := !strings.HasSuffix(n, " (optional)")
227+
if requiredParam && params[n] == "" {
225228
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
226229
return
227230
}

internal/relui/workflows.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package relui
77
import (
88
"sync"
99

10+
"golang.org/x/build/internal/task"
1011
"golang.org/x/build/internal/workflow"
1112
)
1213

@@ -54,6 +55,39 @@ func (h *DefinitionHolder) Definitions() map[string]*workflow.Definition {
5455
return defs
5556
}
5657

58+
// RegisterTweetDefinitions registers workflow definitions involving tweeting
59+
// onto h, using e for the external service configuration.
60+
func RegisterTweetDefinitions(h *DefinitionHolder, e task.ExternalConfig) {
61+
{
62+
wd := workflow.New()
63+
wd.Output("TweetURL", wd.Task("tweet-minor", func(ctx *workflow.TaskContext, v1, v2, sec, ann string) (string, error) {
64+
return task.TweetMinorRelease(ctx, task.ReleaseTweet{Version: v1, SecondaryVersion: v2, Security: sec, Announcement: ann}, e)
65+
}, wd.Parameter("Version"), wd.Parameter("SecondaryVersion"), wd.Parameter("Security (optional)"), wd.Parameter("Announcement")))
66+
h.RegisterDefinition("tweet-minor", wd)
67+
}
68+
{
69+
wd := workflow.New()
70+
wd.Output("TweetURL", wd.Task("tweet-beta", func(ctx *workflow.TaskContext, v, sec, ann string) (string, error) {
71+
return task.TweetBetaRelease(ctx, task.ReleaseTweet{Version: v, Security: sec, Announcement: ann}, e)
72+
}, wd.Parameter("Version"), wd.Parameter("Security (optional)"), wd.Parameter("Announcement")))
73+
h.RegisterDefinition("tweet-beta", wd)
74+
}
75+
{
76+
wd := workflow.New()
77+
wd.Output("TweetURL", wd.Task("tweet-rc", func(ctx *workflow.TaskContext, v, sec, ann string) (string, error) {
78+
return task.TweetRCRelease(ctx, task.ReleaseTweet{Version: v, Security: sec, Announcement: ann}, e)
79+
}, wd.Parameter("Version"), wd.Parameter("Security (optional)"), wd.Parameter("Announcement")))
80+
h.RegisterDefinition("tweet-rc", wd)
81+
}
82+
{
83+
wd := workflow.New()
84+
wd.Output("TweetURL", wd.Task("tweet-major", func(ctx *workflow.TaskContext, v, sec string) (string, error) {
85+
return task.TweetMajorRelease(ctx, task.ReleaseTweet{Version: v, Security: sec}, e)
86+
}, wd.Parameter("Version"), wd.Parameter("Security (optional)")))
87+
h.RegisterDefinition("tweet-major", wd)
88+
}
89+
}
90+
5791
// newEchoWorkflow returns a runnable workflow.Definition for
5892
// development.
5993
func newEchoWorkflow() *workflow.Definition {

0 commit comments

Comments
 (0)