Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .containifyci/containifyci.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,6 @@ func main() {
"tags": build.NewList("containers_image_openpgp"),
"goreleaser": build.NewList("true"),
}
opts.Registries = registryAuth()
// opts.Registries = registryAuth()
build.Serve(opts)
}
40 changes: 38 additions & 2 deletions .github/workflows/engine-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,50 @@ jobs:
secrets: inherit
strategy:
matrix:
runtime: [docker, podman]
include:
- runtime: docker
is_uploader: true
- runtime: podman
is_uploader: false
permissions:
contents: write # for checkout
id-token: write # for authenticating to Google Cloud Platform
pull-requests: write # for updating pr
with:
dockerhub_user: "containifyci"
runtime: ${{ matrix.runtime }}
install_binary: true
remote_debug: true
remote_debug_user: "fr12k"
upload_artifacts: ${{ matrix.is_uploader }}

integration-test:
name: Integration Test ubuntu-latest
needs: build-go
runs-on: ubuntu-latest
permissions:
contents: write # for checkout
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.25'

- name: Download artifacts
uses: actions/download-artifact@v4
with:
name: binaries

- name: Run integration tests
env:
RUN_INTEGRATION_TESTS: "true"
CONTAINIFYCI_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CONTAINIFYCI_DOCKER_TOKEN: ${{ secrets.CONTAINIFYCI_DOCKER_TOKEN }}
run: |
# Move binary to expected location
# mv ${{ matrix.binary }} containifyci-java-$(go env GOOS)-$(go env GOARCH)
chmod +x containifyci-java-$(go env GOOS)-$(go env GOARCH)
# Run the integration test
go test -tags=integration -v -timeout 5m integration_test.go
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ go 1.25.0
// replace github.com/containifyci/engine-ci => ../engine-ci

require (
github.com/containifyci/engine-ci v0.24.2
github.com/containifyci/engine-ci v0.26.0
github.com/stretchr/testify v1.11.1
)

Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ github.com/containers/psgo v1.9.0 h1:eJ74jzSaCHnWt26OlKZROSyUyRcGDf+gYBdXnxrMW4g
github.com/containers/psgo v1.9.0/go.mod h1:0YoluUm43Mz2UnBIh1P+6V6NWcbpTL5uRtXyOcH0B5A=
github.com/containers/storage v1.58.0 h1:Q7SyyCCjqgT3wYNgRNIL8o/wUS92heIj2/cc8Sewvcc=
github.com/containers/storage v1.58.0/go.mod h1:w7Jl6oG+OpeLGLzlLyOZPkmUso40kjpzgrHUk5tyBlo=
github.com/containifyci/engine-ci v0.24.2 h1:TTiPVgY0F2NR0OHq8xO9H45lhpkZQL2Da5M8Irt5x5k=
github.com/containifyci/engine-ci v0.24.2/go.mod h1:SWRTTkF3IADlTwY0w20hCukdeJKOsuS8XmbmoWZE1kw=
github.com/containifyci/engine-ci v0.26.0 h1:dLaq19JIs2VJBCaToZbOPznFPAEcOZ2pqfVN4+V5DeE=
github.com/containifyci/engine-ci v0.26.0/go.mod h1:SWRTTkF3IADlTwY0w20hCukdeJKOsuS8XmbmoWZE1kw=
github.com/containifyci/engine-ci/protos2 v0.15.2 h1:CjUuYqXt0gAakiUCDWn5JaO+oTesFMeyGj0Vs7A24qc=
github.com/containifyci/engine-ci/protos2 v0.15.2/go.mod h1:k7k6Zego6VwwYFYHM4LcBR34E6NDxY1OO8lgVQzMpQ0=
github.com/containifyci/go-self-update v0.2.2 h1:qbactPBL9Ad90bS6v5dIjulNFwqxj/C+IK8ZdFxe9CM=
Expand Down
74 changes: 74 additions & 0 deletions integration_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
//go:build integration
// +build integration

package main

