diff --git a/.gitlab/ci/build.gitlab-ci.yml b/.gitlab/ci/build.gitlab-ci.yml index eec730845c3619be9d18de1f525c59d39d64a1b2..d81a08ed1b0d4343bff4b964cf51c134b714aea7 100644 --- a/.gitlab/ci/build.gitlab-ci.yml +++ b/.gitlab/ci/build.gitlab-ci.yml @@ -13,3 +13,6 @@ build: --build-arg "GLIBC_VERSION=$GLIBC_VERSION" --tag "$BUILD_IMAGE_NAME" . - docker push "$BUILD_IMAGE_NAME" + - export latest_tag="${CI_REGISTRY_IMAGE}/${CI_COMMIT_REF_SLUG}:latest" + - docker tag "$BUILD_IMAGE_NAME" $latest_tag + - docker push $latest_tag diff --git a/.gitlab/ci/release.gitlab-ci.yml b/.gitlab/ci/release.gitlab-ci.yml index 199072f6047caa33843498989f65fef4fab82738..2e03cf6fc1fc0f2236ae37e829c5c5faae89e361 100644 --- a/.gitlab/ci/release.gitlab-ci.yml +++ b/.gitlab/ci/release.gitlab-ci.yml @@ -18,12 +18,15 @@ release-tag: - 'echo ${CI_JOB_TOKEN} | docker login --password-stdin -u $CI_REGISTRY_USER $CI_REGISTRY' - export ci_image="${CI_REGISTRY_IMAGE}" - export ci_image_tag=${CI_COMMIT_TAG:-$CI_COMMIT_SHORT_SHA} + - export ci_image_tag_major=$(echo $CI_COMMIT_TAG | sed 's/\(v[0-9]\+\)\.[0-9]\+\.[0-9]\+/\1/') - echo "Using tag $ci_image_tag for image" - docker pull "$BUILD_IMAGE_NAME" - docker tag "$BUILD_IMAGE_NAME" $ci_image:latest - docker tag "$BUILD_IMAGE_NAME" $ci_image:$ci_image_tag + - docker tag "$BUILD_IMAGE_NAME" $ci_image:$ci_image_tag_major - docker push $ci_image:latest - docker push $ci_image:$ci_image_tag + - docker push $ci_image:$ci_image_tag_major rules: - if: $CI_COMMIT_TAG diff --git a/.gitlab/ci/test.gitlab-ci.yml b/.gitlab/ci/test.gitlab-ci.yml index cf6c2657c7ca45c2460afe28f6084ed0ba2830af..c26804f5abf455ed2fcf251a01462a2928acb5a5 100644 --- a/.gitlab/ci/test.gitlab-ci.yml +++ b/.gitlab/ci/test.gitlab-ci.yml @@ -64,10 +64,16 @@ test-download-chart: test-download-chart-from-repo: <<: *test-job variables: + AUTO_DEVOPS_CHART_REPOSITORY: https://charts.gitlab.io + AUTO_DEVOPS_CHART_REPOSITORY_NAME: gitlab AUTO_DEVOPS_CHART: gitlab/auto-deploy-app script: - auto-deploy download_chart - ./test/verify-chart-version 0 + # test that a custom repo gets added even if the chart/ folder is present + - export AUTO_DEVOPS_CHART_REPOSITORY_NAME=custom + - auto-deploy download_chart + - helm fetch custom/auto-deploy-app test-deploy-name: <<: *test-job @@ -258,6 +264,7 @@ test-deploy: CI_APPLICATION_TAG: "5d248f6fa69a" CI_ENVIRONMENT_SLUG: production CI_ENVIRONMENT_URL: example.com + ADDITIONAL_HOSTS: '*.example.com, extra.host.com' CI_PROJECT_PATH_SLUG: "gitlab-org/cluster-integration/auto-build-image" CI_PROJECT_VISIBILITY: public KUBE_NAMESPACE: default @@ -448,7 +455,12 @@ test-delete-canary-postgresql: test-chart-major-version-upgrade: extends: test-deploy + variables: + AUTO_DEVOPS_CHART_REPOSITORY: https://charts.gitlab.io + AUTO_DEVOPS_CHART_REPOSITORY_NAME: gitlab script: + - unset ADDITIONAL_HOSTS # The legacy chart is not compatible wildcard hosts on ADDITIONAL_HOSTS + - auto-deploy initialize_tiller # Downloading legacy v0 chart from charts.gitlab.io and the deployment should succeed - AUTO_DEVOPS_CHART=gitlab/auto-deploy-app auto-deploy download_chart - auto-deploy deploy diff --git a/assets/auto-deploy-app/Chart.yaml b/assets/auto-deploy-app/Chart.yaml index 31ee68fcaf4ef985866c004af4b404ca17df29ef..53e884cf77a4e530990950a9a5508fb3d0353992 100644 --- a/assets/auto-deploy-app/Chart.yaml +++ b/assets/auto-deploy-app/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: GitLab's Auto-deploy Helm Chart name: auto-deploy-app -version: 2.0.0-beta.2 +version: 2.0.0-beta.3 icon: https://gitlab.com/gitlab-com/gitlab-artwork/raw/master/logo/logo-square.png diff --git a/assets/auto-deploy-app/templates/_helpers.tpl b/assets/auto-deploy-app/templates/_helpers.tpl index e717b085a0751b0a9ba5fcfdb5f2b74c5895ba84..20789d254ed0fe7f528fc373a354bcfe75c64540 100644 --- a/assets/auto-deploy-app/templates/_helpers.tpl +++ b/assets/auto-deploy-app/templates/_helpers.tpl @@ -37,7 +37,7 @@ We truncate at 63 chars because some Kubernetes name fields are limited to this Get a hostname from URL */}} {{- define "hostname" -}} -{{- . | trimPrefix "http://" | trimPrefix "https://" | trimSuffix "/" | quote -}} +{{- . | trimPrefix "http://" | trimPrefix "https://" | trimSuffix "/" | trim | quote -}} {{- end -}} {{/* diff --git a/assets/auto-deploy-app/templates/ingress.yaml b/assets/auto-deploy-app/templates/ingress.yaml index 81b2dbf9bfa4f2560da02eded4533795086a1ee7..785a58f0dfd363daa86958b58c564d062526d08f 100644 --- a/assets/auto-deploy-app/templates/ingress.yaml +++ b/assets/auto-deploy-app/templates/ingress.yaml @@ -46,7 +46,7 @@ spec: - {{ template "hostname" .Values.service.url }} {{- if .Values.service.additionalHosts }} {{- range $host := .Values.service.additionalHosts }} - - {{ $host }} + - {{ template "hostname" $host }} {{- end -}} {{- end }} secretName: {{ .Values.ingress.tls.secretName | default (printf "%s-tls" (include "fullname" .)) }} @@ -67,7 +67,7 @@ spec: {{- end -}} {{- if .Values.service.additionalHosts }} {{- range $host := .Values.service.additionalHosts }} - - host: {{ $host }} + - host: {{ template "hostname" $host }} http: <<: *httpRule {{- end -}} diff --git a/assets/auto-deploy-app/test/template_test.go b/assets/auto-deploy-app/test/template_test.go index 8b862a3fb99e196cd4b60cef9ebd32f936cbec8a..604ab0891c984c0ddc0c5f3287ad7573796c4d1b 100644 --- a/assets/auto-deploy-app/test/template_test.go +++ b/assets/auto-deploy-app/test/template_test.go @@ -17,7 +17,7 @@ import ( ) const ( - chartName = "auto-deploy-app-2.0.0-beta.2" + chartName = "auto-deploy-app-2.0.0-beta.3" helmChartPath = ".." ) diff --git a/src/bin/auto-deploy b/src/bin/auto-deploy index 61fd108fb2fc2c7c67ebcfdd26179c205647b34a..513984ea24b5be3475589ea1c55242da40cb4bb5 100755 --- a/src/bin/auto-deploy +++ b/src/bin/auto-deploy @@ -30,35 +30,61 @@ function check_kube_domain() { } function download_chart() { + add_chart_repository + if [[ -d chart ]]; then - echo "Download is skipped. The bundled chart in user's repository will be used." - elif [[ -n "${AUTO_DEVOPS_CHART}${AUTO_DEVOPS_CHART_REPOSITORY_NAME}${AUTO_DEVOPS_CHART_REPOSITORY}" ]]; then - echo "Downloading the chart from the chart repository..." - local auto_chart - local auto_chart_name - - auto_chart=${AUTO_DEVOPS_CHART:-gitlab/auto-deploy-app} - # shellcheck disable=SC2086 # double quote variables to prevent globbing - auto_chart_name=$(basename $auto_chart) - auto_chart_name=${auto_chart_name%.tgz} - auto_chart_name=${auto_chart_name%.tar.gz} - - # shellcheck disable=SC2086 # double quote variables to prevent globbing - # shellcheck disable=SC2140 # ambiguous quoting warning - helm repo add ${AUTO_DEVOPS_CHART_REPOSITORY_NAME:-gitlab} ${AUTO_DEVOPS_CHART_REPOSITORY:-https://charts.gitlab.io} ${AUTO_DEVOPS_CHART_REPOSITORY_USERNAME:+"--username" "$AUTO_DEVOPS_CHART_REPOSITORY_USERNAME"} ${AUTO_DEVOPS_CHART_REPOSITORY_PASSWORD:+"--password" "$AUTO_DEVOPS_CHART_REPOSITORY_PASSWORD"} - helm pull "${auto_chart}" --untar - if [ "$auto_chart_name" != "chart" ]; then - mv "${auto_chart_name}" chart + echo "Download skipped. Using the chart at local path 'chart/'..." + elif [[ -n "$AUTO_DEVOPS_CHART" ]]; then + # user specified a custom chart to use, but it can be a local directory or a remote chart + if [[ -d "$AUTO_DEVOPS_CHART" ]]; then + echo "Download skipped. Using the chart at local path '$AUTO_DEVOPS_CHART' (moving to 'chart/' first)..." + mv "$AUTO_DEVOPS_CHART" chart/ + else + echo "Downloading remote chart '$AUTO_DEVOPS_CHART'..." + helm pull "$AUTO_DEVOPS_CHART" --untar + + local auto_chart_name + auto_chart_name=$(basename "$AUTO_DEVOPS_CHART") + auto_chart_name=${auto_chart_name%.tgz} + auto_chart_name=${auto_chart_name%.tar.gz} + if [[ "$auto_chart_name" != "chart" ]]; then + mv "$auto_chart_name" chart + fi fi else - echo "Download is skipped. The bundled chart in auto-deploy-image will be used." - cp -R $ASSETS_CHART_DIR chart + echo "Download skipped. Using the default chart included in auto-deploy-image..." + cp -R "$ASSETS_CHART_DIR" chart fi helm repo add stable https://kubernetes-charts.storage.googleapis.com/ - helm dependency update chart/ - helm dependency build chart/ + if [[ -f chart/requirements.lock ]]; then + helm dependency build chart/ + else + helm dependency update chart/ + fi + +} + +function add_chart_repository() { + if [[ -z "$AUTO_DEVOPS_CHART_REPOSITORY" ]]; then + return + fi + + echo "Adding Helm chart repository '$AUTO_DEVOPS_CHART_REPOSITORY_NAME'" + + # repo should always be added when present, because any chart can have external dependencies + local helm_repo_auth=() + if [[ -n "$AUTO_DEVOPS_CHART_REPOSITORY_USERNAME" ]]; then + helm_repo_auth+=('--username' "$AUTO_DEVOPS_CHART_REPOSITORY_USERNAME") + fi + if [[ -n "$AUTO_DEVOPS_CHART_REPOSITORY_PASSWORD" ]]; then + helm_repo_auth+=('--password' "$AUTO_DEVOPS_CHART_REPOSITORY_PASSWORD") + fi + helm repo add \ + "${AUTO_DEVOPS_CHART_REPOSITORY_NAME}" \ + "${AUTO_DEVOPS_CHART_REPOSITORY}" \ + "${helm_repo_auth[@]}" } function ensure_namespace() { diff --git a/test/rspec/helpers/gitlab/chart_spec.rb b/test/rspec/helpers/gitlab/chart_spec.rb index bef573229bc002ad2dff9745784210ecfbbc1306..2690caa8987129904ff66fe9890a193614513df9 100644 --- a/test/rspec/helpers/gitlab/chart_spec.rb +++ b/test/rspec/helpers/gitlab/chart_spec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require_relative '../../../../src/bin/helpers/gitlab/chart.rb' require 'tmpdir' @@ -101,11 +103,11 @@ describe Gitlab::Chart do describe '.load_from_chart_yml' do let(:chart_yaml) do <<~EOS - apiVersion: v1 - description: GitLab's Auto-deploy Helm Chart - name: auto-deploy-app - version: 1.0.0-beta.0 - icon: https://gitlab.com/gitlab-com/gitlab-artwork/raw/master/logo/logo-square.png + apiVersion: v1 + description: GitLab's Auto-deploy Helm Chart + name: auto-deploy-app + version: 1.0.3 + icon: https://gitlab.com/gitlab-com/gitlab-artwork/raw/master/logo/logo-square.png EOS end @@ -115,18 +117,18 @@ describe Gitlab::Chart do expect(chart.major).to eq(1) expect(chart.minor).to eq(0) - expect(chart.patch).to eq(0) + expect(chart.patch).to eq(3) end end context 'when chart is not gitlab managed chart' do let(:chart_yaml) do <<~EOS - apiVersion: v1 - description: GitLab's Auto-deploy Helm Chart - name: custom-chart - version: 1.0.0-beta.0 - icon: https://gitlab.com/gitlab-com/gitlab-artwork/raw/master/logo/logo-square.png + apiVersion: v1 + description: GitLab's Auto-deploy Helm Chart + name: custom-chart + version: 1.0.3 + icon: https://gitlab.com/gitlab-com/gitlab-artwork/raw/master/logo/logo-square.png EOS end