Commit ec4570f0 authored by Pierre Smeyers's avatar Pierre Smeyers
Browse files

Merge branch '48-auto-stop-environments' into 'master'

Resolve "auto-stop environments"

Closes #48

See merge request to-be-continuous/helm!77
parents 9d2b16b3 bec897e5
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ that you might use in your hook scripts and Helm charts (as [values](https://hel
| `$environment_name`  | `{{ .Release.Name }}` | a generated application name to use for the current deployment environment (ex: `myproject-review-fix-bug-12` or `myproject-staging`). This is used as the **Helm release name** in deploy & delete jobs - _details below_ |
| `$environment_type`  | `{{ .Values.environmentType }}` | the current deployment environment type (`review`, `integration`, `staging` or `production`) |
| `$hostname`          | `{{ .Values.hostname }}` | the environment hostame, extracted from the environment URL (if you [specified the environment url statically](#environments-url-management)) |
| `$kube_namespace`    | `{{ .Release.Namespace }}` | the Kubernetes namespace currently used for deployment/cleanup |

#### Generated environment name

@@ -264,6 +265,7 @@ Here are variables supported to configure review environments:
| `HELM_REVIEW_NAMESPACE`  | The Kubernetes namespace to use for `review` env _(only define to override default)_ | `$KUBE_NAMESPACE` |
| :lock: `HELM_REVIEW_KUBE_CONFIG` | Specific kubeconfig for `review` env _(only define to override default)_ | `$HELM_DEFAULT_KUBE_CONFIG` |
| `HELM_REVIEW_VALUES`     | The [Values file](https://helm.sh/docs/chart_template_guide/values_files/) to use with `review` environments | _none_ |
| `HELM_REVIEW_AUTOSTOP_DURATION`| The amount of time before GitLab will automatically stop `review` environments | `4 hours` |

### Integration environment configuration

@@ -281,6 +283,7 @@ Here are variables supported to configure the integration environment:
| `HELM_INTEG_NAMESPACE`   | The Kubernetes namespace to use for `integration` env _(only define to override default)_ | `$KUBE_NAMESPACE` |
| :lock: `HELM_INTEG_KUBE_CONFIG` | Specific kubeconfig for `integration` env _(only define to override default)_ | `$HELM_DEFAULT_KUBE_CONFIG` |
| `HELM_INTEG_VALUES`      | The [Values file](https://helm.sh/docs/chart_template_guide/values_files/) to use with the `integration` environment | _none_ |
| `HELM_INTEG_AUTOSTOP_DURATION`| The amount of time before GitLab will automatically stop the `integration` env | `never` |

### Staging environment configuration

@@ -298,6 +301,7 @@ Here are variables supported to configure the staging environment:
| `HELM_STAGING_NAMESPACE` | The Kubernetes namespace to use for `staging` env _(only define to override default)_ | `$KUBE_NAMESPACE` |
| :lock: `HELM_STAGING_KUBE_CONFIG` | Specific kubeconfig for `staging` env _(only define to override default)_ | `$HELM_DEFAULT_KUBE_CONFIG` |
| `HELM_STAGING_VALUES`    | The [Values file](https://helm.sh/docs/chart_template_guide/values_files/) to use with the staging environment | _none_ |
| `HELM_STAGING_AUTOSTOP_DURATION`| The amount of time before GitLab will automatically stop the `staging` env | `never` |

### Production environment configuration

+15 −0
Original line number Diff line number Diff line
@@ -249,6 +249,11 @@
          "default": "${HELM_BASE_APP_NAME}-${CI_ENVIRONMENT_SLUG}",
          "advanced": true
        },
        {
          "name": "HELM_REVIEW_AUTOSTOP_DURATION",
          "description": "The amount of time before GitLab will automatically stop `review` environments",
          "default": "4 hours"
        },
        {
          "name": "HELM_REVIEW_ENVIRONMENT_URL",
          "type": "url",
@@ -286,6 +291,11 @@
          "default": "${HELM_BASE_APP_NAME}-integration",
          "advanced": true
        },
        {
          "name": "HELM_INTEG_AUTOSTOP_DURATION",
          "description": "The amount of time before GitLab will automatically stop the `integration` env",
          "default": "never"
        },
        {
          "name": "HELM_INTEG_ENVIRONMENT_URL",
          "type": "url",
@@ -323,6 +333,11 @@
          "default": "${HELM_BASE_APP_NAME}-staging",
          "advanced": true
        },
        {
          "name": "HELM_STAGING_AUTOSTOP_DURATION",
          "description": "The amount of time before GitLab will automatically stop the `staging` env",
          "default": "never"
        },
        {
          "name": "HELM_STAGING_ENVIRONMENT_URL",
          "type": "url",
+46 −41
Original line number Diff line number Diff line
@@ -121,7 +121,11 @@ variables:
  # [optional]  HELM_PROD_APP_NAME    : specific Helm application name in production env (defaults to $HELM_BASE_APP_NAME)

  HELM_BASE_APP_NAME: "$CI_PROJECT_NAME"
  # deprecated, backward compatibility
  HELM_REVIEW_ENVIRONMENT_SCHEME: "https"
  HELM_REVIEW_AUTOSTOP_DURATION: "4 hours"
  HELM_INTEG_AUTOSTOP_DURATION: "never"
  HELM_STAGING_AUTOSTOP_DURATION: "never"
  HELM_PUBLISH_ON: "prod"

  # default: one-click deploy
@@ -344,17 +348,18 @@ stages:
  }

  function setup_kubeconfig() {
    if [[ -f "$1" ]]
    explicit_config=${ENV_KUBE_CONFIG:-${HELM_DEFAULT_KUBE_CONFIG}}
    if [[ -f "$explicit_config" ]]
    then
      # arg1 is a path to a Kuberconfig file
      # is a path to a Kuberconfig file
      export KUBECONFIG="$CI_PROJECT_DIR/.kubeconfig"
      cp -f "$1" "$KUBECONFIG"
      cp -f "$explicit_config" "$KUBECONFIG"
      log_info "--- using \\e[32mKUBECONFIG\\e[0m provided by env variables"
    elif [[ -n "$1" ]]
    elif [[ -n "$explicit_config" ]]
    then
      # arg1 is a Kuberconfig file content
      # is a Kuberconfig file content
      export KUBECONFIG="$CI_PROJECT_DIR/.kubeconfig"
      echo "$1" > "$KUBECONFIG"
      echo "$explicit_config" > "$KUBECONFIG"
      log_info "--- using \\e[32mKUBECONFIG\\e[0m provided by env variables"
    elif [[ -n "$KUBECONFIG" ]]
    then
@@ -429,12 +434,12 @@ stages:
  }

  # deploy application
  function deploy() {
    export environment_type=$1
    export environment_name=$2
    namespace=$3
    values_files=$4
    environment_url=$5
  function helm_deploy() {
    export environment_type=$ENV_TYPE
    export environment_name=${ENV_APP_NAME:-${HELM_BASE_APP_NAME}${ENV_APP_SUFFIX}}
    export kube_namespace=${ENV_NAMESPACE:-${KUBE_NAMESPACE}}
    values_files=$ENV_VALUES
    environment_url=${ENV_URL:-${HELM_ENVIRONMENT_URL:-$ENV_URL_LEGACY}}

    # variables expansion in $environment_url
    environment_url=$(echo "$environment_url" | awkenvsubst)
@@ -444,7 +449,7 @@ stages:
    export hostname

    log_info "--- \\e[32mdeploy\\e[0m"
    log_info "--- \$namespace: \\e[33;1m${namespace}\\e[0m"
    log_info "--- \$kube_namespace: \\e[33;1m${kube_namespace}\\e[0m"
    log_info "--- \$environment_type: \\e[33;1m${environment_type}\\e[0m (Helm variable '$HELM_ENV_VALUE_NAME')"
    log_info "--- \$environment_name: \\e[33;1m${environment_name}\\e[0m (used as release name)"
    log_info "--- \$hostname: \\e[33;1m${hostname}\\e[0m (Helm variable '$HELM_HOSTNAME_VALUE_NAME')"
@@ -484,9 +489,9 @@ stages:
      helm_opts="$helm_opts --kubeconfig $CI_PROJECT_DIR/.kubeconfig"
    fi

    if [ -n "$namespace" ]; then
      log_info "--- using \\e[32mnamespace\\e[0m: \\e[33;1m${namespace}\\e[0m"
      helm_opts="$helm_opts --namespace $namespace"
    if [ -n "$kube_namespace" ]; then
      log_info "--- using \\e[32mnamespace\\e[0m: \\e[33;1m${kube_namespace}\\e[0m"
      helm_opts="$helm_opts --namespace $kube_namespace"
    fi

    _pkg=${helm_package_file:-$HELM_DEPLOY_CHART}
@@ -522,13 +527,13 @@ stages:
  }

  # delete application (and dependencies)
  function delete() {
    export environment_type=$1
    export environment_name=$2
    namespace=$3
  function helm_delete() {
    export environment_type=$ENV_TYPE
    export environment_name=${ENV_APP_NAME:-${HELM_BASE_APP_NAME}${ENV_APP_SUFFIX}}
    export kube_namespace=${ENV_NAMESPACE:-${KUBE_NAMESPACE}}

    log_info "--- \\e[32mdelete"
    log_info "--- \$namespace: \\e[33;1m${namespace}\\e[0m"
    log_info "--- \$kube_namespace: \\e[33;1m${kube_namespace}\\e[0m"
    log_info "--- \$environment_type: \\e[33;1m${environment_type}\\e[0m"
    log_info "--- \$environment_name: \\e[33;1m${environment_name}\\e[0m (used as release name)"

@@ -548,9 +553,9 @@ stages:
      helm_opts="$helm_opts --kubeconfig $CI_PROJECT_DIR/.kubeconfig"
    fi

    if [ -n "$namespace" ]; then
      log_info "--- using \\e[32mnamespace\\e[0m: \\e[33;1m${namespace}\\e[0m"
      helm_opts="$helm_opts --namespace $namespace"
    if [ -n "$kube_namespace" ]; then
      log_info "--- using \\e[32mnamespace\\e[0m: \\e[33;1m${kube_namespace}\\e[0m"
      helm_opts="$helm_opts --namespace $kube_namespace"
    fi

    # shellcheck disable=SC2086
@@ -567,13 +572,12 @@ stages:
  }

  # test application (and dependencies)
  function test() {
    export environment_type=$1
    export environment_name=$2
    namespace=$3
  # $environment_type and $environment_name are propagated by dotenv artifact
  function helm_test() {
    export kube_namespace=${ENV_NAMESPACE:-${KUBE_NAMESPACE}}

    log_info "--- \\e[32mtest\\e[0m (env: ${environment_type})"
    log_info "--- \$namespace: \\e[33;1m${namespace}\\e[0m"
    log_info "--- \$kube_namespace: \\e[33;1m${kube_namespace}\\e[0m"
    log_info "--- \$environment_name: \\e[33;1m${environment_name}\\e[0m"
    log_info "--- \$environment_type: \\e[33;1m${environment_type}\\e[0m"

@@ -584,9 +588,9 @@ stages:
      helm_opts="$helm_opts --kubeconfig $CI_PROJECT_DIR/.kubeconfig"
    fi

    if [ -n "$namespace" ]; then
      log_info "--- using \\e[32mnamespace\\e[0m: \\e[33;1m${namespace}\\e[0m"
      helm_opts="$helm_opts --namespace $namespace"
    if [ -n "$kube_namespace" ]; then
      log_info "--- using \\e[32mnamespace\\e[0m: \\e[33;1m${kube_namespace}\\e[0m"
      helm_opts="$helm_opts --namespace $kube_namespace"
    fi

    # shellcheck disable=SC2086
@@ -958,11 +962,10 @@ helm-publish:
  before_script:
    - *helm-scripts
    - install_ca_certs "${CUSTOM_CA_CERTS:-$DEFAULT_CA_CERTS}"
    - assert_defined "${ENV_KUBE_CONFIG:-${HELM_DEFAULT_KUBE_CONFIG:-${KUBECONFIG}}}" 'Missing required env $ENV_KUBE_CONFIG or $HELM_DEFAULT_KUBE_CONFIG'
    - add_helm_repositories
    - setup_kubeconfig "${ENV_KUBE_CONFIG:-${HELM_DEFAULT_KUBE_CONFIG}}"
    - setup_kubeconfig
  script:
    - deploy $ENV_TYPE "${ENV_APP_NAME:-${HELM_BASE_APP_NAME}${ENV_APP_SUFFIX}}" "${ENV_NAMESPACE:-${KUBE_NAMESPACE}}" "$ENV_VALUES" "${ENV_URL:-${HELM_ENVIRONMENT_URL:-$ENV_URL_LEGACY}}"
    - helm_deploy
  artifacts:
    name: "$ENV_TYPE env url for $CI_PROJECT_NAME on $CI_COMMIT_REF_SLUG"
    paths:
@@ -991,10 +994,9 @@ helm-publish:
  before_script:
    - *helm-scripts
    - install_ca_certs "${CUSTOM_CA_CERTS:-$DEFAULT_CA_CERTS}"
    - assert_defined "${ENV_KUBE_CONFIG:-${HELM_DEFAULT_KUBE_CONFIG:-${KUBECONFIG}}}" 'Missing required Kubeconfig'
    - setup_kubeconfig "${ENV_KUBE_CONFIG:-${HELM_DEFAULT_KUBE_CONFIG}}"
    - setup_kubeconfig
  script:
    - delete $ENV_TYPE "${ENV_APP_NAME:-${HELM_BASE_APP_NAME}${ENV_APP_SUFFIX}}" "${ENV_NAMESPACE:-${KUBE_NAMESPACE}}"
    - helm_delete
  environment:
    action: stop
  resource_group: $CI_ENVIRONMENT_NAME
@@ -1011,10 +1013,9 @@ helm-publish:
  before_script:
    - *helm-scripts
    - install_ca_certs "${CUSTOM_CA_CERTS:-$DEFAULT_CA_CERTS}"
    - assert_defined "${ENV_KUBE_CONFIG:-${HELM_DEFAULT_KUBE_CONFIG:-${KUBECONFIG}}}" 'Missing required Kubeconfig'
    - setup_kubeconfig "${ENV_KUBE_CONFIG:-${HELM_DEFAULT_KUBE_CONFIG}}"
    - setup_kubeconfig
  script:
    - test "$environment_type" "$environment_name" "${ENV_NAMESPACE:-${KUBE_NAMESPACE}}"
    - helm_test

# ==================================================
# Stage: review
@@ -1027,6 +1028,7 @@ helm-review:
    ENV_TYPE: review
    ENV_APP_NAME: "$HELM_REVIEW_APP_NAME"
    ENV_URL: "${HELM_REVIEW_ENVIRONMENT_URL}"
    # deprecated, backward compatibility
    ENV_URL_LEGACY: "${HELM_REVIEW_ENVIRONMENT_SCHEME}://${CI_PROJECT_NAME}-${CI_ENVIRONMENT_SLUG}.${HELM_REVIEW_ENVIRONMENT_DOMAIN}"
    ENV_KUBE_CONFIG: "$HELM_REVIEW_KUBE_CONFIG"
    ENV_NAMESPACE: "$HELM_REVIEW_NAMESPACE"
@@ -1034,6 +1036,7 @@ helm-review:
  environment:
    name: review/$CI_COMMIT_REF_NAME
    on_stop: helm-cleanup-review
    auto_stop_in: "$HELM_REVIEW_AUTOSTOP_DURATION"
  resource_group: review/$CI_COMMIT_REF_NAME
  rules:
    # exclude tags and on $HELM_REVIEW_ENABLED not set
@@ -1101,6 +1104,7 @@ helm-integration:
  environment:
    name: integration
    on_stop: helm-cleanup-integration
    auto_stop_in: "$HELM_INTEG_AUTOSTOP_DURATION"
  resource_group: integration
  rules:
    # exclude on $HELM_INTEG_ENABLED not set
@@ -1167,6 +1171,7 @@ helm-staging:
  environment:
    name: staging
    on_stop: helm-cleanup-staging
    auto_stop_in: "$HELM_STAGING_AUTOSTOP_DURATION"
  resource_group: staging
  rules:
    # exclude on $HELM_STAGING_ENABLED not set