diff --git a/.golangci.yml b/.golangci.yml index 5475477ce..d41d188d5 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,45 +1,30 @@ +--- version: "2" +formatters: + enable: + - gofmt + - goimports + linters: - default: none enable: - errcheck - goconst + # - gosec - govet - ineffassign - misspell - nakedret + # - revive - staticcheck - unconvert + # - unparam - unused - settings: - errcheck: - exclude-functions: - - io.Close - - (io.Closer).Close - - (*os.File).Close - - (net/http.ResponseWriter).Write - - fmt.Fprint - - fmt.Fprintf - - fmt.Fprintln - - exclusions: - rules: - - path: _test\.go - linters: - - errcheck - - goconst - - # Style suggestions, not errors - - linters: [staticcheck] - text: "ST1023" - - linters: [staticcheck] - text: "ST1005" - - linters: [staticcheck] - text: "QF" - -formatters: - enable: - - gofmt - - goimports +# Instead of disabling tests entirely, just ignore goconst, which is the only +# one with issues there currently. +issues: + exclude-rules: + - path: (.+)_test.go + linters: + - goconst diff --git a/cmd/envbuild.go b/cmd/envbuild.go new file mode 100644 index 000000000..bb0c7100c --- /dev/null +++ b/cmd/envbuild.go @@ -0,0 +1,126 @@ +package cmd + +import ( + "encoding/json" + "fmt" + "io" + "os" + "os/exec" + "regexp" + + "github.com/CircleCI-Public/chunk-cli/envbuilder" + "github.com/spf13/cobra" +) + +var validEnvbuildDockerTag = regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9._/\-]*(:[a-zA-Z0-9._\-]+)?$`) + +func newEnvbuildCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "envbuild", + Short: "Detect tech stack and build test environments", + } + + cmd.AddCommand(newEnvbuildEnvCmd()) + cmd.AddCommand(newEnvbuildBuildCmd()) + + return cmd +} + +func newEnvbuildEnvCmd() *cobra.Command { + var dir string + + cmd := &cobra.Command{ + Use: "env", + Short: "Detect tech stack and print environment spec as JSON", + Long: `Analyse the repository at --dir, detect its tech stack, and print +a JSON environment spec to stdout. Pipe this into 'circleci envbuild build' to +generate a Dockerfile and build a test image.`, + RunE: func(cmd *cobra.Command, _ []string) error { + if _, err := os.Stat(dir); err != nil { + return fmt.Errorf("directory %q not found: %w", dir, err) + } + _, _ = fmt.Fprintf(cmd.ErrOrStderr(), "Detecting environment in %s...\n", dir) + + env, err := envbuilder.DetectEnvironment(cmd.Context(), dir) + if err != nil { + return fmt.Errorf("detect environment: %w", err) + } + + out, err := json.MarshalIndent(env, "", " ") + if err != nil { + return fmt.Errorf("marshal environment: %w", err) + } + _, err = fmt.Fprintf(cmd.OutOrStdout(), "%s\n", out) + return err + }, + } + + cmd.Flags().StringVar(&dir, "dir", ".", "Directory to detect environment in") + + return cmd +} + +func newEnvbuildBuildCmd() *cobra.Command { + var dir, tag string + + cmd := &cobra.Command{ + Use: "build", + Short: "Generate a Dockerfile from an environment spec and build a test image", + Long: `Read a JSON environment spec from stdin (produced by 'circleci envbuild env'), +write Dockerfile.test to --dir, and build a Docker test image from it. + +Example: + circleci envbuild env --dir . | circleci envbuild build --dir .`, + RunE: func(cmd *cobra.Command, _ []string) error { + if tag != "" && !validEnvbuildDockerTag.MatchString(tag) { + return fmt.Errorf("invalid docker tag %q", tag) + } + + // Guard against interactive use: if stdin is a terminal (not a pipe), + // fail fast rather than blocking silently. + if f, ok := cmd.InOrStdin().(*os.File); ok { + if fi, err := f.Stat(); err == nil && fi.Mode()&os.ModeCharDevice != 0 { + return fmt.Errorf("no input on stdin — pipe a JSON env spec from 'circleci envbuild env'") + } + } + + raw, err := io.ReadAll(cmd.InOrStdin()) + if err != nil { + return fmt.Errorf("read environment spec: %w", err) + } + var env envbuilder.Environment + if err := json.Unmarshal(raw, &env); err != nil { + return fmt.Errorf("parse environment spec: %w", err) + } + + dockerfilePath, err := envbuilder.WriteDockerfile(dir, &env) + if err != nil { + return fmt.Errorf("write dockerfile: %w", err) + } + _, _ = fmt.Fprintf(cmd.ErrOrStderr(), "Wrote %s\n", dockerfilePath) + _, _ = fmt.Fprintf(cmd.ErrOrStderr(), "Building Docker image in %s...\n", dir) + + args := []string{"build", "-f", "Dockerfile.test"} + if tag != "" { + args = append(args, "-t", tag) + } + args = append(args, ".") + + dockerCmd := exec.CommandContext(cmd.Context(), "docker", args...) + dockerCmd.Dir = dir + dockerCmd.Stdout = cmd.OutOrStdout() + dockerCmd.Stderr = cmd.ErrOrStderr() + if err := dockerCmd.Run(); err != nil { + return fmt.Errorf("docker build: %w", err) + } + + _, _ = fmt.Fprintln(cmd.ErrOrStderr(), "Docker image built successfully") + return nil + }, + } + + cmd.Flags().StringVar(&dir, "dir", ".", "Directory to write Dockerfile.test and build from") + cmd.Flags().StringVar(&tag, "tag", "", "Image tag (e.g. myapp:latest)") + + return cmd +} diff --git a/cmd/root.go b/cmd/root.go index a5a7fa0fd..e660db736 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -197,6 +197,7 @@ func MakeCommands() *cobra.Command { rootCmd.AddCommand(newAdminCommand(rootOptions)) rootCmd.AddCommand(newCompletionCommand(rootOptions)) rootCmd.AddCommand(newEnvCmd()) + rootCmd.AddCommand(newEnvbuildCmd()) rootCmd.AddCommand(newTelemetryCommand(rootOptions)) flags := rootCmd.PersistentFlags() diff --git a/cmd/root_test.go b/cmd/root_test.go index bdcc6f534..dc4209e2e 100644 --- a/cmd/root_test.go +++ b/cmd/root_test.go @@ -16,7 +16,7 @@ var _ = Describe("Root", func() { Describe("subcommands", func() { It("can create commands", func() { commands := cmd.MakeCommands() - Expect(len(commands.Commands())).To(Equal(29)) + Expect(len(commands.Commands())).To(Equal(30)) }) }) diff --git a/go.mod b/go.mod index 57a7ab5ee..918ef1751 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,10 @@ module github.com/CircleCI-Public/circleci-cli -go 1.25.0 +go 1.26 require ( github.com/AlecAivazis/survey/v2 v2.3.7 + github.com/CircleCI-Public/chunk-cli v0.7.6-0.20260401220544-e7c971f266a7 github.com/CircleCI-Public/circle-policy-agent v0.0.779 github.com/Masterminds/semver v1.5.0 github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de @@ -95,11 +96,13 @@ require ( github.com/charithe/durationcheck v0.0.11 // indirect github.com/charmbracelet/bubbles v0.21.0 // indirect github.com/charmbracelet/bubbletea v1.3.10 // indirect - github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect - github.com/charmbracelet/x/ansi v0.10.1 // indirect - github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect - github.com/charmbracelet/x/term v0.2.1 // indirect + github.com/charmbracelet/colorprofile v0.4.2 // indirect + github.com/charmbracelet/x/ansi v0.11.6 // indirect + github.com/charmbracelet/x/cellbuf v0.0.15 // indirect + github.com/charmbracelet/x/term v0.2.2 // indirect github.com/ckaznocha/intrange v0.3.1 // indirect + github.com/clipperhouse/displaywidth v0.11.0 // indirect + github.com/clipperhouse/uax29/v2 v2.7.0 // indirect github.com/cloudflare/circl v1.6.1 // indirect github.com/curioswitch/go-reassign v0.3.0 // indirect github.com/cyphar/filepath-securejoin v0.4.1 // indirect @@ -156,7 +159,9 @@ require ( github.com/gostaticanalysis/comment v1.5.0 // indirect github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect github.com/gostaticanalysis/nilerr v0.1.2 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect + github.com/hashicorp/go-retryablehttp v0.7.8 // indirect github.com/hashicorp/go-version v1.8.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hinshun/vt10x v0.0.0-20220301184237-5011da428d02 // indirect @@ -182,7 +187,7 @@ require ( github.com/ldez/tagliatelle v0.7.2 // indirect github.com/ldez/usetesting v0.5.0 // indirect github.com/leonklingele/grouper v1.1.2 // indirect - github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/lucasb-eyer/go-colorful v1.3.0 // indirect github.com/macabu/inamedparam v0.2.0 // indirect github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect github.com/manuelarte/funcorder v0.5.0 // indirect @@ -191,7 +196,7 @@ require ( github.com/matoous/godox v1.1.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-localereader v0.0.1 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mattn/go-runewidth v0.0.21 // indirect github.com/mgechev/revive v1.15.0 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -287,7 +292,7 @@ require ( golang.org/x/sys v0.42.0 // indirect golang.org/x/text v0.35.0 // indirect golang.org/x/tools v0.43.0 // indirect - google.golang.org/protobuf v1.36.8 // indirect + google.golang.org/protobuf v1.36.10 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index dc4286861..185dd5130 100644 --- a/go.sum +++ b/go.sum @@ -30,6 +30,8 @@ github.com/Antonboom/testifylint v1.6.4 h1:gs9fUEy+egzxkEbq9P4cpcMB6/G0DYdMeiFS8 github.com/Antonboom/testifylint v1.6.4/go.mod h1:YO33FROXX2OoUfwjz8g+gUxQXio5i9qpVy7nXGbxDD4= github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/CircleCI-Public/chunk-cli v0.7.6-0.20260401220544-e7c971f266a7 h1:4q65z8wpZ5+REWeY4IZvh9RCS1aBZts215+1Kfqe5j8= +github.com/CircleCI-Public/chunk-cli v0.7.6-0.20260401220544-e7c971f266a7/go.mod h1:uBZ2OzMqVy24KQunK7jsE+rN6hslPyAG7BAARkcShAM= github.com/CircleCI-Public/circle-policy-agent v0.0.779 h1:yjKIhwYyd6DQL4UH37Ln5Myx/zMX7H8ussp28unZjnE= github.com/CircleCI-Public/circle-policy-agent v0.0.779/go.mod h1:bYS06KcciyAEH13ggXZhOdl8hYS4d/iSCGgX5b03B1U= github.com/CircleCI-Public/circleci-config v0.0.0-20231003143420-842d4b0025ef h1:Bhr3xH8/XV0CF8wHFxWgBkmDRTQIW5O1MiuL3n1AEug= @@ -131,18 +133,22 @@ github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg= github.com/charmbracelet/bubbletea v1.3.10 h1:otUDHWMMzQSB0Pkc87rm691KZ3SWa4KUlvF9nRvCICw= github.com/charmbracelet/bubbletea v1.3.10/go.mod h1:ORQfo0fk8U+po9VaNvnV95UPWA1BitP1E0N6xJPlHr4= -github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= -github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= +github.com/charmbracelet/colorprofile v0.4.2 h1:BdSNuMjRbotnxHSfxy+PCSa4xAmz7szw70ktAtWRYrY= +github.com/charmbracelet/colorprofile v0.4.2/go.mod h1:0rTi81QpwDElInthtrQ6Ni7cG0sDtwAd4C4le060fT8= github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= -github.com/charmbracelet/x/ansi v0.10.1 h1:rL3Koar5XvX0pHGfovN03f5cxLbCF2YvLeyz7D2jVDQ= -github.com/charmbracelet/x/ansi v0.10.1/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE= -github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8= -github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= -github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= -github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= +github.com/charmbracelet/x/ansi v0.11.6 h1:GhV21SiDz/45W9AnV2R61xZMRri5NlLnl6CVF7ihZW8= +github.com/charmbracelet/x/ansi v0.11.6/go.mod h1:2JNYLgQUsyqaiLovhU2Rv/pb8r6ydXKS3NIttu3VGZQ= +github.com/charmbracelet/x/cellbuf v0.0.15 h1:ur3pZy0o6z/R7EylET877CBxaiE1Sp1GMxoFPAIztPI= +github.com/charmbracelet/x/cellbuf v0.0.15/go.mod h1:J1YVbR7MUuEGIFPCaaZ96KDl5NoS0DAWkskup+mOY+Q= +github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk= +github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI= github.com/ckaznocha/intrange v0.3.1 h1:j1onQyXvHUsPWujDH6WIjhyH26gkRt/txNlV7LspvJs= github.com/ckaznocha/intrange v0.3.1/go.mod h1:QVepyz1AkUoFQkpEqksSYpNpUo3c5W7nWh/s6SHIJJk= +github.com/clipperhouse/displaywidth v0.11.0 h1:lBc6kY44VFw+TDx4I8opi/EtL9m20WSEFgwIwO+UVM8= +github.com/clipperhouse/displaywidth v0.11.0/go.mod h1:bkrFNkf81G8HyVqmKGxsPufD3JhNl3dSqnGhOoSD/o0= +github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= +github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= @@ -334,8 +340,14 @@ github.com/gostaticanalysis/testutil v0.5.0 h1:Dq4wT1DdTwTGCQQv3rl3IvD5Ld0E6HiY+ github.com/gostaticanalysis/testutil v0.5.0/go.mod h1:OLQSbuM6zw2EvCcXTz1lVq5unyoNft372msDY0nY5Hs= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix/v2 v2.1.0 h1:CUW5RYIcysz+D3B+l1mDeXrQ7fUvGGCwJfdASSzbrfo= github.com/hashicorp/go-immutable-radix/v2 v2.1.0/go.mod h1:hgdqLXA4f6NIjRVisM1TJ9aOJVNRqKZj+xDGF6m7PBw= +github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= +github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -404,8 +416,8 @@ github.com/ldez/usetesting v0.5.0 h1:3/QtzZObBKLy1F4F8jLuKJiKBjjVFi1IavpoWbmqLwc github.com/ldez/usetesting v0.5.0/go.mod h1:Spnb4Qppf8JTuRgblLrEWb7IE6rDmUpGvxY3iRrzvDQ= github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= -github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= -github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= +github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE= github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U= github.com/manuelarte/embeddedstructfieldcheck v0.4.0 h1:3mAIyaGRtjK6EO9E73JlXLtiy7ha80b2ZVGyacxgfww= @@ -431,8 +443,8 @@ github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+Ei github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.21 h1:jJKAZiQH+2mIinzCJIaIG9Be1+0NR+5sz/lYEEjdM8w= +github.com/mattn/go-runewidth v0.0.21/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/mgechev/revive v1.15.0 h1:vJ0HzSBzfNyPbHKolgiFjHxLek9KUijhqh42yGoqZ8Q= github.com/mgechev/revive v1.15.0/go.mod h1:LlAKO3QQe9OJ0pVZzI2GPa8CbXGZ/9lNpCGvK4T/a8A= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= @@ -849,8 +861,8 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= -google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=