From 921bd3ae92a287a804ab10e943ee1c4a498a816a Mon Sep 17 00:00:00 2001 From: Adin Scannell Date: Thu, 25 Apr 2019 23:04:06 -0700 Subject: cmd/gvisor-website: add /rebuild and cron In order to ensure that the system call descriptions and other documentation that will be sourced from the main repository remains up to date, add a hook that allows the site to submit a rebuild to Google Cloud Builder. This can be triggered manually by an admin, or will be triggered every 24 hours by a new cron configuration. --- cmd/gvisor-website/main.go | 84 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 69 insertions(+), 15 deletions(-) (limited to 'cmd/gvisor-website/main.go') diff --git a/cmd/gvisor-website/main.go b/cmd/gvisor-website/main.go index 6ae1881c2..82364b6fe 100644 --- a/cmd/gvisor-website/main.go +++ b/cmd/gvisor-website/main.go @@ -1,22 +1,21 @@ -/* -Copyright 2019 Google LLC - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ +// Copyright 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. package main import ( + "context" "flag" "fmt" "log" @@ -24,6 +23,10 @@ import ( "os" "regexp" "strings" + + // For triggering manual rebuilds. + "golang.org/x/oauth2/google" + "google.golang.org/api/cloudbuild/v1" ) var redirects = map[string]string{ @@ -120,6 +123,56 @@ func registerStatic(mux *http.ServeMux, staticDir string) { mux.Handle("/", hostRedirectHandler(http.FileServer(http.Dir(staticDir)))) } +// registerRebuild registers the rebuild handler. +func registerRebuild(mux *http.ServeMux) { + if mux == nil { + mux = http.DefaultServeMux + } + + mux.Handle("/rebuild", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := context.Background() + credentials, err := google.FindDefaultCredentials(ctx, cloudbuild.CloudPlatformScope) + if err != nil { + http.Error(w, "credentials error: "+err.Error(), 500) + return + } + cloudbuildService, err := cloudbuild.NewService(ctx) + if err != nil { + http.Error(w, "cloudbuild service error: "+err.Error(), 500) + return + } + projectID := credentials.ProjectID + if projectID == "" { + // If running locally, then this project will not be + // available. Use the default project here. + projectID = "gvisor-website" + } + triggers, err := cloudbuildService.Projects.Triggers.List(projectID).Do() + if err != nil { + http.Error(w, "trigger list error: "+err.Error(), 500) + return + } + if len(triggers.Triggers) < 1 { + http.Error(w, "trigger list error: no triggers", 500) + return + } + if _, err := cloudbuildService.Projects.Triggers.Run( + projectID, + triggers.Triggers[0].Id, + &cloudbuild.RepoSource{ + // In the current project, require that a + // github cloud source repository exists with + // the given name, and build from master. + BranchName: "master", + RepoName: "github_google_gvisor-website", + ProjectId: projectID, + }).Do(); err != nil { + http.Error(w, "run error: "+err.Error(), 500) + return + } + })) +} + func envFlagString(name, def string) string { if val := os.Getenv(name); val != "" { return val @@ -136,6 +189,7 @@ func main() { flag.Parse() registerRedirects(nil) + registerRebuild(nil) registerStatic(nil, *staticDir) log.Fatal(http.ListenAndServe(*addr, nil)) -- cgit v1.2.3