TimescaleDB: 4. GitHub Actions
This documentation is part of the GitHub Actions & GitLab CI guide. View the full guide here: Spin up a real TimescaleDB service from your GitHub Actions or GitLab CI pipeline, run your tests against it, and tear it down automatically.
Welcome to the Stackhero documentation!
Stackhero provides a ready-to-use TimescaleDB cloud solution designed to help you get up and running in minutes. Here is what you can look forward to:
- All the best plugins included, such as
PostGIS,PgVector, and more.- Convenient access to the PgAdmin web UI for easy database management.
- Simple, one-click updates to keep your deployment current.
- Reliable performance and strong security on your own private, dedicated infrastructure.
If you are looking to save time and streamline your workflow, Stackhero's TimescaleDB cloud hosting is designed to make your experience as smooth as possible. You can try it out in as little as 5 minutes!
To get started, you can 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 is configured with if: always() so it runs no matter what, making sure your TimescaleDB instance is deleted and you are not billed for unused resources.