diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8374b2e..a74e0c0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,9 +9,75 @@ on: - main jobs: + shellcheck: + name: Run shellcheck + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: shellcheck + uses: reviewdog/action-shellcheck@v1.19 + + test-postgresql: + name: Test pg_dump with PostgreSQL version + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + postgresql_version: [12, 14, 15] + services: + postgres: + image: postgres:${{ matrix.postgresql_version }} + env: + POSTGRES_USER: test_user + POSTGRES_PASSWORD: test_user_password + POSTGRES_DB: testdb + ports: + - 5432:5432 + # needed because the postgres container does not provide a healthcheck + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of your personal token + + - name: Run pg_dump + uses: ./ + with: + database_url: "postgres://test_user:test_user_password@localhost:5432/testdb" + postgresql_version: ${{ matrix.postgresql_version }} + path: "backups/${{ matrix.postgresql_version }}/backup.sql" + + - name: Check changes to the backup file. + id: changed_backup + if: matrix.platform == 'ubuntu-latest' + uses: tj-actions/verify-changed-files@v16 + with: + files: backups/${{ matrix.postgresql_version }}/backup.sql + + - name: Commit changes to backup file. + if: steps.changed_backup.outputs.files_changed == 'true' && matrix.platform == 'ubuntu-latest' + run: | + git config --local user.email "github-actions[bot]@users.noreply.github.com" + git config --local user.name "github-actions[bot]" + git add backups/${{ matrix.postgresql_version }}/backup.sql + git commit -m "Auto updated backup.sql." + + - name: Push changes + if: steps.changed_backup.outputs.files_changed == 'true' && matrix.platform == 'ubuntu-latest' + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.PAT_TOKEN }} + branch: ${{ github.head_ref }} + test: runs-on: ubuntu-latest - name: Test postgres-restore + name: Test pg_dump services: postgres: image: postgres:9.6.24 @@ -30,6 +96,7 @@ jobs: with: fetch-depth: 0 # otherwise, you will failed to push refs to dest repo persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of your personal token + - name: Run pg_dump uses: ./ with: diff --git a/action.yml b/action.yml index 190ac03..bd2f201 100644 --- a/action.yml +++ b/action.yml @@ -2,6 +2,9 @@ name: pg-dump description: Run pg_dump to generate a backup author: tj-actions inputs: + postgresql_version: + description: 'Version of PostgreSQL. e.g 15' + required: false database_url: description: 'Database URL' required: true @@ -16,10 +19,20 @@ inputs: runs: using: 'composite' steps: + - name: Setup PostgreSQL + uses: tj-actions/install-postgresql@v2 + if: inputs.postgresql_version != '' + with: + postgresql-version: ${{ inputs.postgresql_version }} - run: | - mkdir -p $(dirname "${{ inputs.path }}") - pg_dump ${{ inputs.options }} -d "${{ inputs.database_url }}" > "${{ inputs.path }}" + bash $GITHUB_ACTION_PATH/entrypoint.sh shell: bash + env: + # INPUT_ is not available in Composite run steps + # https://github.community/t/input-variable-name-is-not-available-in-composite-run-steps/127611 + INPUT_PATH: ${{ inputs.path }} + INPUT_DATABASE_URL: ${{ inputs.database_url }} + INPUT_OPTIONS: ${{ inputs.options }} branding: icon: hard-drive color: white diff --git a/backups/12/backup.sql b/backups/12/backup.sql new file mode 100644 index 0000000..a0cd17a --- /dev/null +++ b/backups/12/backup.sql @@ -0,0 +1,22 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 12.16 (Debian 12.16-1.pgdg120+1) +-- Dumped by pg_dump version 12.16 (Ubuntu 12.16-1.pgdg22.04+1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- PostgreSQL database dump complete +-- + diff --git a/backups/14/backup.sql b/backups/14/backup.sql new file mode 100644 index 0000000..7033057 --- /dev/null +++ b/backups/14/backup.sql @@ -0,0 +1,22 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 14.9 (Debian 14.9-1.pgdg120+1) +-- Dumped by pg_dump version 14.9 (Ubuntu 14.9-1.pgdg22.04+1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- PostgreSQL database dump complete +-- + diff --git a/backups/15/backup.sql b/backups/15/backup.sql new file mode 100644 index 0000000..912adc1 --- /dev/null +++ b/backups/15/backup.sql @@ -0,0 +1,22 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 15.4 (Debian 15.4-1.pgdg120+1) +-- Dumped by pg_dump version 15.4 (Ubuntu 15.4-1.pgdg22.04+1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- PostgreSQL database dump complete +-- + diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..6afb598 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +set -euo pipefail + +echo "::group::pg-dump" + +echo "Checking if the output directory exists..." + +if [ ! -d "$(dirname "$INPUT_PATH")" ]; then + echo "The output directory does not exist. Creating it..." + mkdir -p "$(dirname "$INPUT_PATH")" + echo "Created the output directory" +else + echo "The output directory already exists" +fi + +echo "Running pg_dump..." + +# shellcheck disable=SC2086 +pg_dump $INPUT_OPTIONS -d "$INPUT_DATABASE_URL" > "$INPUT_PATH" + +echo "Complete" + +echo "::endgroup::"