しおメモ

雑多な技術系ブログです。ニッチな内容が多いです。

gemパッケージのCI/CDをGitHub Actionsに移行した

GitHub Actionsを使ってみたかったので、gemパッケージのrake specrubygems.orgへのpushを自動化してみました。

GitHub Actionsの準備

Travis CIなど他のCIと同じく、yamlファイルで設定を記述して、ワークフローを構築します。 yamlファイルはリポジトリ内の.github/workflowsにまとめて置きます。

yamlファイルはActionsのタブから、ブラウザのエディタでも記述することができます。

f:id:scior:20200203005607p:plain

使い方自体の詳細は、下記公式ドキュメントや他の記事を参考にしてみてください。

https://help.github.com/en/actions/automating-your-workflow-with-github-actions

PRに対してRSpecテストを実行する

こちらはRubyのテンプレートがあるので、それを少し修正すれば問題ないです。
Actionsタブにもサジェストされます。

name: RSpec

on: pull_request

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up Ruby 2.6
      uses: actions/setup-ruby@v1
      with:
        ruby-version: 2.6.x
    - name: Build and test with Rake
      run: |
        gem install bundler
        bundle install --jobs 4 --retry 3
        bundle exec rake spec

on:の部分がトリガーになるので、ここを目的のpull_requestに変えておきます。

masterへのpushでgemをアップロードする

こちらもテンプレートがありますが、多少手を加えました。

name: Ruby Gem

on:
  push:
    branches:
      - master

jobs:
  build:
    name: Build + Publish
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up Ruby 2.6
      uses: actions/setup-ruby@v1
      with:
        version: 2.6.x

    - name: Build and test with Rake
      run: |
        gem install bundler
        bundle install --jobs 4 --retry 3
        bundle exec rake

    - name: Publish to RubyGems
      run: |
        mkdir -p $HOME/.gem
        touch $HOME/.gem/credentials
        chmod 0600 $HOME/.gem/credentials
        printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
        gem build *.gemspec
        gem push *.gem
      env:
        GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_AUTH_TOKEN}}

masterプッシュへのトリガーだけで良いので、on:の部分は上記のようにします。

GitHub Packageは今回は対象外なので、そちらは削除しています。
(GPRを設定したい場合こちら: https://help.github.com/en/github/managing-packages-with-github-packages/configuring-rubygems-for-use-with-github-packages)

gemをpushする前に、テストを走らせたいので、先程のrake specの部分を直前に差し込みます。 Secretsの値は後からセットします。

GitHubのレポジトリの設定

Secretsに.gems/credentialsの中のトークンを値としたキーを作っておきます。

f:id:scior:20200203005712p:plain

PRのマージの条件にCIパスを設定したい場合、Settings > Branchesから以下のようにします。 (この辺りの機能はころころ変わるので、画像と異なる場合があります)

f:id:scior:20200203005638p:plain

動くとこのようになります。

f:id:scior:20200203010056p:plain