Ridgepole利用時のCI(GitHub Actions)設定

下記のようにGitHub Actionsの設定を書いてPRが出された時点で

  • ridgepole applyで差分実行が正常に実行できるか(bin/rails db:drop db:create ridgepole:applyでは正常扱いになってしまうが差分適用時にはエラーになるもの)
  • 差分適用のために生成されるDDL等が問題ないか(意図しないDDL等が発行されてないか)

を確認できるような運用にしています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    - name: Ridgepole Apply
      run: |
        # ベースブランチのスキーマでapply
        docker-compose exec -T app bin/rails db:create
        git checkout ${{ github.base_ref }}
        docker-compose exec -T app bin/rails ridgepole:apply

        # ソースブランチのスキーマでdry-runとapply
        git checkout ${{ github.head_ref }}
        rp_res=`docker-compose exec -T app bin/rails ridgepole:dry_run`
        echo 'rp_res<<EOF' >> $GITHUB_ENV # https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings
        echo "${rp_res}" >> $GITHUB_ENV
        echo 'EOF' >> $GITHUB_ENV
        docker-compose exec -T app bin/rails ridgepole:apply
    - name: Post Ridgepole dry run results to PR
      uses: thollander/actions-comment-pull-request@v1
      with:
        # ベースブランチとソースブランチの差分で適用されるDDL等を表示
        message: |
          Ridgepole dry run results
          ```
            ${{ env.rp_res }}
          ```
        comment_includes: 'Ridgepole dry run results'
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

rough ridgepole.rake example:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
namespace :ridgepole do
  task apply: :environment do
    ridgepole('--apply')
  end

  task dry_run: :environment do
    ridgepole('--apply', '--dry-run')
  end

  def ridgepole(*options)
    # drop-table optionがないとテーブルが削除されません
    command = ['bundle exec ridgepole --file db/Schemafile', '-c config/database.yml', '--drop-table', "-E #{Rails.env}"]
    o, e, s = Open3.capture3((command + options).join(' '))
    puts o.presence || e

    raise e unless s.success?
  end
end
Built with Hugo
テーマ StackJimmy によって設計されています。