From d390172d248d01932dbf994e4bb22dc78ee4fab5 Mon Sep 17 00:00:00 2001 From: Simon Planinschek Date: Thu, 19 Feb 2026 15:42:19 +0100 Subject: [PATCH 1/8] add action to setup PostgreSQL preview schema for PRs --- setup-postgres-preview-schema/action.yml | 62 ++++++++++++++ .../job-template.yml | 85 +++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 setup-postgres-preview-schema/action.yml create mode 100644 setup-postgres-preview-schema/job-template.yml diff --git a/setup-postgres-preview-schema/action.yml b/setup-postgres-preview-schema/action.yml new file mode 100644 index 0000000..8b66038 --- /dev/null +++ b/setup-postgres-preview-schema/action.yml @@ -0,0 +1,62 @@ +name: 'Setup PostgreSQL Preview Schema' +description: 'Sets up a PostgreSQL preview schema by cloning the main schema' +inputs: + deployment-name: + description: 'Name of the deployment (used for ConfigMap name)' + required: true + namespace: + description: 'Kubernetes namespace' + required: true + preview-number: + description: 'Preview number (PR number)' + required: true + secret-name: + description: 'Name of the secret containing DB password' + required: false + default: 'app-secrets' + +runs: + using: "composite" + steps: + - name: Prepare setup-schema job + run: | + JOB_NAME="prepare-schema-preview-${{ inputs.preview-number }}" + CONFIGMAP_NAME="${{ inputs.deployment-name }}-environments" + + # Create a temporary file for the manifest + cp ${{ github.action_path }}/job-template.yml job-setup-schema.yml + + # Replace placeholders + sed -i "s/JOB_NAME_PLACEHOLDER/$JOB_NAME/g" job-setup-schema.yml + sed -i "s/CONFIGMAP_NAME_PLACEHOLDER/$CONFIGMAP_NAME/g" job-setup-schema.yml + sed -i "s/SECRET_NAME_PLACEHOLDER/${{ inputs.secret-name }}/g" job-setup-schema.yml + sed -i "s/PREVIEW_NUMBER_PLACEHOLDER/${{ inputs.preview-number }}/g" job-setup-schema.yml + + echo "Prepared job manifest: job-setup-schema.yml" + shell: bash + + - name: Create setup-schema job + run: | + kubectl apply --namespace ${{ inputs.namespace }} -f job-setup-schema.yml + shell: bash + + - name: Wait for setup-schema job to complete + run: | + JOB_NAME="prepare-schema-preview-${{ inputs.preview-number }}" + NAMESPACE="${{ inputs.namespace }}" + + echo "Waiting for job $JOB_NAME in namespace $NAMESPACE..." + + if kubectl wait --namespace $NAMESPACE --for=condition=complete --timeout=60s job/$JOB_NAME; then + echo "Job finished with status: Complete" + kubectl logs job/$JOB_NAME --namespace $NAMESPACE + elif kubectl wait --namespace $NAMESPACE --for=condition=failed --timeout=1s job/$JOB_NAME; then + echo "Job finished with status: Failed" + kubectl logs job/$JOB_NAME --namespace $NAMESPACE + exit 1 + else + echo "Timeout waiting for job to complete." + kubectl logs job/$JOB_NAME --namespace $NAMESPACE || true + exit 1 + fi + shell: bash diff --git a/setup-postgres-preview-schema/job-template.yml b/setup-postgres-preview-schema/job-template.yml new file mode 100644 index 0000000..7430ae0 --- /dev/null +++ b/setup-postgres-preview-schema/job-template.yml @@ -0,0 +1,85 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: JOB_NAME_PLACEHOLDER +spec: + ttlSecondsAfterFinished: 60 + template: + spec: + restartPolicy: Never + containers: + - name: prepare-schema-preview + image: postgres:18 + command: [ "bash", "-c" ] + args: + - | + set -e + + echo "### START $(date --iso-8601=seconds) ###" + + if psql -t -A -c "SELECT 1 FROM information_schema.schemata WHERE schema_name = 'preview_$PREVIEW_NUMBER'" | grep -q 1; then + echo "Schema preview_$PREVIEW_NUMBER already exists. Skipping setup." + echo "Script finished successfully!" + echo "### END $(date --iso-8601=seconds) ###" + exit 0 + fi + + echo "Dumping schema $PGSCHEMA..." + pg_dump --schema=main \ + --no-comments \ + --no-owner \ + --no-acl \ + --quote-all-identifiers \ + --format=plain \ + --file=preview-dump.sql + + echo "Modifying dump file..." + sed -i preview-dump.sql \ + -e "s/\"main\"/\"preview_$PREVIEW_NUMBER\"/g" \ + -e 's/SET /--SET /g' \ + -e 's/SELECT pg_catalog/--SELECT pg_catalog/g' \ + -e 's/--SELECT pg_catalog.setval/SELECT pg_catalog.setval/g' + + echo "Creating schema preview_$PREVIEW_NUMBER with modified dump file..." + psql --echo-queries \ + --echo-errors \ + --single-transaction \ + --set=ON_ERROR_STOP=1 \ + --set=SESSION_REPLICATION_ROLE=replica \ + --file=preview-dump.sql + + echo "Script finished successfully!" + echo "### END $(date --iso-8601=seconds) ###" + env: + - name: PGHOST + valueFrom: + configMapKeyRef: + name: CONFIGMAP_NAME_PLACEHOLDER + key: DB_HOST + - name: PGPORT + valueFrom: + configMapKeyRef: + name: CONFIGMAP_NAME_PLACEHOLDER + key: DB_PORT + - name: PGDATABASE + valueFrom: + configMapKeyRef: + name: CONFIGMAP_NAME_PLACEHOLDER + key: DB_NAME + - name: PGSCHEMA + valueFrom: + configMapKeyRef: + name: CONFIGMAP_NAME_PLACEHOLDER + key: DB_SCHEMA + - name: PGUSER + valueFrom: + configMapKeyRef: + name: CONFIGMAP_NAME_PLACEHOLDER + key: DB_USERNAME + - name: PGPASSWORD + valueFrom: + secretKeyRef: + name: SECRET_NAME_PLACEHOLDER + key: DB_PASSWORD + - name: PREVIEW_NUMBER + value: "PREVIEW_NUMBER_PLACEHOLDER" From 1fc17b751179cb5b336d8370c23880a7a2f5ccbb Mon Sep 17 00:00:00 2001 From: Simon Planinschek Date: Thu, 19 Feb 2026 15:42:25 +0100 Subject: [PATCH 2/8] add action to teardown PostgreSQL preview schema for PRs --- teardown-postgres-preview-schema/action.yml | 62 +++++++++++++++++++ .../job-template.yml | 60 ++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 teardown-postgres-preview-schema/action.yml create mode 100644 teardown-postgres-preview-schema/job-template.yml diff --git a/teardown-postgres-preview-schema/action.yml b/teardown-postgres-preview-schema/action.yml new file mode 100644 index 0000000..aa77196 --- /dev/null +++ b/teardown-postgres-preview-schema/action.yml @@ -0,0 +1,62 @@ +name: 'Teardown PostgreSQL Preview Schema' +description: 'Drops the PostgreSQL preview schema' +inputs: + deployment-name: + description: 'Name of the deployment (used for ConfigMap name)' + required: true + namespace: + description: 'Kubernetes namespace' + required: true + preview-number: + description: 'Preview number (PR number)' + required: true + secret-name: + description: 'Name of the secret containing DB password' + required: false + default: 'app-secrets' + +runs: + using: "composite" + steps: + - name: Prepare teardown-schema job + run: | + JOB_NAME="drop-schema-preview-${{ inputs.preview-number }}" + CONFIGMAP_NAME="${{ inputs.deployment-name }}-environments" + + # Create a temporary file for the manifest + cp ${{ github.action_path }}/job-template.yml job-teardown-schema.yml + + # Replace placeholders + sed -i "s/JOB_NAME_PLACEHOLDER/$JOB_NAME/g" job-teardown-schema.yml + sed -i "s/CONFIGMAP_NAME_PLACEHOLDER/$CONFIGMAP_NAME/g" job-teardown-schema.yml + sed -i "s/SECRET_NAME_PLACEHOLDER/${{ inputs.secret-name }}/g" job-teardown-schema.yml + sed -i "s/PREVIEW_NUMBER_PLACEHOLDER/${{ inputs.preview-number }}/g" job-teardown-schema.yml + + echo "Prepared job manifest: job-teardown-schema.yml" + shell: bash + + - name: Create teardown-schema job + run: | + kubectl apply --namespace ${{ inputs.namespace }} -f job-teardown-schema.yml + shell: bash + + - name: Wait for teardown-schema job to complete + run: | + JOB_NAME="drop-schema-preview-${{ inputs.preview-number }}" + NAMESPACE="${{ inputs.namespace }}" + + echo "Waiting for job $JOB_NAME in namespace $NAMESPACE..." + + if kubectl wait --namespace $NAMESPACE --for=condition=complete --timeout=60s job/$JOB_NAME; then + echo "Job finished with status: Complete" + kubectl logs job/$JOB_NAME --namespace $NAMESPACE + elif kubectl wait --namespace $NAMESPACE --for=condition=failed --timeout=1s job/$JOB_NAME; then + echo "Job finished with status: Failed" + kubectl logs job/$JOB_NAME --namespace $NAMESPACE + exit 1 + else + echo "Timeout waiting for job to complete." + kubectl logs job/$JOB_NAME --namespace $NAMESPACE || true + exit 1 + fi + shell: bash diff --git a/teardown-postgres-preview-schema/job-template.yml b/teardown-postgres-preview-schema/job-template.yml new file mode 100644 index 0000000..ef56cd8 --- /dev/null +++ b/teardown-postgres-preview-schema/job-template.yml @@ -0,0 +1,60 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: JOB_NAME_PLACEHOLDER +spec: + ttlSecondsAfterFinished: 60 + template: + spec: + restartPolicy: Never + containers: + - name: drop-preview-schema + image: postgres:18 + command: [ "bash", "-c" ] + args: + - | + set -e + + echo "### START $(date --iso-8601=seconds) ###" + echo "Drop schema preview_$PREVIEW_NUMBER..." + psql --echo-queries \ + --echo-errors \ + --single-transaction \ + --set=ON_ERROR_STOP=1 \ + --command="drop schema if exists preview_$PREVIEW_NUMBER cascade;" + + echo "Script finished successfully!" + echo "### END $(date --iso-8601=seconds) ###" + env: + - name: PGHOST + valueFrom: + configMapKeyRef: + name: CONFIGMAP_NAME_PLACEHOLDER + key: DB_HOST + - name: PGPORT + valueFrom: + configMapKeyRef: + name: CONFIGMAP_NAME_PLACEHOLDER + key: DB_PORT + - name: PGDATABASE + valueFrom: + configMapKeyRef: + name: CONFIGMAP_NAME_PLACEHOLDER + key: DB_NAME + - name: PGSCHEMA + valueFrom: + configMapKeyRef: + name: CONFIGMAP_NAME_PLACEHOLDER + key: DB_SCHEMA + - name: PGUSER + valueFrom: + configMapKeyRef: + name: CONFIGMAP_NAME_PLACEHOLDER + key: DB_USERNAME + - name: PGPASSWORD + valueFrom: + secretKeyRef: + name: SECRET_NAME_PLACEHOLDER + key: DB_PASSWORD + - name: PREVIEW_NUMBER + value: "PREVIEW_NUMBER_PLACEHOLDER" From db55475c79dcbcf5580cb40b98ea58863bbc4302 Mon Sep 17 00:00:00 2001 From: Simon Planinschek Date: Thu, 19 Feb 2026 15:42:29 +0100 Subject: [PATCH 3/8] update readme with PostgreSQL preview schema actions --- readme.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/readme.md b/readme.md index e11f425..9de0f33 100644 --- a/readme.md +++ b/readme.md @@ -90,6 +90,56 @@ The following inputs can be used as `step.with` keys: | `timeout` | `5m` | The timeout for the Helm command | | `working-directory` | `.` | The working directory where the action commands will operate | +### Setup PostgreSQL Preview Schema + +Sets up a PostgreSQL preview schema by cloning the main schema. + +#### Example + +```yaml + - uses: aboutbits/github-actions-kubernetes/setup-postgres-preview-schema@v3 + with: + deployment-name: my-app + namespace: my-namespace + preview-number: ${{ github.event.number }} +``` + +#### Inputs + +The following inputs can be used as `step.with` keys: + +| Name | Required/Default | Description | +|-------------------|------------------|--------------------------------------------| +| `deployment-name` | required | Name of the deployment | +| `namespace` | required | Kubernetes namespace | +| `preview-number` | required | Preview number (PR number) | +| `secret-name` | `app-secrets` | Name of the secret containing PostgreSQL password | + +### Teardown PostgreSQL Preview Schema + +Drops the PostgreSQL preview schema. + +#### Example + +```yaml + - uses: aboutbits/github-actions-kubernetes/teardown-postgres-preview-schema@v3 + with: + deployment-name: my-app + namespace: my-namespace + preview-number: ${{ github.event.number }} +``` + +#### Inputs + +The following inputs can be used as `step.with` keys: + +| Name | Required/Default | Description | +|-------------------|------------------|--------------------------------------------| +| `deployment-name` | required | Name of the deployment | +| `namespace` | required | Kubernetes namespace | +| `preview-number` | required | Preview number (PR number) | +| `secret-name` | `app-secrets` | Name of the secret containing PostgreSQL password | + ## Build & Publish To build and publish the action, visit the GitHub Actions page of the repository and trigger the workflow "Release Package" manually. From 764c1a360e82bf9cdce27a4ded2f58a7d74eb5bc Mon Sep 17 00:00:00 2001 From: Simon Planinschek Date: Thu, 19 Feb 2026 17:32:55 +0100 Subject: [PATCH 4/8] parameterize setup of PostgreSQL preview schema actions --- setup-postgres-preview-schema/action.yml | 31 +++++++++++-------- .../job-template.yml | 24 +++++++------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/setup-postgres-preview-schema/action.yml b/setup-postgres-preview-schema/action.yml index 8b66038..b1f4a20 100644 --- a/setup-postgres-preview-schema/action.yml +++ b/setup-postgres-preview-schema/action.yml @@ -1,5 +1,5 @@ name: 'Setup PostgreSQL Preview Schema' -description: 'Sets up a PostgreSQL preview schema by cloning the main schema' +description: 'Sets up a PostgreSQL preview schema by cloning a base schema' inputs: deployment-name: description: 'Name of the deployment (used for ConfigMap name)' @@ -14,24 +14,29 @@ inputs: description: 'Name of the secret containing DB password' required: false default: 'app-secrets' + postgres-image: + description: 'PostgreSQL image to use' + required: false + default: 'postgres:18' + base-schema: + description: 'Base schema to copy from' + required: false + default: 'main' runs: using: "composite" steps: - name: Prepare setup-schema job run: | - JOB_NAME="prepare-schema-preview-${{ inputs.preview-number }}" - CONFIGMAP_NAME="${{ inputs.deployment-name }}-environments" - - # Create a temporary file for the manifest - cp ${{ github.action_path }}/job-template.yml job-setup-schema.yml - - # Replace placeholders - sed -i "s/JOB_NAME_PLACEHOLDER/$JOB_NAME/g" job-setup-schema.yml - sed -i "s/CONFIGMAP_NAME_PLACEHOLDER/$CONFIGMAP_NAME/g" job-setup-schema.yml - sed -i "s/SECRET_NAME_PLACEHOLDER/${{ inputs.secret-name }}/g" job-setup-schema.yml - sed -i "s/PREVIEW_NUMBER_PLACEHOLDER/${{ inputs.preview-number }}/g" job-setup-schema.yml - + export JOB_NAME="prepare-schema-preview-${{ inputs.preview-number }}" + export CONFIGMAP_NAME="${{ inputs.deployment-name }}-environments" + export SECRET_NAME="${{ inputs.secret-name }}" + export PREVIEW_NUMBER="${{ inputs.preview-number }}" + export POSTGRES_IMAGE="${{ inputs.postgres-image }}" + export BASE_SCHEMA="${{ inputs.base-schema }}" + + envsubst '$JOB_NAME $CONFIGMAP_NAME $SECRET_NAME $PREVIEW_NUMBER $POSTGRES_IMAGE $BASE_SCHEMA' < ${{ github.action_path }}/job-template.yml > job-setup-schema.yml + echo "Prepared job manifest: job-setup-schema.yml" shell: bash diff --git a/setup-postgres-preview-schema/job-template.yml b/setup-postgres-preview-schema/job-template.yml index 7430ae0..3c8fa69 100644 --- a/setup-postgres-preview-schema/job-template.yml +++ b/setup-postgres-preview-schema/job-template.yml @@ -1,15 +1,15 @@ apiVersion: batch/v1 kind: Job metadata: - name: JOB_NAME_PLACEHOLDER + name: ${JOB_NAME} spec: ttlSecondsAfterFinished: 60 template: spec: restartPolicy: Never containers: - - name: prepare-schema-preview - image: postgres:18 + - name: prepare-preview-schema + image: ${POSTGRES_IMAGE} command: [ "bash", "-c" ] args: - | @@ -25,7 +25,7 @@ spec: fi echo "Dumping schema $PGSCHEMA..." - pg_dump --schema=main \ + pg_dump --schema=${BASE_SCHEMA} \ --no-comments \ --no-owner \ --no-acl \ @@ -35,7 +35,7 @@ spec: echo "Modifying dump file..." sed -i preview-dump.sql \ - -e "s/\"main\"/\"preview_$PREVIEW_NUMBER\"/g" \ + -e "s/\"${BASE_SCHEMA}\"/\"preview_$PREVIEW_NUMBER\"/g" \ -e 's/SET /--SET /g' \ -e 's/SELECT pg_catalog/--SELECT pg_catalog/g' \ -e 's/--SELECT pg_catalog.setval/SELECT pg_catalog.setval/g' @@ -54,32 +54,32 @@ spec: - name: PGHOST valueFrom: configMapKeyRef: - name: CONFIGMAP_NAME_PLACEHOLDER + name: ${CONFIGMAP_NAME} key: DB_HOST - name: PGPORT valueFrom: configMapKeyRef: - name: CONFIGMAP_NAME_PLACEHOLDER + name: ${CONFIGMAP_NAME} key: DB_PORT - name: PGDATABASE valueFrom: configMapKeyRef: - name: CONFIGMAP_NAME_PLACEHOLDER + name: ${CONFIGMAP_NAME} key: DB_NAME - name: PGSCHEMA valueFrom: configMapKeyRef: - name: CONFIGMAP_NAME_PLACEHOLDER + name: ${CONFIGMAP_NAME} key: DB_SCHEMA - name: PGUSER valueFrom: configMapKeyRef: - name: CONFIGMAP_NAME_PLACEHOLDER + name: ${CONFIGMAP_NAME} key: DB_USERNAME - name: PGPASSWORD valueFrom: secretKeyRef: - name: SECRET_NAME_PLACEHOLDER + name: ${SECRET_NAME} key: DB_PASSWORD - name: PREVIEW_NUMBER - value: "PREVIEW_NUMBER_PLACEHOLDER" + value: "${PREVIEW_NUMBER}" From 8c17d8dda5e2380dfc86b09161dbfd41cf3148bb Mon Sep 17 00:00:00 2001 From: Simon Planinschek Date: Thu, 19 Feb 2026 17:33:05 +0100 Subject: [PATCH 5/8] parameterize teardown of PostgreSQL preview schema actions --- teardown-postgres-preview-schema/action.yml | 24 +++++++++---------- .../job-template.yml | 18 +++++++------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/teardown-postgres-preview-schema/action.yml b/teardown-postgres-preview-schema/action.yml index aa77196..3384f8a 100644 --- a/teardown-postgres-preview-schema/action.yml +++ b/teardown-postgres-preview-schema/action.yml @@ -14,24 +14,24 @@ inputs: description: 'Name of the secret containing DB password' required: false default: 'app-secrets' + postgres-image: + description: 'PostgreSQL image to use' + required: false + default: 'postgres:18' runs: using: "composite" steps: - name: Prepare teardown-schema job run: | - JOB_NAME="drop-schema-preview-${{ inputs.preview-number }}" - CONFIGMAP_NAME="${{ inputs.deployment-name }}-environments" - - # Create a temporary file for the manifest - cp ${{ github.action_path }}/job-template.yml job-teardown-schema.yml - - # Replace placeholders - sed -i "s/JOB_NAME_PLACEHOLDER/$JOB_NAME/g" job-teardown-schema.yml - sed -i "s/CONFIGMAP_NAME_PLACEHOLDER/$CONFIGMAP_NAME/g" job-teardown-schema.yml - sed -i "s/SECRET_NAME_PLACEHOLDER/${{ inputs.secret-name }}/g" job-teardown-schema.yml - sed -i "s/PREVIEW_NUMBER_PLACEHOLDER/${{ inputs.preview-number }}/g" job-teardown-schema.yml - + export JOB_NAME="drop-schema-preview-${{ inputs.preview-number }}" + export CONFIGMAP_NAME="${{ inputs.deployment-name }}-environments" + export SECRET_NAME="${{ inputs.secret-name }}" + export PREVIEW_NUMBER="${{ inputs.preview-number }}" + export POSTGRES_IMAGE="${{ inputs.postgres-image }}" + + envsubst '$JOB_NAME $CONFIGMAP_NAME $SECRET_NAME $PREVIEW_NUMBER $POSTGRES_IMAGE' < ${{ github.action_path }}/job-template.yml > job-teardown-schema.yml + echo "Prepared job manifest: job-teardown-schema.yml" shell: bash diff --git a/teardown-postgres-preview-schema/job-template.yml b/teardown-postgres-preview-schema/job-template.yml index ef56cd8..7e3ab91 100644 --- a/teardown-postgres-preview-schema/job-template.yml +++ b/teardown-postgres-preview-schema/job-template.yml @@ -1,7 +1,7 @@ apiVersion: batch/v1 kind: Job metadata: - name: JOB_NAME_PLACEHOLDER + name: ${JOB_NAME} spec: ttlSecondsAfterFinished: 60 template: @@ -9,7 +9,7 @@ spec: restartPolicy: Never containers: - name: drop-preview-schema - image: postgres:18 + image: ${POSTGRES_IMAGE} command: [ "bash", "-c" ] args: - | @@ -29,32 +29,32 @@ spec: - name: PGHOST valueFrom: configMapKeyRef: - name: CONFIGMAP_NAME_PLACEHOLDER + name: ${CONFIGMAP_NAME} key: DB_HOST - name: PGPORT valueFrom: configMapKeyRef: - name: CONFIGMAP_NAME_PLACEHOLDER + name: ${CONFIGMAP_NAME} key: DB_PORT - name: PGDATABASE valueFrom: configMapKeyRef: - name: CONFIGMAP_NAME_PLACEHOLDER + name: ${CONFIGMAP_NAME} key: DB_NAME - name: PGSCHEMA valueFrom: configMapKeyRef: - name: CONFIGMAP_NAME_PLACEHOLDER + name: ${CONFIGMAP_NAME} key: DB_SCHEMA - name: PGUSER valueFrom: configMapKeyRef: - name: CONFIGMAP_NAME_PLACEHOLDER + name: ${CONFIGMAP_NAME} key: DB_USERNAME - name: PGPASSWORD valueFrom: secretKeyRef: - name: SECRET_NAME_PLACEHOLDER + name: ${SECRET_NAME} key: DB_PASSWORD - name: PREVIEW_NUMBER - value: "PREVIEW_NUMBER_PLACEHOLDER" + value: "${PREVIEW_NUMBER}" From 71db3d978fac295767725fbed9076cdf796f6d3c Mon Sep 17 00:00:00 2001 From: Simon Planinschek Date: Thu, 19 Feb 2026 17:33:14 +0100 Subject: [PATCH 6/8] update readme --- readme.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 9de0f33..b02af90 100644 --- a/readme.md +++ b/readme.md @@ -92,7 +92,7 @@ The following inputs can be used as `step.with` keys: ### Setup PostgreSQL Preview Schema -Sets up a PostgreSQL preview schema by cloning the main schema. +Sets up a PostgreSQL preview schema by cloning a base schema. #### Example @@ -114,6 +114,8 @@ The following inputs can be used as `step.with` keys: | `namespace` | required | Kubernetes namespace | | `preview-number` | required | Preview number (PR number) | | `secret-name` | `app-secrets` | Name of the secret containing PostgreSQL password | +| `postgres-image` | `postgres:18` | PostgreSQL image to use | +| `base-schema` | `main` | Base schema to copy from | ### Teardown PostgreSQL Preview Schema @@ -139,6 +141,7 @@ The following inputs can be used as `step.with` keys: | `namespace` | required | Kubernetes namespace | | `preview-number` | required | Preview number (PR number) | | `secret-name` | `app-secrets` | Name of the secret containing PostgreSQL password | +| `postgres-image` | `postgres:18` | PostgreSQL image to use | ## Build & Publish From bc381fab65303aad0fd592dc6685b5f57e97671e Mon Sep 17 00:00:00 2001 From: Simon Planinschek Date: Thu, 19 Feb 2026 17:35:41 +0100 Subject: [PATCH 7/8] adjust envsubst formatting for better readability --- setup-postgres-preview-schema/action.yml | 9 ++++++++- teardown-postgres-preview-schema/action.yml | 8 +++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/setup-postgres-preview-schema/action.yml b/setup-postgres-preview-schema/action.yml index b1f4a20..3eee0c0 100644 --- a/setup-postgres-preview-schema/action.yml +++ b/setup-postgres-preview-schema/action.yml @@ -35,7 +35,14 @@ runs: export POSTGRES_IMAGE="${{ inputs.postgres-image }}" export BASE_SCHEMA="${{ inputs.base-schema }}" - envsubst '$JOB_NAME $CONFIGMAP_NAME $SECRET_NAME $PREVIEW_NUMBER $POSTGRES_IMAGE $BASE_SCHEMA' < ${{ github.action_path }}/job-template.yml > job-setup-schema.yml + envsubst ' + $JOB_NAME + $CONFIGMAP_NAME + $SECRET_NAME + $PREVIEW_NUMBER + $POSTGRES_IMAGE + $BASE_SCHEMA + ' < ${{ github.action_path }}/job-template.yml > job-setup-schema.yml echo "Prepared job manifest: job-setup-schema.yml" shell: bash diff --git a/teardown-postgres-preview-schema/action.yml b/teardown-postgres-preview-schema/action.yml index 3384f8a..089f96a 100644 --- a/teardown-postgres-preview-schema/action.yml +++ b/teardown-postgres-preview-schema/action.yml @@ -30,7 +30,13 @@ runs: export PREVIEW_NUMBER="${{ inputs.preview-number }}" export POSTGRES_IMAGE="${{ inputs.postgres-image }}" - envsubst '$JOB_NAME $CONFIGMAP_NAME $SECRET_NAME $PREVIEW_NUMBER $POSTGRES_IMAGE' < ${{ github.action_path }}/job-template.yml > job-teardown-schema.yml + envsubst ' + $JOB_NAME + $CONFIGMAP_NAME + $SECRET_NAME + $PREVIEW_NUMBER + $POSTGRES_IMAGE + ' < ${{ github.action_path }}/job-template.yml > job-teardown-schema.yml echo "Prepared job manifest: job-teardown-schema.yml" shell: bash From 29e71ea0af348f8b57a6c44a88972d7ac8860247 Mon Sep 17 00:00:00 2001 From: Simon Planinschek Date: Thu, 19 Feb 2026 17:49:46 +0100 Subject: [PATCH 8/8] parameterize PostgreSQL schema teardown with improved env handling --- setup-postgres-preview-schema/action.yml | 22 +++++++++---------- .../job-template.yml | 15 +++++++------ teardown-postgres-preview-schema/action.yml | 20 ++++++++--------- .../job-template.yml | 9 ++++---- 4 files changed, 34 insertions(+), 32 deletions(-) diff --git a/setup-postgres-preview-schema/action.yml b/setup-postgres-preview-schema/action.yml index 3eee0c0..583ba41 100644 --- a/setup-postgres-preview-schema/action.yml +++ b/setup-postgres-preview-schema/action.yml @@ -27,19 +27,19 @@ runs: using: "composite" steps: - name: Prepare setup-schema job + env: + JOB_NAME: "prepare-schema-preview-${{ inputs.preview-number }}" + CONFIGMAP_NAME: "${{ inputs.deployment-name }}-environments" + SECRET_NAME: "${{ inputs.secret-name }}" + PREVIEW_SCHEMA_NAME: "preview_${{ inputs.preview-number }}" + POSTGRES_IMAGE: "${{ inputs.postgres-image }}" + BASE_SCHEMA: "${{ inputs.base-schema }}" run: | - export JOB_NAME="prepare-schema-preview-${{ inputs.preview-number }}" - export CONFIGMAP_NAME="${{ inputs.deployment-name }}-environments" - export SECRET_NAME="${{ inputs.secret-name }}" - export PREVIEW_NUMBER="${{ inputs.preview-number }}" - export POSTGRES_IMAGE="${{ inputs.postgres-image }}" - export BASE_SCHEMA="${{ inputs.base-schema }}" - envsubst ' $JOB_NAME $CONFIGMAP_NAME $SECRET_NAME - $PREVIEW_NUMBER + $PREVIEW_SCHEMA_NAME $POSTGRES_IMAGE $BASE_SCHEMA ' < ${{ github.action_path }}/job-template.yml > job-setup-schema.yml @@ -53,10 +53,10 @@ runs: shell: bash - name: Wait for setup-schema job to complete + env: + JOB_NAME: "prepare-schema-preview-${{ inputs.preview-number }}" + NAMESPACE: "${{ inputs.namespace }}" run: | - JOB_NAME="prepare-schema-preview-${{ inputs.preview-number }}" - NAMESPACE="${{ inputs.namespace }}" - echo "Waiting for job $JOB_NAME in namespace $NAMESPACE..." if kubectl wait --namespace $NAMESPACE --for=condition=complete --timeout=60s job/$JOB_NAME; then diff --git a/setup-postgres-preview-schema/job-template.yml b/setup-postgres-preview-schema/job-template.yml index 3c8fa69..9715b9d 100644 --- a/setup-postgres-preview-schema/job-template.yml +++ b/setup-postgres-preview-schema/job-template.yml @@ -2,6 +2,9 @@ apiVersion: batch/v1 kind: Job metadata: name: ${JOB_NAME} + labels: + app.kubernetes.io/managed-by: github-actions + app.kubernetes.io/component: database-schema-setup spec: ttlSecondsAfterFinished: 60 template: @@ -17,14 +20,14 @@ spec: echo "### START $(date --iso-8601=seconds) ###" - if psql -t -A -c "SELECT 1 FROM information_schema.schemata WHERE schema_name = 'preview_$PREVIEW_NUMBER'" | grep -q 1; then - echo "Schema preview_$PREVIEW_NUMBER already exists. Skipping setup." + if psql -t -A -c "SELECT 1 FROM information_schema.schemata WHERE schema_name = '${PREVIEW_SCHEMA_NAME}'" | grep -q 1; then + echo "Schema ${PREVIEW_SCHEMA_NAME} already exists. Skipping setup." echo "Script finished successfully!" echo "### END $(date --iso-8601=seconds) ###" exit 0 fi - echo "Dumping schema $PGSCHEMA..." + echo "Dumping base schema ${BASE_SCHEMA}..." pg_dump --schema=${BASE_SCHEMA} \ --no-comments \ --no-owner \ @@ -35,12 +38,12 @@ spec: echo "Modifying dump file..." sed -i preview-dump.sql \ - -e "s/\"${BASE_SCHEMA}\"/\"preview_$PREVIEW_NUMBER\"/g" \ + -e "s/\"${BASE_SCHEMA}\"/\"${PREVIEW_SCHEMA_NAME}\"/g" \ -e 's/SET /--SET /g' \ -e 's/SELECT pg_catalog/--SELECT pg_catalog/g' \ -e 's/--SELECT pg_catalog.setval/SELECT pg_catalog.setval/g' - echo "Creating schema preview_$PREVIEW_NUMBER with modified dump file..." + echo "Creating schema ${PREVIEW_SCHEMA_NAME} with modified dump file..." psql --echo-queries \ --echo-errors \ --single-transaction \ @@ -81,5 +84,3 @@ spec: secretKeyRef: name: ${SECRET_NAME} key: DB_PASSWORD - - name: PREVIEW_NUMBER - value: "${PREVIEW_NUMBER}" diff --git a/teardown-postgres-preview-schema/action.yml b/teardown-postgres-preview-schema/action.yml index 089f96a..b753b72 100644 --- a/teardown-postgres-preview-schema/action.yml +++ b/teardown-postgres-preview-schema/action.yml @@ -23,18 +23,18 @@ runs: using: "composite" steps: - name: Prepare teardown-schema job + env: + JOB_NAME: "drop-schema-preview-${{ inputs.preview-number }}" + CONFIGMAP_NAME: "${{ inputs.deployment-name }}-environments" + SECRET_NAME: "${{ inputs.secret-name }}" + PREVIEW_SCHEMA_NAME: "preview_${{ inputs.preview-number }}" + POSTGRES_IMAGE: "${{ inputs.postgres-image }}" run: | - export JOB_NAME="drop-schema-preview-${{ inputs.preview-number }}" - export CONFIGMAP_NAME="${{ inputs.deployment-name }}-environments" - export SECRET_NAME="${{ inputs.secret-name }}" - export PREVIEW_NUMBER="${{ inputs.preview-number }}" - export POSTGRES_IMAGE="${{ inputs.postgres-image }}" - envsubst ' $JOB_NAME $CONFIGMAP_NAME $SECRET_NAME - $PREVIEW_NUMBER + $PREVIEW_SCHEMA_NAME $POSTGRES_IMAGE ' < ${{ github.action_path }}/job-template.yml > job-teardown-schema.yml @@ -47,10 +47,10 @@ runs: shell: bash - name: Wait for teardown-schema job to complete + env: + JOB_NAME: "drop-schema-preview-${{ inputs.preview-number }}" + NAMESPACE: "${{ inputs.namespace }}" run: | - JOB_NAME="drop-schema-preview-${{ inputs.preview-number }}" - NAMESPACE="${{ inputs.namespace }}" - echo "Waiting for job $JOB_NAME in namespace $NAMESPACE..." if kubectl wait --namespace $NAMESPACE --for=condition=complete --timeout=60s job/$JOB_NAME; then diff --git a/teardown-postgres-preview-schema/job-template.yml b/teardown-postgres-preview-schema/job-template.yml index 7e3ab91..e61de85 100644 --- a/teardown-postgres-preview-schema/job-template.yml +++ b/teardown-postgres-preview-schema/job-template.yml @@ -2,6 +2,9 @@ apiVersion: batch/v1 kind: Job metadata: name: ${JOB_NAME} + labels: + app.kubernetes.io/managed-by: github-actions + app.kubernetes.io/component: database-schema-teardown spec: ttlSecondsAfterFinished: 60 template: @@ -16,12 +19,12 @@ spec: set -e echo "### START $(date --iso-8601=seconds) ###" - echo "Drop schema preview_$PREVIEW_NUMBER..." + echo "Drop schema ${PREVIEW_SCHEMA_NAME}..." psql --echo-queries \ --echo-errors \ --single-transaction \ --set=ON_ERROR_STOP=1 \ - --command="drop schema if exists preview_$PREVIEW_NUMBER cascade;" + --command="drop schema if exists ${PREVIEW_SCHEMA_NAME} cascade;" echo "Script finished successfully!" echo "### END $(date --iso-8601=seconds) ###" @@ -56,5 +59,3 @@ spec: secretKeyRef: name: ${SECRET_NAME} key: DB_PASSWORD - - name: PREVIEW_NUMBER - value: "${PREVIEW_NUMBER}"