func runStep(step stepmanModels.StepModel, stepIDData models.StepIDData, stepDir string, environments []envmanModels.EnvironmentItemModel, buildRunResults models.BuildRunResultsModel) (int, []envmanModels.EnvironmentItemModel, error) { log.Debugf("[BITRISE_CLI] - Try running step: %s (%s)", stepIDData.IDorURI, stepIDData.Version) // Check & Install Step Dependencies // [!] Make sure this happens BEFORE the Toolkit Bootstrap, // so that if a Toolkit requires/allows the use of additional dependencies // required for the step (e.g. a brew installed OpenSSH) it can be done // with a Toolkit+Deps if err := checkAndInstallStepDependencies(step); err != nil { return 1, []envmanModels.EnvironmentItemModel{}, fmt.Errorf("Failed to install Step dependency, error: %s", err) } // Collect step inputs if err := tools.EnvmanInitAtPath(configs.InputEnvstorePath); err != nil { return 1, []envmanModels.EnvironmentItemModel{}, fmt.Errorf("Failed to init envman for the Step, error: %s", err) } if err := bitrise.ExportEnvironmentsList(environments); err != nil { return 1, []envmanModels.EnvironmentItemModel{}, fmt.Errorf("Failed to export environment list for the Step, error: %s", err) } evaluatedInputs := []envmanModels.EnvironmentItemModel{} for _, input := range step.Inputs { key, value, err := input.GetKeyValuePair() if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } options, err := input.GetOptions() if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } if options.IsTemplate != nil && *options.IsTemplate { outStr, err := tools.EnvmanJSONPrint(configs.InputEnvstorePath) if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, fmt.Errorf("EnvmanJSONPrint failed, err: %s", err) } envList, err := envmanModels.NewEnvJSONList(outStr) if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, fmt.Errorf("CreateFromJSON failed, err: %s", err) } evaluatedValue, err := bitrise.EvaluateTemplateToString(value, configs.IsCIMode, configs.IsPullRequestMode, buildRunResults, envList) if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } input[key] = evaluatedValue } evaluatedInputs = append(evaluatedInputs, input) } environments = append(environments, evaluatedInputs...) if err := tools.EnvmanInitAtPath(configs.InputEnvstorePath); err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } if err := bitrise.ExportEnvironmentsList(environments); err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } // Run step bitriseSourceDir, err := getCurrentBitriseSourceDir(environments) if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } if bitriseSourceDir == "" { bitriseSourceDir = configs.CurrentDir } if exit, err := executeStep(step, stepIDData, stepDir, bitriseSourceDir); err != nil { stepOutputs, envErr := bitrise.CollectEnvironmentsFromFile(configs.OutputEnvstorePath) if envErr != nil { return 1, []envmanModels.EnvironmentItemModel{}, envErr } return exit, stepOutputs, err } stepOutputs, err := bitrise.CollectEnvironmentsFromFile(configs.OutputEnvstorePath) if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } log.Debugf("[BITRISE_CLI] - Step executed: %s (%s)", stepIDData.IDorURI, stepIDData.Version) return 0, stepOutputs, nil }
func runStep(step stepmanModels.StepModel, stepIDData models.StepIDData, stepDir string, environments []envmanModels.EnvironmentItemModel, buildRunResults models.BuildRunResultsModel) (int, []envmanModels.EnvironmentItemModel, error) { log.Debugf("[BITRISE_CLI] - Try running step: %s (%s)", stepIDData.IDorURI, stepIDData.Version) // Check & Install Step Dependencies if len(step.Dependencies) > 0 { log.Warnf("step.dependencies is deprecated... Use step.deps instead.") } if len(step.Deps.Brew) > 0 || len(step.Deps.AptGet) > 0 || len(step.Deps.CheckOnly) > 0 { // // New dependency handling for _, checkOnlyDep := range step.Deps.CheckOnly { if err := bitrise.DependencyTryCheckTool(checkOnlyDep.Name); err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } log.Infof(" * "+colorstring.Green("[OK]")+" Step dependency (%s) installed, available.", checkOnlyDep.Name) } switch runtime.GOOS { case "darwin": for _, brewDep := range step.Deps.Brew { if err := bitrise.InstallWithBrewIfNeeded(brewDep.Name, configs.IsCIMode); err != nil { log.Infof("Failed to install (%s) with brew", brewDep.Name) return 1, []envmanModels.EnvironmentItemModel{}, err } log.Infof(" * "+colorstring.Green("[OK]")+" Step dependency (%s) installed, available.", brewDep.Name) } case "linux": for _, aptGetDep := range step.Deps.AptGet { log.Infof("Start installing (%s) with apt-get", aptGetDep.Name) if err := bitrise.InstallWithAptGetIfNeeded(aptGetDep.Name, configs.IsCIMode); err != nil { log.Infof("Failed to install (%s) with apt-get", aptGetDep.Name) return 1, []envmanModels.EnvironmentItemModel{}, err } log.Infof(" * "+colorstring.Green("[OK]")+" Step dependency (%s) installed, available.", aptGetDep.Name) } default: return 1, []envmanModels.EnvironmentItemModel{}, errors.New("Unsupported os") } } else if len(step.Dependencies) > 0 { log.Info("Deprecated dependencies found") // // Deprecated dependency handling for _, dep := range step.Dependencies { isSkippedBecauseOfPlatform := false switch dep.Manager { case depManagerBrew: if runtime.GOOS == "darwin" { err := bitrise.InstallWithBrewIfNeeded(dep.Name, configs.IsCIMode) if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } } else { isSkippedBecauseOfPlatform = true } break case depManagerTryCheck: err := bitrise.DependencyTryCheckTool(dep.Name) if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } break default: return 1, []envmanModels.EnvironmentItemModel{}, errors.New("Not supported dependency (" + dep.Manager + ") (" + dep.Name + ")") } if isSkippedBecauseOfPlatform { log.Debugf(" * Dependency (%s) skipped, manager (%s) not supported on this platform (%s)", dep.Name, dep.Manager, runtime.GOOS) } else { log.Infof(" * "+colorstring.Green("[OK]")+" Step dependency (%s) installed, available.", dep.Name) } } } // Collect step inputs if err := tools.EnvmanInitAtPath(configs.InputEnvstorePath); err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } if err := bitrise.ExportEnvironmentsList(environments); err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } evaluatedInputs := []envmanModels.EnvironmentItemModel{} for _, input := range step.Inputs { key, value, err := input.GetKeyValuePair() if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } options, err := input.GetOptions() if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } if options.IsTemplate != nil && *options.IsTemplate { outStr, err := tools.EnvmanJSONPrint(configs.InputEnvstorePath) if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, fmt.Errorf("EnvmanJSONPrint failed, err: %s", err) } envList, err := envmanModels.NewEnvJSONList(outStr) if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, fmt.Errorf("CreateFromJSON failed, err: %s", err) } evaluatedValue, err := bitrise.EvaluateTemplateToString(value, configs.IsCIMode, configs.IsPullRequestMode, buildRunResults, envList) if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } input[key] = evaluatedValue } evaluatedInputs = append(evaluatedInputs, input) } environments = append(environments, evaluatedInputs...) if err := tools.EnvmanInitAtPath(configs.InputEnvstorePath); err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } if err := bitrise.ExportEnvironmentsList(environments); err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } // Run step stepCmd := filepath.Join(stepDir, "step.sh") cmd := []string{"bash", stepCmd} bitriseSourceDir, err := getCurrentBitriseSourceDir(environments) if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } if bitriseSourceDir == "" { bitriseSourceDir = configs.CurrentDir } if exit, err := tools.EnvmanRun(configs.InputEnvstorePath, bitriseSourceDir, cmd); err != nil { stepOutputs, envErr := bitrise.CollectEnvironmentsFromFile(configs.OutputEnvstorePath) if envErr != nil { return 1, []envmanModels.EnvironmentItemModel{}, envErr } return exit, stepOutputs, err } stepOutputs, err := bitrise.CollectEnvironmentsFromFile(configs.OutputEnvstorePath) if err != nil { return 1, []envmanModels.EnvironmentItemModel{}, err } log.Debugf("[BITRISE_CLI] - Step executed: %s (%s)", stepIDData.IDorURI, stepIDData.Version) return 0, stepOutputs, nil }