import (
"fmt"
"os"
"os/exec"
"path/filepath"
"runtime"
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

// TestBuildHelloWorldServlet tests that the containifyci-java binary can successfully
// build a simple Hello World Tomcat servlet project
func TestBuildHelloWorldServlet(t *testing.T) {
// Skip if not running integration tests
if os.Getenv("RUN_INTEGRATION_TESTS") != "true" {
t.Skip("Skipping integration test. Set RUN_INTEGRATION_TESTS=true to run")
}

// Get the current working directory
cwd, err := os.Getwd()
require.NoError(t, err, "Failed to get current working directory")

// Determine binary name based on OS and architecture
binaryName := fmt.Sprintf("containifyci-java-%s-%s", runtime.GOOS, runtime.GOARCH)
binaryPath := filepath.Join(cwd, binaryName)

// Check if pre-built binary exists, if not build it
if _, err := os.Stat(binaryPath); os.IsNotExist(err) {
t.Logf("Binary %s not found, building it...", binaryName)
cmd := exec.Command("go", "build", "-o", binaryPath, ".")
err = cmd.Run()
require.NoError(t, err, "Failed to build binary")
}

// Path to test project
testProjectPath := filepath.Join(cwd, "testdata", "hello-world-servlet")

// Ensure test project exists
pomPath := filepath.Join(testProjectPath, "pom.xml")
require.FileExists(t, pomPath, "Test project pom.xml not found")

// Clean any previous build artifacts
targetDir := filepath.Join(testProjectPath, "target")
os.RemoveAll(targetDir)
defer os.RemoveAll(targetDir)

// Change to project directory
originalDir, err := os.Getwd()
require.NoError(t, err)
defer os.Chdir(originalDir)

err = os.Chdir(testProjectPath)
require.NoError(t, err)

// Run the binary to build the test project
t.Log("Running containifyci-java to build Hello World servlet...")
cmd := exec.Command(binaryPath, "run")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Env = append(os.Environ(), "CONTAINIFYCI_FILE=.containifyci/containifyci.go")

// Run command and check exit code
err = cmd.Run()
assert.NoError(t, err, "Build command should exit with code 0")

t.Log("Build completed successfully with exit code 0")
}
12 changes: 11 additions & 1 deletion pkg/maven/maven.go
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,10 @@ func NewProd(arg *container.Build, version string) build.Build {
container := New(arg, version)
return MavenBuild{
rf: func() error {
if arg.Image == "" {
slog.Info("No image name skip prod image creation")
return nil
}
return container.Prod()
},
name: "maven-prod",
Expand All @@ -276,7 +280,8 @@ func (c *MavenContainer) Prod() error {
os.Exit(1)
}

err = c.CopyFileTo(c.File.Host(), "/usr/local/tomcat/webapps/jpetstore.war")
fileName := filepath.Base(c.File.Host())
err = c.CopyFileTo(c.File.Host(), "/usr/local/tomcat/webapps/"+fileName)
if err != nil {
slog.Error("Failed to copy file to container", "error", err, "file", c.File)
os.Exit(1)
Expand All @@ -294,6 +299,11 @@ func (c *MavenContainer) Prod() error {
os.Exit(1)
}

push := c.GetBuild().Custom.Bool("push", true)
if !push {
slog.Info("Skipping image push", "image", c.Image, "tag", c.ImageTag)
return nil
}
imageUri := utils.ImageURI(c.GetBuild().Registry, c.Image, c.ImageTag)
err = c.Push(imageId, imageUri)
if err != nil {
Expand Down
36 changes: 36 additions & 0 deletions testdata/hello-world-servlet/.containifyci/containifyci.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
//go:generate bash -c "if [ ! -f go.mod ]; then echo 'Initializing go.mod...'; go mod init .containifyci; else echo 'go.mod already exists. Skipping initialization.'; fi"
//go:generate go get github.com/containifyci/engine-ci/protos2
//go:generate go get github.com/containifyci/engine-ci/client
//go:generate go mod tidy

package main

import (
"os"

"github.com/containifyci/engine-ci/client/pkg/build"
"github.com/containifyci/engine-ci/protos2"
)

func registryAuth() map[string]*protos2.ContainerRegistry {
return map[string]*protos2.ContainerRegistry{
"docker.io": {
Username: "containifyci",
Password: "env:CONTAINIFYCI_DOCKER_TOKEN",
},
}
}

func main() {
os.Chdir("../")
opts := build.NewMavenLibraryBuild("hello-world-servlet")
opts.Verbose = false
opts.File = "target/hello-world-servlet.war"
//TODO: adjust the registry to your own container registry
opts.Properties = map[string]*build.ListValue{
"push": build.NewList("false"),
}
opts.Registry = "containifyci"
opts.Registries = registryAuth()
build.Serve(opts)
}
24 changes: 24 additions & 0 deletions testdata/hello-world-servlet/.containifyci/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
module .containifyci

go 1.25.0

require github.com/containifyci/engine-ci/client v0.18.0

require (
github.com/containifyci/engine-ci/protos2 v0.17.0 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/hashicorp/go-hclog v1.6.3 // indirect
github.com/hashicorp/go-plugin v1.7.0 // indirect
github.com/hashicorp/yamux v0.1.2 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/oklog/run v1.2.0 // indirect
golang.org/x/net v0.43.0 // indirect
golang.org/x/sys v0.35.0 // indirect
golang.org/x/text v0.28.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1 // indirect
google.golang.org/grpc v1.75.0 // indirect
google.golang.org/protobuf v1.36.8 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
86 changes: 86 additions & 0 deletions testdata/hello-world-servlet/.containifyci/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw=
github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c=
github.com/containifyci/engine-ci/client v0.18.0 h1:cmM3VI0bG3X3LrQQ06OsWqskaRidFM7heYN6Znpw8OY=
github.com/containifyci/engine-ci/client v0.18.0/go.mod h1:yTlzdvv2k0pKcydnZFLQXxo2WD/W7q6s72N7QswC2Xw=
github.com/containifyci/engine-ci/protos2 v0.17.0 h1:nD0bFLc3lCK1WE+AQi+KUfns/N2vaFYCp4VAknD4ccA=
github.com/containifyci/engine-ci/protos2 v0.17.0/go.mod h1:8Cpr8gRWJw2j6FvYkUUJq4eX1jnBQnk+ZHWcY2AmOjA=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
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-plugin v1.7.0 h1:YghfQH/0QmPNc/AZMTFE3ac8fipZyZECHdDPshfk+mA=
github.com/hashicorp/go-plugin v1.7.0/go.mod h1:BExt6KEaIYx804z8k4gRzRLEvxKVb+kn0NMcihqOqb8=
github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8=
github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns=
github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94=
github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8=
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/oklog/run v1.2.0 h1:O8x3yXwah4A73hJdlrwo/2X6J62gE5qTMusH0dvz60E=
github.com/oklog/run v1.2.0/go.mod h1:mgDbKRSwPhJfesJ4PntqFUbKQRZ50NgmZTSPlFA0YFk=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1 h1:pmJpJEvT846VzausCQ5d7KreSROcDqmO388w5YbnltA=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1/go.mod h1:GmFNa4BdJZ2a8G+wCe9Bg3wwThLrJun751XstdJt5Og=
google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4=
google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Loading
Loading