func printStepSummary(title string, resultCode int, duration time.Duration, exitCode int) { runTime := bitrise.TimeToFormattedSeconds(duration, " sec") content := fmt.Sprintf("%s | .... | %s", title, runTime) if resultCode == stepRunResultCodeFailed || resultCode == stepRunResultCodeFailedNotImportant { content = fmt.Sprintf("%s | .... | exit code: %d | %s", title, exitCode, runTime) } if len(content) > stepRunSummaryBoxMaxWidthChars { dif := len(content) - stepRunSummaryBoxMaxWidthChars title = title[0:(len(title) - dif)] content = fmt.Sprintf("%s | .... | %s", title, runTime) if resultCode == stepRunResultCodeFailed || resultCode == stepRunResultCodeFailedNotImportant { content = fmt.Sprintf("%s | .... | exit code: %d | %s", title, exitCode, runTime) } } sep := strings.Repeat("-", len(content)+2) log.Info(sep) switch resultCode { case stepRunResultCodeSuccess: runStateIcon := "✅ " content = fmt.Sprintf("%s | %s | %s", runStateIcon, colorstring.Green(title), runTime) break case stepRunResultCodeFailed: runStateIcon := "❌ " content = fmt.Sprintf("%s | %s | %s | exit code: %d", runStateIcon, colorstring.Red(title), runTime, exitCode) break case stepRunResultCodeFailedNotImportant: runStateIcon := "❌ " content = fmt.Sprintf("%s | %s | %s | exit code: %d", runStateIcon, colorstring.Yellow(title), runTime, exitCode) break case stepRunResultCodeSkipped, stepRunResultCodeSkippedWithRunIf: runStateIcon := "➡ " content = fmt.Sprintf("%s | %s | %s", runStateIcon, colorstring.White(title), runTime) break default: log.Error("Unkown result code") return } log.Infof("| " + content + " |") log.Info(sep) fmt.Println() }
func doInit(c *cli.Context) { PrintBitriseHeaderASCIIArt() bitriseConfigFileRelPath := "./" + DefaultBitriseConfigFileName bitriseSecretsFileRelPath := "./" + DefaultSecretsFileName if exists, err := pathutil.IsPathExists(bitriseConfigFileRelPath); err != nil { log.Fatalln("Error:", err) } else if exists { ask := fmt.Sprintf("A config file already exists at %s - do you want to overwrite it?", bitriseConfigFileRelPath) if val, err := goinp.AskForBool(ask); err != nil { log.Fatalln("Error:", err) } else if !val { log.Infoln("Init canceled, existing file won't be overwritten.") os.Exit(0) } } defaultExpand := true projectSettingsEnvs := []envmanModels.EnvironmentItemModel{} if val, err := goinp.AskForString("What's the BITRISE_PROJECT_TITLE?"); err != nil { log.Fatalln(err) } else { projectTitleEnv := envmanModels.EnvironmentItemModel{ "BITRISE_PROJECT_TITLE": val, "opts": envmanModels.EnvironmentItemOptionsModel{ IsExpand: &defaultExpand, }, } projectSettingsEnvs = append(projectSettingsEnvs, projectTitleEnv) } if val, err := goinp.AskForString("What's your primary development branch's name?"); err != nil { log.Fatalln(err) } else { devBranchEnv := envmanModels.EnvironmentItemModel{ "BITRISE_DEV_BRANCH": val, "opts": envmanModels.EnvironmentItemOptionsModel{ IsExpand: &defaultExpand, }, } projectSettingsEnvs = append(projectSettingsEnvs, devBranchEnv) } // TODO: // generate a couple of base steps // * timestamp gen // * bash script - hello world scriptStepTitle := "Hello Bitrise!" scriptStepContent := `#!/bin/bash echo "Welcome to Bitrise!"` bitriseConf := models.BitriseDataModel{ FormatVersion: c.App.Version, DefaultStepLibSource: defaultStepLibSource, App: models.AppModel{ Environments: projectSettingsEnvs, }, Workflows: map[string]models.WorkflowModel{ "primary": models.WorkflowModel{ Steps: []models.StepListItemModel{ models.StepListItemModel{ "script": stepmanModels.StepModel{ Title: &scriptStepTitle, Inputs: []envmanModels.EnvironmentItemModel{ envmanModels.EnvironmentItemModel{ "content": scriptStepContent, }, }, }, }, }, }, }, } if err := bitrise.SaveConfigToFile(bitriseConfigFileRelPath, bitriseConf); err != nil { log.Fatalln("Failed to init the bitrise config file:", err) } else { fmt.Println() fmt.Println("# NOTES about the " + DefaultBitriseConfigFileName + " config file:") fmt.Println() fmt.Println("We initialized a " + DefaultBitriseConfigFileName + " config file for you.") fmt.Println("If you're in this folder you can use this config file") fmt.Println(" with bitrise automatically, you don't have to") fmt.Println(" specify it's path.") fmt.Println() } if initialized, err := saveSecretsToFile(bitriseSecretsFileRelPath, defaultSecretsContent); err != nil { log.Fatalln("Failed to init the secrets file:", err) } else if initialized { fmt.Println() fmt.Println("# NOTES about the " + DefaultSecretsFileName + " secrets file:") fmt.Println() fmt.Println("We also created a " + DefaultSecretsFileName + " file") fmt.Println(" in this directory, to keep your passwords, absolute path configurations") fmt.Println(" and other secrets separate from your") fmt.Println(" main configuration file.") fmt.Println("This way you can safely commit and share your configuration file") fmt.Println(" and ignore this secrets file, so nobody else will") fmt.Println(" know about your secrets.") fmt.Println(colorstring.Yellow("You should NEVER commit this secrets file into your repository!!")) fmt.Println() } fmt.Println() fmt.Println("Hurray, you're good to go!") fmt.Println("You can simply run:") fmt.Println("-> bitrise run primary") fmt.Println("to test the sample configuration (which contains") fmt.Println("an example workflow called 'primary').") fmt.Println() fmt.Println("Once you tested this sample setup you can") fmt.Println(" open the " + DefaultBitriseConfigFileName + " config file,") fmt.Println(" modify it and then run a workflow with:") fmt.Println("-> bitrise run YOUR-WORKFLOW-NAME") }