Files
Kevin Minehart 13f4cf162e CI: move grafana-build into pkg/build (#105640)
* move grafana-build into pkg/build
2025-05-20 10:48:00 -05:00

74 lines
2.0 KiB
Go

package containers
import (
"context"
"fmt"
"net/url"
"path/filepath"
"strings"
"dagger.io/dagger"
"github.com/grafana/grafana/pkg/build/daggerbuild/cliutil"
)
type PackageInputOpts struct {
// Name is used when overriding the artifact that is being produced. This is used in very specific scenarios where
// the source package's name does not match the package's metadata name.
Name string
Packages []string
}
func PackageInputOptsFromFlags(c cliutil.CLIContext) *PackageInputOpts {
return &PackageInputOpts{
Name: c.String("name"),
Packages: c.StringSlice("package"),
}
}
// GetPackage uses the PackageInputOpts to get a Grafana package, either from the local filesystem (if the package is of type 'file://...')
// or Google Cloud Storage if the package is a 'gs://' URL.
func GetPackages(ctx context.Context, d *dagger.Client, packageOpts *PackageInputOpts, gcpOpts *GCPOpts) ([]*dagger.File, error) {
files := make([]*dagger.File, len(packageOpts.Packages))
for i, pkg := range packageOpts.Packages {
u, err := url.Parse(pkg)
if err != nil {
return nil, err
}
var file *dagger.File
switch u.Scheme {
case "file", "fs":
p := strings.TrimPrefix(u.String(), u.Scheme+"://")
f, err := getLocalPackage(ctx, d, p)
if err != nil {
return nil, err
}
file = f
case "gs":
f, err := getGCSPackage(ctx, d, gcpOpts, u.String())
if err != nil {
return nil, err
}
file = f
default:
return nil, fmt.Errorf("%w: %s", ErrorUnrecognizedScheme, u.Scheme)
}
files[i] = file
}
return files, nil
}
func getLocalPackage(ctx context.Context, d *dagger.Client, file string) (*dagger.File, error) {
// pending https://github.com/dagger/dagger/issues/4745
return d.Host().Directory(filepath.Dir(file)).File(filepath.Base(file)), nil
}
func getGCSPackage(ctx context.Context, d *dagger.Client, opts *GCPOpts, gcsURL string) (*dagger.File, error) {
auth := GCSAuth(d, opts)
return GCSDownloadFile(d, GoogleCloudImage, auth, gcsURL)
}