Skip to content

Commit e6ac103

Browse files
pan93412claude
andcommitted
docs: improve pkg/push usage docs and add push-image example
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 551c7ad commit e6ac103

6 files changed

Lines changed: 298 additions & 3 deletions

File tree

README.md

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,16 +107,76 @@ See the [BuildKit OCI/Docker exporters documentation](https://docs.docker.com/bu
107107

108108
### Usage
109109

110+
Install the module:
111+
112+
```bash
113+
go get github.com/zeabur/stratus/v2
114+
```
115+
110116
```go
111117
import (
118+
"context"
119+
"fmt"
112120
"os"
113-
"github.com/zeabur/stratus/v2/pkg/push"
121+
122+
stratusconfig "github.com/zeabur/stratus/v2/pkg/config"
123+
stratuspush "github.com/zeabur/stratus/v2/pkg/push"
124+
stratusstorage "github.com/zeabur/stratus/v2/pkg/storage"
114125
)
115126

116-
srcFS := os.DirFS("image-layout") // or archive/tar FS from the .tar file
117-
err := push.PushOciLayout(ctx, storageClient, bucketName, srcFS, "namespace/myapp", "latest")
127+
func pushImage(ctx context.Context, ociLayoutFS fs.FS, imageName, tag string) error {
128+
cfg := stratusconfig.Load()
129+
130+
storage, err := stratusstorage.MinioStorageFromConfig(cfg)
131+
if err != nil {
132+
return fmt.Errorf("create storage: %w", err)
133+
}
134+
135+
err = stratuspush.PushOciLayout(
136+
ctx,
137+
storage,
138+
cfg.BucketName,
139+
ociLayoutFS,
140+
imageName,
141+
tag,
142+
stratuspush.WithLogOutput(os.Stderr),
143+
)
144+
if err != nil {
145+
return fmt.Errorf("push oci layout to S3: %w", err)
146+
}
147+
148+
return nil
149+
}
118150
```
119151

152+
**`ociLayoutFS`** must be an [`fs.FS`](https://pkg.go.dev/io/fs#FS) rooted at an OCI image layout directory — i.e. a directory containing `index.json`, `oci-layout`, and `blobs/sha256/`. Obtain one from a BuildKit export:
153+
154+
```bash
155+
docker buildx build --output type=oci,dest=image.tar .
156+
mkdir image-layout && tar -xf image.tar -C image-layout
157+
```
158+
159+
Then pass it as `os.DirFS("image-layout")`.
160+
161+
**`config.Load()`** reads configuration from environment variables:
162+
163+
```bash
164+
S3_ENDPOINT=minio.example.com:9000 # required — no scheme
165+
S3_ACCESS_KEY_ID=minioadmin # required
166+
S3_SECRET_ACCESS_KEY=minioadmin # required
167+
S3_BUCKET_NAME=zeabur-oci-registry # optional, this is the default
168+
S3_USE_SSL=false # optional, default false
169+
S3_REGION=us-east-1 # optional
170+
S3_PATH_STYLE=false # optional, set true for MinIO path-style access
171+
```
172+
173+
**Available options for `PushOciLayout`:**
174+
175+
| Option | Default | Description |
176+
|--------|---------|-------------|
177+
| `WithLogOutput(w io.Writer)` | `os.Stderr` | Progress log destination |
178+
| `WithBlobUploadConcurrency(n int)` | `4` | Number of blobs uploaded in parallel |
179+
120180
`PushOciLayout` uploads blobs concurrently (skipping any already present in S3), then atomically merges the local image index with the existing remote index before writing it back.
121181

122182
## Development

examples/push-image/go.mod

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
module github.com/zeabur/stratus/v2/examples/push-image
2+
3+
go 1.26.1
4+
5+
require (
6+
github.com/google/go-containerregistry v0.21.5
7+
github.com/zeabur/stratus/v2 v2.1.2
8+
)
9+
10+
require (
11+
github.com/containerd/stargz-snapshotter/estargz v0.18.2 // indirect
12+
github.com/docker/cli v29.4.0+incompatible // indirect
13+
github.com/docker/docker-credential-helpers v0.9.3 // indirect
14+
github.com/dustin/go-humanize v1.0.1 // indirect
15+
github.com/go-ini/ini v1.67.0 // indirect
16+
github.com/google/uuid v1.6.0 // indirect
17+
github.com/klauspost/compress v1.18.5 // indirect
18+
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
19+
github.com/klauspost/crc32 v1.3.0 // indirect
20+
github.com/kr/text v0.2.0 // indirect
21+
github.com/minio/crc64nvme v1.1.1 // indirect
22+
github.com/minio/md5-simd v1.1.2 // indirect
23+
github.com/minio/minio-go/v7 v7.0.100 // indirect
24+
github.com/mitchellh/go-homedir v1.1.0 // indirect
25+
github.com/opencontainers/go-digest v1.0.0 // indirect
26+
github.com/opencontainers/image-spec v1.1.1 // indirect
27+
github.com/philhofer/fwd v1.2.0 // indirect
28+
github.com/rs/xid v1.6.0 // indirect
29+
github.com/sirupsen/logrus v1.9.4 // indirect
30+
github.com/tinylib/msgp v1.6.4 // indirect
31+
github.com/vbatts/tar-split v0.12.2 // indirect
32+
go.yaml.in/yaml/v3 v3.0.4 // indirect
33+
golang.org/x/crypto v0.50.0 // indirect
34+
golang.org/x/net v0.53.0 // indirect
35+
golang.org/x/sync v0.20.0 // indirect
36+
golang.org/x/sys v0.43.0 // indirect
37+
golang.org/x/text v0.36.0 // indirect
38+
gotest.tools/v3 v3.5.2 // indirect
39+
)

examples/push-image/go.sum

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
github.com/containerd/stargz-snapshotter/estargz v0.18.2 h1:yXkZFYIzz3eoLwlTUZKz2iQ4MrckBxJjkmD16ynUTrw=
2+
github.com/containerd/stargz-snapshotter/estargz v0.18.2/go.mod h1:XyVU5tcJ3PRpkA9XS2T5us6Eg35yM0214Y+wvrZTBrY=
3+
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
4+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
5+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6+
github.com/docker/cli v29.4.0+incompatible h1:+IjXULMetlvWJiuSI0Nbor36lcJ5BTcVpUmB21KBoVM=
7+
github.com/docker/cli v29.4.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
8+
github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8=
9+
github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo=
10+
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
11+
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
12+
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
13+
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
14+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
15+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
16+
github.com/google/go-containerregistry v0.21.5 h1:KTJG9Pn/jC0VdZR6ctV3/jcN+q6/Iqlx0sTVz3ywZlM=
17+
github.com/google/go-containerregistry v0.21.5/go.mod h1:ySvMuiWg+dOsRW0Hw8GYwfMwBlNRTmpYBFJPlkco5zU=
18+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
19+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
20+
github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE=
21+
github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
22+
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
23+
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
24+
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
25+
github.com/klauspost/crc32 v1.3.0 h1:sSmTt3gUt81RP655XGZPElI0PelVTZ6YwCRnPSupoFM=
26+
github.com/klauspost/crc32 v1.3.0/go.mod h1:D7kQaZhnkX/Y0tstFGf8VUzv2UofNGqCjnC3zdHB0Hw=
27+
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
28+
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
29+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
30+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
31+
github.com/minio/crc64nvme v1.1.1 h1:8dwx/Pz49suywbO+auHCBpCtlW1OfpcLN7wYgVR6wAI=
32+
github.com/minio/crc64nvme v1.1.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg=
33+
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
34+
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
35+
github.com/minio/minio-go/v7 v7.0.100 h1:ShkWi8Tyj9RtU57OQB2HIXKz4bFgtVib0bbT1sbtLI8=
36+
github.com/minio/minio-go/v7 v7.0.100/go.mod h1:EtGNKtlX20iL2yaYnxEigaIvj0G0GwSDnifnG8ClIdw=
37+
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
38+
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
39+
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
40+
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
41+
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
42+
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
43+
github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM=
44+
github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM=
45+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
46+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
47+
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
48+
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
49+
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
50+
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
51+
github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
52+
github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
53+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
54+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
55+
github.com/tinylib/msgp v1.6.4 h1:mOwYbyYDLPj35mkA2BjjYejgJk9BuHxDdvRnb6v2ZcQ=
56+
github.com/tinylib/msgp v1.6.4/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA=
57+
github.com/vbatts/tar-split v0.12.2 h1:w/Y6tjxpeiFMR47yzZPlPj/FcPLpXbTUi/9H7d3CPa4=
58+
github.com/vbatts/tar-split v0.12.2/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA=
59+
github.com/zeabur/stratus/v2 v2.1.2 h1:3e+4LA0tp5ZOObl6f4FCOaB2H1+Epc2ZjSB+/fR2lAs=
60+
github.com/zeabur/stratus/v2 v2.1.2/go.mod h1:MjMjfQ/Jbn5JM36mUbAfca6hPpb0cEYwR9bvweOx3/A=
61+
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
62+
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
63+
golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI=
64+
golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q=
65+
golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
66+
golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
67+
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
68+
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
69+
golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
70+
golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
71+
golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
72+
golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
73+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
74+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
75+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
76+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
77+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
78+
gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=
79+
gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=

examples/push-image/main.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// push-image pulls any image from a remote registry and pushes it to Stratus.
2+
//
3+
// Usage:
4+
//
5+
// push-image <source-image> <namespace/repo> <tag>
6+
//
7+
// Example:
8+
//
9+
// push-image ubuntu:22.04 library/ubuntu 22.04
10+
//
11+
// Configuration is read from environment variables (S3_ENDPOINT, S3_ACCESS_KEY_ID, etc.).
12+
package main
13+
14+
import (
15+
"context"
16+
"fmt"
17+
"os"
18+
"os/signal"
19+
"syscall"
20+
21+
"github.com/google/go-containerregistry/pkg/crane"
22+
"github.com/google/go-containerregistry/pkg/v1/empty"
23+
"github.com/google/go-containerregistry/pkg/v1/layout"
24+
25+
stratusconfig "github.com/zeabur/stratus/v2/pkg/config"
26+
stratuspush "github.com/zeabur/stratus/v2/pkg/push"
27+
stratusstorage "github.com/zeabur/stratus/v2/pkg/storage"
28+
)
29+
30+
func main() {
31+
if len(os.Args) != 4 {
32+
fmt.Fprintf(os.Stderr, "Usage: %s <source-image> <namespace/repo> <tag>\n", os.Args[0])
33+
fmt.Fprintf(os.Stderr, " Example: %s ubuntu:22.04 library/ubuntu 22.04\n", os.Args[0])
34+
os.Exit(1)
35+
}
36+
37+
srcRef := os.Args[1]
38+
imageName := os.Args[2]
39+
tag := os.Args[3]
40+
41+
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
42+
defer stop()
43+
44+
if err := run(ctx, srcRef, imageName, tag); err != nil {
45+
fmt.Fprintf(os.Stderr, "error: %v\n", err)
46+
os.Exit(1)
47+
}
48+
}
49+
50+
func run(ctx context.Context, srcRef, imageName, tag string) error {
51+
fmt.Fprintf(os.Stderr, "⬇️ Pulling %s...\n", srcRef)
52+
img, err := crane.Pull(srcRef, crane.WithContext(ctx))
53+
if err != nil {
54+
return fmt.Errorf("pull %s: %w", srcRef, err)
55+
}
56+
57+
tmpDir, err := os.MkdirTemp("", "stratus-push-*")
58+
if err != nil {
59+
return fmt.Errorf("create temp dir: %w", err)
60+
}
61+
defer os.RemoveAll(tmpDir)
62+
63+
lp, err := layout.Write(tmpDir, empty.Index)
64+
if err != nil {
65+
return fmt.Errorf("init oci layout: %w", err)
66+
}
67+
if err := lp.AppendImage(img); err != nil {
68+
return fmt.Errorf("write oci layout: %w", err)
69+
}
70+
71+
cfg := stratusconfig.Load()
72+
73+
storage, err := stratusstorage.MinioStorageFromConfig(cfg)
74+
if err != nil {
75+
return fmt.Errorf("create storage: %w", err)
76+
}
77+
78+
return stratuspush.PushOciLayout(
79+
ctx,
80+
storage,
81+
cfg.BucketName,
82+
os.DirFS(tmpDir),
83+
imageName,
84+
tag,
85+
stratuspush.WithLogOutput(os.Stderr),
86+
)
87+
}

go.mod

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.26.1
44

55
require (
66
github.com/gofiber/fiber/v3 v3.1.0
7+
github.com/google/go-containerregistry v0.21.5
78
github.com/minio/minio-go/v7 v7.0.100
89
github.com/samber/slog-fiber v1.22.1
910
golang.org/x/sync v0.20.0
@@ -12,6 +13,9 @@ require (
1213
require (
1314
github.com/andybalholm/brotli v1.2.1 // indirect
1415
github.com/cespare/xxhash/v2 v2.3.0 // indirect
16+
github.com/containerd/stargz-snapshotter/estargz v0.18.2 // indirect
17+
github.com/docker/cli v29.4.0+incompatible // indirect
18+
github.com/docker/docker-credential-helpers v0.9.3 // indirect
1519
github.com/dustin/go-humanize v1.0.1 // indirect
1620
github.com/go-ini/ini v1.67.0 // indirect
1721
github.com/gofiber/schema v1.7.1 // indirect
@@ -25,12 +29,17 @@ require (
2529
github.com/mattn/go-isatty v0.0.21 // indirect
2630
github.com/minio/crc64nvme v1.1.1 // indirect
2731
github.com/minio/md5-simd v1.1.2 // indirect
32+
github.com/mitchellh/go-homedir v1.1.0 // indirect
33+
github.com/opencontainers/go-digest v1.0.0 // indirect
34+
github.com/opencontainers/image-spec v1.1.1 // indirect
2835
github.com/philhofer/fwd v1.2.0 // indirect
2936
github.com/rogpeppe/go-internal v1.14.1 // indirect
3037
github.com/rs/xid v1.6.0 // indirect
38+
github.com/sirupsen/logrus v1.9.4 // indirect
3139
github.com/tinylib/msgp v1.6.4 // indirect
3240
github.com/valyala/bytebufferpool v1.0.0 // indirect
3341
github.com/valyala/fasthttp v1.70.0 // indirect
42+
github.com/vbatts/tar-split v0.12.2 // indirect
3443
go.opentelemetry.io/otel v1.43.0 // indirect
3544
go.opentelemetry.io/otel/trace v1.43.0 // indirect
3645
go.yaml.in/yaml/v3 v3.0.4 // indirect
@@ -39,4 +48,5 @@ require (
3948
golang.org/x/sys v0.43.0 // indirect
4049
golang.org/x/text v0.36.0 // indirect
4150
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
51+
gotest.tools/v3 v3.5.2 // indirect
4252
)

0 commit comments

Comments
 (0)