Packer plugin for Drone CI
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
3.3 KiB

package main
import (
"encoding/json"
"os"
"github.com/rs/zerolog/log"
"github.com/urfave/cli"
)
// Version set at compile-time
var (
Version string
BuildNum string
)
func main() {
app := cli.NewApp()
app.Name = "packer plugin"
app.Usage = "packer plugin"
app.Action = run
app.Flags = []cli.Flag{
cli.StringSliceFlag{
Name: "actions",
Usage: "a list of actions to have packer perform",
EnvVar: "PLUGIN_ACTIONS",
},
cli.StringFlag{
Name: "vars",
Usage: "a map of variables to pass to the Packer `build` commands. Each value is passed as a `<key>=<value>` option",
EnvVar: "PLUGIN_VARS",
},
cli.StringSliceFlag{
Name: "var_files",
Usage: "a list of var files to use. Each value is passed as -var-file=<value>",
EnvVar: "PLUGIN_VAR_FILES",
},
cli.StringSliceFlag{
Name: "except",
Usage: "validate or build all builds other than these",
EnvVar: "PLUGIN_EXCEPT",
},
cli.StringSliceFlag{
Name: "only",
Usage: "validate or build only the specified builds",
EnvVar: "PLUGIN_ONLY",
},
cli.StringFlag{
Name: "template",
Usage: "Will execute multiple builds in parallel as defined in the template",
EnvVar: "PLUGIN_TEMPLATE",
},
cli.StringFlag{
Name: "context",
Usage: "The context directory path to use for executing `packer` command, defaults to root of the git repo",
Value: ".",
EnvVar: "PLUGIN_CONTEXT",
},
cli.BoolFlag{
Name: "syntax_only",
Usage: "Only check syntax. Do not verify config of the template",
EnvVar: "PLUGIN_SYNTAX_ONLY",
},
cli.BoolFlag{
Name: "color",
Usage: "Disable color output (on by default)",
EnvVar: "PLUGIN_COLOR",
},
cli.BoolFlag{
Name: "debug",
Usage: "Debug mode enabled for builds",
7 years ago
EnvVar: "PLUGIN_DEBUG",
},
cli.BoolFlag{
Name: "parallel",
Usage: "Disable parallelization (on by default)",
EnvVar: "PLUGIN_PARALLEL",
},
cli.BoolFlag{
Name: "readable",
Usage: "Machine-readable output",
EnvVar: "PLUGIN_READABLE",
},
cli.BoolFlag{
Name: "force",
Usage: "Force a build to continue if artifacts exist, deletes existing artifacts",
EnvVar: "PLUGIN_FORCE",
},
}
app.Version = Version
if BuildNum != "" {
app.Version = app.Version + "+" + BuildNum
}
if err := app.Run(os.Args); err != nil {
log.Fatal().Err(err).Msg("can't start app")
}
}
func run(c *cli.Context) error {
var version string
if BuildNum != "" {
version = Version + "+" + BuildNum
} else {
version = Version
}
log.Info().Str("revision", version).Msg("Drone Packer Plugin Version")
var vars map[string]string
if c.String("vars") != "" {
if err := json.Unmarshal([]byte(c.String("vars")), &vars); err != nil {
log.Fatal().Err(err).Msg("json unmarshal")
}
}
plugin := Plugin{
Config: Config{
Actions: c.StringSlice("actions"),
Vars: vars,
Template: c.String("template"),
Context: c.String("context"),
VarFiles: c.StringSlice("var_files"),
Except: c.StringSlice("except"),
Only: c.StringSlice("only"),
SyntaxOnly: c.Bool("syntax_only"),
Color: c.Bool("color"),
Debug: c.Bool("debug"),
Parallel: c.Bool("parallel"),
Readable: c.Bool("readable"),
Force: c.Bool("force"),
},
}
return plugin.Exec()
}