func (b *BashShell) fullProjectDir(info common.ShellScriptInfo) string { projectDir := info.Build.FullProjectDir() return helpers.ToSlash(projectDir) }
func (b *BashShell) GenerateScript(info common.ShellScriptInfo) (*common.ShellScript, error) { var buffer bytes.Buffer w := bufio.NewWriter(&buffer) build := info.Build projectDir := build.FullProjectDir() projectDir = helpers.ToSlash(projectDir) gitDir := filepath.Join(projectDir, ".git") projectScript := helpers.ShellEscape(build.FullProjectDir() + ".sh") io.WriteString(w, "#!/usr/bin/env bash\n") io.WriteString(w, "\n") io.WriteString(w, "set -eo pipefail\n") io.WriteString(w, "\n") if len(build.Hostname) != 0 { io.WriteString(w, fmt.Sprintf("echo Running on $(hostname) via %s...", helpers.ShellEscape(build.Hostname))) } else { io.WriteString(w, "echo Running on $(hostname)...\n") } io.WriteString(w, "\n") io.WriteString(w, "echo\n") // Set env variables from build script for _, keyValue := range b.GetVariables(build, projectDir, info.Environment) { io.WriteString(w, "export "+helpers.ShellEscape(keyValue)+"\n") } io.WriteString(w, "\n") io.WriteString(w, "# save script that is read from to file and execute script file on remote server\n") io.WriteString(w, fmt.Sprintf("mkdir -p %s\n", helpers.ShellEscape(projectDir))) io.WriteString(w, fmt.Sprintf("cat > %s; source %s\n", projectScript, projectScript)) io.WriteString(w, "\n") if build.AllowGitFetch { b.writeFetchCmd(w, build, helpers.ShellEscape(projectDir), helpers.ShellEscape(gitDir)) } else { b.writeCloneCmd(w, build, helpers.ShellEscape(projectDir)) } b.writeCheckoutCmd(w, build) io.WriteString(w, "\n") io.WriteString(w, "echo\n") io.WriteString(w, "\n") commands := build.Commands commands = strings.TrimSpace(commands) for _, command := range strings.Split(commands, "\n") { command = strings.TrimSpace(command) if !helpers.BoolOrDefault(build.Runner.DisableVerbose, false) { if command != "" { b.echoColored(w, "$ "+command) } else { io.WriteString(w, "echo\n") } } io.WriteString(w, command+"\n") } io.WriteString(w, "\n") w.Flush() script := common.ShellScript{ Script: buffer.String(), Environment: b.GetVariables(build, projectDir, info.Environment), } // su if info.User != nil { script.Command = "su" if info.Type == common.LoginShell { script.Arguments = []string{"--shell", "/bin/bash", "--login", *info.User} } else { script.Arguments = []string{"--shell", "/bin/bash", *info.User} } } else { script.Command = "bash" if info.Type == common.LoginShell { script.Arguments = []string{"--login"} } } return &script, nil }
func (b *Build) FullProjectDir() string { return helpers.ToSlash(b.BuildDir) }
func (b *BashShell) GenerateScript(build *common.Build, shellType common.ShellType) (*common.ShellScript, error) { var buffer bytes.Buffer w := bufio.NewWriter(&buffer) projectDir := build.FullProjectDir() projectDir = helpers.ToSlash(projectDir) io.WriteString(w, "#!/usr/bin/env bash\n") io.WriteString(w, "\n") if len(build.Hostname) != 0 { io.WriteString(w, fmt.Sprintf("echo Running on $(hostname) via %s...\n", helpers.ShellEscape(build.Hostname))) } else { io.WriteString(w, "echo Running on $(hostname)...\n") } io.WriteString(w, "\n") io.WriteString(w, "set -eo pipefail\n") io.WriteString(w, "\n") if build.AllowGitFetch { b.writeFetchCmd(w, build, helpers.ShellEscape(projectDir)) } else { b.writeCloneCmd(w, build, helpers.ShellEscape(projectDir)) } b.writeCheckoutCmd(w, build) io.WriteString(w, "\n") if !helpers.BoolOrDefault(build.Runner.DisableVerbose, false) { io.WriteString(w, "set -v\n") io.WriteString(w, "\n") } commands := build.Commands commands = strings.Replace(commands, "\r\n", "\n", -1) io.WriteString(w, commands) w.Flush() env := []string{ fmt.Sprintf("CI_BUILD_REF=%s", build.Sha), fmt.Sprintf("CI_BUILD_BEFORE_SHA=%s", build.BeforeSha), fmt.Sprintf("CI_BUILD_REF_NAME=%s", build.RefName), fmt.Sprintf("CI_BUILD_ID=%d", build.ID), fmt.Sprintf("CI_BUILD_REPO=%s", build.RepoURL), fmt.Sprintf("CI_PROJECT_ID=%d", build.ProjectID), fmt.Sprintf("CI_PROJECT_DIR=%s", projectDir), "CI=true", "CI_SERVER=yes", "CI_SERVER_NAME=GitLab CI", "CI_SERVER_VERSION=", "CI_SERVER_REVISION=", "GITLAB_CI=true", } script := common.ShellScript{ Environment: env, Script: buffer.Bytes(), Command: "bash", } if shellType == common.LoginShell { script.Arguments = []string{"--login"} } return &script, nil }