bin/ci-test
#!/bin/bash
if [[ -z ${GIT_COMMIT_SHA+x} ]]; then
echo 'GIT_COMMIT_SHA is not set'
exit 1
fi
if [[ -z ${GIT_BRANCH+x} ]]; then
echo 'GIT_BRANCH is not set'
exit 1
fi
if [[ -z ${TEST_IMAGE+x} ]]; then
echo 'TEST_IMAGE is not set'
exit 1
fi
if [[ "${CI}" == "true" ]]; then
if [[ -z ${S3_BUCKET_URI+x} ]]; then
echo 'S3_BUCKET_URI must be set when CI=true'
exit 1
fi
if [[ -z ${S3_BUCKET_PUBLIC_URI+x} ]]; then
echo 'S3_BUCKET_PUBLIC_URI must be set when CI=true'
exit 1
fi
if [[ -z ${MASTER_BUILD_S3_KEY_PREFIX+x} ]]; then
echo 'MASTER_BUILD_S3_KEY_PREFIX must be set when CI=true'
exit 1
fi
if [[ -z ${BUILD_S3_KEY_PREFIX+x} ]]; then
echo 'BUILD_S3_KEY_PREFIX must be set when CI=true'
exit 1
fi
fi
REPORTS_VOLUME=reports-$(./bin/uuid)
CONTAINER_NAME=test-$(./bin/uuid)
CONTAINER_SRC_DIR=/usr/src/app
CONTAINER_REPORTS_ROOT_DIR=${CONTAINER_SRC_DIR}/reports
BUILD_REPORTS_S3_KEY_PREFIX=${BUILD_S3_KEY_PREFIX%/}/reports/app/
MASTER_REPORTS_S3_KEY_PREFIX=${MASTER_BUILD_S3_KEY_PREFIX%/}/reports/app/
MASTER_ALLURE_HISTORY_S3_KEY_PREFIX=${MASTER_REPORTS_S3_KEY_PREFIX%/}/allure/html/history/
is-ci-context() {
[[ "${CI}" == "true" ]]
}
is-master-branch() {
[[ "${GIT_BRANCH}" == "master" ]]
}
clean() {
docker rm ${CONTAINER_NAME} 2>/dev/null >/dev/null || :
docker volume rm ${REPORTS_VOLUME} 2>/dev/null >/dev/null || :
}
prep() {
for I in ${TEST_IMAGE} mesosphere/aws-cli mattupstate/allure cloudbuilders/cc-test-reporter; do
docker pull $I
done
}
generate-allure-report() {
docker run --rm \
--env AWS_DEFAULT_REGION \
--env AWS_ACCESS_KEY_ID \
--env AWS_SECRET_ACCESS_KEY \
--workdir /work \
--volume ${REPORTS_VOLUME}:/work \
mesosphere/aws-cli s3 cp --quiet --recursive \
${MASTER_ALLURE_HISTORY_S3_KEY_PREFIX} /work/app/allure/xml/history/
echo "Allure report history fetched from ${MASTER_ALLURE_HISTORY_S3_KEY_PREFIX}"
export ALLURE_ENVIRONMENT="Hostname=$(hostname)
Git.Commit=${GIT_COMMIT_SHA}
Git.Branch=${GIT_BRANCH}
Docker.Version=$(docker --version)
Docker.TestImage=${TEST_IMAGE}"
docker run --rm \
--env ALLURE_ENVIRONMENT \
--workdir /work \
--volume ${REPORTS_VOLUME}:/work \
--entrypoint /bin/sh \
mattupstate/allure -c '
echo "$ALLURE_ENVIRONMENT" >> app/allure/xml/environment.properties
echo "Allure environment:"
cat app/allure/xml/environment.properties
allure generate --clean --report-dir app/allure/html app/allure/xml'
docker run --rm \
--workdir /work \
--volume ${REPORTS_VOLUME}:/work \
--entrypoint /bin/sh ${TEST_IMAGE} -c '
tree -H . -L 1 --noreport --charset utf-8 app/allure > app/allure/index.html'
docker run --rm \
--workdir /work \
--volume ${REPORTS_VOLUME}:/work \
--entrypoint /bin/sh ${TEST_IMAGE} -c '
tree -H . -L 1 --noreport --charset utf-8 app/allure/xml > app/allure/xml/index.html'
}
publish-report() {
S3_KEY_PREFIX="${2%/}/${1}/"
docker run --rm \
--env AWS_DEFAULT_REGION \
--env AWS_ACCESS_KEY_ID \
--env AWS_SECRET_ACCESS_KEY \
mesosphere/aws-cli s3 rm --quiet --recursive ${S3_KEY_PREFIX}
docker run --rm \
--env AWS_DEFAULT_REGION \
--env AWS_ACCESS_KEY_ID \
--env AWS_SECRET_ACCESS_KEY \
--workdir /work \
--volume ${REPORTS_VOLUME}:/work \
mesosphere/aws-cli s3 cp --quiet --acl public-read --recursive \
/work/app/${1}/ ${S3_KEY_PREFIX}
echo "Report published to: ${S3_KEY_PREFIX/${S3_BUCKET_URI}/${S3_BUCKET_PUBLIC_URI}}"
}
publish-coverage-report() {
echo "Coverage report published to $(publish-report coverage ${1})"
}
publish-allure-report() {
echo "Allure report published to $(publish-report allure ${1})"
}
publish-build-reports() {
publish-coverage-report ${BUILD_REPORTS_S3_KEY_PREFIX}
publish-allure-report ${BUILD_REPORTS_S3_KEY_PREFIX}
}
publish-master-reports() {
publish-coverage-report ${MASTER_REPORTS_S3_KEY_PREFIX}
publish-allure-report ${MASTER_REPORTS_S3_KEY_PREFIX}
}
reports() {
is-ci-context && generate-allure-report || :
is-ci-context && publish-build-reports || :
is-ci-context && is-master-branch && publish-master-reports || :
}
code-climate-start() {
docker run --rm \
--env CC_TEST_REPORTER_ID \
--env GIT_COMMIT_SHA \
--env GIT_BRANCH \
--env GIT_COMMITED_AT \
cloudbuilders/cc-test-reporter before-build
}
code-climate-end() {
docker run --rm \
--env CC_TEST_REPORTER_ID \
--env GIT_COMMIT_SHA \
--env GIT_BRANCH \
--env GIT_COMMITED_AT \
--workdir /work \
--volume ${REPORTS_VOLUME}:/work/reports \
--volume ${PWD}:/work \
--entrypoint /bin/sh \
cloudbuilders/cc-test-reporter -c '
cc-test-reporter format-coverage -o - -t lcov -p '${CONTAINER_SRC_DIR}'/ reports/app/coverage/lcov.info \
| cc-test-reporter upload-coverage -i -'
}
tests() {
docker volume create ${REPORTS_VOLUME} > /dev/null
is-ci-context && code-climate-start || :
docker run --name ${CONTAINER_NAME} \
--volume ${REPORTS_VOLUME}:${CONTAINER_REPORTS_ROOT_DIR} \
--env ALLURE_RESULTS_DIR=${CONTAINER_REPORTS_ROOT_DIR}/app/allure/xml \
--env COVERAGE_REPORT_DIR=${CONTAINER_REPORTS_ROOT_DIR}/app/coverage \
--security-opt seccomp=${PWD}/etc/docker/seccomp/chrome.json \
${TEST_IMAGE} \
npm run test-ci
is-ci-context && code-climate-end || :
}
prep
tests
TEST_EXIT_CODE=$?
reports
clean
exit $TEST_EXIT_CODE