この記事は岩手県立大学とか、岩手の人たち 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 認証をうまくやれる方法があれば教えていただけると幸いです。