Does PlanetScale Work With GitHub Actions?
PlanetScale and GitHub Actions work seamlessly together for CI/CD pipelines, enabling automated testing and deployments against serverless MySQL databases.
Quick Facts
How PlanetScale Works With GitHub Actions
PlanetScale integrates naturally with GitHub Actions through environment variables and the PlanetScale CLI. You authenticate via API tokens stored as GitHub Secrets, then use the `pscale` CLI or direct connection strings to interact with your database during workflow runs. This enables common patterns like running migrations, executing integration tests against a staging branch, and validating schema changes before merging to production. The real power comes from PlanetScale's branching feature: you can create ephemeral database branches in CI, run your test suite against them, then destroy them—perfect for Pull Request workflows. Developers typically store `PLANETSCALE_SERVICE_TOKEN` and `PLANETSCALE_ORG` as GitHub Secrets, then reference them in workflow YAML. Connection strings can be generated per-workflow, and the `pscale` CLI handles everything from branch creation to promotion. The experience is smooth because both tools are GitHub-native: Actions reads your repo context, PlanetScale CLI integrates with your deployment pipeline, and there's minimal friction between them.
Best Use Cases
GitHub Actions Workflow with PlanetScale Integration
brew install planetscale/tap/pscalename: Test with PlanetScale
on: [pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install pscale CLI
run: curl -L https://github.com/planetscaledb/cli/releases/latest/download/pscale_linux_amd64.tar.gz | tar xz
- name: Create PlanetScale branch for testing
run: |
export PSCALE_TOKEN=${{ secrets.PLANETSCALE_SERVICE_TOKEN }}
./pscale branch create ${{ secrets.PLANETSCALE_DATABASE }} ci-test-${{ github.run_id }} --from main
- name: Get connection string
id: db
run: |
export PSCALE_TOKEN=${{ secrets.PLANETSCALE_SERVICE_TOKEN }}
echo "connection_string=$(./pscale shell ${{ secrets.PLANETSCALE_DATABASE }} ci-test-${{ github.run_id }} --password ${{ secrets.PLANETSCALE_PASSWORD }})" >> $GITHUB_OUTPUT
- name: Run migrations
run: npm run migrate
env:
DATABASE_URL: ${{ steps.db.outputs.connection_string }}
- name: Run tests
run: npm test
env:
DATABASE_URL: ${{ steps.db.outputs.connection_string }}
- name: Cleanup branch
if: always()
run: |
export PSCALE_TOKEN=${{ secrets.PLANETSCALE_SERVICE_TOKEN }}
./pscale branch delete ${{ secrets.PLANETSCALE_DATABASE }} ci-test-${{ github.run_id }} --forceKnown Issues & Gotchas
Connection strings expire and cannot be reused across multiple workflow jobs
Fix: Generate fresh connection strings within each job or use the pscale CLI with service tokens instead of hardcoded strings
GitHub Actions runners may have firewall restrictions; PlanetScale requires HTTPS connections only
Fix: PlanetScale enforces SSL/TLS by default—just ensure your client certificates are configured correctly in connection strings
Deleting branches mid-workflow (e.g., in cleanup) can cause race conditions if other jobs still reference them
Fix: Use explicit dependency ordering with 'needs' and ensure cleanup happens only after all dependent jobs complete
Rate limiting on PlanetScale API during heavy concurrent workflows
Fix: Implement exponential backoff in your pscale CLI calls or use queued workflows to avoid simultaneous branch operations
Alternatives
- •GitHub Actions + Supabase (PostgreSQL alternative with built-in branching via Branching API)
- •GitHub Actions + Neon (PostgreSQL serverless with branch management via API)
- •GitHub Actions + AWS RDS Snapshots (traditional MySQL with automated ephemeral DB clones)
Resources
Related Compatibility Guides
Explore more compatibility guides