-
Notifications
You must be signed in to change notification settings - Fork 122
/
Copy pathbuild-ruby
executable file
·168 lines (158 loc) · 3.49 KB
/
build-ruby
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#!/usr/bin/env bash
set -e
SELFDIR=`dirname "$0"`
SELFDIR=`cd "$SELFDIR" && pwd`
source "$SELFDIR/../shared/library.sh"
CPUCOUNT=`"$SELFDIR/internal/cpucount"`
RUBY_VERSIONS=(`cat "$SELFDIR/../RUBY_VERSIONS.txt"`)
OUTPUT_DIR=
IMAGE=
RUBY_VERSION=${RUBY_VERSIONS[0]}
CACHE_DIR=
CONCURRENCY=$CPUCOUNT
GEMFILE="$SELFDIR/../shared/gemfiles"
DEBUG_SHELL=none
SETUP_SOURCE=true
COMPILE=true
SANITY_CHECK_OUTPUT=true
GEMFILE_MOUNT=()
function usage()
{
echo "Usage: ./build-ruby [options] <OUTPUT_DIR>"
echo "Build Traveling Ruby binaries."
echo
echo "Options:"
echo " -i IMAGE Docker image to use (e.g. phusion/traveling-ruby-builder-x86_64:1.0)"
echo " -r VERSION Ruby version to build. Default: $RUBY_VERSION"
echo " -c DIR Cache directory to use"
echo
echo " -E Do not setup source"
echo " -C Do not compile Ruby"
echo " -G Do not install gems"
echo
echo " -j NUMBER Set build concurrency. Default: $CPUCOUNT"
echo " -g PATH Build gems as specified by the given Gemfile"
echo " -d Open a debugging shell before installing gems"
echo " -D Open a debugging shell after installing gems"
echo " -h Show this help"
}
function parse_options()
{
local OPTIND=1
local opt
while getopts "i:r:c:ECGj:g:dDh" opt; do
case "$opt" in
i)
IMAGE=$OPTARG
;;
r)
RUBY_VERSION=$OPTARG
;;
c)
CACHE_DIR=$OPTARG
;;
E)
SETUP_SOURCE=false
;;
C)
COMPILE=false
;;
G)
GEMFILE=
;;
j)
CONCURRENCY=$OPTARG
;;
g)
GEMFILE="$OPTARG"
;;
d)
DEBUG_SHELL=before
;;
D)
DEBUG_SHELL=after
;;
h)
usage
exit
;;
*)
return 1
;;
esac
done
(( OPTIND -= 1 )) || true
shift $OPTIND || true
OUTPUT_DIR="$1"
if [[ "$OUTPUT_DIR" = "" ]]; then
usage
exit 1
fi
if [[ ! -e "$OUTPUT_DIR" ]]; then
echo "ERROR: $OUTPUT_DIR doesn't exist."
exit 1
fi
if [[ "$IMAGE" = "" ]]; then
echo "ERROR: please specify a Docker image with -i."
exit 1
fi
if [[ "$CACHE_DIR" = "" ]]; then
echo "ERROR: please specify a cache directory with -c."
exit 1
fi
if [[ ! -e "$CACHE_DIR" ]]; then
echo "ERROR: $CACHE_DIR doesn't exist."
exit 1
fi
}
parse_options "$@"
OUTPUT_DIR=`cd "$OUTPUT_DIR" && pwd`
CACHE_DIR=`cd "$CACHE_DIR" && pwd`
if [[ "$GEMFILE" != "" ]]; then
GEMFILE="`absolute_path \"$GEMFILE\"`"
if [[ -d "$GEMFILE" ]]; then
for F in "$GEMFILE"/*/Gemfile; do
DIR="`dirname \"$F\"`"
DIR="`basename \"$DIR\"`"
GEMFILE_MOUNT+=(-v "$F:/gemfiles/$DIR/Gemfile:ro")
if [[ -e "$F.lock" ]]; then
GEMFILE_MOUNT+=(-v "$F.lock:/gemfiles/$DIR/Gemfile.lock:ro")
fi
done
else
GEMFILE_MOUNT=(-v "$GEMFILE:/gemfiles/default/Gemfile:ro")
if [[ -e "$GEMFILE.lock" ]]; then
GEMFILE_MOUNT+=(-v "$GEMFILE.lock:/gemfiles/default/Gemfile.lock:ro")
fi
fi
fi
if [[ "$DEBUG_SHELL" = none ]]; then
if tty -s; then
TTY_ARGS=(-ti)
else
TTY_ARGS=()
fi
else
TTY_ARGS=(-ti)
fi
exec docker run \
"${TTY_ARGS[@]}" \
--rm \
--init \
-v "$SELFDIR/internal:/system:ro" \
-v "$SELFDIR/../shared:/system_shared:ro" \
-v "$OUTPUT_DIR:/output" \
-v "$CACHE_DIR:/cache" \
"${GEMFILE_MOUNT[@]}" \
-e "APP_UID=`id -u`" \
-e "APP_GID=`id -g`" \
-e "BUNDLER_VERSION=`cat \"$SELFDIR/../BUNDLER_VERSION.txt\"`" \
-e "ARCHITECTURE=$ARCHITECTURE" \
-e "RUBY_VERSION=$RUBY_VERSION" \
-e "CONCURRENCY=$CONCURRENCY" \
-e "SETUP_SOURCE=$SETUP_SOURCE" \
-e "COMPILE=$COMPILE" \
-e "SANITY_CHECK_OUTPUT=$SANITY_CHECK_OUTPUT" \
-e "DEBUG_SHELL=$DEBUG_SHELL" \
"$IMAGE" \
/system/build-ruby