| #!/bin/bash |
| |
| # check dependencies |
| ( |
| type docker &>/dev/null || ( echo "docker is not available"; exit 1 ) |
| type curl &>/dev/null || ( echo "curl is not available"; exit 1 ) |
| )>&2 |
| |
| # Assert that $1 is the outputof a command $2 |
| function assert { |
| local expected_output=$1 |
| shift |
| local actual_output |
| actual_output=$("$@") |
| actual_output="${actual_output//[$'\t\r\n']}" # remove newlines |
| if ! [ "$actual_output" = "$expected_output" ]; then |
| echo "expected: \"$expected_output\"" |
| echo "actual: \"$actual_output\"" |
| false |
| fi |
| } |
| |
| # Retry a command $1 times until it succeeds. Wait $2 seconds between retries. |
| function retry { |
| local attempts=$1 |
| shift |
| local delay=$1 |
| shift |
| local i |
| |
| for ((i=0; i < attempts; i++)); do |
| run "$@" |
| if [ "$status" -eq 0 ]; then |
| return 0 |
| fi |
| sleep $delay |
| done |
| |
| echo "Command \"$*\" failed $attempts times. Status: $status. Output: $output" >&2 |
| false |
| } |
| |
| function docker_build { |
| if [ -n "$JENKINS_VERSION" ]; then |
| docker build --build-arg JENKINS_VERSION=$JENKINS_VERSION --build-arg JENKINS_SHA=$JENKINS_SHA "$@" |
| else |
| docker build "$@" |
| fi |
| } |
| |
| function get_jenkins_url { |
| if [ -z "${DOCKER_HOST}" ]; then |
| DOCKER_IP=localhost |
| else |
| DOCKER_IP=$(echo "$DOCKER_HOST" | sed -e 's|tcp://\(.*\):[0-9]*|\1|') |
| fi |
| echo "http://$DOCKER_IP:$(docker port "$SUT_CONTAINER" 8080 | cut -d: -f2)" |
| } |
| |
| function get_jenkins_password { |
| docker logs "$SUT_CONTAINER" 2>&1 | grep -A 2 "Please use the following password to proceed to installation" | tail -n 1 |
| } |
| |
| function test_url { |
| run curl --user "admin:$(get_jenkins_password)" --output /dev/null --silent --head --fail --connect-timeout 30 --max-time 60 "$(get_jenkins_url)$1" |
| if [ "$status" -eq 0 ]; then |
| true |
| else |
| echo "URL $(get_jenkins_url)$1 failed" >&2 |
| echo "output: $output" >&2 |
| false |
| fi |
| } |
| |
| function cleanup { |
| docker kill "$1" &>/dev/null ||: |
| docker rm -fv "$1" &>/dev/null ||: |
| } |
| |
| function unzip_manifest { |
| local plugin=$1 |
| local work=$2 |
| bash -c "docker run --rm -v $work:/var/jenkins_home --entrypoint unzip $SUT_IMAGE -p /var/jenkins_home/plugins/$plugin META-INF/MANIFEST.MF | tr -d '\r'" |
| } |