この記事は岩手県立大学とか、岩手の人たち Advent Calendar 2021の 7 日目の記事です!
はじめに
gem のリリースを自動化したいと思い、GitHub Actions でできないかを調査してみました。
gem のリリースの方法は主に 2 つあります。
gem push-
releaseタスク-
bundlerにある rake タスク
-
GitHub Actions の公式ドキュメントにはgem pushの例はありますが、releaseタスクを用いた例はありません。
そこで、releaseタスクを用いた場合の方法を記事にしておきます。
workflow の準備
releaseタスクで gem をリリースする際の workflow は以下のようになります。
name: Ruby Gem
on:
workflow_dispatch:
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
with:
ruby-version: 3.0.0
- run: bundle install
- name: Setup git config
run: |
git config --global user.email "YOUR_EMAIL"
git config --global user.name "YOUR_NAME"
- name: Publish to RubyGems
run: bundle exec rake release
env:
GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
Ruby のバージョンや、event、git configに関してはお好きなものにどうぞ。
解説
公式の gem push の例と異なる部分の解説です。
- name: Setup git config
run: |
git config --global user.email "YOUR_EMAIL"
git config --global user.name "YOUR_NAME"
releaseタスクは、gem のバージョンに応じた git tag を自動で付与し、push してくれます。
そのため、gitconfigを用意してあげる必要があります。
- name: Publish to RubyGems
run: bundle exec rake release
releaseの rake タスクです。
env:
GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
bundlerのreleaseタスクの内部ではgem (gem pushのgem)が使われています。
そして、gemでは API Key をGEM_HOST_API_KEY環境変数から読むことができます。
https://guides.rubygems.org/command-reference/
The push command will use ~/.gem/credentials to authenticate to a server, but you can use the RubyGems environment variable GEM_HOST_API_KEY to set the api key to authenticate.
そのため、~/.gem/credentialsに API Key を用意しなくても認証できます。
Secrets に API Key を設定する
GitHub リポジトリのSettingsから Secrets を設定できます。
課題
RubyGems へのリリースに OTP 認証を必須とする設定もあります。
GEM_HOST_OTP_CODE環境変数に OTP コードを設定してあげると良さそうなのですが、現状試した限りだとうまく読み取ってくれませんでした。
もし、OTP 認証をうまくやれる方法があれば教えていただけると幸いです。
