-
Notifications
You must be signed in to change notification settings - Fork 21
/
plugin.go
175 lines (148 loc) · 7 KB
/
plugin.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
// Copyright 2023 VMware, Inc. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package main
import (
"fmt"
"github.com/pkg/errors"
"github.com/spf13/cobra"
"github.com/vmware-tanzu/tanzu-cli/cmd/plugin/builder/command"
"github.com/vmware-tanzu/tanzu-cli/cmd/plugin/builder/crane"
"github.com/vmware-tanzu/tanzu-cli/cmd/plugin/builder/plugin"
"github.com/vmware-tanzu/tanzu-cli/pkg/registry"
)
// NewPluginCmd creates a new command for plugin operations.
func NewPluginCmd() *cobra.Command {
var pluginCmd = &cobra.Command{
Use: "plugin",
Short: "Plugin Operations",
}
pluginCmd.AddCommand(
newPluginBuildCmd(),
newPluginBuildPackageCmd(),
newPluginPublishPackageCmd(),
)
return pluginCmd
}
type pluginBuildFlags struct {
PluginDir string
ArtifactDir string
LDFlags string
OSArch []string
Version string
Match string
PluginScopeAssociationFile string
GoFlags string
DebugSymbols bool
}
type pluginBuildPackageFlags struct {
BinaryArtifactDir string
PackageArtifactDir string
localOCIRepository string
}
type pluginPublishPackageFlags struct {
PackageArtifactDir string
Repository string
Publisher string
Vendor string
DryRun bool
}
func newPluginBuildCmd() *cobra.Command {
var pbFlags = &pluginBuildFlags{}
var pluginBuildCmd = &cobra.Command{
Use: "build",
Short: "Build plugins",
SilenceUsage: true,
Example: `
# Build all plugins under 'cmd/plugin' directory for local host os and arch
tanzu builder plugin build --path ./cmd/plugin --version v0.0.2 --os-arch local
# Build all plugins under 'cmd/plugin' directory for os-arch 'darwin_amd64', 'linux_amd64', 'windows_amd64'
tanzu builder plugin build --path ./cmd/plugin --version v0.0.2 --os-arch darwin_amd64 --os-arch linux_amd64 --os-arch windows_amd64
# Build only foo plugin under 'cmd/plugin' directory for all supported os-arch
tanzu builder plugin build --path ./cmd/plugin --version v0.0.2 --os-arch all --match foo`,
RunE: func(cmd *cobra.Command, args []string) error {
compileArgs := &command.PluginCompileArgs{
Match: pbFlags.Match,
TargetArch: pbFlags.OSArch,
SourcePath: pbFlags.PluginDir,
ArtifactsDir: pbFlags.ArtifactDir,
LDFlags: pbFlags.LDFlags,
Version: pbFlags.Version,
PluginScopeAssociationFile: pbFlags.PluginScopeAssociationFile,
GroupByOSArch: true,
GoFlags: pbFlags.GoFlags,
DebugSymbols: pbFlags.DebugSymbols,
}
return command.Compile(compileArgs)
},
}
pluginBuildCmd.Flags().StringVarP(&pbFlags.PluginDir, "path", "", "./cmd/plugin", "path of plugin directory")
pluginBuildCmd.Flags().StringVarP(&pbFlags.ArtifactDir, "binary-artifacts", "", "./artifacts", "path to output artifacts directory")
pluginBuildCmd.Flags().StringVarP(&pbFlags.LDFlags, "ldflags", "", "", "ldflags to set on build")
pluginBuildCmd.Flags().StringArrayVarP(&pbFlags.OSArch, "os-arch", "", []string{"all"}, "compile for specific os-arch, use 'local' for host os, use '<os>_<arch>' for specific")
pluginBuildCmd.Flags().StringVarP(&pbFlags.Version, "version", "v", "", "version of the plugins")
pluginBuildCmd.Flags().StringVarP(&pbFlags.Match, "match", "", "*", "match a plugin name to build, supports globbing")
pluginBuildCmd.Flags().StringVarP(&pbFlags.PluginScopeAssociationFile, "plugin-scope-association-file", "", "", "file specifying plugin scope association")
pluginBuildCmd.Flags().StringVarP(&pbFlags.GoFlags, "goflags", "", "", "goflags to set on build")
pluginBuildCmd.Flags().BoolVarP(&pbFlags.DebugSymbols, "debug-symbols", "", false, "include debug symbols in the build")
_ = pluginBuildCmd.MarkFlagRequired("version")
return pluginBuildCmd
}
func newPluginBuildPackageCmd() *cobra.Command {
var pbpFlags = &pluginBuildPackageFlags{}
var pluginBuildPackageCmd = &cobra.Command{
Use: "build-package",
Short: "Build plugin packages",
Long: "Build plugin packages OCI image as tar.gz file that can be published to any repository",
SilenceUsage: true,
RunE: func(cmd *cobra.Command, args []string) error {
if pbpFlags.localOCIRepository == "" {
registryPort, shutdownServerFunc, err := registry.ServeLocalRegistry("")
if err != nil {
return errors.Wrap(err, "error while starting build registry server")
}
defer shutdownServerFunc()
pbpFlags.localOCIRepository = fmt.Sprintf("localhost:%s", registryPort)
}
bppArgs := &plugin.BuildPluginPackageOptions{
BinaryArtifactDir: pbpFlags.BinaryArtifactDir,
PackageArtifactDir: pbpFlags.PackageArtifactDir,
LocalOCIRegistry: pbpFlags.localOCIRepository,
CraneOptions: crane.NewCraneWrapper(),
}
return bppArgs.BuildPluginPackages()
},
}
pluginBuildPackageCmd.Flags().StringVarP(&pbpFlags.BinaryArtifactDir, "binary-artifacts", "", "./artifacts/plugins", "plugin binary artifact directory")
pluginBuildPackageCmd.Flags().StringVarP(&pbpFlags.PackageArtifactDir, "package-artifacts", "", "./artifacts/packages", "plugin package artifacts directory")
pluginBuildPackageCmd.Flags().StringVarP(&pbpFlags.localOCIRepository, "oci-registry", "", "", "local oci-registry to use for generating packages (optional)")
return pluginBuildPackageCmd
}
func newPluginPublishPackageCmd() *cobra.Command {
var pppFlags = &pluginPublishPackageFlags{}
var pluginBuildPackageCmd = &cobra.Command{
Use: "publish-package",
Short: "Publish plugin packages",
Long: "Publish plugin packages as OCI image to specified repository",
SilenceUsage: true,
RunE: func(cmd *cobra.Command, args []string) error {
bppArgs := &plugin.PublishPluginPackageOptions{
PackageArtifactDir: pppFlags.PackageArtifactDir,
Publisher: pppFlags.Publisher,
Vendor: pppFlags.Vendor,
Repository: pppFlags.Repository,
DryRun: pppFlags.DryRun,
CraneOptions: crane.NewCraneWrapper(),
}
return bppArgs.PublishPluginPackages()
},
}
pluginBuildPackageCmd.Flags().StringVarP(&pppFlags.PackageArtifactDir, "package-artifacts", "", "./artifacts/packages", "plugin package artifacts directory")
pluginBuildPackageCmd.Flags().StringVarP(&pppFlags.Repository, "repository", "", "", "repository to publish plugins")
pluginBuildPackageCmd.Flags().StringVarP(&pppFlags.Vendor, "vendor", "", "", "name of the vendor")
pluginBuildPackageCmd.Flags().StringVarP(&pppFlags.Publisher, "publisher", "", "", "name of the publisher")
pluginBuildPackageCmd.Flags().BoolVarP(&pppFlags.DryRun, "dry-run", "", false, "show commands without publishing plugin packages")
_ = pluginBuildPackageCmd.MarkFlagRequired("repository")
_ = pluginBuildPackageCmd.MarkFlagRequired("vendor")
_ = pluginBuildPackageCmd.MarkFlagRequired("publisher")
return pluginBuildPackageCmd
}