Repository: GoogleContainerTools/skaffold
Pull request #7682 (2022-07-25 14:02:34)

fix: updated typo and links that weren't rendering correctly


Patch:
diff --git a/cmd/skaffold/app/cmd/init.go b/cmd/skaffold/app/cmd/init.go
index f0a0660a4..684d1e57c 100644
--- a/cmd/skaffold/app/cmd/init.go
+++ b/cmd/skaffold/app/cmd/init.go
@@ -40,6 +40,7 @@ var (
 	analyze                  bool
 	enableJibInit            bool
 	enableJibGradleInit      bool
+	enableKoInit             bool
 	enableBuildpacksInit     bool
 	enableNewInitFormat      bool
 	enableManifestGeneration bool
@@ -65,6 +66,7 @@ func NewCmdInit() *cobra.Command {
 			{Value: &enableNewInitFormat, Name: "XXenableNewInitFormat", DefValue: false, Usage: "", Hidden: true, IsEnum: true},
 			{Value: &enableJibInit, Name: "XXenableJibInit", DefValue: true, Usage: "", Hidden: true, IsEnum: true},
 			{Value: &enableJibGradleInit, Name: "XXenableJibGradleInit", DefValue: false, Usage: "", Hidden: true, IsEnum: true},
+			{Value: &enableKoInit, Name: "XXenableKoInit", DefValue: false, Usage: "", Hidden: true, IsEnum: true},
 			{Value: &enableBuildpacksInit, Name: "XXenableBuildpacksInit", DefValue: true, Usage: "", Hidden: true, IsEnum: true},
 			{Value: &buildpacksBuilder, Name: "XXdefaultBuildpacksBuilder", DefValue: "gcr.io/buildpacks/builder:v1", Usage: "", Hidden: true},
 			{Value: &enableManifestGeneration, Name: "generate-manifests", DefValue: false, Usage: "Allows skaffold to try and generate basic kubernetes resources to get your project started", IsEnum: true},
@@ -85,8 +87,9 @@ func doInit(ctx context.Context, out io.Writer) error {
 		Analyze:                  analyze,
 		EnableJibInit:            enableJibInit,
 		EnableJibGradleInit:      enableJibGradleInit,
+		EnableKoInit:             enableKoInit,
 		EnableBuildpacksInit:     enableBuildpacksInit,
-		EnableNewInitFormat:      enableNewInitFormat || enableBuildpacksInit || enableJibInit,
+		EnableNewInitFormat:      enableNewInitFormat || enableBuildpacksInit || enableJibInit || enableKoInit,
 		EnableManifestGeneration: enableManifestGeneration,
 		Opts:                     opts,
 		MaxFileSize:              maxFileSize,
diff --git a/docs-v2/content/en/api-v2/skaffold.swagger.json b/docs-v2/content/en/api-v2/skaffold.swagger.json
index 0ebaa28ea..d15129a66 100644
--- a/docs-v2/content/en/api-v2/skaffold.swagger.json
+++ b/docs-v2/content/en/api-v2/skaffold.swagger.json
@@ -760,6 +760,27 @@
       },
       "description": "`BuildSubtaskvent` describes the build status per artifact, and will be emitted by Skaffold anytime a build starts or finishes, successfully or not.\nIf the build fails, an error will be attached to the event."
     },
+    "v2CloudRunReadyEvent": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "task_id": {
+          "type": "string"
+        },
+        "resource": {
+          "type": "string"
+        },
+        "url": {
+          "type": "string"
+        },
+        "ready_revision": {
+          "type": "string"
+        }
+      },
+      "description": "A Resource StatusCheck Event for a Cloud Run Service.\nIndicates that a Cloud Run Service has deployed successfully and is serving\non the specified URL"
+    },
     "v2DebuggingContainerEvent": {
       "type": "object",
       "properties": {
@@ -896,6 +917,9 @@
         },
         "verifyEvent": {
           "$ref": "#/definitions/v2VerifySubtaskEvent"
+        },
+        "cloudRunReadyEvent": {
+          "$ref": "#/definitions/v2CloudRunReadyEvent"
         }
       },
       "description": "`Event` describes an event in the Skaffold process.\nIt is one of MetaEvent, BuildEvent, TestEvent, DeployEvent, PortEvent, StatusCheckEvent, ResourceStatusCheckEvent, FileSyncEvent, or DebuggingContainerEvent."
diff --git a/docs-v2/content/en/docs/pipeline-stages/builders/ko.md b/docs-v2/content/en/docs/pipeline-stages/builders/ko.md
index af0994be8..86c5ac7c4 100644
--- a/docs-v2/content/en/docs/pipeline-stages/builders/ko.md
+++ b/docs-v2/content/en/docs/pipeline-stages/builders/ko.md
@@ -254,30 +254,10 @@ Useful tips for existing `ko` users:
   specify these fields in `.ko.yaml`, you do not need to repeat them in
   `skaffold.yaml`.
 
-- Future Skaffold releases will include support for generating `skaffold.yaml`
-  files by examining an existing code base. For now, you can generate a starter
-  `skaffold.yaml` file by searching your existing manifests for image
-  references starting with `ko://` by using this snippet:
-
-  ```shell
-  cat << EOF > skaffold.yaml
-  apiVersion: skaffold/v2beta26
-  kind: Config
-  build:
-    artifacts:
-  EOF
-  grep -rho "ko://$(go list -m)[^\"]*" ./config/ | sort | uniq | xargs -Iimg echo -e "  - image: img\n    ko: {}" >> skaffold.yaml
-  cat << EOF >> skaffold.yaml
-    local:
-      concurrency: 0
-  deploy:
-    kubectl:
-      manifests:
-      - ./config/**
-  EOF
-  ```
-
-  Replace `./config/` with the path to your Kubernetes manifest files.
+- You can generate `skaffold.yaml` files by examining an existing code base,
+  using the command
+  [`skaffold init --XXenableKoInit=true`]({{< relref "/docs/pipeline-stages/init" >}}).
+  Select the Ko builder for your images when prompted.
 
 ### `ko` commands and workflows in Skaffold
 
