高木のブログ

【Github Actions】Dynamic Matrix を使って常に最新の Ruby バージョンでテストをする試み

2022/05/29

新しいバージョンが出る度にワークフローファイルを更新するのは面倒だなと思ったので試してみた

jobs:
  versions:
    name: Get versions
    runs-on: ubuntu-latest
    steps:
      - id: set-matrix
        name: Set Matrix
        run: |
          versions=$(
            curl -s https://raw.githubusercontent.com/ruby/setup-ruby/master/ruby-builder-versions.json |
              jq -c '[.ruby[]
                | select(test("preview|rc|debug") | not)
                | if test("^[a-z]") then . else .[0:3] end
                | select(. >= "2.5")]
                | unique'
            )
          echo "::set-output name=matrix::${versions}"
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
  build:
    needs: versions
    runs-on: ubuntu-latest
    strategy:
      matrix:
        ruby: ${{ fromJson(needs.versions.outputs.matrix) }}
    name: Ruby ${{ matrix.ruby }}
    steps:
    - uses: actions/[email protected]
    - name: Set up Ruby
      uses: ruby/setup-[email protected]
      with:
        ruby-version: ${{ matrix.ruby }}
        bundler-cache: true
    - name: Run the default task
      run: |
        bundle exec rake

001.png https://github.com/ytkg/ruby-dynamic-matrix-testing/actions/runs/1799057068

解説

versions というジョブで Ruby のバージョンのリストを生成している
GitHub Actions で使える Ruby のバージョンを ruby/setup-ruby リポジトリにある ruby-builder-versions.json から取得して、jq で絞り込みと加工をしている

$ curl -s https://raw.githubusercontent.com/ruby/setup-ruby/master/ruby-builder-versions.json |
  jq -c '[.ruby[]
    | select(test("preview|rc|debug") | not)
    | if test("^[a-z]") then . else .[0:3] end
    | select(. >= "2.5")]
    | unique'
["2.5","2.6","2.7","3.0","3.1","head"]

所感

一応動いたけど、jsonファイルのフォーマットが変わったり、そもそも無くなったりする可能性もあるので、いつまで機能するかわからない
管理しているリポジトリがそんなに多くなければ、ベタ書きで都度更新の方が良さそう

参考


ytkg

Written by ytkg, Twitter, GitHub