Skip to content

Commit

Permalink
packer_test: add build customisation capabilities
Browse files Browse the repository at this point in the history
When building a plugin, we may want some customisation capabilities
beyond changing the version/pre-release/metadata, and instead run
commands or change files on the filesystem.

To do so, we introduce functions under the BuildCustomisation type,
which have two responsabilities: changing the current state of the
plugin's directory, and cleaning up afterwards.
These customisations are passed as parameters to the BuildSimplePlugin
function, and are called one-by-one, deferring their cleanup after the
build process is finished.

A first implementation of such a customisation is added with this
commit, in order to change the version of a module that the plugin
depends on, which we'll use to change the version of the plugin SDK in
order to test how Packer behaves with different versions of the SDK for
a single plugin.
  • Loading branch information
lbajolet-hashicorp committed Aug 13, 2024
1 parent 782da90 commit 571e6c8
Showing 1 changed file with 59 additions and 1 deletion.
60 changes: 59 additions & 1 deletion packer_test/lib/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,56 @@ func ExpectedInstalledName(versionStr string) string {
runtime.GOOS, runtime.GOARCH, ext)
}

// BuildCustomisation is a function that allows you to change things on a plugin's
// local files, with a way to rollback those changes after the fact.
//
// The function is meant to take a path parameter to the directory for the plugin,
// and returns a function that unravels those changes once the build process is done.
type BuildCustomisation func(string) (error, func())

const SDKModule = "github.com/hashicorp/packer-plugin-sdk"

// UseDependency invokes go get and go mod tidy to update a package required
// by the plugin, and use it to build the plugin with that change.
func UseDependency(remoteModule, ref string) BuildCustomisation {
return func(path string) (error, func()) {
modPath := filepath.Join(path, "go.mod")

stat, err := os.Stat(modPath)
if err != nil {
return fmt.Errorf("cannot stat mod file %q: %s", modPath, err), nil
}

// Save old go.mod file from dir
oldGoMod, err := os.ReadFile(modPath)
if err != nil {
return fmt.Errorf("failed to read current mod file %q: %s", modPath, err), nil
}

modSpec := fmt.Sprintf("%s@%s", remoteModule, ref)
cmd := exec.Command("go", "get", modSpec)
cmd.Dir = path
err = cmd.Run()
if err != nil {
return fmt.Errorf("failed to run go get %s: %s", modSpec, err), nil
}

cmd = exec.Command("go", "mod", "tidy")
cmd.Dir = path
err = cmd.Run()
if err != nil {
return fmt.Errorf("failed to run go mod tidy: %s", err), nil
}

return nil, func() {
os.WriteFile(modPath, oldGoMod, stat.Mode())
cmd := exec.Command("go", "mod", "tidy")
cmd.Dir = path
cmd.Run()
}
}
}

// BuildSimplePlugin creates a plugin that essentially does nothing.
//
// The plugin's code is contained in a subdirectory of this, and lets us
Expand All @@ -100,7 +150,7 @@ func ExpectedInstalledName(versionStr string) string {
//
// The path to the plugin is returned, it won't be removed automatically
// though, deletion is the caller's responsibility.
func (ts *PackerTestSuite) BuildSimplePlugin(versionString string, t *testing.T) string {
func (ts *PackerTestSuite) BuildSimplePlugin(versionString string, t *testing.T, customisations ...BuildCustomisation) string {
// Only build plugin binary if not already done beforehand
path, ok := ts.LoadPluginVersion(versionString)
if ok {
Expand All @@ -117,6 +167,14 @@ func (ts *PackerTestSuite) BuildSimplePlugin(versionString string, t *testing.T)
}

testerPluginDir := filepath.Join(testDir, "plugin_tester")
for _, custom := range customisations {
err, cleanup := custom(testerPluginDir)
if err != nil {
t.Fatalf("failed to prepare plugin workdir: %s", err)
}
defer cleanup()
}

outBin := filepath.Join(ts.pluginsDirectory, BinaryName(v))

compileCommand := exec.Command("go", "build", "-C", testerPluginDir, "-o", outBin, "-ldflags", LDFlags(v), ".")
Expand Down

0 comments on commit 571e6c8

Please sign in to comment.