From 795f34dc22957b10939e0512070d440095786d0d Mon Sep 17 00:00:00 2001 From: Thong Kuah Date: Mon, 10 Feb 2020 16:51:37 +1300 Subject: [PATCH] feat: Add option to install and use postgres chart 8.x If AUTO_DEVOPS_POSTGRES_CHANNEL is "2", we install the new 8.2.1 postgresql, otherwise we use the old behaviour with respect to postgres Also test auto_database_url in isolation AUTO_DEVOPS_POSTGRES_CHANNEL uses increasing numbers, with 1 being the oldest generation, and 2 being the newer generation. --- .gitlab-ci.yml | 55 +++++++++++++++++++++++++++++++++++++ src/bin/auto-deploy | 66 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 112 insertions(+), 9 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 604f112..717807e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -126,6 +126,30 @@ test-deploy-name: exit 1 fi +test-auto_database_url: + <<: *test-job + variables: + CI_ENVIRONMENT_SLUG: production + POSTGRES_USER: user + POSTGRES_PASSWORD: testing-password + POSTGRES_DB: $CI_ENVIRONMENT_SLUG + script: + - auto_database_url=$(auto-deploy auto_database_url) + - export expected_url="postgres://user:testing-password@production-postgres:5432/production" + - | + if [[ $auto_database_url != $expected_url ]]; then + echo "\$auto_database_url = '${auto_database_url}', want '${expected_url}'" + exit 1 + fi + - export AUTO_DEVOPS_POSTGRES_CHANNEL=2 + - auto_database_url=$(auto-deploy auto_database_url) + - export expected_url="postgres://user:testing-password@production-postgresql:5432/production" + - | + if [[ $auto_database_url != $expected_url ]]; then + echo "\$auto_database_url = '${auto_database_url}', want '${expected_url}'" + exit 1 + fi + test-get-replicas: <<: *test-job variables: @@ -250,6 +274,23 @@ test-persist-environment-url: - auto-deploy persist_environment_url - grep review-app.example.com environment_url.txt +test-install-postgres: + <<: *test-job + variables: + GIT_STRATEGY: none + CI_ENVIRONMENT_SLUG: production + KUBE_NAMESPACE: default + AUTO_DEVOPS_POSTGRES_CHANNEL: 2 + POSTGRES_USER: user + POSTGRES_PASSWORD: testing-password + POSTGRES_DB: $CI_ENVIRONMENT_SLUG + POSTGRES_VERSION: 9.6.16 + script: + - auto-deploy initialize_tiller + - auto-deploy download_chart + - auto-deploy install_postgresql + - kubectl get statefulset production-postgresql -n $KUBE_NAMESPACE + test-deploy: <<: *test-job variables: &deploy-variables @@ -276,6 +317,20 @@ test-deploy: - helm get values production --output json | grep "postgres://user:testing-password@production-postgres:5432/production" - ./test/verify-deployment-database production production-postgres +test-deploy-postgresql-beta: + extends: test-deploy + variables: + <<: *deploy-variables + AUTO_DEVOPS_POSTGRES_CHANNEL: 2 + POSTGRES_VERSION: 9.6.16 + script: + - auto-deploy initialize_tiller + - auto-deploy download_chart + - auto-deploy deploy + - helm get production + - helm get values production --output json | grep "postgres://user:testing-password@production-postgresql:5432/production" + - ./test/verify-deployment-database production postgresql + test-deploy-modsecurity: extends: test-deploy variables: diff --git a/src/bin/auto-deploy b/src/bin/auto-deploy index 876ba93..7a5fd72 100755 --- a/src/bin/auto-deploy +++ b/src/bin/auto-deploy @@ -2,11 +2,10 @@ [[ "$TRACE" ]] && set -x -export RELEASE_NAME=${HELM_RELEASE_NAME:-$CI_ENVIRONMENT_SLUG} -auto_database_url=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${RELEASE_NAME}-postgres:5432/${POSTGRES_DB} -export DATABASE_URL=${DATABASE_URL-$auto_database_url} export TILLER_NAMESPACE=$KUBE_NAMESPACE export HELM_HOST="localhost:44134" +export RELEASE_NAME=${HELM_RELEASE_NAME:-$CI_ENVIRONMENT_SLUG} +export AUTO_DEVOPS_POSTGRES_CHANNEL=${AUTO_DEVOPS_POSTGRES_CHANNEL:-"1"} function check_kube_domain() { if [[ -z "$KUBE_INGRESS_BASE_DOMAIN" ]]; then @@ -87,6 +86,40 @@ function persist_environment_url() { echo $CI_ENVIRONMENT_URL >environment_url.txt } +function auto_database_url() { + local auto_database_url + if [[ "$AUTO_DEVOPS_POSTGRES_CHANNEL" == "2" ]]; then + auto_database_url="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${RELEASE_NAME}-postgresql:5432/${POSTGRES_DB}" + elif [[ "$AUTO_DEVOPS_POSTGRES_CHANNEL" == "1" ]]; then + auto_database_url="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${RELEASE_NAME}-postgres:5432/${POSTGRES_DB}" + fi + + echo "${DATABASE_URL-$auto_database_url}" +} + +function install_postgresql() { + if [[ "$POSTGRES_VERSION" == "9.6.2" ]]; then + echo "The minimum supported image tag for AUTO_DEVOPS_POSTGRES_CHANNEL:2 is 9.6.16" + + exit 1 + fi + + local name="${RELEASE_NAME}-postgresql" + + helm upgrade --install \ + --atomic \ + --wait \ + --version 8.2.1 \ + --set fullnameOverride="$name" \ + --set postgresqlUsername="$POSTGRES_USER" \ + --set postgresqlPassword="$POSTGRES_PASSWORD" \ + --set postgresqlDatabase="$POSTGRES_DB" \ + --set image.tag="$POSTGRES_VERSION" \ + --namespace="$KUBE_NAMESPACE" \ + "$name" \ + stable/postgresql +} + # shellcheck disable=SC2153 # warns that my_var vs MY_VAR is a possible misspelling # shellcheck disable=SC2154 # env_ADDITIONAL_HOSTS eval assignment is not recognized function deploy() { @@ -96,6 +129,19 @@ function deploy() { local name name=$(deploy_name "$track") + local old_postgres_enabled + if [[ "$POSTGRES_ENABLED" == "true" && "$AUTO_DEVOPS_POSTGRES_CHANNEL" == "2" ]]; then + install_postgresql + + # Do not install the older 0.7.1 postgresql sub-chart + old_postgres_enabled="false" + else + old_postgres_enabled="$POSTGRES_ENABLED" + fi + + local database_url + database_url=$(auto_database_url) + local stable_name stable_name=$(deploy_name stable) @@ -111,7 +157,7 @@ function deploy() { fi local service_enabled="true" - local postgres_enabled="$POSTGRES_ENABLED" + local old_postgres_enabled_stable_track="$old_postgres_enabled" local postgres_managed="$AUTO_DEVOPS_POSTGRES_MANAGED" local postgres_managed_selector="$AUTO_DEVOPS_POSTGRES_MANAGED_CLASS_SELECTOR" @@ -119,7 +165,7 @@ function deploy() { # re-use all attached resources if [[ "$track" != "stable" ]]; then service_enabled="false" - postgres_enabled="false" + old_postgres_enabled_stable_track="false" fi local replicas @@ -174,14 +220,14 @@ function deploy() { --set image.tag="$image_tag" \ --set image.secrets[0].name="$secret_name" \ --set application.track="stable" \ - --set application.database_url="$DATABASE_URL" \ + --set application.database_url="$database_url" \ --set application.secretName="$APPLICATION_SECRET_NAME" \ --set application.secretChecksum="$APPLICATION_SECRET_CHECKSUM" \ --set service.commonName="le-$CI_PROJECT_ID.$KUBE_INGRESS_BASE_DOMAIN" \ --set service.url="$CI_ENVIRONMENT_URL" \ --set service.additionalHosts="$additional_hosts" \ --set replicaCount="$replicas" \ - --set postgresql.enabled="$POSTGRES_ENABLED" \ + --set postgresql.enabled="$old_postgres_enabled" \ --set postgresql.managed="$postgres_managed" \ --set postgresql.managedClassSelector="$postgres_managed_selector" \ --set postgresql.nameOverride="postgres" \ @@ -212,14 +258,14 @@ function deploy() { --set image.tag="$image_tag" \ --set image.secrets[0].name="$secret_name" \ --set application.track="$track" \ - --set application.database_url="$DATABASE_URL" \ + --set application.database_url="$database_url" \ --set application.secretName="$APPLICATION_SECRET_NAME" \ --set application.secretChecksum="$APPLICATION_SECRET_CHECKSUM" \ --set service.commonName="le-$CI_PROJECT_ID.$KUBE_INGRESS_BASE_DOMAIN" \ --set service.url="$CI_ENVIRONMENT_URL" \ --set service.additionalHosts="$additional_hosts" \ --set replicaCount="$replicas" \ - --set postgresql.enabled="$postgres_enabled" \ + --set postgresql.enabled="$old_postgres_enabled_stable_track" \ --set postgresql.managed="$postgres_managed" \ --set postgresql.managedClassSelector="$postgres_managed_selector" \ --set postgresql.nameOverride="postgres" \ @@ -384,6 +430,8 @@ case $option in initialize_tiller) initialize_tiller ;; create_secret) create_secret ;; persist_environment_url) persist_environment_url ;; + auto_database_url) auto_database_url ;; + install_postgresql) install_postgresql "${@:2}" ;; deploy) deploy "${@:2}" ;; scale) scale "${@:2}" ;; delete) delete "${@:2}" ;; -- GitLab