From f2626436e714539505eada88de001ff98aeff597 Mon Sep 17 00:00:00 2001 From: Jacob Gillespie Date: Thu, 21 Mar 2024 20:28:40 +0100 Subject: [PATCH] Add experimental exec command --- pkg/cmd/exec/exec.go | 208 +++++++++++++++++++++++++++++ pkg/cmd/root/root.go | 2 + pkg/connection/machine.go | 58 ++++++++ pkg/connection/proxy.go | 116 ++++++++++++++++ pkg/helpers/build.go | 1 - pkg/proto/depot/cli/v1/build.pb.go | 170 +++++++++++------------ proto/depot/cli/v1/build.proto | 1 + 7 files changed, 472 insertions(+), 84 deletions(-) create mode 100644 pkg/cmd/exec/exec.go create mode 100644 pkg/connection/machine.go create mode 100644 pkg/connection/proxy.go diff --git a/pkg/cmd/exec/exec.go b/pkg/cmd/exec/exec.go new file mode 100644 index 00000000..bcd96364 --- /dev/null +++ b/pkg/cmd/exec/exec.go @@ -0,0 +1,208 @@ +package exec + +import ( + "context" + "fmt" + "net" + "os" + "os/exec" + "os/signal" + "runtime" + "strings" + "syscall" + + "github.com/depot/cli/pkg/connection" + "github.com/depot/cli/pkg/helpers" + "github.com/depot/cli/pkg/machine" + "github.com/depot/cli/pkg/progress" + cliv1 "github.com/depot/cli/pkg/proto/depot/cli/v1" + buildxprogress "github.com/docker/buildx/util/progress" + "github.com/docker/cli/cli" + "github.com/docker/cli/cli/command" + "github.com/spf13/cobra" +) + +func NewCmdExec(dockerCli command.Cli) *cobra.Command { + var ( + envVar string + token string + projectID string + platform string + progressMode string + ) + + run := func(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() + + token, err := helpers.ResolveToken(ctx, token) + if err != nil { + return err + } + projectID = helpers.ResolveProjectID(projectID) + if projectID == "" { + selectedProject, err := helpers.OnboardProject(ctx, token) + if err != nil { + return err + } + projectID = selectedProject.ID + } + + if token == "" { + return fmt.Errorf("missing API token, please run `depot login`") + } + + platform, err = ResolveMachinePlatform(platform) + if err != nil { + return err + } + + req := &cliv1.CreateBuildRequest{ + ProjectId: &projectID, + Options: []*cliv1.BuildOptions{{Command: cliv1.Command_COMMAND_EXEC}}, + } + build, err := helpers.BeginBuild(ctx, req, token) + if err != nil { + return fmt.Errorf("unable to begin build: %w", err) + } + + var buildErr error + defer func() { + build.Finish(buildErr) + }() + + printCtx, cancel := context.WithCancel(ctx) + buildxprinter, buildErr := buildxprogress.NewPrinter(printCtx, os.Stderr, os.Stderr, progressMode) + if buildErr != nil { + cancel() + return buildErr + } + + reporter, finishReporter, buildErr := progress.NewProgress(printCtx, build.ID, build.Token, buildxprinter) + if buildErr != nil { + cancel() + return buildErr + } + + var builder *machine.Machine + buildErr = reporter.WithLog(fmt.Sprintf("[depot] launching %s machine", platform), func() error { + for i := 0; i < 2; i++ { + builder, buildErr = machine.Acquire(ctx, build.ID, build.Token, platform) + if buildErr == nil { + break + } + } + return buildErr + }) + if buildErr != nil { + cancel() + finishReporter() + return buildErr + } + + defer func() { _ = builder.Release() }() + + // Wait for connection to be ready. + var conn net.Conn + buildErr = reporter.WithLog(fmt.Sprintf("[depot] connecting to %s machine", platform), func() error { + conn, buildErr = connection.TLSConn(ctx, builder) + if buildErr != nil { + return fmt.Errorf("unable to connect: %w", buildErr) + } + _ = conn.Close() + return nil + }) + cancel() + finishReporter() + + listener, localAddr, buildErr := connection.LocalListener() + if buildErr != nil { + return buildErr + } + proxy := connection.NewProxy(listener, builder) + + proxyCtx, proxyCancel := context.WithCancel(ctx) + defer proxyCancel() + go func() { _ = proxy.Start(proxyCtx) }() + + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan) + + subCmd := exec.CommandContext(ctx, args[0], args[1:]...) + + env := os.Environ() + subCmd.Env = append(env, fmt.Sprintf("%s=%s", envVar, localAddr)) + subCmd.Stdin = os.Stdin + subCmd.Stdout = os.Stdout + subCmd.Stderr = os.Stderr + + buildErr = subCmd.Start() + if buildErr != nil { + return buildErr + } + + go func() { + for { + sig := <-sigChan + _ = subCmd.Process.Signal(sig) + } + }() + + buildErr = subCmd.Wait() + if buildErr != nil { + return buildErr + } + + return nil + } + + cmd := &cobra.Command{ + Hidden: true, + Use: "exec [flags] command [args...]", + Short: "Execute a command with injected BuildKit connection", + Args: cli.RequiresMinArgs(1), + Run: func(cmd *cobra.Command, args []string) { + if err := run(cmd, args); err != nil { + if exitErr, ok := err.(*exec.ExitError); ok { + if status, ok := exitErr.Sys().(syscall.WaitStatus); ok { + os.Exit(status.ExitStatus()) + } + } + + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + }, + } + + cmd.Flags().SetInterspersed(false) + cmd.Flags().StringVar(&envVar, "env-var", "BUILDKIT_HOST", "Environment variable name for the BuildKit connection") + cmd.Flags().StringVar(&platform, "platform", "", "Platform to execute the command on") + cmd.Flags().StringVar(&projectID, "project", "", "Depot project ID") + cmd.Flags().StringVar(&progressMode, "progress", "auto", `Set type of progress output ("auto", "plain", "tty")`) + cmd.Flags().StringVar(&token, "token", "", "Depot token") + + return cmd +} + +func ResolveMachinePlatform(platform string) (string, error) { + if platform == "" { + platform = os.Getenv("DEPOT_BUILD_PLATFORM") + } + + switch platform { + case "linux/arm64": + platform = "arm64" + case "linux/amd64": + platform = "amd64" + case "": + if strings.HasPrefix(runtime.GOARCH, "arm") { + platform = "arm64" + } else { + platform = "amd64" + } + default: + return "", fmt.Errorf("invalid platform: %s (must be one of: linux/amd64, linux/arm64)", platform) + } + + return platform, nil +} diff --git a/pkg/cmd/root/root.go b/pkg/cmd/root/root.go index 9236598d..70ea1f33 100644 --- a/pkg/cmd/root/root.go +++ b/pkg/cmd/root/root.go @@ -10,6 +10,7 @@ import ( buildCmd "github.com/depot/cli/pkg/cmd/build" cacheCmd "github.com/depot/cli/pkg/cmd/cache" dockerCmd "github.com/depot/cli/pkg/cmd/docker" + "github.com/depot/cli/pkg/cmd/exec" initCmd "github.com/depot/cli/pkg/cmd/init" "github.com/depot/cli/pkg/cmd/list" loginCmd "github.com/depot/cli/pkg/cmd/login" @@ -64,6 +65,7 @@ func NewCmdRoot(version, buildDate string) *cobra.Command { cmd.AddCommand(dockerCmd.NewCmdConfigureDocker(dockerCli)) cmd.AddCommand(registry.NewCmdRegistry()) cmd.AddCommand(projects.NewCmdProjects()) + cmd.AddCommand(exec.NewCmdExec(dockerCli)) return cmd } diff --git a/pkg/connection/machine.go b/pkg/connection/machine.go new file mode 100644 index 00000000..3013e931 --- /dev/null +++ b/pkg/connection/machine.go @@ -0,0 +1,58 @@ +package connection + +import ( + "context" + "crypto/tls" + "crypto/x509" + "fmt" + "net" + "strings" + "time" + + "github.com/depot/cli/pkg/machine" +) + +// Connects to the buildkitd using the TLS certs provided by the Depot API. +// Attempts to connect every one second for two minutes until it succeeds +// or the context is canceled. +func TLSConn(ctx context.Context, builder *machine.Machine) (net.Conn, error) { + // Uses similar retry logic as the depot buildx driver. + ctx, cancel := context.WithTimeout(ctx, 5*time.Minute) + defer cancel() + + certPool := x509.NewCertPool() + if ok := certPool.AppendCertsFromPEM([]byte(builder.CACert)); !ok { + return nil, fmt.Errorf("failed to append ca certs") + } + + cfg := &tls.Config{RootCAs: certPool} + if builder.Cert != "" || builder.Key != "" { + cert, err := tls.X509KeyPair([]byte(builder.Cert), []byte(builder.Key)) + if err != nil { + return nil, fmt.Errorf("could not read certificate/key: %w", err) + } + cfg.Certificates = []tls.Certificate{cert} + } + + dialer := &tls.Dialer{Config: cfg} + addr := strings.TrimPrefix(builder.Addr, "tcp://") + + var ( + conn net.Conn + err error + ) + for i := 0; i < 120; i++ { + conn, err = dialer.DialContext(ctx, "tcp", addr) + if err == nil { + return conn, nil + } + select { + case <-ctx.Done(): + return nil, ctx.Err() + default: + time.Sleep(1 * time.Second) + } + } + + return nil, err +} diff --git a/pkg/connection/proxy.go b/pkg/connection/proxy.go new file mode 100644 index 00000000..6b44b672 --- /dev/null +++ b/pkg/connection/proxy.go @@ -0,0 +1,116 @@ +package connection + +import ( + "context" + "fmt" + "io" + "net" + "sync" + + "github.com/depot/cli/pkg/machine" +) + +// LocalListener returns a listener that listens on a random port on localhost. +func LocalListener() (net.Listener, string, error) { + l, err := net.Listen("tcp", ":0") + if err != nil { + return nil, "", err + } + addr := fmt.Sprintf("tcp://127.0.0.1:%d", l.Addr().(*net.TCPAddr).AddrPort().Port()) + return l, addr, nil +} + +type Proxy struct { + listener net.Listener + builder *machine.Machine + done chan struct{} + + mu sync.Mutex + err error +} + +func NewProxy(listener net.Listener, builder *machine.Machine) *Proxy { + return &Proxy{ + listener: listener, + builder: builder, + done: make(chan struct{}), + } +} + +func (p *Proxy) Start(ctx context.Context) error { + defer func() { _ = p.listener.Close() }() + + wg := &sync.WaitGroup{} + go p.run(p.listener, wg) + <-ctx.Done() + + _ = p.listener.Close() + p.Stop() + wg.Wait() + + p.mu.Lock() + defer p.mu.Unlock() + return p.err +} + +func (p *Proxy) Stop() { + if p.done == nil { + return + } + close(p.done) + p.done = nil +} + +func (p *Proxy) run(listener net.Listener, wg *sync.WaitGroup) { + for { + select { + case <-p.done: + return + default: + connection, err := listener.Accept() + if err == nil { + defer wg.Done() + wg.Add(1) + go p.handle(connection) + } else { + p.mu.Lock() + p.err = err + p.mu.Unlock() + } + } + } +} + +func (p *Proxy) handle(connection net.Conn) { + defer func() { _ = connection.Close() }() + remote, err := TLSConn(context.Background(), p.builder) + if err != nil { + p.mu.Lock() + p.err = err + p.mu.Unlock() + return + } + defer func() { _ = remote.Close() }() + + wg := &sync.WaitGroup{} + wg.Add(2) + go p.copy(remote, connection, wg) + go p.copy(connection, remote, wg) + wg.Wait() +} + +func (p *Proxy) copy(from, to net.Conn, wg *sync.WaitGroup) { + defer wg.Done() + select { + case <-p.done: + return + default: + if _, err := io.Copy(to, from); err != nil { + p.mu.Lock() + p.err = err + p.mu.Unlock() + p.Stop() + return + } + } +} diff --git a/pkg/helpers/build.go b/pkg/helpers/build.go index 14d87c0e..ebd5b7c4 100644 --- a/pkg/helpers/build.go +++ b/pkg/helpers/build.go @@ -94,7 +94,6 @@ func NewBuildRequest(project string, opts map[string]buildx.Options, features Us } } - // Should never be reached. return &cliv1.CreateBuildRequest{ProjectId: &project} } diff --git a/pkg/proto/depot/cli/v1/build.pb.go b/pkg/proto/depot/cli/v1/build.pb.go index a15ec415..bfe2c59b 100644 --- a/pkg/proto/depot/cli/v1/build.pb.go +++ b/pkg/proto/depot/cli/v1/build.pb.go @@ -29,6 +29,7 @@ const ( Command_COMMAND_BUILD Command = 1 Command_COMMAND_BAKE Command = 2 Command_COMMAND_BUILDX Command = 3 + Command_COMMAND_EXEC Command = 5 ) // Enum value maps for Command. @@ -38,12 +39,14 @@ var ( 1: "COMMAND_BUILD", 2: "COMMAND_BAKE", 3: "COMMAND_BUILDX", + 5: "COMMAND_EXEC", } Command_value = map[string]int32{ "COMMAND_UNSPECIFIED": 0, "COMMAND_BUILD": 1, "COMMAND_BAKE": 2, "COMMAND_BUILDX": 3, + "COMMAND_EXEC": 5, } ) @@ -2716,98 +2719,99 @@ var file_depot_cli_v1_build_proto_rawDesc = []byte{ 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x2a, 0x5b, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, + 0x6b, 0x65, 0x6e, 0x2a, 0x6d, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x42, 0x41, 0x4b, 0x45, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x58, 0x10, 0x03, - 0x2a, 0x6b, 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x74, 0x66, - 0x6f, 0x72, 0x6d, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x45, 0x52, 0x5f, 0x50, - 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x45, 0x52, - 0x5f, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x41, 0x4d, 0x44, 0x36, 0x34, 0x10, - 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x45, 0x52, 0x5f, 0x50, 0x4c, 0x41, - 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x41, 0x52, 0x4d, 0x36, 0x34, 0x10, 0x02, 0x2a, 0x94, 0x01, - 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, - 0x18, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x42, - 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x55, 0x4e, 0x4e, - 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4e, 0x49, 0x53, 0x48, 0x45, 0x44, 0x10, 0x02, - 0x12, 0x17, 0x0a, 0x13, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x55, 0x49, - 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, - 0x45, 0x44, 0x10, 0x04, 0x32, 0xa6, 0x07, 0x0a, 0x0c, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x45, 0x58, 0x45, 0x43, + 0x10, 0x05, 0x2a, 0x6b, 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x45, 0x52, + 0x5f, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x49, 0x4c, 0x44, + 0x45, 0x52, 0x5f, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x41, 0x4d, 0x44, 0x36, + 0x34, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x45, 0x52, 0x5f, 0x50, + 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x41, 0x52, 0x4d, 0x36, 0x34, 0x10, 0x02, 0x2a, + 0x94, 0x01, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x1c, 0x0a, 0x18, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, + 0x14, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x55, + 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x55, 0x49, 0x4c, 0x44, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4e, 0x49, 0x53, 0x48, 0x45, 0x44, + 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x42, + 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x41, 0x4e, 0x43, + 0x45, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x32, 0xa6, 0x07, 0x0a, 0x0c, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0b, 0x46, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, 0x70, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0b, 0x46, + 0x69, 0x6e, 0x69, 0x73, 0x68, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x69, - 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x69, 0x74, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x64, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x12, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, - 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, - 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x65, 0x70, - 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x55, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x12, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x27, 0x2e, 0x64, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x69, + 0x73, 0x68, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x70, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x69, 0x74, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x4b, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x69, 0x74, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x64, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x51, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x1f, 0x2e, - 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, + 0x72, 0x74, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x55, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x12, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x27, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x51, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, + 0x1f, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x50, 0x75, 0x6c, - 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x6c, 0x6c, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xa3, 0x01, - 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, - 0x76, 0x31, 0x42, 0x0a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x70, - 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6c, - 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x44, 0x43, 0x58, 0xaa, 0x02, 0x0c, 0x44, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x43, 0x6c, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x44, 0x65, 0x70, 0x6f, 0x74, - 0x5c, 0x43, 0x6c, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, - 0x43, 0x6c, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x0e, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x3a, 0x3a, 0x43, 0x6c, 0x69, 0x3a, - 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x50, + 0x75, 0x6c, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x6c, 0x6c, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, + 0x6c, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, + 0xa3, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, + 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x69, 0x2f, 0x76, 0x31, 0x3b, + 0x63, 0x6c, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x44, 0x43, 0x58, 0xaa, 0x02, 0x0c, 0x44, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x43, 0x6c, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x44, 0x65, 0x70, + 0x6f, 0x74, 0x5c, 0x43, 0x6c, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x44, 0x65, 0x70, 0x6f, + 0x74, 0x5c, 0x43, 0x6c, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x3a, 0x3a, 0x43, 0x6c, + 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/depot/cli/v1/build.proto b/proto/depot/cli/v1/build.proto index 0f8a28e8..b724eb05 100644 --- a/proto/depot/cli/v1/build.proto +++ b/proto/depot/cli/v1/build.proto @@ -46,6 +46,7 @@ enum Command { COMMAND_BUILD = 1; COMMAND_BAKE = 2; COMMAND_BUILDX = 3; + COMMAND_EXEC = 5; } message BuildOutput {