cmd/generateworkflow.go (86 lines of code) (raw):
package cmd
import (
"fmt"
"strings"
"github.com/manifoldco/promptui"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/Azure/draft/pkg/cmdhelpers"
"github.com/Azure/draft/pkg/handlers"
"github.com/Azure/draft/pkg/prompts"
"github.com/Azure/draft/pkg/templatewriter"
"github.com/Azure/draft/pkg/templatewriter/writers"
)
type generateWorkflowCmd struct {
dest string
deployType string
flagVariables []string
templateWriter templatewriter.TemplateWriter
}
func newGenerateWorkflowCmd() *cobra.Command {
gwCmd := &generateWorkflowCmd{}
gwCmd.dest = ""
var cmd = &cobra.Command{
Use: "generate-workflow [flags]",
Short: "Generates a Github workflow for automatic build and deploy to AKS",
Long: `This command will generate a Github workflow to build and deploy an application containerized
with draft on AKS. This command assumes the 'setup-gh' command has been run properly.`,
RunE: func(cmd *cobra.Command, args []string) error {
log.Info("--> Generating Github workflow")
if err := gwCmd.generateWorkflows(); err != nil {
return err
}
log.Info("Draft has successfully generated a Github workflow for your project 😃")
return nil
},
}
f := cmd.Flags()
f.StringVarP(&gwCmd.dest, "destination", "d", currentDirDefaultFlagValue, "specify the path to the project directory")
f.StringVarP(&gwCmd.deployType, "deploy-type", "", "", "specify the k8s deployment type (helm, kustomize, manifests)")
f.StringArrayVarP(&gwCmd.flagVariables, "variable", "", []string{}, "pass template variables (e.g. --variable CLUSTERNAME=testCluster --variable DOCKERFILE=./Dockerfile)")
gwCmd.templateWriter = &writers.LocalFSWriter{}
return cmd
}
func init() {
rootCmd.AddCommand(newGenerateWorkflowCmd())
}
func (gwc *generateWorkflowCmd) generateWorkflows() error {
var err error
flagVariablesMap = flagVariablesToMap(gwc.flagVariables)
if gwc.deployType == "" {
selection := &promptui.Select{
Label: "Select k8s Deployment Type",
Items: []string{"helm", "kustomize", "manifests"},
}
_, gwc.deployType, err = selection.Run()
if err != nil {
return err
}
}
t, err := handlers.GetTemplate(fmt.Sprintf("github-workflow-%s", gwc.deployType), "", gwc.dest, gwc.templateWriter)
if err != nil {
return fmt.Errorf("failed to get template: %e", err)
}
if t == nil {
return fmt.Errorf("template is nil")
}
t.Config.VariableMapToDraftConfig(flagVariablesMap)
if err = prompts.RunPromptsFromConfigWithSkips(t.Config); err != nil {
return err
}
if err := cmdhelpers.UpdateProductionDeployments(gwc.deployType, gwc.dest, t.Config, gwc.templateWriter); err != nil {
return fmt.Errorf("update production deployments: %w", err)
}
return t.Generate()
}
func flagVariablesToMap(flagVariables []string) map[string]string {
flagVariablesMap := make(map[string]string)
for _, flagVar := range flagVariables {
flagVarName, flagVarValue, ok := strings.Cut(flagVar, "=")
if !ok {
log.Fatalf("invalid variable format: %s", flagVar)
}
flagVariablesMap[flagVarName] = flagVarValue
}
return flagVariablesMap
}