func checkIsBitriseToolInstalled(toolname, minVersion string, isInstall bool) error { doInstall := func() error { installCmdLines := []string{ "curl -L https://github.com/bitrise-io/" + toolname + "/releases/download/" + minVersion + "/" + toolname + "-$(uname -s)-$(uname -m) > /usr/local/bin/" + toolname, "chmod +x /usr/local/bin/" + toolname, } officialGithub := "https://github.com/bitrise-io/" + toolname fmt.Println() log.Warnln("No supported " + toolname + " version found.") log.Infoln("You can find more information about "+toolname+" on it's official GitHub page:", officialGithub) fmt.Println() // Install log.Infoln("Installing...") fmt.Println(strings.Join(installCmdLines, "\n")) if err := bitrise.RunBashCommandLines(installCmdLines); err != nil { return err } // check again return checkIsBitriseToolInstalled(toolname, minVersion, false) } // check whether installed progInstallPth, err := CheckProgramInstalledPath(toolname) if err != nil { if !isInstall { return err } return doInstall() } verStr, err := bitrise.RunCommandAndReturnStdout(toolname, "-version") if err != nil { log.Infoln("") return errors.New("Failed to get version") } // version check isVersionOk, err := bitrise.IsVersionGreaterOrEqual(verStr, minVersion) if err != nil { log.Error("Failed to validate installed version") return err } if !isVersionOk { log.Warn("Installed "+toolname+" found, but not a supported version: ", verStr) if !isInstall { return errors.New("Failed to install required version.") } log.Warn("Updating...") return doInstall() } log.Infoln(" * "+colorstring.Green("[OK]")+" "+toolname+" :", progInstallPth) log.Infoln(" version :", verStr) return nil }
// InstallWithBrewIfNeeded ... func InstallWithBrewIfNeeded(tool string) error { if err := chekWithBrewProgramInstalled(tool); err != nil { args := []string{"install", tool} if out, err := bitrise.RunCommandAndReturnCombinedStdoutAndStderr("brew", args...); err != nil { log.Infof("%s", out) return err } } log.Info(" * " + colorstring.Green("[OK] ") + "Dependency (" + tool + ") installed") return nil }
// CheckIsXcodeCLTInstalled ... func CheckIsXcodeCLTInstalled() error { progInstallPth, err := CheckProgramInstalledPath("xcodebuild") if err != nil { fmt.Println() log.Warn("It seems that the Xcode Command Line Tools are not installed on your system.") log.Infoln("You can install it by running the following command in your Terminal:") log.Infoln("xcode-select --install") log.Warn("Once the installation is finished you should call the bitrise setup again.") return err } xcodeSelectPth, err := bitrise.RunCommandAndReturnStdout("xcode-select", "-p") if err != nil { log.Infoln("") return errors.New("Failed to get Xcode path") } isFullXcodeAvailable := false verStr, err := bitrise.RunCommandAndReturnCombinedStdoutAndStderr("xcodebuild", "-version") if err != nil { // No full Xcode available, only the Command Line Tools // verStr is something like "xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance" isFullXcodeAvailable = false } else { // version OK - full Xcode available // we'll just format it a bit to fit into one line isFullXcodeAvailable = true verStr = strings.Join(strings.Split(verStr, "\n"), " | ") } log.Infoln(" * "+colorstring.Green("[OK]")+" xcodebuild path :", progInstallPth) if !isFullXcodeAvailable { log.Infoln(" version (xcodebuild) :", colorstring.Yellowf("%s", verStr)) } else { log.Infoln(" version (xcodebuild) :", verStr) } log.Infoln(" active Xcode (Command Line Tools) path (xcode-select --print-path) :", xcodeSelectPth) if !isFullXcodeAvailable { log.Warn(colorstring.Yellowf("%s", "No Xcode found, only the Xcode Command Line Tools are available!")) log.Warn(colorstring.Yellowf("%s", "Full Xcode is required to build, test and archive iOS apps!")) } return nil }
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() }
// CheckIsHomebrewInstalled ... func CheckIsHomebrewInstalled() error { brewRubyInstallCmdString := `$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"` officialSiteURL := "http://brew.sh/" progInstallPth, err := CheckProgramInstalledPath("brew") if err != nil { fmt.Println() log.Warn("It seems that Homebrew is not installed on your system.") log.Infoln("Homebrew (short: brew) is required in order to be able to auto-install all the bitrise dependencies.") log.Infoln("You should be able to install brew by copying this command and running it in your Terminal:") log.Infoln(brewRubyInstallCmdString) log.Infoln("You can find more information about Homebrew on it's official site at:", officialSiteURL) log.Warn("Once the installation of brew is finished you should call the bitrise setup again.") return err } verStr, err := bitrise.RunCommandAndReturnStdout("brew", "--version") if err != nil { log.Infoln("") return errors.New("Failed to get version") } log.Infoln(" * "+colorstring.Green("[OK]")+" Homebrew :", progInstallPth) log.Infoln(" version :", verStr) return nil }