diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8374b2e..84f26f3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,9 +9,72 @@ on: - main jobs: + shellcheck: + name: Run shellcheck + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4 + - name: shellcheck + uses: reviewdog/action-shellcheck@v1.19 + test-postgresql: + name: Test pg_dump with PostgreSQL version + runs-on: ${{ matrix.platform }} + strategy: + fail-fast: false + matrix: + platform: [ubuntu-latest, windows-latest, macos-latest, macos-11, windows-2022] + 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 diff --git a/action.yml b/action.yml index 190ac03..95e6f6a 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 @@ -17,9 +20,15 @@ runs: using: 'composite' steps: - 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_POSTGRESQL_VERSION: ${{ inputs.postgresql_version }} + INPUT_PATH: ${{ inputs.path }} + INPUT_DATABASE_URL: ${{ inputs.database_url }} + INPUT_OPTIONS: ${{ inputs.options }} branding: icon: hard-drive color: white diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..c18968d --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,65 @@ +#!/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 + +if [[ -n "$INPUT_POSTGRESQL_VERSION" ]]; then + echo "Verifying version" + + # Check if the input is an integer + if ! [[ "$INPUT_POSTGRESQL_VERSION" =~ ^[0-9]+$ ]]; then + echo "Error: $INPUT_POSTGRESQL_VERSION is not a valid integer." + exit 1 + fi + + # Check if the input is between 10 and 15 (inclusive) + if (( INPUT_POSTGRESQL_VERSION < 10 || INPUT_POSTGRESQL_VERSION > 15 )); then + echo "Error: $INPUT_POSTGRESQL_VERSION is not between 10 and 15 (inclusive)." + exit 1 + fi + + echo "Validated postgresql version: $INPUT_POSTGRESQL_VERSION" + + echo "Installing postgresql..." + + if [[ "$(uname -s)" == "Linux" ]]; then + sudo apt-get update + sudo apt-get install -y "postgresql-$INPUT_POSTGRESQL_VERSION" + elif [[ "$(uname -s)" == "NT"* ]]; then + choco install postgresql --version="$INPUT_POSTGRESQL_VERSION" -y + elif [[ "$(uname -s)" == "Darwin" ]]; then + brew update + brew install "postgresql@$INPUT_POSTGRESQL_VERSION" + else + echo "Unsupported OS" + exit 1 + fi + + if [[ "$(uname -s)" == "NT"* ]]; then + echo "/Program Files/PostgreSQL/15/bin" >> "$GITHUB_PATH" + else + echo "/usr/lib/postgresql/15/bin" >> "$GITHUB_PATH" + fi + + echo "Installed postgresql" +fi + +echo "Running pg_dump..." + +# shellcheck disable=SC2086 +pg_dump $INPUT_OPTIONS -d "$INPUT_DATABASE_URL" > "$INPUT_PATH" + +echo "Complete" + +echo "::endgroup::"