summaryrefslogtreecommitdiff
path: root/tests/platform-ci/ci-build.sh
blob: b39f6874ea0eff99488e84d26eafda665e040c19 (plain)
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
#!/bin/bash
#
# This script will run create a virtual provider
# and run tests on it.
#
# This script is triggered by .gitlab-ci.yml
#
# It depends on:
#   * leap_platform: in ../..
#   * test provider: in provider/
#   * leap-platform-test: installed in path
#   * AWS credentials as environment variables:
#     * `AWS_ACCESS_KEY`
#     * `AWS_SECRET_KEY`
#   * ssh private key used to login to remove vm
#     * `SSH_PRIVATE_KEY`
#

# exit if any commands returns non-zero status
set -e
# because the ci-build is running in a pipe we need to also set the following
# so exit codes will be caught correctly.
set -o pipefail

# we wrap the whole script in curly braces so we can pipe it all through ts to
# get timestamps. If we put it outside of the script, then we can't get proper
# pipefail results.

{
# leap_platform/tests/platform-ci
# shellcheck disable=SC2086
ROOTDIR=$(readlink -f "$(dirname $0)")

# leap_platform
PLATFORMDIR=$(readlink -f "${ROOTDIR}/../..")

LEAP_CMD() {
  /usr/local/bin/bundle exec leap -v2 --yes "$@"
}

deploy() {
  LEAP_CMD deploy "$TAG"
}

test() {
  LEAP_CMD test "$TAG"
}

build_from_scratch() {
  # leap_platform/tests/platform-ci/provider
  PROVIDERDIR="${ROOTDIR}/provider"
  /bin/echo "Provider directory: ${PROVIDERDIR}"
  cd "$PROVIDERDIR"

  # Create cloud.json needed for `leap vm` commands using AWS credentials
  which jq || ( apt-get update -y && apt-get install jq -y )
  /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

  [ -d "./tags" ] || mkdir "./tags"
  /bin/echo "{\"environment\": \"$TAG\"}" | /usr/bin/json_pp > "${PROVIDERDIR}/tags/${TAG}.json"

  pwd
  LEAP_CMD vm status "$TAG"
  # shellcheck disable=SC2086
  LEAP_CMD vm add "$NAME" services:"$SERVICES" tags:"$TAG" $SEEDS
  LEAP_CMD compile "$TAG"
  LEAP_CMD vm status "$TAG"

  LEAP_CMD node init "$TAG"
  LEAP_CMD info "${TAG}"
}

#
# Main
#

/bin/echo "CI directory: ${ROOTDIR}"
/bin/echo "Platform directory: ${PLATFORMDIR}"

# Ensure we don't output secret stuff to console even when running in verbose mode with -x
set +x

# Configure ssh keypair
[ -d ~/.ssh ] || /bin/mkdir ~/.ssh
/bin/echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
/bin/chmod 600 ~/.ssh/id_rsa
/bin/cp "${ROOTDIR}/provider/users/gitlab-runner/gitlab-runner_ssh.pub" ~/.ssh/id_rsa.pub

case "$CI_ENVIRONMENT_NAME" in
  latest)
    TAG='latest'
    echo "Cloning ibex provider..."
    git clone -q --depth 1 ssh://gitolite@leap.se/ibex
    cd ibex
    git rev-parse HEAD
    echo -n "Operating in the ibex directory: "
    pwd
    echo "Listing current node information..."
    LEAP_CMD list
    echo "Attempting a deploy..."
    deploy
    echo "Attempting to run tests..."
    test
    ;;
  *)
    # create node(s) with unique id so we can run tests in parallel
    NAME="citest${CI_BUILD_ID}"
    # when using gitlab-runner locally, CI_BUILD_ID is always 1 which
    # will conflict with running/terminating AWS instances in subsequent runs
    # therefore we pick a random number in this case
    [ "$CI_BUILD_ID" -eq "1" ] && NAME+="000${RANDOM}"

    TAG='single'
    SERVICES='couchdb,soledad,mx,webapp,tor,monitor'
    SEEDS=''
    build_from_scratch
    # Deploy and test
    deploy
    test
    # if everything succeeds, destroy the vm
    LEAP_CMD vm rm "${TAG}"
    [ -f "nodes/${NAME}.json" ] && /bin/rm "nodes/${NAME}.json"
    ;;
esac
} | /usr/bin/ts -s