経緯
仕事の関係で、ステージング環境へ自動的にマイグレーションを走らせたい&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のマイグレーションを自動化する