--- /dev/null
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+ "flag"
+ "fmt"
+ "io/ioutil"
+ "net/http"
+ "os"
+ "path"
+)
+
+var bucket = flag.String("bucket", "golang-gopls_integration_tests", "GCS bucket holding test artifacts.")
+
+const usage = `
+artifacts [--bucket=<bucket ID>] <cloud build evaluation ID>
+
+Fetch artifacts from an integration test run. Evaluation ID should be extracted
+from the cloud build notification.
+
+In order for this to work, the GCS bucket that artifacts were written to must
+be publicly readable. By default, this fetches from the
+golang-gopls_integration_tests bucket.
+`
+
+func main() {
+ flag.Usage = func() {
+ fmt.Fprint(flag.CommandLine.Output(), usage)
+ }
+ flag.Parse()
+ if flag.NArg() != 1 {
+ flag.Usage()
+ os.Exit(2)
+ }
+ evalID := flag.Arg(0)
+ logURL := fmt.Sprintf("https://storage.googleapis.com/%s/log-%s.txt", *bucket, evalID)
+ if err := download(logURL); err != nil {
+ fmt.Fprintf(os.Stderr, "downloading logs: %v", err)
+ }
+ tarURL := fmt.Sprintf("https://storage.googleapis.com/%s/govim/%s/artifacts.tar.gz", *bucket, evalID)
+ if err := download(tarURL); err != nil {
+ fmt.Fprintf(os.Stderr, "downloading artifact tarball: %v", err)
+ }
+}
+
+func download(artifactURL string) error {
+ name := path.Base(artifactURL)
+ resp, err := http.Get(artifactURL)
+ if err != nil {
+ return fmt.Errorf("fetching from GCS: %v", err)
+ }
+ defer resp.Body.Close()
+ if resp.StatusCode != http.StatusOK {
+ return fmt.Errorf("got status code %d from GCS", resp.StatusCode)
+ }
+ data, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ return fmt.Errorf("reading result: %v", err)
+ }
+ if err := ioutil.WriteFile(name, data, 0644); err != nil {
+ return fmt.Errorf("writing artifact: %v", err)
+ }
+ return nil
+}