mattupstate/angular-pipeline-example

View on GitHub
bin/ci-test

Summary

Maintainability
Test Coverage
#!/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