Skip to content

Commit

Permalink
#158 Update existing CI/CD for each repo to be compatible with K8s Lo…
Browse files Browse the repository at this point in the history
…ndon (#58)

* Re-aligned circleci2.0 config to k8s-london
1. added support for token authorization
2. added support for selecting a chart version
3. updated helm install/update to correctly check for existing helm installation
4. cleaned up config
5. fixed bug on helm update where one MUST include the original value file to correctly merge value changes
6. fixed typos in integration & functional tests in config

* Fixed the following issues:
1. Integration Test Command now does not cat, thus returns proper result code (0 - success, >0 - failure)
2. Integration script re-worked to properly handle failure case
3. updated nvmrc to the version of node that we are using

* fixed typoe in node version in nvmrc
  • Loading branch information
mdebarros authored Apr 23, 2018
1 parent 06f71d9 commit 658bc8f
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 36 deletions.
63 changes: 36 additions & 27 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,13 @@ defaults_docker_helm_kube: &defaults_docker_helm_kube
docker:
- image: hypnoglow/kubernetes-helm

# default_env: &default_env
# environment:
# # - TAG_EXP: 'v[0-9]+(\.[0-9]+)*'
# # - TAG_EXP_SNAPSHOT: 'v[0-9]+(\.[0-9]+)*\-SNAPSHOT'
# # - TAG: v1.0

defaults_Dependencies: &defaults_Dependencies |
apk --no-cache add git
apk --no-cache add ca-certificates
apk --no-cache add curl
apk --no-cache add openssh-client
apk add --no-cache -t build-dependencies make gcc g++ python libtool autoconf automake
npm install -g node-gyp

defaults_awsCliDependencies: &defaults_awsCliDependencies |
apk --no-cache add \
Expand All @@ -35,7 +30,6 @@ defaults_awsCliDependencies: &defaults_awsCliDependencies |
pip install --upgrade awscli==1.14.5 s3cmd==2.0.1 python-magic
apk -v --purge del py-pip


defaults_build_docker_login: &defaults_build_docker_login
name: Login to Docker Hub
command: |
Expand All @@ -57,10 +51,15 @@ defaults_build_docker_publish: &defaults_build_docker_publish
defaults_deploy_prequisites: &defaults_deploy_prequisites
name: Copy deployment pre-requisites from S3 bucket
command: |
echo "Copying K8 keys into $AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS folder"
mkdir $CIRCLE_WORKING_DIRECTORY/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS
aws s3 cp $AWS_S3_URI_DEVOPS_DEPLOYMENT_CONFIG/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS/$K8_USER_PEM_KEY_FILENAME $CIRCLE_WORKING_DIRECTORY/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS/
aws s3 cp $AWS_S3_URI_DEVOPS_DEPLOYMENT_CONFIG/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS/$K8_USER_PEM_CERT_FILENAME $CIRCLE_WORKING_DIRECTORY/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS/
if [ -z "$K8_USER_TOKEN" ];
then
echo "Copying K8 keys into $AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS folder"
mkdir $CIRCLE_WORKING_DIRECTORY/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS
aws s3 cp $AWS_S3_URI_DEVOPS_DEPLOYMENT_CONFIG/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS/$K8_USER_PEM_KEY_FILENAME $CIRCLE_WORKING_DIRECTORY/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS/
aws s3 cp $AWS_S3_URI_DEVOPS_DEPLOYMENT_CONFIG/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS/$K8_USER_PEM_CERT_FILENAME $CIRCLE_WORKING_DIRECTORY/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS/
else
echo "Skipping K8 keys into $AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS folder"
fi
echo "Copying Helm value file into $AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_HELM folder for $K8_RELEASE_NAME release"
mkdir $CIRCLE_WORKING_DIRECTORY/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_HELM
Expand All @@ -75,8 +74,15 @@ defaults_deploy_config_kubernetes_cluster: &defaults_deploy_config_kubernetes_cl
defaults_deploy_config_kubernetes_credentials: &defaults_deploy_config_kubernetes_credentials
name: Configure Kubernetes credentails
command: |
echo "Configure Kubernetes credentails ${K8_USER_NAME}"
kubectl config set-credentials $K8_USER_NAME --client-certificate=$CIRCLE_WORKING_DIRECTORY/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS/$K8_USER_PEM_CERT_FILENAME --client-key=$CIRCLE_WORKING_DIRECTORY/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS/$K8_USER_PEM_KEY_FILENAME
echo "Configure Kubernetes credentials ${K8_USER_NAME}"
if [ ! -z "$K8_USER_TOKEN" ];
then
echo "Configure Kubernetes credentials ${K8_USER_NAME} using Token"
kubectl config set-credentials $K8_USER_NAME --token=$K8_USER_TOKEN
else
echo "Configure Kubernetes credentials ${K8_USER_NAME} using Certs"
kubectl config set-credentials $K8_USER_NAME --client-certificate=$CIRCLE_WORKING_DIRECTORY/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS/$K8_USER_PEM_CERT_FILENAME --client-key=$CIRCLE_WORKING_DIRECTORY/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_KEYS/$K8_USER_PEM_KEY_FILENAME
fi
defaults_deploy_config_kubernetes_context: &defaults_deploy_config_kubernetes_context
name: Confi gure Kubernetes context
Expand All @@ -99,13 +105,13 @@ defaults_deploy_install_or_upgrade_helm_chart: &defaults_deploy_install_or_upgra
name: Install or Upgrade Helm Chart
command: |
echo "Install or Upgrade Chart ${K8_RELEASE_NAME} for Docker Image ${DOCKER_ORG}/${CIRCLE_PROJECT_REPONAME}:${CIRCLE_TAG}"
if [ -z "$(helm list -q | grep ${K8_RELEASE_NAME})" ] && [ "$(helm list -q | grep ${K8_RELEASE_NAME})" != "Error: Unauthorized" ];
if [ -z "$(helm list -q | grep -E "^${K8_RELEASE_NAME}$")" ] && [ "$(helm list -q | grep -E "^${K8_RELEASE_NAME}$")" != "Error: Unauthorized" ];
then
echo "Installing ${K8_RELEASE_NAME} new release"
helm install --namespace=$K8_NAMESPACE --name=$K8_RELEASE_NAME --repo=$K8_HELM_REPO $HELM_VALUE_SET_VALUES -f $CIRCLE_WORKING_DIRECTORY/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_HELM/$HELM_VALUE_FILENAME $K8_HELM_CHART_NAME
helm install --namespace=$K8_NAMESPACE --name=$K8_RELEASE_NAME --repo=$K8_HELM_REPO --version $K8_HELM_CHART_VERSION $HELM_VALUE_SET_VALUES -f $CIRCLE_WORKING_DIRECTORY/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_HELM/$HELM_VALUE_FILENAME $K8_HELM_CHART_NAME
else
echo "Upgrading ${K8_RELEASE_NAME} release"
helm upgrade $K8_RELEASE_NAME --repo=$K8_HELM_REPO --reuse-values $HELM_VALUE_SET_VALUES $K8_HELM_CHART_NAME
helm upgrade $K8_RELEASE_NAME --repo=$K8_HELM_REPO --version $K8_HELM_CHART_VERSION --reuse-values $HELM_VALUE_SET_VALUES -f $CIRCLE_WORKING_DIRECTORY/$AWS_S3_DIR_DEVOPS_DEPLOYMENT_CONFIG_HELM/$HELM_VALUE_FILENAME $K8_HELM_CHART_NAME
fi
jobs:
Expand All @@ -120,9 +126,6 @@ jobs:
- run:
name: Access npm folder as root
command: cd $(npm root -g)/npm
- run:
name: Install node-gyp globally
command: npm install -g node-gyp
- run:
name: Install interledgerjs/five-bells-ledger-api-tests
command: npm install github:interledgerjs/five-bells-ledger-api-tests
Expand All @@ -132,9 +135,6 @@ jobs:
- run:
name: Delete build dependencies
command: apk del build-dependencies
# - run:
# name: Update NPM install
# command: npm link sodium && npm link argon2 && npm install --production
- save_cache:
key: dependency-cache-{{ checksum "package.json" }}
paths:
Expand All @@ -151,8 +151,8 @@ jobs:
- restore_cache:
key: dependency-cache-{{ checksum "package.json" }}
- run:
name: Install tape and tap-xunit
command: npm install -g tape tap-xunit
name: Install tape, tapes and tap-xunit
command: npm install -g tape tapes tap-xunit
- run:
name: Create dir for test results
command: mkdir -p ./test/results
Expand Down Expand Up @@ -208,7 +208,7 @@ jobs:
name: Create dir for test results
command: mkdir -p ./test/results
- run:
name: Execute unit tests
name: Execute integration tests
command: npm -s run test:integration
- store_artifacts:
path: ./test/results
Expand Down Expand Up @@ -236,15 +236,14 @@ jobs:
name: Create dir for test results
command: mkdir -p ./test/results
- run:
name: Execute unit tests
name: Execute functional tests
command: npm -s run test:functional
- store_artifacts:
path: ./test/results
prefix: test
- store_test_results:
path: ./test/results


# test-spec:
# machine: true
# # <<: *defaults
Expand Down Expand Up @@ -335,8 +334,13 @@ jobs:
name: setup environment vars for SNAPSHOT release
command: |
echo 'export HELM_VALUE_FILENAME=$K8_HELM_VALUE_FILENAME_SNAPSHOT' >> $BASH_ENV
echo 'export K8_CLUSTER_SERVER=$K8_CLUSTER_SERVER_SNAPSHOT' >> $BASH_ENV
echo 'export K8_RELEASE_NAME=$K8_RELEASE_NAME_SNAPSHOT' >> $BASH_ENV
echo 'export K8_NAMESPACE=$K8_NAMESPACE_SNAPSHOT' >> $BASH_ENV
echo 'export K8_USER_NAME=$K8_USER_NAME_SNAPSHOT' >> $BASH_ENV
echo 'export K8_USER_TOKEN=$K8_USER_TOKEN_SNAPSHOT' >> $BASH_ENV
echo 'export K8_HELM_CHART_NAME=$K8_HELM_CHART_NAME_SNAPSHOT' >> $BASH_ENV
echo 'export K8_HELM_CHART_VERSION=$K8_HELM_CHART_VERSION_SNAPSHOT' >> $BASH_ENV
echo 'export HELM_VALUE_SET_VALUES="--set central.centralhub.centralledger.containers.api.image.repository=$DOCKER_ORG/$CIRCLE_PROJECT_REPONAME --set central.centralhub.centralledger.containers.api.image.tag=$CIRCLE_TAG --set central.centralhub.centralledger.containers.admin.image.repository=$DOCKER_ORG/$CIRCLE_PROJECT_REPONAME --set central.centralhub.centralledger.containers.admin.image.tag=$CIRCLE_TAG"' >> $BASH_ENV
- run:
<<: *defaults_deploy_prequisites
Expand Down Expand Up @@ -364,8 +368,13 @@ jobs:
name: setup environment vars for release
command: |
echo 'export HELM_VALUE_FILENAME=$K8_HELM_VALUE_FILENAME_PROD' >> $BASH_ENV
echo 'export K8_CLUSTER_SERVER=$K8_CLUSTER_SERVER_PROD' >> $BASH_ENV
echo 'export K8_RELEASE_NAME=$K8_RELEASE_NAME_PROD' >> $BASH_ENV
echo 'export K8_NAMESPACE=$K8_NAMESPACE_PROD' >> $BASH_ENV
echo 'export K8_USER_NAME=$K8_USER_NAME_PROD' >> $BASH_ENV
echo 'export K8_USER_TOKEN=$K8_USER_TOKEN_PROD' >> $BASH_ENV
echo 'export K8_HELM_CHART_NAME=$K8_HELM_CHART_NAME_PROD' >> $BASH_ENV
echo 'export K8_HELM_CHART_VERSION=$K8_HELM_CHART_VERSION_PROD' >> $BASH_ENV
echo 'export HELM_VALUE_SET_VALUES="--set central.centralhub.centralledger.containers.api.image.repository=$DOCKER_ORG/$CIRCLE_PROJECT_REPONAME --set central.centralhub.centralledger.containers.api.image.tag=$CIRCLE_TAG --set central.centralhub.centralledger.containers.admin.image.repository=$DOCKER_ORG/$CIRCLE_PROJECT_REPONAME --set central.centralhub.centralledger.containers.admin.image.tag=$CIRCLE_TAG"' >> $BASH_ENV
- run:
<<: *defaults_deploy_prequisites
Expand Down
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
6.5.0
8.9.4
2 changes: 1 addition & 1 deletion test/integration-runner.env
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ POSTGRES_IMAGE=${POSTGRES_DOCKER:-"postgres"}
POSTGRES_TAG=${POSTGRES_DOCKER:-"9.4"}
APP_HOST=${APP_HOST:-"centralleadger-int"}
APP_DIR_TEST_RESULTS=${APP_DIR_TEST_RESULTS:-"test/results"}
TEST_CMD=${TEST_CMD:-"tape 'test/integration/**/*.test.js' | tap-xunit > ./test/results/tape-integration.xml; cat ./test/results/tape-integration.xml"}
TEST_CMD=${TEST_CMD:-"tape 'test/integration/**/*.test.js' | tap-xunit > ./test/results/tape-integration.xml"}
13 changes: 6 additions & 7 deletions test/integration-runner.sh
Original file line number Diff line number Diff line change
Expand Up @@ -143,18 +143,17 @@ fi
run_test_command
test_exit_code=$?

>&2 echo "Displaying test logs"
docker logs $APP_TEST_HOST

>&2 echo "Copy results to local directory"
docker cp $APP_HOST:$DOCKER_WORKING_DIR/$APP_DIR_TEST_RESULTS test

if [ "$test_exit_code" != 0 ]
then
>&2 echo "Integration tests failed...exiting"
>&2 echo "Test environment logs..."
docker logs $APP_HOST
clean_docker
exit 1
fi

>&2 echo "Copy results to local directory"
docker cp $APP_HOST:$DOCKER_WORKING_DIR/$APP_DIR_TEST_RESULTS test

clean_docker

exit "$test_exit_code"

0 comments on commit 658bc8f

Please sign in to comment.