GitHub Actionsで自動的にマイグレーション&DBバックアップが走るようにしてみた
経緯
仕事の関係で、ステージング環境へ自動的にマイグレーションを走らせたい&DBのバックアップを自動化したい状況があり、GitHub Actionsで自動化してみました。 これはその時のアレコレをまとめたものです。
つくったもの(サンプル)
仕事で書いているのがGoだったのでGoのmigrateを使っています。
やったこと
GitHub ActionsでDBのバックアップ
以下のようにservicesにMySQLのコンテナを指定しています。これはDBのバックアップを取るため必要なCLIコマンドを実行できるようにするためですね。
name: "Auto migration"
runs-on: "ubuntu-latest"
services:
image: mysql:5.7
stepsで先ほど追加したMySQLのコンテナを使い、DBのバックアップを取得しています。
- name: backup mysql database
run: |
mkdir -p backup/staging
mysqldump --skip-column-statistics --single-transaction --set-gtid-purged=OFF -u ${{ secrets.MYSQL_USERNAME }} -p${{ secrets.MYSQL_PASSWORD }} -h ${{ secrets.MYSQL_DATABASE_HOST }} ${{ secrets.MYSQL_DATABASE_NAME }} > ./backup/staging/backup_`date '+%Y%m%d%H:%M:%S'`.dump
バックアップに必要なパスワードなどはsecrets経由で追加しています。
これでbakup/stagingディレクトリ内にDBのバックアップが保存されます。
S3へとアップロード
次にjakejarvis/s3-sync-actioを使い、S3へとバックアップをアップロードします。
- name: Push backups to S3 Bucket
uses: jakejarvis/s3-sync-action@master
with:
args: --follow-symlinks
env:
AWS_S3_BUCKET: ${{ secrets.AWS_BUCKET_NAME }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_KEY }}
AWS_REGION: ${{ secrets.AWS_BUCKET_REGION }}
SOURCE_DIR: 'backup'
同様にAWSへのアクセスキーなどはsecrets経由で渡しています。
これでS3のバケットにDBのバックアップがアップロードされます。
migrateでマイグレーション
最後にmigrateのインストールとマイグレーションを走らせます。
- name: install migrate
run: |
go get -tags 'mysql' github.com/golang-migrate/migrate/v4/cmd/migrate
- name: running migration
run: |
migrate -path ./migrate -database "mysql://${{ secrets.MYSQL_USERNAME }}:${{ secrets.MYSQL_PASSWORD }}@tcp(${{ secrets.MYSQL_DATABASE_HOST }})/${{ secrets.MYSQL_DATABASE_NAME }}" up
go get経由でmigrateを入れ、マイグレーションを走らせます。
これで自動でマイグレーションとDBのバックアップを行うものができました。
参考記事など
ref: golang-migrateでDBマイグレーション ref: appleboy/database-backup-action ref: valerianpereira/backup-action ref: 【Github Actions】CIのstepでmysqlにSQLを実行する ref: jakejarvis/s3-sync-action ref: GitHub ActionsでCloud SQLのマイグレーションを自動化する