ci: recreate dev database in cleanup #no_deploy
All checks were successful
CI/CD Pipeline / Manual Action Help (push) Has been skipped
CI/CD Pipeline / Start Dev Containers in Dokploy (push) Has been skipped
CI/CD Pipeline / Drop and Recreate Dev Database (push) Has been skipped
CI/CD Pipeline / Quality Gate (push) Successful in 1m53s
CI/CD Pipeline / Build and Push Images (push) Successful in 3s
CI/CD Pipeline / Deploy Dev in Dokploy (push) Has been skipped
CI/CD Pipeline / Internal Notify (push) Successful in 1s

This commit is contained in:
2026-04-28 13:25:31 +02:00
parent 4aa552341f
commit c43d92cbb1

View File

@@ -22,7 +22,7 @@ on:
required: true
default: "all"
cleanup_confirm:
description: "Type CLEAN_DEV_DB to recreate/reset the dev database as UTF8"
description: "Type CLEAN_DEV_DB to drop and recreate the dev database as UTF8"
required: false
default: ""
@@ -62,6 +62,7 @@ jobs:
echo "For dev DB cleanup run with:"
echo "- manual_action=cleanup_dev_database"
echo "- cleanup_confirm=CLEAN_DEV_DB"
echo "This drops and recreates the dev database, then triggers Dokploy web/worker/beat."
echo "For Dokploy start run with manual_action=dokploy_start and dokploy_target=all|web|worker|beat."
} >> "${GITHUB_STEP_SUMMARY:-/dev/stdout}"
@@ -491,9 +492,9 @@ jobs:
} >> "${GITHUB_STEP_SUMMARY:-/dev/stdout}"
cleanup_dev_database:
name: Cleanup Dev Database
name: Drop and Recreate Dev Database
runs-on: ubuntu-latest
timeout-minutes: 10
timeout-minutes: 15
if: |
github.event_name == 'workflow_dispatch' &&
github.ref == 'refs/heads/dev' &&
@@ -528,28 +529,12 @@ jobs:
"${APT_RUNNER[@]}" apt-get update
"${APT_RUNNER[@]}" apt-get install -y postgresql-client
- name: Recreate UTF8 database or reset public schema
- name: Drop and recreate UTF8 database
run: |
set -euo pipefail
export PGPASSWORD="${POSTGRES_PASSWORD}"
terminate_connections() {
psql \
--set ON_ERROR_STOP=1 \
--host="${POSTGRES_HOST}" \
--port="${POSTGRES_PORT}" \
--username="${POSTGRES_USER}" \
--dbname=postgres \
--set=dbname="${POSTGRES_DB}" \
<<'SQL'
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = :'dbname'
AND pid <> pg_backend_pid();
SQL
}
ENCODING=$(psql \
DB_EXISTS=$(psql \
--set ON_ERROR_STOP=1 \
--host="${POSTGRES_HOST}" \
--port="${POSTGRES_PORT}" \
@@ -558,11 +543,10 @@ jobs:
--tuples-only \
--no-align \
--set=dbname="${POSTGRES_DB}" \
--command="SELECT pg_encoding_to_char(encoding) FROM pg_database WHERE datname = :'dbname';")
--command="SELECT 1 FROM pg_database WHERE datname = :'dbname';")
if [ "${ENCODING:-}" != "UTF8" ]; then
echo "Database ${POSTGRES_DB} encoding is ${ENCODING:-missing}; recreating as UTF8"
terminate_connections
if [ "${DB_EXISTS:-}" = "1" ]; then
echo "Closing active connections to ${POSTGRES_DB}"
psql \
--set ON_ERROR_STOP=1 \
--host="${POSTGRES_HOST}" \
@@ -570,28 +554,28 @@ jobs:
--username="${POSTGRES_USER}" \
--dbname=postgres \
--set=dbname="${POSTGRES_DB}" \
--set=dbuser="${POSTGRES_USER}" \
<<'SQL'
ALTER DATABASE :"dbname" WITH ALLOW_CONNECTIONS false;
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = :'dbname'
AND pid <> pg_backend_pid();
SQL
fi
echo "Dropping and recreating ${POSTGRES_DB} with UTF8 encoding"
psql \
--set ON_ERROR_STOP=1 \
--host="${POSTGRES_HOST}" \
--port="${POSTGRES_PORT}" \
--username="${POSTGRES_USER}" \
--dbname=postgres \
--set=dbname="${POSTGRES_DB}" \
--set=dbuser="${POSTGRES_USER}" \
<<'SQL'
DROP DATABASE IF EXISTS :"dbname";
CREATE DATABASE :"dbname" WITH OWNER :"dbuser" TEMPLATE template0 ENCODING 'UTF8';
SQL
else
echo "Database ${POSTGRES_DB} is already UTF8; resetting public schema"
terminate_connections
psql \
--set ON_ERROR_STOP=1 \
--host="${POSTGRES_HOST}" \
--port="${POSTGRES_PORT}" \
--username="${POSTGRES_USER}" \
--dbname="${POSTGRES_DB}" \
--set=dbuser="${POSTGRES_USER}" \
<<'SQL'
DROP SCHEMA IF EXISTS public CASCADE;
CREATE SCHEMA public AUTHORIZATION :"dbuser";
GRANT ALL ON SCHEMA public TO :"dbuser";
GRANT ALL ON SCHEMA public TO public;
SQL
fi
psql \
--set ON_ERROR_STOP=1 \
@@ -610,11 +594,67 @@ jobs:
exit 1
fi
- name: Trigger Dokploy after database recreate
env:
DOKPLOY_API_TOKEN: ${{ secrets.DOKPLOY_API_TOKEN }}
run: |
set -euo pipefail
call_webhook() {
service_name="$1"
webhook_url="$2"
target="$3"
AUTH_HEADER=()
if [ -n "${DOKPLOY_API_TOKEN:-}" ]; then
AUTH_HEADER=(-H "Authorization: Bearer ${DOKPLOY_API_TOKEN}")
fi
PAYLOAD=$(CURRENT_DOKPLOY_TARGET="${target}" python3 - <<'PY'
import json
import os
celery_image = f"{os.environ['REGISTRY_HOST']}/{os.environ['REGISTRY_NAMESPACE']}/{os.environ['CELERY_IMAGE']}:dev"
payload = {
"project": os.environ.get("GITHUB_REPOSITORY"),
"branch": os.environ.get("GITHUB_REF_NAME"),
"sha": os.environ.get("GITHUB_SHA"),
"actor": os.environ.get("GITHUB_ACTOR"),
"target": os.environ.get("CURRENT_DOKPLOY_TARGET"),
"images": {
"web": f"{os.environ['REGISTRY_HOST']}/{os.environ['REGISTRY_NAMESPACE']}/{os.environ['WEB_IMAGE']}:dev",
"worker": celery_image,
"beat": celery_image,
},
}
print(json.dumps(payload, ensure_ascii=True, separators=(",", ":")))
PY
)
echo "Trigger Dokploy for ${service_name}"
curl -fsS \
--connect-timeout 5 \
--max-time 30 \
--retry 2 \
--retry-delay 2 \
-X POST \
-H "Content-Type: application/json" \
"${AUTH_HEADER[@]}" \
--data "${PAYLOAD}" \
"${webhook_url}"
}
call_webhook "dev web" "${DOKPLOY_DEV_WEB_WEBHOOK_URL}" "web"
sleep 45
call_webhook "dev worker" "${DOKPLOY_DEV_WORKER_WEBHOOK_URL}" "worker"
call_webhook "dev beat" "${DOKPLOY_DEV_BEAT_WEBHOOK_URL}" "beat"
- name: Summary
run: |
set -euo pipefail
{
echo "Dev database cleanup completed."
echo "Dev database was dropped and recreated."
echo "Database: ${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
echo "Encoding: UTF8"
echo "Dokploy web/worker/beat deploy was triggered."
} >> "${GITHUB_STEP_SUMMARY:-/dev/stdout}"