GitHub Actionsで自動的にマイグレーション&DBバックアップが走るようにしてみた

経緯

仕事の関係で、ステージング環境へ自動的にマイグレーションを走らせたい&DBのバックアップを自動化したい状況があり、GitHub Actionsで自動化してみました。 これはその時のアレコレをまとめたものです。

つくったもの(サンプル)

github.com

仕事で書いているのがGoだったのでGoのmigrateを使っています。

やったこと

GitHub ActionsでDBのバックアップ

以下のようにservicesMySQLのコンテナを指定しています。これは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のマイグレーションを自動化する