CI: Test staging deb repo component
[leap_platform.git] / tests / platform-ci / ci-build.sh
1 #!/bin/bash
2 #
3 # This script will run create a virtual provider
4 # and run tests on it.
5 #
6 # This script is triggered by .gitlab-ci.yml
7 #
8 # It depends on:
9 #   * leap_platform: in ../..
10 #   * test provider: in provider/
11 #   * leap-platform-test: installed in path
12 #   * AWS credentials as environment variables:
13 #     * `AWS_ACCESS_KEY`
14 #     * `AWS_SECRET_KEY`
15 #   * ssh private key used to login to remove vm
16 #     * `SSH_PRIVATE_KEY`
17 #
18
19 # exit if any commands returns non-zero status
20 set -e
21 # because the ci-build is running in a pipe we need to also set the following
22 # so exit codes will be caught correctly.
23 set -o pipefail
24
25 # Check if scipt is run in debug mode so we can hide secrets
26 if [[ "$-" =~ 'x' ]]
27 then
28   echo 'Running with xtrace enabled!'
29   xtrace=true
30 else
31   echo 'Running with xtrace disabled!'
32   xtrace=false
33 fi
34
35 # leap_platform/tests/platform-ci
36 # shellcheck disable=SC2086
37 ROOTDIR=$(readlink -f "$(dirname $0)")
38
39 # leap_platform
40 PLATFORMDIR=$(readlink -f "${ROOTDIR}/../..")
41
42 # deb repo component to configure
43 COMPONENT=${COMPONENT:-"master"}
44
45 # In the gitlab CI pipeline leap is installed in a different
46 # stage by bundle. To debug you can run a single CI job locally
47 # so we install leap_cli as gem here.
48 if /usr/local/bin/bundle exec leap >/dev/null 2>&1
49 then
50   LEAP_CMD() {
51     /usr/local/bin/bundle exec leap -v2 --yes "$@"
52   }
53 else
54   sudo gem install leap_cli
55   LEAP_CMD() {
56     leap -v2 --yes "$@"
57   }
58 fi
59
60 fail() {
61   echo "$*"
62   exit 1
63 }
64
65 deploy() {
66   LEAP_CMD deploy "$TAG"
67 }
68
69 test() {
70   LEAP_CMD test "$TAG"
71 }
72
73 build_from_scratch() {
74   # when using gitlab-runner locally, CI_JOB_ID is always 1 which
75   # will conflict with running/terminating AWS instances in subsequent runs
76   # therefore we pick a random number in this case
77   [ "${CI_JOB_ID}" == "1" ] && CI_JOB_ID="000${RANDOM}"
78
79   # create node(s) with unique id so we can run tests in parallel
80   NAME="citest${CI_JOB_ID:-0}"
81
82
83   TAG='single'
84   SERVICES='couchdb,soledad,mx,webapp,tor,monitor'
85
86   # leap_platform/tests/platform-ci/provider
87   PROVIDERDIR="${ROOTDIR}/provider"
88   /bin/echo "Provider directory: ${PROVIDERDIR}"
89   cd "$PROVIDERDIR"
90
91   # Create cloud.json needed for `leap vm` commands using AWS credentials
92   which jq || ( apt-get update -y && apt-get install jq -y )
93
94   # Disable xtrace
95   set +x
96
97   [ -z "$AWS_ACCESS_KEY" ]  && fail "\$AWS_ACCESS_KEY  is not set - please provide it as env variable."
98   [ -z "$AWS_SECRET_KEY" ]  && fail "\$AWS_SECRET_KEY  is not set - please provide it as env variable."
99   [ -z "$SSH_PRIVATE_KEY" ] && fail "\$SSH_PRIVATE_KEY is not set - please provide it as env variable."
100
101   /usr/bin/jq ".platform_ci.auth |= .+ {\"aws_access_key_id\":\"$AWS_ACCESS_KEY\", \"aws_secret_access_key\":\"$AWS_SECRET_KEY\"}" < cloud.json.template > cloud.json
102   # Enable xtrace again only if it was set at beginning of script
103   [[ $xtrace == true ]] && set -x
104
105   [ -d "./tags" ] || mkdir "./tags"
106   /bin/echo "{\"environment\": \"$TAG\"}" | /usr/bin/json_pp > "${PROVIDERDIR}/tags/${TAG}.json"
107
108   # configure deb repo component
109   echo '{}' | jq ".sources.platform.apt |= { \"source\": \"http://deb.leap.se/platform\", \"component\": \"${COMPONENT}\" }" > common.json
110
111   # remove old cached nodes
112   echo "Removing old cached nodes..."
113   find nodes -name 'citest*' -exec rm {} \;
114
115   echo "Listing current VM status..."
116   LEAP_CMD vm status "$TAG"
117   # shellcheck disable=SC2086
118   echo "Adding VM $NAME with the services: $SERVICES and the tags: $TAG"
119   LEAP_CMD vm add "$NAME" services:"$SERVICES" tags:"$TAG"
120   echo "Compiling $TAG..."
121   LEAP_CMD compile "$TAG"
122   echo "Listing current VM status for TAG: $TAG..."
123   LEAP_CMD vm status "$TAG"
124
125   echo "Running leap list..."
126   LEAP_CMD list
127
128   echo "Running leap node init on TAG: $TAG"
129   LEAP_CMD node init "$TAG"
130   echo "Running leap info on $TAG"
131   LEAP_CMD info "${TAG}"
132 }
133
134 run() {
135   provider_name=$1
136   provider_URI=$2
137   platform_branch=$3
138
139   # Setup the provider repository
140   echo "Setting up the provider repository: $provider_name by cloning $provider_URI"
141   git clone -q --depth 1 "$provider_URI"
142   cd "$provider_name"
143   echo -n "$provider_name repo at revision: "
144   git rev-parse HEAD
145   echo -n "Operating in the $provider_name directory: "
146   pwd
147
148
149   # If the third argument is set make sure we are on that platform branch
150   if [[ -n $platform_branch ]]
151   then
152       echo "Checking out $platform_branch branch of platform"
153       cd "$PLATFORMDIR"
154       git checkout -B "$platform_branch"
155   fi
156
157   cd "${ROOTDIR}/${provider_name}"
158   echo "Listing current node information..."
159   LEAP_CMD list
160
161   # Do the deployment
162   echo "Attempting a deploy..."
163   LEAP_CMD cert renew "$CI_JOB_NAME"
164   deploy
165   echo "Attempting to run tests..."
166   test
167 }
168
169 upgrade_test() {
170   # Checkout stable branch containing last release
171   # and deploy this
172   cd "$PLATFORMDIR"
173   # due to cache, this remote is sometimes already added
174   git remote add leap https://leap.se/git/leap_platform || true
175   git fetch leap
176   echo "Checking out leap/stable"
177   git checkout -b leap_stable remotes/leap/stable || true
178   echo -n "Current version: "
179   git rev-parse HEAD
180   # After checking out a different platform branch
181   # bundle install is needed again
182   cd "$ROOTDIR"
183   /usr/local/bin/bundle install
184
185   cd "$PROVIDERDIR"
186
187   build_from_scratch
188   deploy
189   test
190
191   # Checkout HEAD of current branch and re-deploy
192   cd "$PLATFORMDIR"
193   echo "Checking out: $CI_COMMIT_SHA"
194   git checkout "$CI_COMMIT_SHA"
195   echo -n "Current version: "
196   git rev-parse HEAD
197   # After checking out a different platform branch
198   # bundle install is needed again
199   cd "$ROOTDIR"
200   /usr/local/bin/bundle install
201
202   cd "$PROVIDERDIR"
203   deploy
204   test
205
206   cleanup
207
208 }
209
210 cleanup() {
211   # if everything succeeds, destroy the vm
212   LEAP_CMD vm rm "${TAG}"
213   [ -f "nodes/${NAME}.json" ] && /bin/rm "nodes/${NAME}.json"
214 }
215
216 #
217 # Main
218 #
219
220 /bin/echo "CI directory: ${ROOTDIR}"
221 /bin/echo "Platform directory: ${PLATFORMDIR}"
222
223 # Ensure we don't output secret stuff to console even when running in verbose mode with -x
224 set +x
225
226 # Configure ssh keypair
227 [ -d ~/.ssh ] || /bin/mkdir ~/.ssh
228 /bin/echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
229 /bin/chmod 600 ~/.ssh/id_rsa
230 /bin/cp "${ROOTDIR}/provider/users/gitlab-runner/gitlab-runner_ssh.pub" ~/.ssh/id_rsa.pub
231
232 # Enable xtrace again only if it was set at beginning of script
233 [[ $xtrace == true ]] && set -x
234
235 case "$CI_JOB_NAME" in
236   ci.leap.se)
237     TAG='latest'
238     run ibex ssh://gitolite@leap.se/ibex
239     ;;
240   mail.bitmask.net)
241     TAG='demomail'
242     run bitmask ssh://gitolite@leap.se/bitmask master
243     ;;
244   demo.bitmask.net)
245     TAG='demovpn'
246     run bitmask ssh://gitolite@leap.se/bitmask master
247     ;;
248   deploy_test*)
249     build_from_scratch
250     deploy
251     test
252     cleanup
253     ;;
254   upgrade_test)
255     upgrade_test
256     ;;
257   *)
258     fail "Don't know what to do for \$CI_JOB_NAME \"$CI_JOB_NAME\"!"
259     ;;
260 esac