mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-23 08:51:30 -05:00
Merge pull request #2503 from alphagov/revert-2498-zdt-deploy
Revert "Zero downtime deploy"
This commit is contained in:
24
Makefile
24
Makefile
@@ -231,18 +231,25 @@ cf-deploy: scripts/statsd_exporter ## Deploys the app to Cloud Foundry
|
|||||||
$(if ${CF_APP},,$(error Must specify CF_APP))
|
$(if ${CF_APP},,$(error Must specify CF_APP))
|
||||||
cf target -o ${CF_ORG} -s ${CF_SPACE}
|
cf target -o ${CF_ORG} -s ${CF_SPACE}
|
||||||
@cf app --guid ${CF_APP} || exit 1
|
@cf app --guid ${CF_APP} || exit 1
|
||||||
|
cf rename ${CF_APP} ${CF_APP}-rollback
|
||||||
|
cf push ${CF_APP} -f <(make -s generate-manifest)
|
||||||
|
cf scale -i $$(cf curl /v2/apps/$$(cf app --guid ${CF_APP}-rollback) | jq -r ".entity.instances" 2>/dev/null || echo "1") ${CF_APP}
|
||||||
|
cf stop ${CF_APP}-rollback
|
||||||
|
# sleep for 10 seconds to try and make sure that all worker threads (either web api or celery) have finished before we delete
|
||||||
|
# when we delete the DB is unbound from the app, which can cause "permission denied for relation" psycopg2 errors.
|
||||||
|
sleep 10
|
||||||
|
|
||||||
# cancel any existing deploys to ensure we can apply manifest (if a deploy is in progress you'll see ScaleDisabledDuringDeployment)
|
# get the new GUID, and find all crash events for that. If there were any crashes we will abort the deploy.
|
||||||
cf v3-cancel-zdt-push ${CF_APP} || true
|
[ $$(cf curl "/v2/events?q=type:app.crash&q=actee:$$(cf app --guid ${CF_APP})" | jq ".total_results") -eq 0 ]
|
||||||
|
cf delete -f ${CF_APP}-rollback
|
||||||
cf v3-apply-manifest ${CF_APP} -f <(make -s generate-manifest)
|
|
||||||
cf v3-zdt-push ${CF_APP} --wait-for-deploy-complete # fails after 5 mins if deploy doesn't work
|
|
||||||
|
|
||||||
|
|
||||||
.PHONY: cf-deploy-api-db-migration
|
.PHONY: cf-deploy-api-db-migration
|
||||||
cf-deploy-api-db-migration:
|
cf-deploy-api-db-migration:
|
||||||
$(if ${CF_SPACE},,$(error Must specify CF_SPACE))
|
$(if ${CF_SPACE},,$(error Must specify CF_SPACE))
|
||||||
cf target -o ${CF_ORG} -s ${CF_SPACE}
|
cf target -o ${CF_ORG} -s ${CF_SPACE}
|
||||||
|
cf unbind-service notify-api-db-migration notify-db
|
||||||
|
cf unbind-service notify-api-db-migration notify-config
|
||||||
|
cf unbind-service notify-api-db-migration notify-aws
|
||||||
cf push notify-api-db-migration -f <(make -s CF_APP=notify-api-db-migration generate-manifest)
|
cf push notify-api-db-migration -f <(make -s CF_APP=notify-api-db-migration generate-manifest)
|
||||||
cf run-task notify-api-db-migration "flask db upgrade" --name api_db_migration
|
cf run-task notify-api-db-migration "flask db upgrade" --name api_db_migration
|
||||||
|
|
||||||
@@ -253,7 +260,10 @@ cf-check-api-db-migration-task: ## Get the status for the last notify-api-db-mig
|
|||||||
.PHONY: cf-rollback
|
.PHONY: cf-rollback
|
||||||
cf-rollback: ## Rollbacks the app to the previous release
|
cf-rollback: ## Rollbacks the app to the previous release
|
||||||
$(if ${CF_APP},,$(error Must specify CF_APP))
|
$(if ${CF_APP},,$(error Must specify CF_APP))
|
||||||
cf v3-cancel-zdt-push ${CF_APP}
|
@cf app --guid ${CF_APP}-rollback || exit 1
|
||||||
|
@[ $$(cf curl /v2/apps/`cf app --guid ${CF_APP}-rollback` | jq -r ".entity.state") = "STARTED" ] || (echo "Error: rollback is not possible because ${CF_APP}-rollback is not in a started state" && exit 1)
|
||||||
|
cf delete -f ${CF_APP} || true
|
||||||
|
cf rename ${CF_APP}-rollback ${CF_APP}
|
||||||
|
|
||||||
.PHONY: cf-push
|
.PHONY: cf-push
|
||||||
cf-push: scripts/statsd_exporter
|
cf-push: scripts/statsd_exporter
|
||||||
|
|||||||
@@ -156,9 +156,7 @@ This means that the first deployment of your app must happen manually.
|
|||||||
|
|
||||||
To do this:
|
To do this:
|
||||||
|
|
||||||
1. Run `cf target -s <cf-space>; cf v3-create-app <APP_NAME>`
|
1. Ensure your code is backwards compatible
|
||||||
1. Repeat for each cf environment
|
1. From the root of this repo run `CF_APP=<APP_NAME> make <cf-space> cf-push`
|
||||||
|
|
||||||
Once this is done, you can push your deployment changes to jenkins to have your app deployed on every deployment.
|
Once this is done, you can push your deployment changes to jenkins to have your app deployed on every deployment.
|
||||||
|
|
||||||
To delete an unused app, repeat the steps in reverse order. After you are no longer scaling, deploying, or alerting on that box, it's safe to run `cf stop <APP_NAME>`. Then, wait for a minute to make sure all tasks have finished executing, and after one last check to make sure notify still works, delete with `cf delete <APP_NAME>`
|
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
{%- set app_vars = {
|
{%- set app_vars = {
|
||||||
'notify-api': {'NOTIFY_APP_NAME': 'api', 'disk_quota': '2G', 'sqlalchemy_pool_size': 20, 'routes': {
|
'notify-api': {'NOTIFY_APP_NAME': 'api', 'disk_quota': '2G', 'sqlalchemy_pool_size': 20, 'routes': {
|
||||||
'preview': ['api.notify.works'],
|
'preview': ['notify-api-preview.cloudapps.digital', 'api.notify.works'],
|
||||||
'staging': ['api.staging-notify.works'],
|
'staging': ['notify-api-staging.cloudapps.digital', 'api.staging-notify.works'],
|
||||||
'production': ['api.notifications.service.gov.uk'],
|
'production': ['notify-api-production.cloudapps.digital', 'api.notifications.service.gov.uk'],
|
||||||
},
|
}
|
||||||
'healthcheck-endpoint': '/_status',
|
|
||||||
},
|
},
|
||||||
'notify-api-db-migration': {'NOTIFY_APP_NAME': 'api', 'instances': 0},
|
'notify-api-db-migration': {'NOTIFY_APP_NAME': 'api', 'instances': 0},
|
||||||
|
|
||||||
@@ -34,24 +33,24 @@ applications:
|
|||||||
memory: {{ app.get('memory', '1G') }}
|
memory: {{ app.get('memory', '1G') }}
|
||||||
disk_quota: {{ app.get('disk_quota', '1G')}}
|
disk_quota: {{ app.get('disk_quota', '1G')}}
|
||||||
|
|
||||||
|
{% if 'routes' in app -%}
|
||||||
routes:
|
routes:
|
||||||
{%- for route in app.get('routes', {}).get(environment, []) %}
|
{%- for route in app['routes'][environment] %}
|
||||||
- route: {{ route }}
|
- route: {{ route }}
|
||||||
{%- endfor%}
|
{%- endfor -%}
|
||||||
|
{%- elif environment in app.get('local_statsd', []) -%}
|
||||||
|
health-check-type: none
|
||||||
|
routes:
|
||||||
- route: {{ CF_APP }}-{{ environment }}.cloudapps.digital
|
- route: {{ CF_APP }}-{{ environment }}.cloudapps.digital
|
||||||
{% if 'healthcheck-endpoint' in app %}
|
{%- else -%}
|
||||||
health-check-type: http
|
health-check-type: none
|
||||||
health-check-http-endpoint: {{ app['healthcheck-endpoint'] }}
|
no-route: true
|
||||||
{% else %}
|
|
||||||
health-check-type: process
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
services:
|
services:
|
||||||
- notify-db
|
- notify-db
|
||||||
- logit-ssl-syslog-drain
|
- logit-ssl-syslog-drain
|
||||||
{% if environment in app.get('local_statsd', []) -%}
|
{% if environment in app.get('local_statsd', []) %}- notify-prometheus{% endif %}
|
||||||
- notify-prometheus
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
NOTIFY_APP_NAME: {{ app.get('NOTIFY_APP_NAME', CF_APP.replace('notify-', '')) }}
|
NOTIFY_APP_NAME: {{ app.get('NOTIFY_APP_NAME', CF_APP.replace('notify-', '')) }}
|
||||||
|
|||||||
Reference in New Issue
Block a user