/
rubyscript.go
79 lines (64 loc) · 1.97 KB
/
rubyscript.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package ios
import (
"errors"
"path"
"os"
"github.com/bitrise-io/go-utils/command"
"github.com/bitrise-io/go-utils/errorutil"
"github.com/bitrise-io/go-utils/fileutil"
"github.com/bitrise-io/go-utils/log"
"github.com/bitrise-io/go-utils/pathutil"
)
func runRubyScriptForOutput(scriptContent, gemfileContent string, withEnvs []string) (string, error) {
tmpDir, err := pathutil.NormalizedOSTempDirPath("__bitrise-init__")
if err != nil {
return "", err
}
defer func() {
if err := os.RemoveAll(tmpDir); err != nil {
log.TErrorf("Failed to remove tmp dir (%s), error: %s", tmpDir, err)
}
}()
// Write Gemfile to file and install
if gemfileContent != "" {
gemfilePth := path.Join(tmpDir, "Gemfile")
if err := fileutil.WriteStringToFile(gemfilePth, gemfileContent); err != nil {
return "", err
}
cmd := command.New("bundle", "install")
cmd.SetDir(tmpDir)
withEnvs = append(withEnvs, "BUNDLE_GEMFILE="+gemfilePth)
cmd.AppendEnvs(withEnvs...)
if out, err := cmd.RunAndReturnTrimmedCombinedOutput(); err != nil {
if errorutil.IsExitStatusError(err) {
return "", errors.New(out)
}
return "", err
}
}
// Write script to file and run
rubyScriptPth := path.Join(tmpDir, "script.rb")
if err := fileutil.WriteStringToFile(rubyScriptPth, scriptContent); err != nil {
return "", err
}
var cmd *command.Model
if gemfileContent != "" {
cmd = command.New("bundle", "exec", "ruby", rubyScriptPth)
} else {
cmd = command.New("ruby", rubyScriptPth)
}
// Set the temp dir as working dir, so the project defined `.ruby-version` does not cause ruby resolution to fail:
// [ ... ] ruby script failed, error: rbenv: version `2.7.4' is not installed (set by /[ ... ]/MyTestApp/.ruby-version)
cmd.SetDir(tmpDir)
if len(withEnvs) > 0 {
cmd.AppendEnvs(withEnvs...)
}
out, err := cmd.RunAndReturnTrimmedCombinedOutput()
if err != nil {
if errorutil.IsExitStatusError(err) {
return "", errors.New(out)
}
return "", err
}
return out, nil
}