-
Notifications
You must be signed in to change notification settings - Fork 0
/
setup.sh
executable file
·146 lines (123 loc) · 2.62 KB
/
setup.sh
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
#!/usr/bin/env bash
set -euf -o pipefail
dockerArgs="
--detach
--log-opt max-file=5
--log-opt max-size=10m
--restart unless-stopped
"
jenkinsTagVersion=$(date "+%F")
timeout=300
errx() {
echo "$*"
exit 1
}
off() {
case $1 in
stdout)
exec 6>&1
exec > /dev/null
;;
stderr)
exec 7>&2
exec 2>/dev/null
;;
esac
}
on() {
case $1 in
stdout)
exec 1>&6 6>&-
;;
stderr)
exec 2>&7 7>&-
;;
esac
}
case "$(uname)" in
Linux)
;;
*)
errx "ERROR: $(uname) is not supported OS."
;;
esac
SCRIPT_ROOT=$(dirname "$(readlink -f $0)")
sudo apt-get update
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
netcat-openbsd
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/docker.list
deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable
EOF
sudo apt-get update
sudo apt-get install -y \
containerd.io \
docker-ce \
docker-ce-cli
off stdout
off stderr
for container in jenkins consul-client consul-server; do
sudo docker stop $container || :
sudo docker rm $container || :
done
sudo docker volume rm jenkins-home || :
for port in 80 8500; do
if nc -vz localhost $port; then
on stderr
>&2 echo "ERROR: the port $port/tcp is already in use."
exit 1
fi
done
if nc -uvz localhost 8600; then
on stderr
>&2 echo "ERROR: the port 8600/udp is already in use."
exit 1
fi
on stderr
on stdout
sudo docker build \
--build-arg DOCKER_GID=$(stat -c %g /var/run/docker.sock) \
--tag jenkins:$jenkinsTagVersion \
"$SCRIPT_ROOT/jenkins"
off stdout
sudo docker run \
$dockerArgs \
--publish 8500:8500 \
--publish 8600:8600/udp \
--name=consul-server \
consul agent -server -ui -node=server -bootstrap-expect=1 -client=0.0.0.0
consulHttpAddr=$(
sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' consul-server
)
sudo docker run \
$dockerArgs \
--name=consul-client \
consul agent -node=client -join=$consulHttpAddr
sudo docker volume create jenkins-home
sudo docker run \
$dockerArgs \
--name jenkins \
--publish 80:8080 \
--volume $(which docker):/usr/bin/docker:ro \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume jenkins-home:/var/jenkins_home \
jenkins:$jenkinsTagVersion
on stdout
echo -n "wait for jenkins: "
for i in `seq ${timeout}`; do
status=$(sudo docker inspect -f "{{ .State.Health.Status }}" jenkins)
if [ x"$status" = x"healthy" ]; then
echo ok
exit 0
else
echo -n .
sleep 1
fi
done
echo fail
exit 1