Setup autodeployment for api's bazel build
* Using docker.New instead of docker.Login which needed configDir passed around.
* Also cleaned up unneeded references to infraCommonEnv and infraCommonBuildArgs.
Bug: skia:12812
Change-Id: Ie60ad77d75a5a17f9350e0028afb8c54bf4c63cb
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/494581
Reviewed-by: Kevin Lubick <kjlubick@google.com>
Commit-Queue: Ravi Mistry <rmistry@google.com>
diff --git a/infra/bots/task_drivers/push_apps_from_skia_image/push_apps_from_skia_image.go b/infra/bots/task_drivers/push_apps_from_skia_image/push_apps_from_skia_image.go
index ffb58e5..9086edd 100644
--- a/infra/bots/task_drivers/push_apps_from_skia_image/push_apps_from_skia_image.go
+++ b/infra/bots/task_drivers/push_apps_from_skia_image/push_apps_from_skia_image.go
@@ -11,10 +11,8 @@
import (
"context"
- "errors"
"flag"
"fmt"
- "io/ioutil"
"os"
"path"
"path/filepath"
@@ -26,7 +24,6 @@
"go.skia.org/infra/go/common"
docker_pubsub "go.skia.org/infra/go/docker/build/pubsub"
sk_exec "go.skia.org/infra/go/exec"
- "go.skia.org/infra/go/util"
"go.skia.org/infra/task_driver/go/lib/auth_steps"
"go.skia.org/infra/task_driver/go/lib/bazel"
"go.skia.org/infra/task_driver/go/lib/checkout"
@@ -57,31 +54,7 @@
apiImageName = "api"
)
-var (
- infraCommonEnv = []string{
- "SKIP_BUILD=1",
- "ROOT=/OUT",
- }
- infraCommonBuildArgs = map[string]string{
- "SKIA_IMAGE_NAME": "skia-release",
- }
-)
-
-func buildPushFiddlerImage(ctx context.Context, tag, repo, configDir string, topic *pubsub.Topic) error {
- // Checkout out the Skia infra repo at the specified commit.
- if *infraRevision == "" {
- return errors.New("Must specify --infra_revision")
- }
- // Check out the Skia infra repo at the specified commit.
- rs := types.RepoState{
- Repo: common.REPO_SKIA_INFRA,
- Revision: *infraRevision,
- }
- infraCheckoutDir := filepath.Join("infra_repo")
- if _, err := checkout.EnsureGitCheckout(ctx, infraCheckoutDir, rs); err != nil {
- return err
- }
-
+func buildPushFiddlerImage(ctx context.Context, dkr *docker.Docker, tag, infraCheckoutDir string, topic *pubsub.Topic) error {
// Run skia-release image and extract products out of /tmp/skia/skia. See
// https://skia.googlesource.com/skia/+/0e845dc8b05cb2d40d1c880184e33dd76081283a/docker/skia-release/Dockerfile#33
productsDir, err := os_steps.TempDir(ctx, "", "")
@@ -93,15 +66,7 @@
}
skiaCopyCmd := []string{"/bin/sh", "-c", "cd /tmp; tar cvzf skia.tar.gz --directory=/tmp/skia skia; cp /tmp/skia.tar.gz /OUT/"}
releaseImg := fmt.Sprintf("gcr.io/skia-public/skia-release:%s", tag)
- if err := docker.Run(ctx, releaseImg, configDir, skiaCopyCmd, volumes, nil); err != nil {
- return err
- }
-
- // Ensure that the bazel cache is setup.
- opts := bazel.BazelOptions{
- CachePath: "/mnt/pd0/bazel_cache",
- }
- if err := bazel.EnsureBazelRCFile(ctx, opts); err != nil {
+ if err := dkr.Run(ctx, releaseImg, skiaCopyCmd, volumes, nil); err != nil {
return err
}
@@ -131,26 +96,17 @@
return err
}
- // Remove all temporary files from the host machine. Swarming gets upset if there are root-owned
- // files it cannot clean up.
- // TODO(rmistry): Move to cleanupTempFiles after api is migrated to bazel.
- cleanupCmd := []string{"/bin/sh", "-c", "rm -rf /OUT/*"}
- if err := docker.Run(ctx, releaseImg, configDir, cleanupCmd, volumes, nil); err != nil {
- return err
- }
-
- return nil
+ return cleanupTempFiles(ctx, dkr, releaseImg, volumes)
}
-func cleanupTempFiles(ctx context.Context, configDir string, volumes []string) error {
+func cleanupTempFiles(ctx context.Context, dkr *docker.Docker, image string, volumes []string) error {
// Remove all temporary files from the host machine. Swarming gets upset if there are root-owned
// files it cannot clean up.
- const infraImageWithTag = "gcr.io/skia-public/infra:prod"
cleanupCmd := []string{"/bin/sh", "-c", "rm -rf /OUT/*"}
- return docker.Run(ctx, infraImageWithTag, configDir, cleanupCmd, volumes, nil)
+ return dkr.Run(ctx, image, cleanupCmd, volumes, nil)
}
-func buildPushApiImage(ctx context.Context, tag, repo, configDir, checkoutDir string, topic *pubsub.Topic) error {
+func buildPushApiImage(ctx context.Context, dkr *docker.Docker, tag, checkoutDir, infraCheckoutDir string, topic *pubsub.Topic) error {
tempDir, err := os_steps.TempDir(ctx, "", "")
if err != nil {
return err
@@ -168,20 +124,38 @@
"OUTPUT_DIRECTORY=/OUT",
}
doxygenCmd := []string{"/bin/sh", "-c", "cd /CHECKOUT/tools/doxygen && doxygen ProdDoxyfile"}
- if err := docker.Run(ctx, "gcr.io/skia-public/doxygen:testing-slim", configDir, doxygenCmd, volumes, env); err != nil {
+ doxygenImg := "gcr.io/skia-public/doxygen:testing-slim"
+ if err := dkr.Run(ctx, doxygenImg, doxygenCmd, volumes, env); err != nil {
return err
}
- image := fmt.Sprintf("gcr.io/skia-public/%s", apiImageName)
- cmd := []string{"/bin/sh", "-c", "cd /home/skia/golib/src/go.skia.org/infra/api && make release_ci"}
- infraEnv := util.CopyStringSlice(infraCommonEnv)
- infraEnv = append(infraEnv, "DOXYGEN_HTML=/OUT/html")
- infraVolumes := []string{fmt.Sprintf("%s:/OUT", tempDir)}
- err = docker.BuildPushImageFromInfraImage(ctx, "Api", image, tag, repo, configDir, tempDir, "prod", topic, cmd, infraVolumes, infraEnv, infraCommonBuildArgs)
+ err = td.Do(ctx, td.Props("Build "+apiImageName+" image").Infra(), func(ctx context.Context) error {
+ runCmd := &sk_exec.Command{
+ Name: "make",
+ Args: []string{"release-api-ci"},
+ InheritEnv: true,
+ Env: []string{
+ "COPY_FROM_DIR=" + filepath.Join(tempDir, "html"),
+ "STABLE_DOCKER_TAG=" + tag,
+ },
+ Dir: filepath.Join(infraCheckoutDir, "api"),
+ LogStdout: true,
+ LogStderr: true,
+ }
+ _, err := sk_exec.RunCommand(ctx, runCmd)
+ if err != nil {
+ return err
+ }
+ return nil
+ })
if err != nil {
return err
}
- return cleanupTempFiles(ctx, configDir, volumes)
+ if err := docker.PublishToTopic(ctx, "gcr.io/skia-public/"+apiImageName, tag, common.REPO_SKIA, topic); err != nil {
+ return err
+ }
+
+ return cleanupTempFiles(ctx, dkr, doxygenImg, volumes)
}
func main() {
@@ -189,25 +163,46 @@
ctx := td.StartRun(projectId, taskId, taskName, output, local)
defer td.EndRun(ctx)
+ if *infraRevision == "" {
+ td.Fatalf(ctx, "Must specify --infra_revision")
+ }
+
rs, err := checkout.GetRepoState(checkoutFlags)
if err != nil {
td.Fatal(ctx, err)
}
-
wd, err := os_steps.Abs(ctx, *workdir)
if err != nil {
td.Fatal(ctx, err)
}
-
- // Check out the code.
+ // Check out the Skia repo code.
co, err := checkout.EnsureGitCheckout(ctx, path.Join(wd, "repo"), rs)
if err != nil {
td.Fatal(ctx, err)
}
+ skiaCheckoutDir := co.Dir()
+
+ // Checkout out the Skia infra repo at the specified commit.
+ infraRS := types.RepoState{
+ Repo: common.REPO_SKIA_INFRA,
+ Revision: *infraRevision,
+ }
+ infraCheckoutDir := filepath.Join("infra_repo")
+ if _, err := checkout.EnsureGitCheckout(ctx, infraCheckoutDir, infraRS); err != nil {
+ td.Fatal(ctx, err)
+ }
// Setup go.
ctx = golang.WithEnv(ctx, wd)
+ // Ensure that the bazel cache is setup.
+ opts := bazel.BazelOptions{
+ CachePath: "/mnt/pd0/bazel_cache",
+ }
+ if err := bazel.EnsureBazelRCFile(ctx, opts); err != nil {
+ td.Fatal(ctx, err)
+ }
+
// Create token source with scope for cloud registry (storage) and pubsub.
ts, err := auth_steps.Init(ctx, *local, auth.ScopeUserinfoEmail, auth.ScopeFullControl, pubsub.ScopePubSub)
if err != nil {
@@ -226,36 +221,18 @@
if rs.Issue != "" && rs.Patchset != "" {
tag = fmt.Sprintf("%s_%s", rs.Issue, rs.Patchset)
}
- // Add the tag to infraCommonBuildArgs.
- infraCommonBuildArgs["SKIA_IMAGE_TAG"] = tag
- // Create a temporary config dir for Docker.
- configDir, err := ioutil.TempDir("", "")
+ // Instantiate docker.
+ dkr, err := docker.New(ctx, ts)
if err != nil {
td.Fatal(ctx, err)
}
- defer util.RemoveAll(configDir)
-
- // Login to docker (required to push to docker).
- token, err := ts.Token()
- if err != nil {
- td.Fatal(ctx, err)
- }
- if err := docker.Login(ctx, token.AccessToken, "gcr.io/skia-public/", configDir); err != nil {
- td.Fatal(ctx, err)
- }
- // TODO(rmistry): After api is migrated to bazel use this way to instantiate
- // docker instead:
- // dkr, err := docker.New(ctx, ts)
- // if err != nil {
- // td.Fatal(ctx, err)
- // }
// Build and push all apps of interest below.
- if err := buildPushApiImage(ctx, tag, rs.Repo, configDir, co.Dir(), topic); err != nil {
+ if err := buildPushApiImage(ctx, dkr, tag, skiaCheckoutDir, infraCheckoutDir, topic); err != nil {
td.Fatal(ctx, err)
}
- if err := buildPushFiddlerImage(ctx, tag, rs.Repo, configDir, topic); err != nil {
+ if err := buildPushFiddlerImage(ctx, dkr, tag, infraCheckoutDir, topic); err != nil {
td.Fatal(ctx, err)
}
}