Commit 9117e144 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge branch '48004-db-initialize-migrate' into 'master'

Support db migration and initialization for Auto DevOps

Closes #48004

See merge request gitlab-org/gitlab-ce!21955
parents e113e251 6e564400
---
title: Support db migration and initialization for Auto DevOps
merge_request: 21955
author:
type: added
...@@ -440,6 +440,30 @@ no longer be valid as soon as the deployment job finishes. This means that ...@@ -440,6 +440,30 @@ no longer be valid as soon as the deployment job finishes. This means that
Kubernetes can run the application, but in case it should be restarted or Kubernetes can run the application, but in case it should be restarted or
executed somewhere else, it cannot be accessed again. executed somewhere else, it cannot be accessed again.
> [Introduced][ce-21955] in GitLab 11.4
Database initialization and migrations for PostgreSQL can be configured to run
within the application pod by setting the project variables `DB_INITIALIZE` and
`DB_MIGRATE` respectively.
If present, `DB_INITIALIZE` will be run as a shell command within an application pod as a helm
post-install hook. Note that this means that if any deploy succeeds,
`DB_INITIALIZE` will not be processed thereafter.
If present, `DB_MIGRATE` will be run as a shell command within an application pod as
a helm pre-upgrade hook.
For example, in a Rails application:
* `DB_INITIALIZE` can be set to `cd /app && RAILS_ENV=production
bin/setup`
* `DB_MIGRATE` can be set to `cd /app && RAILS_ENV=production bin/update`
NOTE: **Note:**
The `/app` path is the directory of your project inside the docker image
as [configured by
Herokuish](https://github.com/gliderlabs/herokuish#paths)
> [Introduced][ce-19507] in GitLab 11.0. > [Introduced][ce-19507] in GitLab 11.0.
For internal and private projects a [GitLab Deploy Token](../../user/project/deploy_tokens/index.md###gitlab-deploy-token) For internal and private projects a [GitLab Deploy Token](../../user/project/deploy_tokens/index.md###gitlab-deploy-token)
...@@ -581,6 +605,8 @@ also be customized, and you can easily use a [custom buildpack](#custom-buildpac ...@@ -581,6 +605,8 @@ also be customized, and you can easily use a [custom buildpack](#custom-buildpac
| `BUILDPACK_URL` | The buildpack's full URL. It can point to either Git repositories or a tarball URL. For Git repositories, it is possible to point to a specific `ref`, for example `https://github.com/heroku/heroku-buildpack-ruby.git#v142` | | `BUILDPACK_URL` | The buildpack's full URL. It can point to either Git repositories or a tarball URL. For Git repositories, it is possible to point to a specific `ref`, for example `https://github.com/heroku/heroku-buildpack-ruby.git#v142` |
| `SAST_CONFIDENCE_LEVEL` | The minimum confidence level of security issues you want to be reported; `1` for Low, `2` for Medium, `3` for High; defaults to `3`.| | `SAST_CONFIDENCE_LEVEL` | The minimum confidence level of security issues you want to be reported; `1` for Low, `2` for Medium, `3` for High; defaults to `3`.|
| `DEP_SCAN_DISABLE_REMOTE_CHECKS` | Whether remote Dependency Scanning checks are disabled; defaults to `"false"`. Set to `"true"` to disable checks that send data to GitLab central servers. [Read more about remote checks](https://gitlab.com/gitlab-org/security-products/dependency-scanning#remote-checks).| | `DEP_SCAN_DISABLE_REMOTE_CHECKS` | Whether remote Dependency Scanning checks are disabled; defaults to `"false"`. Set to `"true"` to disable checks that send data to GitLab central servers. [Read more about remote checks](https://gitlab.com/gitlab-org/security-products/dependency-scanning#remote-checks).|
| `DB_INITIALIZE` | From GitLab 11.4, this variable can be used to specify the command to run to initialize the application's PostgreSQL database. It runs inside the application pod. |
| `DB_MIGRATE` | From GitLab 11.4, this variable can be used to specify the command to run to migrate the application's PostgreSQL database. It runs inside the application pod. |
| `STAGING_ENABLED` | From GitLab 10.8, this variable can be used to define a [deploy policy for staging and production environments](#deploy-policy-for-staging-and-production-environments). | | `STAGING_ENABLED` | From GitLab 10.8, this variable can be used to define a [deploy policy for staging and production environments](#deploy-policy-for-staging-and-production-environments). |
| `CANARY_ENABLED` | From GitLab 11.0, this variable can be used to define a [deploy policy for canary environments](#deploy-policy-for-canary-environments). | | `CANARY_ENABLED` | From GitLab 11.0, this variable can be used to define a [deploy policy for canary environments](#deploy-policy-for-canary-environments). |
| `INCREMENTAL_ROLLOUT_ENABLED`| From GitLab 10.8, this variable can be used to enable an [incremental rollout](#incremental-rollout-to-production) of your application for the production environment. | | `INCREMENTAL_ROLLOUT_ENABLED`| From GitLab 10.8, this variable can be used to enable an [incremental rollout](#incremental-rollout-to-production) of your application for the production environment. |
...@@ -834,4 +860,5 @@ curl --data "value=true" --header "PRIVATE-TOKEN: personal_access_token" https:/ ...@@ -834,4 +860,5 @@ curl --data "value=true" --header "PRIVATE-TOKEN: personal_access_token" https:/
[postgresql]: https://www.postgresql.org/ [postgresql]: https://www.postgresql.org/
[Auto DevOps template]: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml [Auto DevOps template]: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml
[ee]: https://about.gitlab.com/pricing/ [ee]: https://about.gitlab.com/pricing/
[ce-21955]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/21955
[ce-19507]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/19507 [ce-19507]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/19507
...@@ -598,26 +598,59 @@ rollout 100%: ...@@ -598,26 +598,59 @@ rollout 100%:
secret_name='' secret_name=''
fi fi
helm upgrade --install \ if [[ -n "$DB_INITIALIZE" && -z "$(helm ls -q "^$name$")" ]]; then
--wait \ helm upgrade --install \
--set service.enabled="$service_enabled" \ --wait \
--set releaseOverride="$CI_ENVIRONMENT_SLUG" \ --set service.enabled="$service_enabled" \
--set image.repository="$CI_APPLICATION_REPOSITORY" \ --set releaseOverride="$CI_ENVIRONMENT_SLUG" \
--set image.tag="$CI_APPLICATION_TAG" \ --set image.repository="$CI_APPLICATION_REPOSITORY" \
--set image.pullPolicy=IfNotPresent \ --set image.tag="$CI_APPLICATION_TAG" \
--set image.secrets[0].name="$secret_name" \ --set image.pullPolicy=IfNotPresent \
--set application.track="$track" \ --set image.secrets[0].name="$secret_name" \
--set application.database_url="$DATABASE_URL" \ --set application.track="$track" \
--set service.url="$CI_ENVIRONMENT_URL" \ --set application.database_url="$DATABASE_URL" \
--set replicaCount="$replicas" \ --set service.url="$CI_ENVIRONMENT_URL" \
--set postgresql.enabled="$postgres_enabled" \ --set replicaCount="$replicas" \
--set postgresql.nameOverride="postgres" \ --set postgresql.enabled="$postgres_enabled" \
--set postgresql.postgresUser="$POSTGRES_USER" \ --set postgresql.nameOverride="postgres" \
--set postgresql.postgresPassword="$POSTGRES_PASSWORD" \ --set postgresql.postgresUser="$POSTGRES_USER" \
--set postgresql.postgresDatabase="$POSTGRES_DB" \ --set postgresql.postgresPassword="$POSTGRES_PASSWORD" \
--namespace="$KUBE_NAMESPACE" \ --set postgresql.postgresDatabase="$POSTGRES_DB" \
"$name" \ --set application.initializeCommand="$DB_INITIALIZE" \
chart/ --namespace="$KUBE_NAMESPACE" \
"$name" \
chart/
helm upgrade --reuse-values \
--wait \
--set application.initializeCommand="" \
--set application.migrateCommand="$DB_MIGRATE" \
--namespace="$KUBE_NAMESPACE" \
"$name" \
chart/
else
helm upgrade --install \
--wait \
--set service.enabled="$service_enabled" \
--set releaseOverride="$CI_ENVIRONMENT_SLUG" \
--set image.repository="$CI_APPLICATION_REPOSITORY" \
--set image.tag="$CI_APPLICATION_TAG" \
--set image.pullPolicy=IfNotPresent \
--set image.secrets[0].name="$secret_name" \
--set application.track="$track" \
--set application.database_url="$DATABASE_URL" \
--set service.url="$CI_ENVIRONMENT_URL" \
--set replicaCount="$replicas" \
--set postgresql.enabled="$postgres_enabled" \
--set postgresql.nameOverride="postgres" \
--set postgresql.postgresUser="$POSTGRES_USER" \
--set postgresql.postgresPassword="$POSTGRES_PASSWORD" \
--set postgresql.postgresDatabase="$POSTGRES_DB" \
--set application.migrateCommand="$DB_MIGRATE" \
--namespace="$KUBE_NAMESPACE" \
"$name" \
chart/
fi
kubectl rollout status -n "$KUBE_NAMESPACE" -w "deployment/$name" kubectl rollout status -n "$KUBE_NAMESPACE" -w "deployment/$name"
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment