MySQL: 4. GitHub Actions
This documentation is part of the GitHub Actions & GitLab CI guide. View the full guide here: Spin up a real MySQL 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 fully managed MySQL cloud service that simplifies deployment and management for production workloads:
- Unlimited connections and data transfers.
- Integrated phpMyAdmin web interface for easy database management.
- Hassle-free updates with one-click upgrades.
- Consistent performance and strong security on a private, dedicated infrastructure.
With Stackhero, you can have a reliable MySQL database ready in just a few minutes. Spend less time on setup and maintenance, and more time building your applications. Try MySQL cloud hosting on Stackhero today.
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 MySQL instance.
name: CI with MySQL
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
env:
STACKHERO_TOKEN: ${{ secrets.STACKHERO_TOKEN }}
STACK_NAME: ci-mysql-${{ 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 default-mysql-client
- name: Create the MySQL 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="mysql" \
--instance="$INSTANCE" \
--region="$REGION")
echo "SERVICE_ID=$SERVICE_ID" >> "$GITHUB_ENV"
stackhero service-wait-for --service="$SERVICE_ID"
- name: Run tests against MySQL
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.mysqlRootPassword')
# Run a trivial query against the database.
mysql --host="$host" --port=3306 --user=root --password="$password" --ssl-mode=REQUIRED -e "SELECT 1;"
echo "✅ MySQL 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 MySQL instance is deleted and you are not billed for unused resources.