TimescaleDB: 4. GitHub Actions

This documentation is part of the GitHub Actions & GitLab CI guide. You can view the complete guide here: Launch a real TimescaleDB service from your GitHub Actions or GitLab CI pipeline, run your tests against it, and automatically tear it down.

Welcome to the Stackhero documentation!

Stackhero offers a ready-to-use TimescaleDB cloud solution designed to get you started within minutes. Here’s what you can expect:

  • All the top plugins included, such as PostGIS, PgVector, and many more.
  • Convenient access to the PgAdmin web interface for simplified database management.
  • Easy, one-click updates to keep your deployment up to date.
  • Reliable performance and enhanced security on your own private, dedicated infrastructure.

If you’re looking to save time and streamline your processes, Stackhero’s TimescaleDB cloud hosting is designed to make your experience as smooth as possible. You can try it out in just 5 minutes!

To get started, save the following as .github/workflows/ci.yml. From now on, every push and pull request will run tests against a real TimescaleDB instance.

name: CI with TimescaleDB

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    env:
      STACKHERO_TOKEN: ${{ secrets.STACKHERO_TOKEN }}
      STACK_NAME: ci-timescaledb-${{ github.run_id }}-${{ github.run_attempt }}
      INSTANCE: "10G"   # Change this as needed (see step 3)
      REGION: europe
    steps:
      - uses: actions/checkout@v4

      - name: Install the Stackhero CLI and the client
        run: |
          curl -fsSL https://www.stackhero.io/install.sh | sh
          apt-get update && apt-get install -y --no-install-recommends jq curl postgresql-client

      - name: Create the TimescaleDB service
        run: |
          set -euo pipefail
          STACK_ID=$(stackhero --format=script stack-create --name="$STACK_NAME")
          echo "STACK_ID=$STACK_ID" >> "$GITHUB_ENV"
          SERVICE_ID=$(stackhero --format=script service-add \
            --stack="$STACK_ID" \
            --service-store="timescaledb" \
            --instance="$INSTANCE" \
            --region="$REGION")
          echo "SERVICE_ID=$SERVICE_ID" >> "$GITHUB_ENV"
          stackhero service-wait-for --service="$SERVICE_ID"

      - name: Run tests against TimescaleDB
        run: |
          set -euo pipefail
          config=$(stackhero service-configuration-get --service="$SERVICE_ID" --format=json)
          host=$(echo "$config" | jq -r '.configuration.domain')
password=$(echo "$config" | jq -r '.configuration.password')
          # Run a trivial query against the database.
          PGPASSWORD="$password" psql "host=$host port=5432 user=admin dbname=admin sslmode=require" -c "SELECT 1;"
          echo "✅ TimescaleDB is reachable from CI."
          # You can run your own test suite here using the credentials above ...

      - name: Tear down (always, even on failure)
        if: always()
        run: |
          if [ -n "${SERVICE_ID:-}" ]; then
            stackhero service-delete --service="$SERVICE_ID" --confirm
            stackhero service-wait-for --service="$SERVICE_ID"
          fi
          if [ -n "${STACK_ID:-}" ]; then
            stackhero stack-delete --stack="$STACK_ID" --confirm
          fi

The teardown step uses if: always() to ensure it runs in all cases, making sure your TimescaleDB instance is deleted and you are not billed for unused resources.