Does MySQL Work With GitHub Actions?
Yes, MySQL integrates seamlessly with GitHub Actions for testing, migrations, and CI/CD pipelines through service containers and native tooling.
Quick Facts
How MySQL Works With GitHub Actions
MySQL works excellently with GitHub Actions via Docker service containers that spin up isolated database instances for each workflow run. GitHub Actions provides built-in support for running MySQL in the job environment without additional configuration—you simply declare it as a service and it's available on localhost. This is ideal for testing applications that depend on MySQL: your tests can connect, create schemas, run migrations, and validate data integrity before deployment.
The developer experience is straightforward: define the MySQL service in your workflow YAML, pass credentials through environment variables, and your application code connects as it normally would. GitHub provides pre-built MySQL images (5.7, 8.0) with standard ports exposed. You can also use custom Docker images if you need specific configurations. The isolation means each workflow run gets a clean database state, eliminating test pollution across CI runs.
Common architectures involve running unit tests against an in-memory database (SQLite) and integration tests against MySQL. For production-like testing, you might seed the MySQL instance with fixtures before running test suites. Multi-database testing scenarios work well too—running tests against MySQL 5.7, 8.0, and even MariaDB in parallel matrix jobs.
Best Use Cases
Quick Setup
No installation needed; built into GitHub Actionsname: MySQL Integration Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: testdb
MYSQL_USER: testuser
MYSQL_PASSWORD: testpass
options: >-
--health-cmd="mysqladmin ping -h localhost"
--health-interval=10s
--health-timeout=5s
--health-retries=3
ports:
- 3306:3306
steps:
- uses: actions/checkout@v3
- name: Run Tests
run: |
mysql -h127.0.0.1 -utestuser -ptestpass testdb -e "SELECT 1;"
npm testKnown Issues & Gotchas
MySQL service takes 10-30 seconds to become ready; connecting immediately causes failures
Fix: Add a health check step using `wait-for-it.sh` or implement retry logic in your test suite before connecting
Root password and database initialization credentials must be set via environment variables; defaults are unpredictable
Fix: Always explicitly set MYSQL_ROOT_PASSWORD, MYSQL_DATABASE, and MYSQL_USER in the service container options
GitHub Actions MySQL service only persists for the duration of the job; data is lost after workflow completion
Fix: This is by design for isolation. Seed data fresh in each run or use database snapshots/fixtures loaded at job start
Port binding conflicts occur if multiple jobs run on the same runner without proper isolation
Fix: Use unique ports or separate runners; GitHub-hosted runners provide clean environments per job automatically
Alternatives
- •PostgreSQL with GitHub Actions (similar setup, different SQL dialect; better for some use cases)
- •Docker Compose in GitHub Actions (manual orchestration; more control but added complexity)
- •Cloud-hosted databases (AWS RDS, DigitalOcean Managed MySQL; eliminates local setup but adds latency/cost)
Resources
Related Compatibility Guides
Explore more compatibility guides