Skip to content

Commit

Permalink
feat: support go_build package (#2065)
Browse files Browse the repository at this point in the history
* feat: support go_build package

* fix: fix

* fix: fix compile errors

* fix: fix type

* fix: fix go_build
  • Loading branch information
suzuki-shunsuke committed Jul 29, 2023
1 parent c2b7efe commit 4704f70
Show file tree
Hide file tree
Showing 16 changed files with 169 additions and 24 deletions.
25 changes: 24 additions & 1 deletion pkg/config/package.go
Expand Up @@ -22,6 +22,11 @@ type Package struct {
}

func (cpkg *Package) GetExePath(rootDir string, file *registry.File, rt *runtime.Runtime) (string, error) {
pkgInfo := cpkg.PackageInfo
if pkgInfo.Type == "go_build" {
return filepath.Join(rootDir, "pkgs", pkgInfo.GetType(), "github.com", pkgInfo.RepoOwner, pkgInfo.RepoName, cpkg.Package.Version, "bin", file.Name), nil
}

pkgPath, err := cpkg.GetPkgPath(rootDir, rt)
if err != nil {
return "", err
Expand Down Expand Up @@ -75,6 +80,8 @@ func (cpkg *Package) GetPkgPath(rootDir string, rt *runtime.Runtime) (string, er
switch pkgInfo.Type {
case PkgInfoTypeGitHubArchive:
return filepath.Join(rootDir, "pkgs", pkgInfo.GetType(), "github.com", pkgInfo.RepoOwner, pkgInfo.RepoName, pkg.Version), nil
case PkgInfoTypeGoBuild:
return filepath.Join(rootDir, "pkgs", pkgInfo.GetType(), "github.com", pkgInfo.RepoOwner, pkgInfo.RepoName, pkg.Version, "src"), nil
case PkgInfoTypeGoInstall:
p, err := cpkg.RenderPath()
if err != nil {
Expand Down Expand Up @@ -209,6 +216,7 @@ const (
PkgInfoTypeGitHubArchive = "github_archive"
PkgInfoTypeHTTP = "http"
PkgInfoTypeGoInstall = "go_install"
PkgInfoTypeGoBuild = "go_build"
PkgInfoTypeCargo = "cargo"
)

Expand Down Expand Up @@ -249,7 +257,7 @@ type Param struct {
func (cpkg *Package) renderAsset(rt *runtime.Runtime) (string, error) {
pkgInfo := cpkg.PackageInfo
switch pkgInfo.Type {
case PkgInfoTypeGitHubArchive:
case PkgInfoTypeGitHubArchive, PkgInfoTypeGoBuild:
return "", nil
case PkgInfoTypeGoInstall:
if pkgInfo.Asset != nil {
Expand Down Expand Up @@ -328,3 +336,18 @@ func (cpkg *Package) semVer() string {
}
return strings.TrimPrefix(v, prefix)
}

func (cpkg *Package) RenderDir(file *registry.File, rt *runtime.Runtime) (string, error) {
pkgInfo := cpkg.PackageInfo
pkg := cpkg.Package
return template.Execute(file.Dir, map[string]interface{}{ //nolint:wrapcheck
"Version": pkg.Version,
"SemVer": cpkg.semVer(),
"GOOS": rt.GOOS,
"GOARCH": rt.GOARCH,
"OS": replace(rt.GOOS, pkgInfo.GetReplacements()),
"Arch": getArch(pkgInfo.GetRosetta2(), pkgInfo.GetReplacements(), rt),
"Format": pkgInfo.GetFormat(),
"FileName": file.Name,
})
}
16 changes: 14 additions & 2 deletions pkg/config/registry/package_info.go
Expand Up @@ -16,6 +16,7 @@ const (
PkgInfoTypeGitHubArchive = "github_archive"
PkgInfoTypeHTTP = "http"
PkgInfoTypeGoInstall = "go_install"
PkgInfoTypeGoBuild = "go_build"
PkgInfoTypeCargo = "cargo"
)

Expand Down Expand Up @@ -173,6 +174,17 @@ func (pkgInfo *PackageInfo) resetByPkgType(typ string) { //nolint:funlen
pkgInfo.SLSAProvenance = nil
pkgInfo.Format = ""
pkgInfo.Rosetta2 = nil
case PkgInfoTypeGoBuild:
pkgInfo.URL = nil
pkgInfo.Asset = nil
pkgInfo.Crate = nil
pkgInfo.Cargo = nil
pkgInfo.WindowsExt = ""
pkgInfo.CompleteWindowsExt = nil
pkgInfo.Cosign = nil
pkgInfo.SLSAProvenance = nil
pkgInfo.Format = ""
pkgInfo.Rosetta2 = nil
case PkgInfoTypeCargo:
pkgInfo.URL = nil
pkgInfo.Asset = nil
Expand Down Expand Up @@ -445,7 +457,7 @@ func (pkgInfo *PackageInfo) GetLink() string {
}

func (pkgInfo *PackageInfo) GetFormat() string {
if pkgInfo.Type == PkgInfoTypeGitHubArchive {
if pkgInfo.Type == PkgInfoTypeGitHubArchive || pkgInfo.Type == PkgInfoTypeGoBuild {
return "tar.gz"
}
return pkgInfo.Format
Expand Down Expand Up @@ -490,7 +502,7 @@ func (pkgInfo *PackageInfo) Validate() error { //nolint:cyclop
return errPkgNameIsRequired
}
switch pkgInfo.Type {
case PkgInfoTypeGitHubArchive:
case PkgInfoTypeGitHubArchive, PkgInfoTypeGoBuild:
if !pkgInfo.HasRepo() {
return errRepoRequired
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/controller/exec/exec_test.go
Expand Up @@ -152,7 +152,7 @@ packages:
whichCtrl := which.New(d.param, finder.NewConfigFinder(fs), reader.New(fs, d.param), registry.New(d.param, ghDownloader, fs, d.rt, &cosign.MockVerifier{}, &slsa.MockVerifier{}), d.rt, osEnv, fs, linker)
downloader := download.NewDownloader(nil, download.NewHTTPDownloader(http.DefaultClient))
executor := &exec.Mock{}
pkgInstaller := installpackage.New(d.param, downloader, d.rt, fs, linker, nil, &checksum.Calculator{}, unarchive.New(executor, fs), &policy.Checker{}, &cosign.MockVerifier{}, &slsa.MockVerifier{}, &installpackage.MockGoInstallInstaller{}, &installpackage.MockCargoPackageInstaller{})
pkgInstaller := installpackage.New(d.param, downloader, d.rt, fs, linker, nil, &checksum.Calculator{}, unarchive.New(executor, fs), &policy.Checker{}, &cosign.MockVerifier{}, &slsa.MockVerifier{}, &installpackage.MockGoInstallInstaller{}, &installpackage.MockGoBuildInstaller{}, &installpackage.MockCargoPackageInstaller{})
policyFinder := policy.NewConfigFinder(fs)
ctrl := execCtrl.New(d.param, pkgInstaller, whichCtrl, executor, osEnv, fs, policy.NewReader(fs, policy.NewValidator(d.param, fs), policyFinder, policy.NewConfigReader(fs)), policyFinder)
if err := ctrl.Exec(ctx, logE, d.param, d.exeName, d.args...); err != nil {
Expand Down Expand Up @@ -248,7 +248,7 @@ packages:
whichCtrl := which.New(d.param, finder.NewConfigFinder(fs), reader.New(fs, d.param), registry.New(d.param, ghDownloader, afero.NewOsFs(), d.rt, &cosign.MockVerifier{}, &slsa.MockVerifier{}), d.rt, osEnv, fs, linker)
downloader := download.NewDownloader(nil, download.NewHTTPDownloader(http.DefaultClient))
executor := &exec.Mock{}
pkgInstaller := installpackage.New(d.param, downloader, d.rt, fs, linker, nil, &checksum.Calculator{}, unarchive.New(executor, fs), &policy.Checker{}, &cosign.MockVerifier{}, &slsa.MockVerifier{}, &installpackage.MockGoInstallInstaller{}, &installpackage.MockCargoPackageInstaller{})
pkgInstaller := installpackage.New(d.param, downloader, d.rt, fs, linker, nil, &checksum.Calculator{}, unarchive.New(executor, fs), &policy.Checker{}, &cosign.MockVerifier{}, &slsa.MockVerifier{}, &installpackage.MockGoInstallInstaller{}, &installpackage.MockGoBuildInstaller{}, &installpackage.MockCargoPackageInstaller{})
ctrl := execCtrl.New(d.param, pkgInstaller, whichCtrl, executor, osEnv, fs, &policy.MockReader{}, policy.NewConfigFinder(fs))
b.ResetTimer()
for i := 0; i < b.N; i++ {
Expand Down
2 changes: 1 addition & 1 deletion pkg/controller/install/install_test.go
Expand Up @@ -103,7 +103,7 @@ packages:
}
downloader := download.NewDownloader(nil, download.NewHTTPDownloader(http.DefaultClient))
executor := &exec.Mock{}
pkgInstaller := installpackage.New(d.param, downloader, d.rt, fs, linker, nil, &checksum.Calculator{}, unarchive.New(executor, fs), &policy.Checker{}, &cosign.MockVerifier{}, &slsa.MockVerifier{}, &installpackage.MockGoInstallInstaller{}, &installpackage.MockCargoPackageInstaller{})
pkgInstaller := installpackage.New(d.param, downloader, d.rt, fs, linker, nil, &checksum.Calculator{}, unarchive.New(executor, fs), &policy.Checker{}, &cosign.MockVerifier{}, &slsa.MockVerifier{}, &installpackage.MockGoInstallInstaller{}, &installpackage.MockGoBuildInstaller{}, &installpackage.MockCargoPackageInstaller{})
policyFinder := policy.NewConfigFinder(fs)
policyReader := policy.NewReader(fs, &policy.MockValidator{}, policyFinder, policy.NewConfigReader(fs))
ctrl := install.New(d.param, finder.NewConfigFinder(fs), reader.New(fs, d.param), registry.New(d.param, registryDownloader, fs, d.rt, &cosign.MockVerifier{}, &slsa.MockVerifier{}), pkgInstaller, fs, d.rt, policyReader, policyFinder)
Expand Down
16 changes: 16 additions & 0 deletions pkg/controller/wire.go
Expand Up @@ -293,6 +293,10 @@ func InitializeInstallCommandController(ctx context.Context, param *config.Param
installpackage.NewGoInstallInstallerImpl,
wire.Bind(new(installpackage.GoInstallInstaller), new(*installpackage.GoInstallInstallerImpl)),
),
wire.NewSet(
installpackage.NewGoBuildInstallerImpl,
wire.Bind(new(installpackage.GoBuildInstaller), new(*installpackage.GoBuildInstallerImpl)),
),
wire.NewSet(
installpackage.NewCargoPackageInstallerImpl,
wire.Bind(new(installpackage.CargoPackageInstaller), new(*installpackage.CargoPackageInstallerImpl)),
Expand Down Expand Up @@ -456,6 +460,10 @@ func InitializeExecCommandController(ctx context.Context, param *config.Param, h
installpackage.NewGoInstallInstallerImpl,
wire.Bind(new(installpackage.GoInstallInstaller), new(*installpackage.GoInstallInstallerImpl)),
),
wire.NewSet(
installpackage.NewGoBuildInstallerImpl,
wire.Bind(new(installpackage.GoBuildInstaller), new(*installpackage.GoBuildInstallerImpl)),
),
wire.NewSet(
installpackage.NewCargoPackageInstallerImpl,
wire.Bind(new(installpackage.CargoPackageInstaller), new(*installpackage.CargoPackageInstallerImpl)),
Expand Down Expand Up @@ -524,6 +532,10 @@ func InitializeUpdateAquaCommandController(ctx context.Context, param *config.Pa
installpackage.NewGoInstallInstallerImpl,
wire.Bind(new(installpackage.GoInstallInstaller), new(*installpackage.GoInstallInstallerImpl)),
),
wire.NewSet(
installpackage.NewGoBuildInstallerImpl,
wire.Bind(new(installpackage.GoBuildInstaller), new(*installpackage.GoBuildInstallerImpl)),
),
wire.NewSet(
installpackage.NewCargoPackageInstallerImpl,
wire.Bind(new(installpackage.CargoPackageInstaller), new(*installpackage.CargoPackageInstallerImpl)),
Expand Down Expand Up @@ -638,6 +650,10 @@ func InitializeCopyCommandController(ctx context.Context, param *config.Param, h
installpackage.NewGoInstallInstallerImpl,
wire.Bind(new(installpackage.GoInstallInstaller), new(*installpackage.GoInstallInstallerImpl)),
),
wire.NewSet(
installpackage.NewGoBuildInstallerImpl,
wire.Bind(new(installpackage.GoBuildInstaller), new(*installpackage.GoBuildInstallerImpl)),
),
wire.NewSet(
installpackage.NewCargoPackageInstallerImpl,
wire.Bind(new(installpackage.CargoPackageInstaller), new(*installpackage.CargoPackageInstallerImpl)),
Expand Down
12 changes: 8 additions & 4 deletions pkg/controller/wire_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion pkg/download/util.go
Expand Up @@ -70,7 +70,8 @@ func ConvertPackageToFile(pkg *config.Package, assetName string, rt *runtime.Run
case config.PkgInfoTypeGitHubContent:
file.Path = assetName
return file, nil
case config.PkgInfoTypeGitHubArchive:
case config.PkgInfoTypeGitHubArchive, config.PkgInfoTypeGoBuild:
file.Type = config.PkgInfoTypeGitHubArchive
return file, nil
case config.PkgInfoTypeHTTP:
uS, err := pkg.RenderURL(rt)
Expand Down
4 changes: 4 additions & 0 deletions pkg/exec/exec.go
Expand Up @@ -24,6 +24,10 @@ func New() *Executor {
}
}

func (exe *Executor) ExecCommand(cmd *exec.Cmd) (int, error) {
return exe.exec(exe.command(cmd))
}

func (exe *Executor) Exec(ctx context.Context, exePath string, args ...string) (int, error) {
return exe.exec(exe.command(exec.CommandContext(ctx, exePath, args...)))
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/installpackage/aqua_test.go
Expand Up @@ -69,7 +69,7 @@ e922723678f493216c2398f3f23fb027c9a98808b49f6fce401ef82ee2c22b03 aqua_linux_arm
}
ctrl := installpackage.New(d.param, &download.Mock{
RC: io.NopCloser(strings.NewReader("xxx")),
}, d.rt, fs, domain.NewMockLinker(fs), d.checksumDownloader, d.checksumCalculator, &unarchive.MockUnarchiver{}, &policy.Checker{}, &cosign.MockVerifier{}, &slsa.MockVerifier{}, &installpackage.MockGoInstallInstaller{}, &installpackage.MockCargoPackageInstaller{})
}, d.rt, fs, domain.NewMockLinker(fs), d.checksumDownloader, d.checksumCalculator, &unarchive.MockUnarchiver{}, &policy.Checker{}, &cosign.MockVerifier{}, &slsa.MockVerifier{}, &installpackage.MockGoInstallInstaller{}, &installpackage.MockGoBuildInstaller{}, &installpackage.MockCargoPackageInstaller{})
if err := ctrl.InstallAqua(ctx, logE, d.version); err != nil {
if d.isErr {
return
Expand Down
38 changes: 38 additions & 0 deletions pkg/installpackage/go_build.go
@@ -0,0 +1,38 @@
package installpackage

import (
"context"
"fmt"
"os/exec"
)

type GoBuildInstaller interface {
Install(ctx context.Context, exePath, exeDir, src string) error
}

type MockGoBuildInstaller struct {
Err error
}

func (mock *MockGoBuildInstaller) Install(ctx context.Context, exePath, exeDir, src string) error {
return mock.Err
}

type GoBuildInstallerImpl struct {
exec Executor
}

func NewGoBuildInstallerImpl(exec Executor) *GoBuildInstallerImpl {
return &GoBuildInstallerImpl{
exec: exec,
}
}

func (inst *GoBuildInstallerImpl) Install(ctx context.Context, exePath, exeDir, src string) error {
cmd := exec.CommandContext(ctx, "go", "build", "-o", exePath, src)
cmd.Dir = exeDir
if _, err := inst.exec.ExecCommand(cmd); err != nil {
return fmt.Errorf("build a go package: %w", err)
}
return nil
}

0 comments on commit 4704f70

Please sign in to comment.