diff --git a/docs-v2/content/en/docs/pipeline-stages/init.md b/docs-v2/content/en/docs/pipeline-stages/init.md
index a719db9c8..0fdf0c2e9 100644
--- a/docs-v2/content/en/docs/pipeline-stages/init.md
+++ b/docs-v2/content/en/docs/pipeline-stages/init.md
@@ -17,7 +17,8 @@ and [deploy](#deploy-config-initialization) config.
 
 1. [Docker]({{<relref "/docs/pipeline-stages/builders/docker">}})
 2. [Jib]({{<relref "/docs/pipeline-stages/builders/jib">}})
-2. [Buildpacks]({{<relref "/docs/pipeline-stages/builders/buildpacks">}})
+3. [Ko]({{<relref "/docs/pipeline-stages/builders/ko">}})
+4. [Buildpacks]({{<relref "/docs/pipeline-stages/builders/buildpacks">}})
 
 `skaffold init` walks your project directory and looks for any build configuration files such as `Dockerfile`,
 `build.gradle/pom.xml`, `package.json`, `requirements.txt` or `go.mod`. `init` skips files that are larger
@@ -108,7 +109,7 @@ If bringing a project to skaffold that has no kubernetes manifests yet, it may b
 ## `--force` Flag
 `skaffold init` allows for use of a `--force` flag, which removes the prompts from vanilla `skaffold init`, and allows skaffold to make a best effort attempt to automatically generate a config for your project.
 
-In a situation where one image is detected, but multiple possible builders are detected, skaffold will choose a builder as follows: Docker > Jib > Bazel > Buildpacks.
+In a situation where one image is detected, but multiple possible builders are detected, skaffold will choose a builder as follows: Docker > Jib > Ko > Bazel > Buildpacks.
 
 *Note: This feature is still under development, and doesn't currently support use cases such as multiple images in a project.*
 
diff --git a/docs-v2/content/en/docs/references/api-v2/grpc.md b/docs-v2/content/en/docs/references/api-v2/grpc.md
index 3ff8be9ee..9ca6abbaa 100644
--- a/docs-v2/content/en/docs/references/api-v2/grpc.md
+++ b/docs-v2/content/en/docs/references/api-v2/grpc.md
@@ -195,6 +195,27 @@ If the build fails, an error will be attached to the event.
 
 
 
+<a name="proto.v2.CloudRunReadyEvent"></a>
+#### CloudRunReadyEvent
+A Resource StatusCheck Event for a Cloud Run Service.
+Indicates that a Cloud Run Service has deployed successfully and is serving
+on the specified URL
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| id | [string](#string) |  | id of the subtask which will be used in SkaffoldLog |
+| task_id | [string](#string) |  | id of the task of skaffold that this event came from |
+| resource | [string](#string) |  | the Cloud Run resource that was deployed |
+| url | [string](#string) |  | the base URL that the Cloud Run service is serving on. |
+| ready_revision | [string](#string) |  | the name of the revision that went ready. |
+
+
+
+
+
+
+
 <a name="proto.v2.DebuggingContainerEvent"></a>
 #### DebuggingContainerEvent
 DebuggingContainerEvent is raised when a debugging container is started or terminated
@@ -326,6 +347,7 @@ It is one of MetaEvent, BuildEvent, TestEvent, DeployEvent, PortEvent, StatusChe
 | testEvent | [TestSubtaskEvent](#proto.v2.TestSubtaskEvent) |  | describes if the test has started, is in progress or is complete. |
 | renderEvent | [RenderSubtaskEvent](#proto.v2.RenderSubtaskEvent) |  | describes if the render has started, is in progress or is complete. |
 | verifyEvent | [VerifySubtaskEvent](#proto.v2.VerifySubtaskEvent) |  | describes if the render has started, is in progress or is complete. |
+| cloudRunReadyEvent | [CloudRunReadyEvent](#proto.v2.CloudRunReadyEvent) |  | describes a deployed Cloud Run service. |
 
 
 
diff --git a/docs/content/en/api-v2/skaffold.swagger.json b/docs/content/en/api-v2/skaffold.swagger.json
index 0ebaa28ea..d15129a66 100644
--- a/docs/content/en/api-v2/skaffold.swagger.json
+++ b/docs/content/en/api-v2/skaffold.swagger.json
@@ -760,6 +760,27 @@
       },
       "description": "`BuildSubtaskvent` describes the build status per artifact, and will be emitted by Skaffold anytime a build starts or finishes, successfully or not.\nIf the build fails, an error will be attached to the event."
     },
+    "v2CloudRunReadyEvent": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "task_id": {
+          "type": "string"
+        },
+        "resource": {
+          "type": "string"
+        },
+        "url": {
+          "type": "string"
+        },
+        "ready_revision": {
+          "type": "string"
+        }
+      },
+      "description": "A Resource StatusCheck Event for a Cloud Run Service.\nIndicates that a Cloud Run Service has deployed successfully and is serving\non the specified URL"
+    },
     "v2DebuggingContainerEvent": {
       "type": "object",
       "properties": {
@@ -896,6 +917,9 @@
         },
         "verifyEvent": {
           "$ref": "#/definitions/v2VerifySubtaskEvent"
+        },
+        "cloudRunReadyEvent": {
+          "$ref": "#/definitions/v2CloudRunReadyEvent"
         }
       },
       "description": "`Event` describes an event in the Skaffold process.\nIt is one of MetaEvent, BuildEvent, TestEvent, DeployEvent, PortEvent, StatusCheckEvent, ResourceStatusCheckEvent, FileSyncEvent, or DebuggingContainerEvent."
diff --git a/docs/content/en/docs/pipeline-stages/builders/ko.md b/docs/content/en/docs/pipeline-stages/builders/ko.md
index af0994be8..86c5ac7c4 100644
--- a/docs/content/en/docs/pipeline-stages/builders/ko.md
+++ b/docs/content/en/docs/pipeline-stages/builders/ko.md
@@ -254,30 +254,10 @@ Useful tips for existing `ko` users:
   specify these fields in `.ko.yaml`, you do not need to repeat them in
   `skaffold.yaml`.
 
-- Future Skaffold releases will include support for generating `skaffold.yaml`
-  files by examining an existing code base. For now, you can generate a starter
-  `skaffold.yaml` file by searching your existing manifests for image
-  references starting with `ko://` by using this snippet:
-
-  ```shell
-  cat << EOF > skaffold.yaml
-  apiVersion: skaffold/v2beta26
-  kind: Config
-  build:
-    artifacts:
-  EOF
-  grep -rho "ko://$(go list -m)[^\"]*" ./config/ | sort | uniq | xargs -Iimg echo -e "  - image: img\n    ko: {}" >> skaffold.yaml
-  cat << EOF >> skaffold.yaml
-    local:
-      concurrency: 0
-  deploy:
-    kubectl:
-      manifests:
-      - ./config/**
-  EOF
-  ```
-
-  Replace `./config/` with the path to your Kubernetes manifest files.
+- You can generate `skaffold.yaml` files by examining an existing code base,
+  using the command
+  [`skaffold init --XXenableKoInit=true`]({{< relref "/docs/pipeline-stages/init" >}}).
+  Select the Ko builder for your images when prompted.
 
 ### `ko` commands and workflows in Skaffold
 
diff --git a/docs/content/en/docs/pipeline-stages/init.md b/docs/content/en/docs/pipeline-stages/init.md
index a719db9c8..0fdf0c2e9 100644
--- a/docs/content/en/docs/pipeline-stages/init.md
+++ b/docs/content/en/docs/pipeline-stages/init.md
@@ -17,7 +17,8 @@ and [deploy](#deploy-config-initialization) config.
 
 1. [Docker]({{<relref "/docs/pipeline-stages/builders/docker">}})
 2. [Jib]({{<relref "/docs/pipeline-stages/builders/jib">}})
-2. [Buildpacks]({{<relref "/docs/pipeline-stages/builders/buildpacks">}})
+3. [Ko]({{<relref "/docs/pipeline-stages/builders/ko">}})
+4. [Buildpacks]({{<relref "/docs/pipeline-stages/builders/buildpacks">}})
 
 `skaffold init` walks your project directory and looks for any build configuration files such as `Dockerfile`,
 `build.gradle/pom.xml`, `package.json`, `requirements.txt` or `go.mod`. `init` skips files that are larger
@@ -108,7 +109,7 @@ If bringing a project to skaffold that has no kubernetes manifests yet, it may b
 ## `--force` Flag
 `skaffold init` allows for use of a `--force` flag, which removes the prompts from vanilla `skaffold init`, and allows skaffold to make a best effort attempt to automatically generate a config for your project.
 
-In a situation where one image is detected, but multiple possible builders are detected, skaffold will choose a builder as follows: Docker > Jib > Bazel > Buildpacks.
+In a situation where one image is detected, but multiple possible builders are detected, skaffold will choose a builder as follows: Docker > Jib > Ko > Bazel > Buildpacks.
 
 *Note: This feature is still under development, and doesn't currently support use cases such as multiple images in a project.*
 
diff --git a/docs/content/en/docs/references/api-v2/grpc.md b/docs/content/en/docs/references/api-v2/grpc.md
index 3ff8be9ee..9ca6abbaa 100644
--- a/docs/content/en/docs/references/api-v2/grpc.md
+++ b/docs/content/en/docs/references/api-v2/grpc.md
@@ -195,6 +195,27 @@ If the build fails, an error will be attached to the event.
 
 
 
+<a name="proto.v2.CloudRunReadyEvent"></a>
+#### CloudRunReadyEvent
+A Resource StatusCheck Event for a Cloud Run Service.
+Indicates that a Cloud Run Service has deployed successfully and is serving
+on the specified URL
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| id | [string](#string) |  | id of the subtask which will be used in SkaffoldLog |
+| task_id | [string](#string) |  | id of the task of skaffold that this event came from |
+| resource | [string](#string) |  | the Cloud Run resource that was deployed |
+| url | [string](#string) |  | the base URL that the Cloud Run service is serving on. |
+| ready_revision | [string](#string) |  | the name of the revision that went ready. |
+
+
+
+
+
+
+
 <a name="proto.v2.DebuggingContainerEvent"></a>
 #### DebuggingContainerEvent
 DebuggingContainerEvent is raised when a debugging container is started or terminated
@@ -326,6 +347,7 @@ It is one of MetaEvent, BuildEvent, TestEvent, DeployEvent, PortEvent, StatusChe
 | testEvent | [TestSubtaskEvent](#proto.v2.TestSubtaskEvent) |  | describes if the test has started, is in progress or is complete. |
 | renderEvent | [RenderSubtaskEvent](#proto.v2.RenderSubtaskEvent) |  | describes if the render has started, is in progress or is complete. |
 | verifyEvent | [VerifySubtaskEvent](#proto.v2.VerifySubtaskEvent) |  | describes if the render has started, is in progress or is complete. |
+| cloudRunReadyEvent | [CloudRunReadyEvent](#proto.v2.CloudRunReadyEvent) |  | describes a deployed Cloud Run service. |
 
 
 
diff --git a/docs/content/en/docs/workflows/debug.md b/docs/content/en/docs/workflows/debug.md
index bffa3fc37..5930c3a49 100644
--- a/docs/content/en/docs/workflows/debug.md
+++ b/docs/content/en/docs/workflows/debug.md
@@ -16,7 +16,7 @@ Debugging is currently supported for five language runtimes.
   - Python 3.5+ (runtime ID: `python`) using `debugpy` (Debug Adapter Protocol) or `pydevd`
   - .NET Core (runtime ID: `netcore`) using `vsdbg` (only for VS Code)
 
-Skaffold can usually detect the correct language runtime if present. However if you encounter difficulties then checkout the [Supported Language Runtimes]({{< relref "#supported-language-runtimes">}}) section for the exact heuristics that Skaffold uses and you can modify your application accordingly, or read about [manually configuring your container for debugging]({{< relref "#manually-configuring-your-container-for-debugging">}}).
+Skaffold can usually detect the correct language runtime if present. However if you encounter difficulties then checkout the [Supported Language Runtimes]({{< relref "#supported-language-runtimes">}}) section for the exact heuristics that Skaffold uses and you can modify your application accordingly, or read about [manually configuring your container for debugging](#manually-configuring-your-container-for-debugging).
 
 ## (Recommended) Debugging using Cloud Code
 
@@ -259,7 +259,7 @@ is a useful setting in many situtions.
 
 Your application should be built with the `-gcflags='all=-N -l'` flag to
 disable optimizations and inlining. If you do not add this flag, debugging can
-becoming confusing due to seemingly-random execution jumps that happen due to
+become confusing due to seemingly-random execution jumps that happen due to
 statement reordering and inlining. Skaffold configures Docker builds with a
 `SKAFFOLD_GO_GCFLAGS` build argument that you should use in your `Dockerfile`:
 
@@ -423,7 +423,7 @@ binary or launch script (i.e., a `pip`-generated launcher script such as `gunico
 Skaffold cannot debug Go and Python applications that use user-created
 shell scripts, or that use shell constructs like `exec` or `eval`.
 Either rewrite your container image command-line or
-[manually configure your container for debugging]({{ relref "#manually-configuring-your-container-for-debugging" }}).
+[manually configure your container for debugging](#manually-configuring-your-container-for-debugging).
 For example:
 ```
 ❌ CMD launch.sh
diff --git a/pkg/skaffold/build/ko/init/init.go b/pkg/skaffold/build/ko/init/init.go
new file mode 100644
index 000000000..98ecafbf9
--- /dev/null
+++ b/pkg/skaffold/build/ko/init/init.go
@@ -0,0 +1,70 @@
+/*
+Copyright 2022 The Skaffold Authors
+
+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
+
+    http://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 init
+
+import (
+	"fmt"
+	"path/filepath"
+
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/initializer/build"
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest"
+)
+
+// ArtifactConfig holds information about a Ko project
+type ArtifactConfig struct {
+	File string `json:"path,omitempty"`
+}
+
+var _ build.InitBuilder = &ArtifactConfig{}
+
+// Validate checks if the file is a Go module file.
+func Validate(path string) bool {
+	return filepath.Base(path) == "go.mod"
+}
+
+// Name returns the name of the builder.
+func (c ArtifactConfig) Name() string {
+	return "Ko"
+}
+
+// Describe returns the initBuilder's string representation.
+// This representation is used when prompting the user to choose a builder.
+func (c ArtifactConfig) Describe() string {
+	return fmt.Sprintf("%s (%s)", c.Name(), c.File)
+}
+
+// ArtifactType returns a definition of the artifact to be built.
+func (c ArtifactConfig) ArtifactType(_ string) latest.ArtifactType {
+	return latest.ArtifactType{
+		KoArtifact: &latest.KoArtifact{
+			Dependencies: &latest.KoDependencies{
+				Paths: []string{"**/*.go", "go.*"},
+			},
+		},
+	}
+}
+
+// ConfiguredImage returns the target image configured by the builder, or empty string if no image is configured.
+func (c ArtifactConfig) ConfiguredImage() string {
+	// Target image is not configured in Ko.
+	return ""
+}
+
+// Path returns the path to the build definition.
+func (c ArtifactConfig) Path() string {
+	return c.File
+}
diff --git a/pkg/skaffold/deploy/cloudrun/status.go b/pkg/skaffold/deploy/cloudrun/status.go
index 46582f956..5db858602 100644
--- a/pkg/skaffold/deploy/cloudrun/status.go
+++ b/pkg/skaffold/deploy/cloudrun/status.go
@@ -142,6 +142,8 @@ type runResource struct {
 	name      string
 	completed bool
 	status    Status
+	url       string
+	revision  string
 }
 
 type Status struct {
@@ -249,6 +251,8 @@ func (r *runResource) checkStatus(crClient *run.APIService) {
 			ErrCode: proto.StatusCode_STATUSCHECK_SUCCESS,
 			Message: "Service started",
 		})
+		r.url = res.Status.Url
+		r.revision = res.Status.LatestReadyRevisionName
 	case "False":
 		r.completed = true
 		r.updateStatus(&proto.ActionableErr{
@@ -305,6 +309,9 @@ func (s *Monitor) printStatusCheckSummary(out io.Writer, c *counter, r *runResou
 		return
 	}
 	eventV2.ResourceStatusCheckEventCompleted(r.path, curStatus.ae)
+	if r.url != "" {
+		eventV2.CloudRunServiceReady(r.path, r.url, r.revision)
+	}
 	if curStatus.ae.ErrCode != proto.StatusCode_STATUSCHECK_SUCCESS {
 		output.Default.Fprintln(out, fmt.Sprintf("Cloud Run Service %s failed with error: %s", r.name, curStatus.ae.Message))
 	} else {
diff --git a/pkg/skaffold/event/v2/cloudrun.go b/pkg/skaffold/event/v2/cloudrun.go
new file mode 100644
index 000000000..9523f31ac
--- /dev/null
+++ b/pkg/skaffold/event/v2/cloudrun.go
@@ -0,0 +1,42 @@
+/*
+Copyright 2021 The Skaffold Authors
+
+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
+
+    http://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 v2
+
+import (
+	"fmt"
+
+	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/constants"
+	proto "github.com/GoogleContainerTools/skaffold/proto/v2"
+)
+
+func CloudRunServiceReady(r, url, revision string) {
+	handler.handleCloudRunReady(&proto.CloudRunReadyEvent{
+		Id:            r,
+		TaskId:        fmt.Sprintf("%s-%d", constants.Deploy, handler.iteration),
+		Resource:      r,
+		Url:           url,
+		ReadyRevision: revision,
+	})
+}
+
+func (ev *eventHandler) handleCloudRunReady(e *proto.CloudRunReadyEvent) {
+	ev.handle(&proto.Event{
+		EventType: &proto.Event_CloudRunReadyEvent{
+			CloudRunReadyEvent: e,
+		},
+	})
+}
diff --git a/pkg/skaffold/initializer/analyze/analyze.go b/pkg/skaffold/initializer/analyze/analyze.go
index 8aa55aa01..07e03f662 100644
--- a/pkg/skaffold/initializer/analyze/analyze.go
+++ b/pkg/skaffold/initializer/analyze/analyze.go
@@ -105,6 +105,7 @@ func NewAnalyzer(c config.Config) *ProjectAnalysis {
 			findBuilders:         !c.SkipBuild,
 			enableJibInit:        c.EnableJibInit,
 			enableJibGradleInit:  c.EnableJibGradleInit,
+			enableKoInit:         c.EnableKoInit,
 			enableBuildpacksInit: c.EnableBuildpacksInit,
 			buildpacksBuilder:    c.BuildpacksBuilder,
 		},
diff --git a/pkg/skaffold/initializer/analyze/builder.go b/pkg/skaffold/initializer/analyze/builder.go
index 8db7df081..aa4b1cb8b 100644
--- a/pkg/skaffold/initializer/analyze/builder.go
+++ b/pkg/skaffold/initializer/analyze/builder.go
@@ -23,6 +23,7 @@ import (
 
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/build/buildpacks"
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/build/jib"
+	koinit "github.com/GoogleContainerTools/skaffold/pkg/skaffold/build/ko/init"
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/docker"
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/initializer/build"
 )
@@ -31,6 +32,7 @@ type builderAnalyzer struct {
 	directoryAnalyzer
 	enableJibInit        bool
 	enableJibGradleInit  bool
+	enableKoInit         bool
 	enableBuildpacksInit bool
 	findBuilders         bool
 	buildpacksBuilder    string
@@ -86,6 +88,14 @@ func (a *builderAnalyzer) detectBuilders(ctx context.Context, path string, detec
 		}
 	}
 
+	if a.enableKoInit {
+		if koinit.Validate(path) {
+			results = append(results, koinit.ArtifactConfig{
+				File: path,
+			})
+		}
+	}
+
 	// TODO: Remove backwards compatibility if statement (not entire block)
 	if a.enableBuildpacksInit {
 		// Check for buildpacks
diff --git a/pkg/skaffold/initializer/build/resolve.go b/pkg/skaffold/initializer/build/resolve.go
index 567807a8f..ab81a4c9f 100644
--- a/pkg/skaffold/initializer/build/resolve.go
+++ b/pkg/skaffold/initializer/build/resolve.go
@@ -85,13 +85,15 @@ func builderRank(builder InitBuilder) int {
 		return 1
 	case a.JibArtifact != nil:
 		return 2
-	case a.BazelArtifact != nil:
+	case a.KoArtifact != nil:
 		return 3
-	case a.BuildpackArtifact != nil:
+	case a.BazelArtifact != nil:
 		return 4
+	case a.BuildpackArtifact != nil:
+		return 5
 	}
 
-	return 5
+	return 6
 }
 
 func (d *defaultBuildInitializer) resolveBuilderImagesInteractively() error {
diff --git a/pkg/skaffold/initializer/config/config.go b/pkg/skaffold/initializer/config/config.go
index 28eb5435a..1bc1cf553 100644
--- a/pkg/skaffold/initializer/config/config.go
+++ b/pkg/skaffold/initializer/config/config.go
@@ -31,6 +31,7 @@ type Config struct {
 	Analyze                  bool
 	EnableJibInit            bool // TODO: Remove this parameter
 	EnableJibGradleInit      bool
+	EnableKoInit             bool
 	EnableBuildpacksInit     bool
 	EnableNewInitFormat      bool
 	EnableManifestGeneration bool
diff --git a/pkg/skaffold/initializer/errors/errors.go b/pkg/skaffold/initializer/errors/errors.go
index d03b06456..fa48390dd 100644
--- a/pkg/skaffold/initializer/errors/errors.go
+++ b/pkg/skaffold/initializer/errors/errors.go
@@ -23,7 +23,7 @@ type NoBuilderErr struct{}
 
 func (e NoBuilderErr) ExitCode() int { return 101 }
 func (e NoBuilderErr) Error() string {
-	return "one or more valid builder configuration (Dockerfile or Jib configuration) must be present to build images with skaffold; please provide at least one build config and try again or run `skaffold init --skip-build`"
+	return "one or more valid build configuration must be present to build images with Skaffold; please provide at least one build config and try again, or run `skaffold init --skip-build`"
 }
 
 // NoManifestErr is an error returned by `skaffold init` when no valid Kubernetes manifest is found.
@@ -34,7 +34,7 @@ func (e NoManifestErr) Error() string {
 	return "one or more valid Kubernetes manifests are required to run skaffold"
 }
 
-// PreExistingConfigErr is an error returned by `skaffold init` when a skaffold config file already exists.
+// PreExistingConfigErr is an error returned by `skaffold init` when a Skaffold config file already exists.
 type PreExistingConfigErr struct {
 	Path string
 }
@@ -57,5 +57,5 @@ type NoHelmChartsErr struct{}
 
 func (e NoHelmChartsErr) ExitCode() int { return 105 }
 func (e NoHelmChartsErr) Error() string {
-	return "one or more valid helm charts or kubernetes manifests are required to run skaffold"
+	return "one or more valid Helm charts or Kubernetes manifests are required to run Skaffold"
 }
diff --git a/proto/v2/skaffold.pb.go b/proto/v2/skaffold.pb.go
index af4acd8ea..7faa8b4a9 100644
--- a/proto/v2/skaffold.pb.go
+++ b/proto/v2/skaffold.pb.go
@@ -1397,6 +1397,7 @@ type Event struct {
 	//	*Event_TestEvent
 	//	*Event_RenderEvent
 	//	*Event_VerifyEvent
+	//	*Event_CloudRunReadyEvent
 	EventType isEvent_EventType `protobuf_oneof:"event_type"`
 }
 
@@ -1544,6 +1545,13 @@ func (x *Event) GetVerifyEvent() *VerifySubtaskEvent {
 	return nil
 }
 
+func (x *Event) GetCloudRunReadyEvent() *CloudRunReadyEvent {
+	if x, ok := x.GetEventType().(*Event_CloudRunReadyEvent); ok {
+		return x.CloudRunReadyEvent
+	}
+	return nil
+}
+
 type isEvent_EventType interface {
 	isEvent_EventType()
 }
@@ -1604,6 +1612,10 @@ type Event_VerifyEvent struct {
 	VerifyEvent *VerifySubtaskEvent `protobuf:"bytes,15,opt,name=verifyEvent,proto3,oneof"` // describes if the render has started, is in progress or is complete.
 }
 
+type Event_CloudRunReadyEvent struct {
+	CloudRunReadyEvent *CloudRunReadyEvent `protobuf:"bytes,16,opt,name=cloudRunReadyEvent,proto3,oneof"` // describes a deployed Cloud Run service.
+}
+
 func (*Event_MetaEvent) isEvent_EventType() {}
 
 func (*Event_SkaffoldLogEvent) isEvent_EventType() {}
@@ -1632,6 +1644,8 @@ func (*Event_RenderEvent) isEvent_EventType() {}
 
 func (*Event_VerifyEvent) isEvent_EventType() {}
 
+func (*Event_CloudRunReadyEvent) isEvent_EventType() {}
+
 // `TerminationEvent` marks the end of the skaffold session
 type TerminationEvent struct {
 	state         protoimpl.MessageState
@@ -2547,6 +2561,88 @@ func (x *StatusCheckSubtaskEvent) GetActionableErr() *ActionableErr {
 	return nil
 }
 
+// A Resource StatusCheck Event for a Cloud Run Service.
+// Indicates that a Cloud Run Service has deployed successfully and is serving
+// on the specified URL
+type CloudRunReadyEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id            string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`                                            // id of the subtask which will be used in SkaffoldLog
+	TaskId        string `protobuf:"bytes,2,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"`                      // id of the task of skaffold that this event came from
+	Resource      string `protobuf:"bytes,3,opt,name=resource,proto3" json:"resource,omitempty"`                                // the Cloud Run resource that was deployed
+	Url           string `protobuf:"bytes,4,opt,name=url,proto3" json:"url,omitempty"`                                          // the base URL that the Cloud Run service is serving on.
+	ReadyRevision string `protobuf:"bytes,5,opt,name=ready_revision,json=readyRevision,proto3" json:"ready_revision,omitempty"` // the name of the revision that went ready.
+}
+
+func (x *CloudRunReadyEvent) Reset() {
+	*x = CloudRunReadyEvent{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_v2_skaffold_proto_msgTypes[29]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CloudRunReadyEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CloudRunReadyEvent) ProtoMessage() {}
+
+func (x *CloudRunReadyEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_v2_skaffold_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CloudRunReadyEvent.ProtoReflect.Descriptor instead.
+func (*CloudRunReadyEvent) Descriptor() ([]byte, []int) {
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{29}
+}
+
+func (x *CloudRunReadyEvent) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *CloudRunReadyEvent) GetTaskId() string {
+	if x != nil {
+		return x.TaskId
+	}
+	return ""
+}
+
+func (x *CloudRunReadyEvent) GetResource() string {
+	if x != nil {
+		return x.Resource
+	}
+	return ""
+}
+
+func (x *CloudRunReadyEvent) GetUrl() string {
+	if x != nil {
+		return x.Url
+	}
+	return ""
+}
+
+func (x *CloudRunReadyEvent) GetReadyRevision() string {
+	if x != nil {
+		return x.ReadyRevision
+	}
+	return ""
+}
+
 // PortForwardEvent Event describes each port forwarding event.
 type PortForwardEvent struct {
 	state         protoimpl.MessageState
@@ -2569,7 +2665,7 @@ type PortForwardEvent struct {
 func (x *PortForwardEvent) Reset() {
 	*x = PortForwardEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[29]
+		mi := &file_v2_skaffold_proto_msgTypes[30]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2582,7 +2678,7 @@ func (x *PortForwardEvent) String() string {
 func (*PortForwardEvent) ProtoMessage() {}
 
 func (x *PortForwardEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[29]
+	mi := &file_v2_skaffold_proto_msgTypes[30]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2595,7 +2691,7 @@ func (x *PortForwardEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use PortForwardEvent.ProtoReflect.Descriptor instead.
 func (*PortForwardEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{29}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{30}
 }
 
 func (x *PortForwardEvent) GetId() string {
@@ -2692,7 +2788,7 @@ type FileSyncEvent struct {
 func (x *FileSyncEvent) Reset() {
 	*x = FileSyncEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[30]
+		mi := &file_v2_skaffold_proto_msgTypes[31]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2705,7 +2801,7 @@ func (x *FileSyncEvent) String() string {
 func (*FileSyncEvent) ProtoMessage() {}
 
 func (x *FileSyncEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[30]
+	mi := &file_v2_skaffold_proto_msgTypes[31]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2718,7 +2814,7 @@ func (x *FileSyncEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FileSyncEvent.ProtoReflect.Descriptor instead.
 func (*FileSyncEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{30}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{31}
 }
 
 func (x *FileSyncEvent) GetId() string {
@@ -2784,7 +2880,7 @@ type DebuggingContainerEvent struct {
 func (x *DebuggingContainerEvent) Reset() {
 	*x = DebuggingContainerEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[31]
+		mi := &file_v2_skaffold_proto_msgTypes[32]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2797,7 +2893,7 @@ func (x *DebuggingContainerEvent) String() string {
 func (*DebuggingContainerEvent) ProtoMessage() {}
 
 func (x *DebuggingContainerEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[31]
+	mi := &file_v2_skaffold_proto_msgTypes[32]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2810,7 +2906,7 @@ func (x *DebuggingContainerEvent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DebuggingContainerEvent.ProtoReflect.Descriptor instead.
 func (*DebuggingContainerEvent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{31}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{32}
 }
 
 func (x *DebuggingContainerEvent) GetId() string {
@@ -2894,7 +2990,7 @@ type UserIntentRequest struct {
 func (x *UserIntentRequest) Reset() {
 	*x = UserIntentRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[32]
+		mi := &file_v2_skaffold_proto_msgTypes[33]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2907,7 +3003,7 @@ func (x *UserIntentRequest) String() string {
 func (*UserIntentRequest) ProtoMessage() {}
 
 func (x *UserIntentRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[32]
+	mi := &file_v2_skaffold_proto_msgTypes[33]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2920,7 +3016,7 @@ func (x *UserIntentRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UserIntentRequest.ProtoReflect.Descriptor instead.
 func (*UserIntentRequest) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{32}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{33}
 }
 
 func (x *UserIntentRequest) GetIntent() *Intent {
@@ -2941,7 +3037,7 @@ type TriggerRequest struct {
 func (x *TriggerRequest) Reset() {
 	*x = TriggerRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[33]
+		mi := &file_v2_skaffold_proto_msgTypes[34]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2954,7 +3050,7 @@ func (x *TriggerRequest) String() string {
 func (*TriggerRequest) ProtoMessage() {}
 
 func (x *TriggerRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[33]
+	mi := &file_v2_skaffold_proto_msgTypes[34]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2967,7 +3063,7 @@ func (x *TriggerRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TriggerRequest.ProtoReflect.Descriptor instead.
 func (*TriggerRequest) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{33}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{34}
 }
 
 func (x *TriggerRequest) GetState() *TriggerState {
@@ -2991,7 +3087,7 @@ type TriggerState struct {
 func (x *TriggerState) Reset() {
 	*x = TriggerState{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[34]
+		mi := &file_v2_skaffold_proto_msgTypes[35]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3004,7 +3100,7 @@ func (x *TriggerState) String() string {
 func (*TriggerState) ProtoMessage() {}
 
 func (x *TriggerState) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[34]
+	mi := &file_v2_skaffold_proto_msgTypes[35]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3017,7 +3113,7 @@ func (x *TriggerState) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TriggerState.ProtoReflect.Descriptor instead.
 func (*TriggerState) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{34}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{35}
 }
 
 func (m *TriggerState) GetVal() isTriggerState_Val {
@@ -3059,7 +3155,7 @@ type Intent struct {
 func (x *Intent) Reset() {
 	*x = Intent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[35]
+		mi := &file_v2_skaffold_proto_msgTypes[36]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3072,7 +3168,7 @@ func (x *Intent) String() string {
 func (*Intent) ProtoMessage() {}
 
 func (x *Intent) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[35]
+	mi := &file_v2_skaffold_proto_msgTypes[36]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3085,7 +3181,7 @@ func (x *Intent) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Intent.ProtoReflect.Descriptor instead.
 func (*Intent) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{35}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{36}
 }
 
 func (x *Intent) GetBuild() bool {
@@ -3129,7 +3225,7 @@ type Suggestion struct {
 func (x *Suggestion) Reset() {
 	*x = Suggestion{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[36]
+		mi := &file_v2_skaffold_proto_msgTypes[37]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3142,7 +3238,7 @@ func (x *Suggestion) String() string {
 func (*Suggestion) ProtoMessage() {}
 
 func (x *Suggestion) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[36]
+	mi := &file_v2_skaffold_proto_msgTypes[37]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3155,7 +3251,7 @@ func (x *Suggestion) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Suggestion.ProtoReflect.Descriptor instead.
 func (*Suggestion) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{36}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{37}
 }
 
 func (x *Suggestion) GetSuggestionCode() enums.SuggestionCode {
@@ -3186,7 +3282,7 @@ type IntOrString struct {
 func (x *IntOrString) Reset() {
 	*x = IntOrString{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[37]
+		mi := &file_v2_skaffold_proto_msgTypes[38]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3199,7 +3295,7 @@ func (x *IntOrString) String() string {
 func (*IntOrString) ProtoMessage() {}
 
 func (x *IntOrString) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[37]
+	mi := &file_v2_skaffold_proto_msgTypes[38]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3212,7 +3308,7 @@ func (x *IntOrString) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use IntOrString.ProtoReflect.Descriptor instead.
 func (*IntOrString) Descriptor() ([]byte, []int) {
-	return file_v2_skaffold_proto_rawDescGZIP(), []int{37}
+	return file_v2_skaffold_proto_rawDescGZIP(), []int{38}
 }
 
 func (x *IntOrString) GetType() int32 {
@@ -3250,7 +3346,7 @@ type BuildMetadata_Artifact struct {
 func (x *BuildMetadata_Artifact) Reset() {
 	*x = BuildMetadata_Artifact{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[40]
+		mi := &file_v2_skaffold_proto_msgTypes[41]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3263,7 +3359,7 @@ func (x *BuildMetadata_Artifact) String() string {
 func (*BuildMetadata_Artifact) ProtoMessage() {}
 
 func (x *BuildMetadata_Artifact) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[40]
+	mi := &file_v2_skaffold_proto_msgTypes[41]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3319,7 +3415,7 @@ type TestMetadata_Tester struct {
 func (x *TestMetadata_Tester) Reset() {
 	*x = TestMetadata_Tester{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[42]
+		mi := &file_v2_skaffold_proto_msgTypes[43]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3332,7 +3428,7 @@ func (x *TestMetadata_Tester) String() string {
 func (*TestMetadata_Tester) ProtoMessage() {}
 
 func (x *TestMetadata_Tester) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[42]
+	mi := &file_v2_skaffold_proto_msgTypes[43]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3374,7 +3470,7 @@ type RenderMetadata_Renderer struct {
 func (x *RenderMetadata_Renderer) Reset() {
 	*x = RenderMetadata_Renderer{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[43]
+		mi := &file_v2_skaffold_proto_msgTypes[44]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3387,7 +3483,7 @@ func (x *RenderMetadata_Renderer) String() string {
 func (*RenderMetadata_Renderer) ProtoMessage() {}
 
 func (x *RenderMetadata_Renderer) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[43]
+	mi := &file_v2_skaffold_proto_msgTypes[44]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3429,7 +3525,7 @@ type DeployMetadata_Deployer struct {
 func (x *DeployMetadata_Deployer) Reset() {
 	*x = DeployMetadata_Deployer{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_v2_skaffold_proto_msgTypes[44]
+		mi := &file_v2_skaffold_proto_msgTypes[45]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3442,7 +3538,7 @@ func (x *DeployMetadata_Deployer) String() string {
 func (*DeployMetadata_Deployer) ProtoMessage() {}
 
 func (x *DeployMetadata_Deployer) ProtoReflect() protoreflect.Message {
-	mi := &file_v2_skaffold_proto_msgTypes[44]
+	mi := &file_v2_skaffold_proto_msgTypes[45]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3677,7 +3773,7 @@ var file_v2_skaffold_proto_rawDesc = []byte{
 	0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
 	0x12, 0x20, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18,
 	0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x69, 0x67, 0x67,
-	0x65, 0x72, 0x22, 0xb8, 0x08, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09,
+	0x65, 0x72, 0x22, 0x88, 0x09, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09,
 	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
 	0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
 	0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d,
@@ -3743,7 +3839,12 @@ var file_v2_skaffold_proto_rawDesc = []byte{
 	0x0b, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01,
 	0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x65,
 	0x72, 0x69, 0x66, 0x79, 0x53, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74,
-	0x48, 0x00, 0x52, 0x0b, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42,
+	0x48, 0x00, 0x52, 0x0b, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+	0x4e, 0x0a, 0x12, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x79,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x75, 0x6e, 0x52,
+	0x65, 0x61, 0x64, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, 0x63, 0x6c, 0x6f,
+	0x75, 0x64, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42,
 	0x0c, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x55, 0x0a,
 	0x10, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e,
 	0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
@@ -3870,148 +3971,157 @@ var file_v2_skaffold_proto_rawDesc = []byte{
 	0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b,
 	0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69,
 	0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f,
-	0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x22, 0xec, 0x02, 0x0a, 0x10, 0x50, 0x6f, 0x72,
-	0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a,
-	0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a,
-	0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
-	0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50,
-	0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
-	0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18,
-	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24,
-	0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18,
-	0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
-	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63,
-	0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61,
-	0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22,
-	0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x08,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79,
-	0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61,
-	0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
-	0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
-	0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
-	0x12, 0x35, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x0b,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e,
-	0x49, 0x6e, 0x74, 0x4f, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x74, 0x61, 0x72,
-	0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x22, 0xc3, 0x01, 0x0a, 0x0d, 0x46, 0x69, 0x6c, 0x65,
-	0x53, 0x79, 0x6e, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73,
-	0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b,
-	0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74,
-	0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d,
-	0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x18,
-	0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32,
-	0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x52, 0x0d,
-	0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x22, 0xa0, 0x03,
-	0x0a, 0x17, 0x44, 0x65, 0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61,
-	0x69, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73,
-	0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b,
-	0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f,
-	0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64,
-	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
-	0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e,
-	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61,
-	0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e,
-	0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x72, 0x74, 0x69,
-	0x66, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x72, 0x74, 0x69,
-	0x66, 0x61, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18,
-	0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1e,
-	0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x18, 0x09, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x12, 0x51,
-	0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65,
-	0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
-	0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x50, 0x6f, 0x72, 0x74, 0x73,
-	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x50, 0x6f, 0x72, 0x74,
-	0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x44, 0x65, 0x62, 0x75, 0x67, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45,
-	0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01,
-	0x22, 0x3d, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x06, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32,
-	0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22,
-	0x3e, 0x0a, 0x0e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x12, 0x2c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72, 0x69, 0x67,
-	0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22,
-	0x31, 0x0a, 0x0c, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
-	0x1a, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
-	0x48, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x05, 0x0a, 0x03, 0x76,
-	0x61, 0x6c, 0x22, 0x64, 0x0a, 0x06, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05,
-	0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x75, 0x69,
-	0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08,
-	0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x18,
-	0x0a, 0x07, 0x64, 0x65, 0x76, 0x6c, 0x6f, 0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52,
-	0x07, 0x64, 0x65, 0x76, 0x6c, 0x6f, 0x6f, 0x70, 0x22, 0x69, 0x0a, 0x0a, 0x53, 0x75, 0x67, 0x67,
-	0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x0e, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73,
-	0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x53, 0x75, 0x67,
-	0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0e, 0x73, 0x75, 0x67,
-	0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61,
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74,
-	0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x0b, 0x49, 0x6e, 0x74, 0x4f, 0x72, 0x53, 0x74, 0x72, 0x69,
-	0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,
-	0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x12, 0x16,
-	0x0a, 0x06, 0x73, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
-	0x73, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x32, 0xdf, 0x05, 0x0a, 0x11, 0x53, 0x6b, 0x61, 0x66, 0x66,
-	0x6f, 0x6c, 0x64, 0x56, 0x32, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x46, 0x0a, 0x08,
-	0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
-	0x1a, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x74,
-	0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x32, 0x2f, 0x73,
-	0x74, 0x61, 0x74, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x16,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76,
-	0x32, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12,
-	0x0a, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x30, 0x01, 0x12, 0x59, 0x0a,
-	0x0f, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x73,
-	0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x2e, 0x76, 0x32, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02,
-	0x15, 0x12, 0x13, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63,
-	0x75, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x55,
-	0x73, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15,
-	0x22, 0x0b, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x3a, 0x06, 0x69,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x6f, 0x42, 0x75, 0x69,
-	0x6c, 0x64, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72,
-	0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
-	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
-	0x6d, 0x70, 0x74, 0x79, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x1a, 0x16, 0x2f, 0x76,
-	0x32, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65,
-	0x63, 0x75, 0x74, 0x65, 0x3a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x62, 0x0a, 0x08, 0x41,
-	0x75, 0x74, 0x6f, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x22, 0x92, 0x01, 0x0a, 0x12, 0x43, 0x6c, 0x6f,
+	0x75, 0x64, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12,
+	0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
+	0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f,
+	0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f,
+	0x75, 0x72, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f,
+	0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d,
+	0x72, 0x65, 0x61, 0x64, 0x79, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xec, 0x02,
+	0x0a, 0x10, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+	0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6c,
+	0x6f, 0x63, 0x61, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09,
+	0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f, 0x64,
+	0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x4e,
+	0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
+	0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74,
+	0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d,
+	0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61,
+	0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x4e,
+	0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x4e,
+	0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54,
+	0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75,
+	0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75,
+	0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72,
+	0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61,
+	0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64,
+	0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x35, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50,
+	0x6f, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x74, 0x4f, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67,
+	0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x22, 0xc3, 0x01, 0x0a,
+	0x0d, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e,
+	0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17,
+	0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43,
+	0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65,
+	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c,
+	0x65, 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65,
+	0x45, 0x72, 0x72, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45,
+	0x72, 0x72, 0x22, 0xa0, 0x03, 0x0a, 0x17, 0x44, 0x65, 0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67,
+	0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e,
+	0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17,
+	0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x18, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12,
+	0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a,
+	0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e,
+	0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74,
+	0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69,
+	0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67,
+	0x44, 0x69, 0x72, 0x12, 0x51, 0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x50, 0x6f, 0x72, 0x74,
+	0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x76, 0x32, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74,
+	0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67,
+	0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x64, 0x65, 0x62, 0x75,
+	0x67, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x44, 0x65, 0x62, 0x75, 0x67, 0x50,
+	0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3d, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x74,
+	0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x06, 0x69, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x69, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x0a, 0x0e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32,
+	0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x22, 0x31, 0x0a, 0x0c, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x53,
+	0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64,
+	0x42, 0x05, 0x0a, 0x03, 0x76, 0x61, 0x6c, 0x22, 0x64, 0x0a, 0x06, 0x49, 0x6e, 0x74, 0x65, 0x6e,
+	0x74, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x64,
+	0x65, 0x70, 0x6c, 0x6f, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x65, 0x70,
+	0x6c, 0x6f, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x6c, 0x6f, 0x6f, 0x70, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x76, 0x6c, 0x6f, 0x6f, 0x70, 0x22, 0x69, 0x0a,
+	0x0a, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x0e, 0x73,
+	0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x6e, 0x75, 0x6d,
+	0x73, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65,
+	0x52, 0x0e, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65,
+	0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x0b, 0x49, 0x6e, 0x74, 0x4f,
+	0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69,
+	0x6e, 0x74, 0x56, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x69, 0x6e, 0x74,
+	0x56, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x56, 0x61, 0x6c, 0x32, 0xdf, 0x05, 0x0a, 0x11,
+	0x53, 0x6b, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x56, 0x32, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x12, 0x46, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32,
+	0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09,
+	0x2f, 0x76, 0x32, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x12, 0x82, 0xd3,
+	0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73,
+	0x30, 0x01, 0x12, 0x59, 0x0a, 0x0f, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x1b,
+	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x76, 0x32, 0x2f, 0x61, 0x70, 0x70, 0x6c,
+	0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x30, 0x01, 0x12, 0x5b, 0x0a,
+	0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1b, 0x82,
+	0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x0b, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75,
+	0x74, 0x65, 0x3a, 0x06, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x09, 0x41, 0x75,
+	0x74, 0x6f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
 	0x76, 0x32, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
 	0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02,
-	0x1e, 0x1a, 0x15, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x2f, 0x61, 0x75, 0x74, 0x6f,
-	0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x3a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12,
-	0x66, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x18, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02,
+	0x1f, 0x1a, 0x16, 0x2f, 0x76, 0x32, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x61, 0x75, 0x74,
+	0x6f, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x3a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,
+	0x12, 0x62, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x18, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x24,
+	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x1a, 0x15, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x79, 0x6e, 0x63,
+	0x2f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x3a, 0x05, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x12, 0x66, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x65, 0x70, 0x6c,
+	0x6f, 0x79, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x72,
+	0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
+	0x6d, 0x70, 0x74, 0x79, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x1a, 0x17, 0x2f, 0x76,
+	0x32, 0x2f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x65, 0x78,
+	0x65, 0x63, 0x75, 0x74, 0x65, 0x3a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4f, 0x0a, 0x06,
+	0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76,
+	0x32, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
-	0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x1a, 0x17, 0x2f, 0x76, 0x32, 0x2f, 0x64, 0x65, 0x70,
-	0x6c, 0x6f, 0x79, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65,
-	0x3a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4f, 0x0a, 0x06, 0x48, 0x61, 0x6e, 0x64, 0x6c,
-	0x65, 0x12, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x76, 0x65,
-	0x6e, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93,
-	0x02, 0x16, 0x22, 0x11, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x68,
-	0x61, 0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68,
-	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x43, 0x6f, 0x6e,
-	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x73, 0x6b, 0x61, 0x66,
-	0x66, 0x6f, 0x6c, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x32, 0x50, 0x03, 0x62,
-	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x76, 0x65,
+	0x6e, 0x74, 0x73, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x33, 0x5a,
+	0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x73,
+	0x2f, 0x73, 0x6b, 0x61, 0x66, 0x66, 0x6f, 0x6c, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
+	0x76, 0x32, 0x50, 0x03, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -4026,7 +4136,7 @@ func file_v2_skaffold_proto_rawDescGZIP() []byte {
 	return file_v2_skaffold_proto_rawDescData
 }
 
-var file_v2_skaffold_proto_msgTypes = make([]protoimpl.MessageInfo, 48)
+var file_v2_skaffold_proto_msgTypes = make([]protoimpl.MessageInfo, 49)
 var file_v2_skaffold_proto_goTypes = []interface{}{
 	(*StateResponse)(nil),           // 0: proto.v2.StateResponse
 	(*Response)(nil),                // 1: proto.v2.Response
@@ -4057,45 +4167,46 @@ var file_v2_skaffold_proto_goTypes = []interface{}{
 	(*VerifySubtaskEvent)(nil),      // 26: proto.v2.VerifySubtaskEvent
 	(*DeploySubtaskEvent)(nil),      // 27: proto.v2.DeploySubtaskEvent
 	(*StatusCheckSubtaskEvent)(nil), // 28: proto.v2.StatusCheckSubtaskEvent
-	(*PortForwardEvent)(nil),        // 29: proto.v2.PortForwardEvent
-	(*FileSyncEvent)(nil),           // 30: proto.v2.FileSyncEvent
-	(*DebuggingContainerEvent)(nil), // 31: proto.v2.DebuggingContainerEvent
-	(*UserIntentRequest)(nil),       // 32: proto.v2.UserIntentRequest
-	(*TriggerRequest)(nil),          // 33: proto.v2.TriggerRequest
-	(*TriggerState)(nil),            // 34: proto.v2.TriggerState
-	(*Intent)(nil),                  // 35: proto.v2.Intent
-	(*Suggestion)(nil),              // 36: proto.v2.Suggestion
-	(*IntOrString)(nil),             // 37: proto.v2.IntOrString
-	nil,                             // 38: proto.v2.State.ForwardedPortsEntry
-	nil,                             // 39: proto.v2.Metadata.AdditionalEntry
-	(*BuildMetadata_Artifact)(nil),  // 40: proto.v2.BuildMetadata.Artifact
-	nil,                             // 41: proto.v2.BuildMetadata.AdditionalEntry
-	(*TestMetadata_Tester)(nil),     // 42: proto.v2.TestMetadata.Tester
-	(*RenderMetadata_Renderer)(nil), // 43: proto.v2.RenderMetadata.Renderer
-	(*DeployMetadata_Deployer)(nil), // 44: proto.v2.DeployMetadata.Deployer
-	nil,                             // 45: proto.v2.BuildState.ArtifactsEntry
-	nil,                             // 46: proto.v2.StatusCheckState.ResourcesEntry
-	nil,                             // 47: proto.v2.DebuggingContainerEvent.DebugPortsEntry
-	(enums.BuildType)(0),            // 48: proto.enums.BuildType
-	(enums.ClusterType)(0),          // 49: proto.enums.ClusterType
-	(enums.StatusCode)(0),           // 50: proto.enums.StatusCode
-	(*timestamppb.Timestamp)(nil),   // 51: google.protobuf.Timestamp
-	(enums.LogLevel)(0),             // 52: proto.enums.LogLevel
-	(enums.SuggestionCode)(0),       // 53: proto.enums.SuggestionCode
-	(enums.BuilderType)(0),          // 54: proto.enums.BuilderType
-	(enums.TesterType)(0),           // 55: proto.enums.TesterType
-	(enums.RenderType)(0),           // 56: proto.enums.RenderType
-	(enums.DeployerType)(0),         // 57: proto.enums.DeployerType
-	(*emptypb.Empty)(nil),           // 58: google.protobuf.Empty
+	(*CloudRunReadyEvent)(nil),      // 29: proto.v2.CloudRunReadyEvent
+	(*PortForwardEvent)(nil),        // 30: proto.v2.PortForwardEvent
+	(*FileSyncEvent)(nil),           // 31: proto.v2.FileSyncEvent
+	(*DebuggingContainerEvent)(nil), // 32: proto.v2.DebuggingContainerEvent
+	(*UserIntentRequest)(nil),       // 33: proto.v2.UserIntentRequest
+	(*TriggerRequest)(nil),          // 34: proto.v2.TriggerRequest
+	(*TriggerState)(nil),            // 35: proto.v2.TriggerState
+	(*Intent)(nil),                  // 36: proto.v2.Intent
+	(*Suggestion)(nil),              // 37: proto.v2.Suggestion
+	(*IntOrString)(nil),             // 38: proto.v2.IntOrString
+	nil,                             // 39: proto.v2.State.ForwardedPortsEntry
+	nil,                             // 40: proto.v2.Metadata.AdditionalEntry
+	(*BuildMetadata_Artifact)(nil),  // 41: proto.v2.BuildMetadata.Artifact
+	nil,                             // 42: proto.v2.BuildMetadata.AdditionalEntry
+	(*TestMetadata_Tester)(nil),     // 43: proto.v2.TestMetadata.Tester
+	(*RenderMetadata_Renderer)(nil), // 44: proto.v2.RenderMetadata.Renderer
+	(*DeployMetadata_Deployer)(nil), // 45: proto.v2.DeployMetadata.Deployer
+	nil,                             // 46: proto.v2.BuildState.ArtifactsEntry
+	nil,                             // 47: proto.v2.StatusCheckState.ResourcesEntry
+	nil,                             // 48: proto.v2.DebuggingContainerEvent.DebugPortsEntry
+	(enums.BuildType)(0),            // 49: proto.enums.BuildType
+	(enums.ClusterType)(0),          // 50: proto.enums.ClusterType
+	(enums.StatusCode)(0),           // 51: proto.enums.StatusCode
+	(*timestamppb.Timestamp)(nil),   // 52: google.protobuf.Timestamp
+	(enums.LogLevel)(0),             // 53: proto.enums.LogLevel
+	(enums.SuggestionCode)(0),       // 54: proto.enums.SuggestionCode
+	(enums.BuilderType)(0),          // 55: proto.enums.BuilderType
+	(enums.TesterType)(0),           // 56: proto.enums.TesterType
+	(enums.RenderType)(0),           // 57: proto.enums.RenderType
+	(enums.DeployerType)(0),         // 58: proto.enums.DeployerType
+	(*emptypb.Empty)(nil),           // 59: google.protobuf.Empty
 }
 var file_v2_skaffold_proto_depIdxs = []int32{
 	3,  // 0: proto.v2.StateResponse.state:type_name -> proto.v2.State
 	9,  // 1: proto.v2.State.buildState:type_name -> proto.v2.BuildState
 	13, // 2: proto.v2.State.deployState:type_name -> proto.v2.DeployState
-	38, // 3: proto.v2.State.forwardedPorts:type_name -> proto.v2.State.ForwardedPortsEntry
+	39, // 3: proto.v2.State.forwardedPorts:type_name -> proto.v2.State.ForwardedPortsEntry
 	14, // 4: proto.v2.State.statusCheckState:type_name -> proto.v2.StatusCheckState
 	15, // 5: proto.v2.State.fileSyncState:type_name -> proto.v2.FileSyncState
-	31, // 6: proto.v2.State.debuggingContainers:type_name -> proto.v2.DebuggingContainerEvent
+	32, // 6: proto.v2.State.debuggingContainers:type_name -> proto.v2.DebuggingContainerEvent
 	4,  // 7: proto.v2.State.metadata:type_name -> proto.v2.Metadata
 	10, // 8: proto.v2.State.testState:type_name -> proto.v2.TestState
 	11, // 9: proto.v2.State.renderState:type_name -> proto.v2.RenderState
@@ -4104,82 +4215,83 @@ var file_v2_skaffold_proto_depIdxs = []int32{
 	8,  // 12: proto.v2.Metadata.deploy:type_name -> proto.v2.DeployMetadata
 	6,  // 13: proto.v2.Metadata.test:type_name -> proto.v2.TestMetadata
 	7,  // 14: proto.v2.Metadata.render:type_name -> proto.v2.RenderMetadata
-	39, // 15: proto.v2.Metadata.additional:type_name -> proto.v2.Metadata.AdditionalEntry
-	40, // 16: proto.v2.BuildMetadata.artifacts:type_name -> proto.v2.BuildMetadata.Artifact
-	48, // 17: proto.v2.BuildMetadata.type:type_name -> proto.enums.BuildType
-	41, // 18: proto.v2.BuildMetadata.additional:type_name -> proto.v2.BuildMetadata.AdditionalEntry
-	42, // 19: proto.v2.TestMetadata.Testers:type_name -> proto.v2.TestMetadata.Tester
-	43, // 20: proto.v2.RenderMetadata.Renderers:type_name -> proto.v2.RenderMetadata.Renderer
-	44, // 21: proto.v2.DeployMetadata.deployers:type_name -> proto.v2.DeployMetadata.Deployer
-	49, // 22: proto.v2.DeployMetadata.cluster:type_name -> proto.enums.ClusterType
-	45, // 23: proto.v2.BuildState.artifacts:type_name -> proto.v2.BuildState.ArtifactsEntry
-	50, // 24: proto.v2.BuildState.statusCode:type_name -> proto.enums.StatusCode
-	50, // 25: proto.v2.TestState.statusCode:type_name -> proto.enums.StatusCode
-	50, // 26: proto.v2.RenderState.statusCode:type_name -> proto.enums.StatusCode
-	50, // 27: proto.v2.VerifyState.statusCode:type_name -> proto.enums.StatusCode
-	50, // 28: proto.v2.DeployState.statusCode:type_name -> proto.enums.StatusCode
-	46, // 29: proto.v2.StatusCheckState.resources:type_name -> proto.v2.StatusCheckState.ResourcesEntry
-	50, // 30: proto.v2.StatusCheckState.statusCode:type_name -> proto.enums.StatusCode
-	51, // 31: proto.v2.Event.timestamp:type_name -> google.protobuf.Timestamp
+	40, // 15: proto.v2.Metadata.additional:type_name -> proto.v2.Metadata.AdditionalEntry
+	41, // 16: proto.v2.BuildMetadata.artifacts:type_name -> proto.v2.BuildMetadata.Artifact
+	49, // 17: proto.v2.BuildMetadata.type:type_name -> proto.enums.BuildType
+	42, // 18: proto.v2.BuildMetadata.additional:type_name -> proto.v2.BuildMetadata.AdditionalEntry
+	43, // 19: proto.v2.TestMetadata.Testers:type_name -> proto.v2.TestMetadata.Tester
+	44, // 20: proto.v2.RenderMetadata.Renderers:type_name -> proto.v2.RenderMetadata.Renderer
+	45, // 21: proto.v2.DeployMetadata.deployers:type_name -> proto.v2.DeployMetadata.Deployer
+	50, // 22: proto.v2.DeployMetadata.cluster:type_name -> proto.enums.ClusterType
+	46, // 23: proto.v2.BuildState.artifacts:type_name -> proto.v2.BuildState.ArtifactsEntry
+	51, // 24: proto.v2.BuildState.statusCode:type_name -> proto.enums.StatusCode
+	51, // 25: proto.v2.TestState.statusCode:type_name -> proto.enums.StatusCode
+	51, // 26: proto.v2.RenderState.statusCode:type_name -> proto.enums.StatusCode
+	51, // 27: proto.v2.VerifyState.statusCode:type_name -> proto.enums.StatusCode
+	51, // 28: proto.v2.DeployState.statusCode:type_name -> proto.enums.StatusCode
+	47, // 29: proto.v2.StatusCheckState.resources:type_name -> proto.v2.StatusCheckState.ResourcesEntry
+	51, // 30: proto.v2.StatusCheckState.statusCode:type_name -> proto.enums.StatusCode
+	52, // 31: proto.v2.Event.timestamp:type_name -> google.protobuf.Timestamp
 	19, // 32: proto.v2.Event.metaEvent:type_name -> proto.v2.MetaEvent
 	20, // 33: proto.v2.Event.skaffoldLogEvent:type_name -> proto.v2.SkaffoldLogEvent
 	21, // 34: proto.v2.Event.applicationLogEvent:type_name -> proto.v2.ApplicationLogEvent
 	22, // 35: proto.v2.Event.taskEvent:type_name -> proto.v2.TaskEvent
 	23, // 36: proto.v2.Event.buildSubtaskEvent:type_name -> proto.v2.BuildSubtaskEvent
 	27, // 37: proto.v2.Event.deploySubtaskEvent:type_name -> proto.v2.DeploySubtaskEvent
-	29, // 38: proto.v2.Event.portEvent:type_name -> proto.v2.PortForwardEvent
+	30, // 38: proto.v2.Event.portEvent:type_name -> proto.v2.PortForwardEvent
 	28, // 39: proto.v2.Event.statusCheckSubtaskEvent:type_name -> proto.v2.StatusCheckSubtaskEvent
-	30, // 40: proto.v2.Event.fileSyncEvent:type_name -> proto.v2.FileSyncEvent
-	31, // 41: proto.v2.Event.debuggingContainerEvent:type_name -> proto.v2.DebuggingContainerEvent
+	31, // 40: proto.v2.Event.fileSyncEvent:type_name -> proto.v2.FileSyncEvent
+	32, // 41: proto.v2.Event.debuggingContainerEvent:type_name -> proto.v2.DebuggingContainerEvent
 	17, // 42: proto.v2.Event.terminationEvent:type_name -> proto.v2.TerminationEvent
 	24, // 43: proto.v2.Event.testEvent:type_name -> proto.v2.TestSubtaskEvent
 	25, // 44: proto.v2.Event.renderEvent:type_name -> proto.v2.RenderSubtaskEvent
 	26, // 45: proto.v2.Event.verifyEvent:type_name -> proto.v2.VerifySubtaskEvent
-	18, // 46: proto.v2.TerminationEvent.err:type_name -> proto.v2.ActionableErr
-	50, // 47: proto.v2.ActionableErr.errCode:type_name -> proto.enums.StatusCode
-	36, // 48: proto.v2.ActionableErr.suggestions:type_name -> proto.v2.Suggestion
-	4,  // 49: proto.v2.MetaEvent.metadata:type_name -> proto.v2.Metadata
-	52, // 50: proto.v2.SkaffoldLogEvent.level:type_name -> proto.enums.LogLevel
-	18, // 51: proto.v2.TaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	18, // 52: proto.v2.BuildSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	18, // 53: proto.v2.TestSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	18, // 54: proto.v2.RenderSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	18, // 55: proto.v2.VerifySubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	18, // 56: proto.v2.DeploySubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	50, // 57: proto.v2.StatusCheckSubtaskEvent.statusCode:type_name -> proto.enums.StatusCode
-	18, // 58: proto.v2.StatusCheckSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	37, // 59: proto.v2.PortForwardEvent.targetPort:type_name -> proto.v2.IntOrString
-	18, // 60: proto.v2.FileSyncEvent.actionableErr:type_name -> proto.v2.ActionableErr
-	47, // 61: proto.v2.DebuggingContainerEvent.debugPorts:type_name -> proto.v2.DebuggingContainerEvent.DebugPortsEntry
-	35, // 62: proto.v2.UserIntentRequest.intent:type_name -> proto.v2.Intent
-	34, // 63: proto.v2.TriggerRequest.state:type_name -> proto.v2.TriggerState
-	53, // 64: proto.v2.Suggestion.suggestionCode:type_name -> proto.enums.SuggestionCode
-	29, // 65: proto.v2.State.ForwardedPortsEntry.value:type_name -> proto.v2.PortForwardEvent
-	54, // 66: proto.v2.BuildMetadata.Artifact.type:type_name -> proto.enums.BuilderType
-	55, // 67: proto.v2.TestMetadata.Tester.type:type_name -> proto.enums.TesterType
-	56, // 68: proto.v2.RenderMetadata.Renderer.type:type_name -> proto.enums.RenderType
-	57, // 69: proto.v2.DeployMetadata.Deployer.type:type_name -> proto.enums.DeployerType
-	58, // 70: proto.v2.SkaffoldV2Service.GetState:input_type -> google.protobuf.Empty
-	58, // 71: proto.v2.SkaffoldV2Service.Events:input_type -> google.protobuf.Empty
-	58, // 72: proto.v2.SkaffoldV2Service.ApplicationLogs:input_type -> google.protobuf.Empty
-	32, // 73: proto.v2.SkaffoldV2Service.Execute:input_type -> proto.v2.UserIntentRequest
-	33, // 74: proto.v2.SkaffoldV2Service.AutoBuild:input_type -> proto.v2.TriggerRequest
-	33, // 75: proto.v2.SkaffoldV2Service.AutoSync:input_type -> proto.v2.TriggerRequest
-	33, // 76: proto.v2.SkaffoldV2Service.AutoDeploy:input_type -> proto.v2.TriggerRequest
-	16, // 77: proto.v2.SkaffoldV2Service.Handle:input_type -> proto.v2.Event
-	3,  // 78: proto.v2.SkaffoldV2Service.GetState:output_type -> proto.v2.State
-	16, // 79: proto.v2.SkaffoldV2Service.Events:output_type -> proto.v2.Event
-	16, // 80: proto.v2.SkaffoldV2Service.ApplicationLogs:output_type -> proto.v2.Event
-	58, // 81: proto.v2.SkaffoldV2Service.Execute:output_type -> google.protobuf.Empty
-	58, // 82: proto.v2.SkaffoldV2Service.AutoBuild:output_type -> google.protobuf.Empty
-	58, // 83: proto.v2.SkaffoldV2Service.AutoSync:output_type -> google.protobuf.Empty
-	58, // 84: proto.v2.SkaffoldV2Service.AutoDeploy:output_type -> google.protobuf.Empty
-	58, // 85: proto.v2.SkaffoldV2Service.Handle:output_type -> google.protobuf.Empty
-	78, // [78:86] is the sub-list for method output_type
-	70, // [70:78] is the sub-list for method input_type
-	70, // [70:70] is the sub-list for extension type_name
-	70, // [70:70] is the sub-list for extension extendee
-	0,  // [0:70] is the sub-list for field type_name
+	29, // 46: proto.v2.Event.cloudRunReadyEvent:type_name -> proto.v2.CloudRunReadyEvent
+	18, // 47: proto.v2.TerminationEvent.err:type_name -> proto.v2.ActionableErr
+	51, // 48: proto.v2.ActionableErr.errCode:type_name -> proto.enums.StatusCode
+	37, // 49: proto.v2.ActionableErr.suggestions:type_name -> proto.v2.Suggestion
+	4,  // 50: proto.v2.MetaEvent.metadata:type_name -> proto.v2.Metadata
+	53, // 51: proto.v2.SkaffoldLogEvent.level:type_name -> proto.enums.LogLevel
+	18, // 52: proto.v2.TaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	18, // 53: proto.v2.BuildSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	18, // 54: proto.v2.TestSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	18, // 55: proto.v2.RenderSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	18, // 56: proto.v2.VerifySubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	18, // 57: proto.v2.DeploySubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	51, // 58: proto.v2.StatusCheckSubtaskEvent.statusCode:type_name -> proto.enums.StatusCode
+	18, // 59: proto.v2.StatusCheckSubtaskEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	38, // 60: proto.v2.PortForwardEvent.targetPort:type_name -> proto.v2.IntOrString
+	18, // 61: proto.v2.FileSyncEvent.actionableErr:type_name -> proto.v2.ActionableErr
+	48, // 62: proto.v2.DebuggingContainerEvent.debugPorts:type_name -> proto.v2.DebuggingContainerEvent.DebugPortsEntry
+	36, // 63: proto.v2.UserIntentRequest.intent:type_name -> proto.v2.Intent
+	35, // 64: proto.v2.TriggerRequest.state:type_name -> proto.v2.TriggerState
+	54, // 65: proto.v2.Suggestion.suggestionCode:type_name -> proto.enums.SuggestionCode
+	30, // 66: proto.v2.State.ForwardedPortsEntry.value:type_name -> proto.v2.PortForwardEvent
+	55, // 67: proto.v2.BuildMetadata.Artifact.type:type_name -> proto.enums.BuilderType
+	56, // 68: proto.v2.TestMetadata.Tester.type:type_name -> proto.enums.TesterType
+	57, // 69: proto.v2.RenderMetadata.Renderer.type:type_name -> proto.enums.RenderType
+	58, // 70: proto.v2.DeployMetadata.Deployer.type:type_name -> proto.enums.DeployerType
+	59, // 71: proto.v2.SkaffoldV2Service.GetState:input_type -> google.protobuf.Empty
+	59, // 72: proto.v2.SkaffoldV2Service.Events:input_type -> google.protobuf.Empty
+	59, // 73: proto.v2.SkaffoldV2Service.ApplicationLogs:input_type -> google.protobuf.Empty
+	33, // 74: proto.v2.SkaffoldV2Service.Execute:input_type -> proto.v2.UserIntentRequest
+	34, // 75: proto.v2.SkaffoldV2Service.AutoBuild:input_type -> proto.v2.TriggerRequest
+	34, // 76: proto.v2.SkaffoldV2Service.AutoSync:input_type -> proto.v2.TriggerRequest
+	34, // 77: proto.v2.SkaffoldV2Service.AutoDeploy:input_type -> proto.v2.TriggerRequest
+	16, // 78: proto.v2.SkaffoldV2Service.Handle:input_type -> proto.v2.Event
+	3,  // 79: proto.v2.SkaffoldV2Service.GetState:output_type -> proto.v2.State
+	16, // 80: proto.v2.SkaffoldV2Service.Events:output_type -> proto.v2.Event
+	16, // 81: proto.v2.SkaffoldV2Service.ApplicationLogs:output_type -> proto.v2.Event
+	59, // 82: proto.v2.SkaffoldV2Service.Execute:output_type -> google.protobuf.Empty
+	59, // 83: proto.v2.SkaffoldV2Service.AutoBuild:output_type -> google.protobuf.Empty
+	59, // 84: proto.v2.SkaffoldV2Service.AutoSync:output_type -> google.protobuf.Empty
+	59, // 85: proto.v2.SkaffoldV2Service.AutoDeploy:output_type -> google.protobuf.Empty
+	59, // 86: proto.v2.SkaffoldV2Service.Handle:output_type -> google.protobuf.Empty
+	79, // [79:87] is the sub-list for method output_type
+	71, // [71:79] is the sub-list for method input_type
+	71, // [71:71] is the sub-list for extension type_name
+	71, // [71:71] is the sub-list for extension extendee
+	0,  // [0:71] is the sub-list for field type_name
 }
 
 func init() { file_v2_skaffold_proto_init() }
@@ -4537,7 +4649,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*PortForwardEvent); i {
+			switch v := v.(*CloudRunReadyEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4549,7 +4661,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*FileSyncEvent); i {
+			switch v := v.(*PortForwardEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4561,7 +4673,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DebuggingContainerEvent); i {
+			switch v := v.(*FileSyncEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4573,7 +4685,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UserIntentRequest); i {
+			switch v := v.(*DebuggingContainerEvent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4585,7 +4697,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TriggerRequest); i {
+			switch v := v.(*UserIntentRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4597,7 +4709,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TriggerState); i {
+			switch v := v.(*TriggerRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4609,7 +4721,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Intent); i {
+			switch v := v.(*TriggerState); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4621,7 +4733,7 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Suggestion); i {
+			switch v := v.(*Intent); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -4633,6 +4745,18 @@ func file_v2_skaffold_proto_init() {
 			}
 		}
 		file_v2_skaffold_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Suggestion); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_v2_skaffold_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*IntOrString); i {
 			case 0:
 				return &v.state
@@ -4644,7 +4768,7 @@ func file_v2_skaffold_proto_init() {
 				return nil
 			}
 		}
-		file_v2_skaffold_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
+		file_v2_skaffold_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*BuildMetadata_Artifact); i {
 			case 0:
 				return &v.state
@@ -4656,7 +4780,7 @@ func file_v2_skaffold_proto_init() {
 				return nil
 			}
 		}
-		file_v2_skaffold_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
+		file_v2_skaffold_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestMetadata_Tester); i {
 			case 0:
 				return &v.state
@@ -4668,7 +4792,7 @@ func file_v2_skaffold_proto_init() {
 				return nil
 			}
 		}
-		file_v2_skaffold_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
+		file_v2_skaffold_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*RenderMetadata_Renderer); i {
 			case 0:
 				return &v.state
@@ -4680,7 +4804,7 @@ func file_v2_skaffold_proto_init() {
 				return nil
 			}
 		}
-		file_v2_skaffold_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
+		file_v2_skaffold_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*DeployMetadata_Deployer); i {
 			case 0:
 				return &v.state
@@ -4708,8 +4832,9 @@ func file_v2_skaffold_proto_init() {
 		(*Event_TestEvent)(nil),
 		(*Event_RenderEvent)(nil),
 		(*Event_VerifyEvent)(nil),
+		(*Event_CloudRunReadyEvent)(nil),
 	}
-	file_v2_skaffold_proto_msgTypes[34].OneofWrappers = []interface{}{
+	file_v2_skaffold_proto_msgTypes[35].OneofWrappers = []interface{}{
 		(*TriggerState_Enabled)(nil),
 	}
 	type x struct{}
@@ -4718,7 +4843,7 @@ func file_v2_skaffold_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_v2_skaffold_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   48,
+			NumMessages:   49,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/v2/skaffold.proto b/proto/v2/skaffold.proto
index 1fc8f813a..df4645a4f 100644
--- a/proto/v2/skaffold.proto
+++ b/proto/v2/skaffold.proto
@@ -171,6 +171,7 @@ message Event {
         TestSubtaskEvent testEvent = 13; // describes if the test has started, is in progress or is complete.
         RenderSubtaskEvent renderEvent = 14; // describes if the render has started, is in progress or is complete.
         VerifySubtaskEvent verifyEvent = 15; // describes if the render has started, is in progress or is complete.
+        CloudRunReadyEvent cloudRunReadyEvent = 16; // describes a deployed Cloud Run service.
     }
 }
 
@@ -287,6 +288,17 @@ message StatusCheckSubtaskEvent {
     ActionableErr actionableErr = 7; // actionable error message
 }
 
+// A Resource StatusCheck Event for a Cloud Run Service.
+// Indicates that a Cloud Run Service has deployed successfully and is serving
+// on the specified URL
+message CloudRunReadyEvent {
+    string id = 1; // id of the subtask which will be used in SkaffoldLog
+    string task_id = 2; // id of the task of skaffold that this event came from
+    string resource = 3; // the Cloud Run resource that was deployed
+    string url = 4; // the base URL that the Cloud Run service is serving on.
+    string ready_revision = 5; // the name of the revision that went ready.
+}
+
 // PortForwardEvent Event describes each port forwarding event.
 message PortForwardEvent {
     string id = 1; // id of the subtask which will be used in SkaffoldLog


Test patch:
diff --git a/cmd/skaffold/app/cmd/init_test.go b/cmd/skaffold/app/cmd/init_test.go
index abee6f584..b20b1675c 100644
--- a/cmd/skaffold/app/cmd/init_test.go
+++ b/cmd/skaffold/app/cmd/init_test.go
@@ -54,6 +54,7 @@ func TestFlagsToConfigVersion(t *testing.T) {
 				Analyze:                false,
 				EnableJibInit:          true,
 				EnableJibGradleInit:    false,
+				EnableKoInit:           false,
 				EnableBuildpacksInit:   true,
 				EnableNewInitFormat:    true,
 				BuildpacksBuilder:      "gcr.io/buildpacks/builder:v1",
@@ -77,6 +78,7 @@ func TestFlagsToConfigVersion(t *testing.T) {
 				"--analyze",
 				"--XXenableJibInit",
 				"--XXenableJibGradleInit",
+				"--XXenableKoInit=true",
 				"--XXenableBuildpacksInit",
 				"--XXenableNewInitFormat",
 				"--XXdefaultBuildpacksBuilder", "buildpacks/builder",
@@ -91,6 +93,7 @@ func TestFlagsToConfigVersion(t *testing.T) {
 				Analyze:                true,
 				EnableJibInit:          true,
 				EnableJibGradleInit:    true,
+				EnableKoInit:           true,
 				EnableBuildpacksInit:   true,
 				EnableNewInitFormat:    true,
 				BuildpacksBuilder:      "buildpacks/builder",
@@ -104,6 +107,8 @@ func TestFlagsToConfigVersion(t *testing.T) {
 			args: []string{
 				"init",
 				"--XXenableJibInit",
+				"--XXenableKoInit=false",
+				"--XXenableBuildpacksInit=false",
 			},
 			expectedConfig: config.Config{
 				ComposeFile:            "",
@@ -114,7 +119,33 @@ func TestFlagsToConfigVersion(t *testing.T) {
 				Force:                  false,
 				Analyze:                false,
 				EnableJibInit:          true,
-				EnableBuildpacksInit:   true,
+				EnableKoInit:           false,
+				EnableBuildpacksInit:   false,
+				EnableNewInitFormat:    true,
+				BuildpacksBuilder:      "gcr.io/buildpacks/builder:v1",
+				Opts:                   opts,
+				MaxFileSize:            maxFileSize,
+			},
+		},
+		{
+			name: "enableKoInit implies enableNewInitFormat",
+			args: []string{
+				"init",
+				"--XXenableJibInit=false",
+				"--XXenableKoInit",
+				"--XXenableBuildpacksInit=false",
+			},
+			expectedConfig: config.Config{
+				ComposeFile:            "",
+				CliArtifacts:           []string{},
+				CliKubernetesManifests: []string{},
+				SkipBuild:              false,
+				SkipDeploy:             false,
+				Force:                  false,
+				Analyze:                false,
+				EnableJibInit:          false,
+				EnableKoInit:           true,
+				EnableBuildpacksInit:   false,
 				EnableNewInitFormat:    true,
 				BuildpacksBuilder:      "gcr.io/buildpacks/builder:v1",
 				Opts:                   opts,
@@ -125,6 +156,8 @@ func TestFlagsToConfigVersion(t *testing.T) {
 			name: "enableBuildpackInit implies enableNewInitFormat",
 			args: []string{
 				"init",
+				"--XXenableJibInit=false",
+				"--XXenableKoInit=false",
 				"--XXenableBuildpacksInit",
 			},
 			expectedConfig: config.Config{
@@ -135,7 +168,8 @@ func TestFlagsToConfigVersion(t *testing.T) {
 				SkipDeploy:             false,
 				Force:                  false,
 				Analyze:                false,
-				EnableJibInit:          true,
+				EnableJibInit:          false,
+				EnableKoInit:           false,
 				EnableBuildpacksInit:   true,
 				EnableNewInitFormat:    true,
 				BuildpacksBuilder:      "gcr.io/buildpacks/builder:v1",
diff --git a/pkg/skaffold/build/ko/init/init_test.go b/pkg/skaffold/build/ko/init/init_test.go
new file mode 100644
index 000000000..1138db4af
--- /dev/null
+++ b/pkg/skaffold/build/ko/init/init_test.go
@@ -0,0 +1,52 @@
+/*
+Copyright 2022 The Skaffold Authors
+
+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
+
+    http://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 init
+
+import (
+	"testing"
+
+	"github.com/GoogleContainerTools/skaffold/testutil"
+)
+
+func TestValidate(t *testing.T) {
+	tests := []struct {
+		description string
+		path        string
+		expect      bool
+	}{
+		{
+			description: "go.mod in current directory",
+			path:        "go.mod",
+			expect:      true,
+		},
+		{
+			description: "go.mod in subdirectory",
+			path:        "foo/go.mod",
+			expect:      true,
+		},
+		{
+			description: "not go.mod",
+			path:        "Gopkg.toml",
+			expect:      false,
+		},
+	}
+	for _, test := range tests {
+		testutil.Run(t, test.description, func(t *testutil.T) {
+			t.CheckDeepEqual(test.expect, Validate(test.path))
+		})
+	}
+}