高木のブログ

GitHub Actions の ruby/setup-ruby で Ruby のバージョンを .ruby-version から取得して指定する

2022/12/27

以下の記事を読んで Ruby もできたらいいなと調べたら、書き方は違うができる方法がちゃんと用意されていた

GitHub Actions の setup-go や setup-node で指定されるバージョンを go.mod や .node-version から取ってくる - stefafafan の fa は3つです

これで Rails アプリとかの Ruby バージョンを上げる際に変更するファイルが1つ減らせる

やり方

with で ruby-version に .ruby-version と指定するだけ

      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: .ruby-version

default にしてもよい(.ruby-version、.tool-versions の順で読み込む仕様)

      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: default

もっというと、デフォルト値が default になっているので何も指定しなくても良かったりする
でもちゃんと書いた方が、.ruby-version から読み込んでいることが一目でわかるので親切だと思う

実装について

ついでにどうやって実現しているのか気になったからコードを読んだ
説明不要なシンプルな実装になってた

  if (rubyVersion === 'default') {
    if (fs.existsSync('.ruby-version')) {
      rubyVersion = '.ruby-version'
    } else if (fs.existsSync('.tool-versions')) {
      rubyVersion = '.tool-versions'
    } else {
      throw new Error('input ruby-version needs to be specified if no .ruby-version or .tool-versions file exists')
    }
  }

  if (rubyVersion === '.ruby-version') { // Read from .ruby-version
    rubyVersion = fs.readFileSync('.ruby-version', 'utf8').trim()
    console.log(`Using ${rubyVersion} as input from file .ruby-version`)
  } else if (rubyVersion === '.tool-versions') { // Read from .tool-versions
    const toolVersions = fs.readFileSync('.tool-versions', 'utf8').trim()
    const rubyLine = toolVersions.split(/\r?\n/).filter(e => /^ruby\s/.test(e))[0]
    rubyVersion = rubyLine.match(/^ruby\s+(.+)$/)[1]
    console.log(`Using ${rubyVersion} as input from file .tool-versions`)
  }

https://github.com/ruby/setup-ruby/blob/8a6667e214803d030def654bc64a71ceeec500d1/index.js


SNS でシェアする


ytkg

Written by ytkg, Twitter, GitHub