ministryofjustice/atet

View on GitHub
package.sh

Summary

Maintainability
Test Coverage
#!/bin/bash

set -e

CONTAINERS=(assets rails)

DEFAULT_DOCKERREPO="docker.local:5000"
DEFAULT_DOCKERTAG="assets"

DOCKERREPO="${DOCKERREPO:-$DEFAULT_DOCKERREPO}"
DOCKERTAG="${DOCKERTAG:-$DEFAULT_DOCKERTAG}"


tag()
{
    # If an application prefix has been passed in via APP_PREFIX use
    # it during all docker operations
    if [ -n "${APP_PREFIX}" ]; then
        IMAGE="${APP_PREFIX}_$1"
    else
        IMAGE="$1"
    fi
    if [ -n "$2" ]; then
        TAG="${DOCKER_PREFIX}${DOCKERREPO}/${IMAGE}:$2"
    else
        TAG="${DOCKER_PREFIX}${DOCKERREPO}/${IMAGE}"
    fi
    echo $TAG
}

output()
{
    echo "$(tput setaf 1)$1$(tput sgr 0)"
}

docker_build() 
{
    TAG=$(tag $1 $2)
    [ ! -d "docker" ] && output "Please run from git root" && exit 1

        rm -f .dockerignore
    [ -f "docker/$1/.dockerignore" ] && cp "docker/$1/.dockerignore" .
    cp "docker/$1/Dockerfile" .
        output "+ docker build -t ${TAG} --force-rm=true ."
        echo "BEGIN SECTION build-details"
    docker build -t ${TAG} --force-rm=true .
        RETCODE=$?
        echo "END SECTION"
    return $RETCODE
}

docker_push()
{
    TAG=$(tag $1 $2)
    # Skip push if build generates an error

    output "+ docker push ${TAG}"
        echo "BEGIN SECTION push-details"
    docker push ${TAG}
    RETCODE=$?
        echo "END SECTION"
    return $RETCODE
}

docker_rmi()
{
    TAG=$(tag $1 $2)
    if [ -z "$DOCKER_NORMI" ]; then
          output "+ docker rmi ${TAG}"
          docker rmi ${TAG}
    fi
}


create_app_envvar()
{
  mkdir -p ./docker/app_env_vars
  echo "$2" > ./docker/app_env_vars/$1  
}

###
###
###
if [ -n "$1" ]; then 
  export APPVERSION=`echo "$1" | sed -e "s/.*release\///g"`
else
  export APPVERSION='latest'
fi

DATE=`date`

cat <<EOT >MANIFEST
Version:  $APPVERSION
Date:     $DATE
BuildTag: $BUILD_TAG
Commit:   $GIT_COMMIT

EOT

###
### Setup application envvars for docker
###
rm -f ./docker/app_env_vars/*
create_app_envvar APP_BUILD_VERSION "$APPVERSION"
create_app_envvar APP_BUILD_DATE    "$DATE"
create_app_envvar APP_BUILD_TAG     "$BUILD_TAG"
create_app_envvar APP_GIT_COMMIT    "$GIT_COMMIT"

# Generate a self contained bundle
#cd build
bundle --quiet \
       --path vendor/bundle \
       --deployment \
       --standalone \
       --binstubs \
       --without build


rm -rf bin
# Add the envvars defined in .env to avoid errors during the assets:precompile stage
set -a
. .env
set +a
npm install
bundle exec rake rails:update:bin
bundle exec rake assets:precompile RAILS_ENV=production

# Once the assets have been built add a ping to the assets server
cat <<EOT >public/assets/ping.json
{"version_number":"$APPVERSION","build_date":"$DATE","commit_id":"$GIT_COMMIT","build_tag":"$BUILD_TAG"}
EOT

# After here we capture the retcode when we need it, so turn off automatic fail on error
set +e

JENKINS_RETCODE=0

# Build containers
for i in  ${CONTAINERS[@]}; do
  docker_build $i $APPVERSION
  RETCODE=$?
  if [ "$RETCODE" -ne 0 ]; then
     JENKINS_RETCODE=$RETCODE
     DOCKER_NOPUSH=true
     output "Failed $i build with code $RETCODE - skipping further builds and disabling push"
     break
  fi
done


# Push containers only if all builds were successful and DOCKER_NOPUSH isn't specified
if [ -z "$DOCKER_NOPUSH" ]; then
    for i in  ${CONTAINERS[@]}; do
        docker_push $i $APPVERSION
        RETCODE=$?
          if [ "$RETCODE" -ne 0 ]; then
                 JENKINS_RETCODE=$RETCODE
                 output "Failed $i push with code $RETCODE"
        fi
    done
else
    output "Not pushing images"
fi

if [ -z "$DOCKER_NORMI" ]; then
    for i in  ${CONTAINERS[@]}; do
        docker_rmi $i $APPVERSION
        RETCODE=$?
    done
else
    output "Not removing images"
fi

exit $JENKINS_RETCODE