package build import ( "context" "edge-infra.dev/pkg/f8n/warehouse/release/cmd/internal" "edge-infra.dev/pkg/lib/cli/rags" "edge-infra.dev/pkg/lib/cli/sink" ) func New() *sink.Command { var ( releaser = &internal.Releaser{} destinationRegistry string destinationRepo string configPath string pushFlag bool outputJSON bool ) cmd := &sink.Command{ Use: "build [flags]", Short: "build a Release OCI artifact", Extensions: []sink.Extension{releaser}, Flags: []*rags.Rag{ { Name: "dest-registry", Usage: "destination registry to push Release artifact", Value: &rags.String{Var: &destinationRegistry}, }, { Name: "dest-repo", Usage: "destination repo to push Release artifact", Value: &rags.String{Var: &destinationRepo}, }, { Name: "push", Short: "p", Usage: "flag to push artifact to destination registry", Value: &rags.Bool{Var: &pushFlag}, }, { Name: "ojson", Usage: "output Release artifact JSON", Value: &rags.Bool{Var: &outputJSON}, }, // Shared config flag used in Releaser creation internal.ConfigFlag(configPath), }, Exec: func(ctx context.Context, r sink.Run) error { rel, err := releaser.BuildRelease(ctx) if err != nil { return err } relDigest, err := rel.Digest() if err != nil { return err } r.Log.Info("built release", "digest", relDigest.Hex[:9]) if pushFlag { r.Log.Info("push is set", "destination repo", releaser.DestinationRepository) err = releaser.Push(ctx, rel) if err != nil { return err } r.Log.Info("push successful") } if outputJSON { relBytes, err := rel.RawManifest() if err != nil { return err } if _, err = r.Out().Write(relBytes); err != nil { return err } } return nil }, } return cmd }