RedmineプラグインをGitHub Actionsでテストする


Redmine Advent Calendar 2019の7日目です!6日めは「yuki476さん」の「チケットの書き方」でした。

RedmineプラグインをGitHub Actionsでテストしてみました。
ざっくり以下を行なっていました。

  • 以前Travis-CIで行なっていたテストを移行した。
  • いろいろなプラグインで使えるようにアクションを作成した。

ワークフローの作成

ワークフローを作成については、GitHubのサイト1にまとまっています。
Redmine Auto Assign Group Pluginで、テストを行うワークフローを作成しました。これを例に見ていきます。

ci.yml
name: CI
on:
  push:
  pull_request:
  schedule:
    - cron: '0 20 * * *' # JST 5:00

ワークフローの名前とトリガーとなるイベントを指定します。指定できるイベントはここに詳細があります。
この例では、プッシュ、プルリクエストとスケジュールでの実行を指定しています。
スケジュールに関しては、デフォルトブランチでのみ実行されます2
Redmineのプラグインに関しては、Redmine本体側の修正の影響で動作しなくなるケースがあるので、日次でもテストを実行するようにしています。

ci.yml
jobs:
  one:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        ruby:
          - v2.4.x
          - v2.5.x
          - v2.6.x
        redmine:
          - 3.4-stable
          - 4.0-stable
          - master
        exclude:
          - ruby: v2.5.x
            redmine: 3.4-stable
          - ruby: v2.6.x
            redmine: 3.4-stable

テストするrubyとRedmineのバージョンをマトリクスで指定します。同時実行数は無料の場合は20まで3です。exclude指定で条件を除くことができます。
DBに関しては、Travis-CIの頃からやっていなかったので今回も見送りました。
Redmineのバージョンは、RedmineのGitHubのブランチ/タグに対応しています。
rubyのバージョンはRedmineのサポートとしてはもっと広い4のですが、既にrubyとしてはサポート終了していることからv2.4.x以降にしました。5

ci.yml
    steps:
      - uses: actions/checkout@v1

ここからが、アクションの実行内容です。
まずは、リポジトリの内容をチェックアウト。
/home/runner/work/redmine_auto_assign_group/redmine_auto_assign_group
と言った感じのパスでチェックアウトされます。

ci.yml
      - name: Setup System
        run: |
          sudo apt-get update
          sudo apt-get install libsqlite3-dev

sqlite3でテストするので、必要なパッケージをインストール。

ci.yml
      - name: Set up Ruby
        uses: actions/setup-ruby@v1
        with:
          ruby-version: ${{ matrix.ruby }}

      - name: Update gems
        run: |
          gem update --system

rubyのインストールとgemのアップデート。
rubyはインストール用のアクション6が用意されているので、マトリクスのバージョンを取ってきて指定するだけです。
ただ、v2.2.x、v2.3.xはインストールしようとするとキャッシュにないためインストールに失敗7します。上で書いた通り、rubyのサポート期間が終了していることもあり、マトリクスの条件から外しています。

ci.yml
      - name: Set up chromedriver
        uses: nanasess/setup-chromedriver@master
        with:
          chromedriver-version: '77.0.3865.40'

テストにChrome headlessを使っているので、chromedriverをインストール。
こちらもアクションを作成されている方がいる6ので、サクッと書くだけ。

ci.yml
      - name: Redmine plugin test
        uses: two-pack/redmine-plugin-test-action@v1
        with:
          plugin-name: redmine_auto_assign_group
          redmine_version: ${{ matrix.redmine }}

ここがテストを実行するアクションの呼び出し部分です。
プラグインの名前とRedmineのバージョンを指定します。
ここではRedmineのバージョンをマトリクスでの設定で指定しています。前述の通りRedmineのGitHubのブランチ/タグに対応しています。

ここまででワークフローの設定が完了ですが、YAMLファイルをGitHubのリポジトリにコミットする際、以下のエラーが出ました。

! [remote rejected] master -> master (refusing to allow an OAuth App to create or update workflow `.github/workflows/ci.yml` without `workflow` scope)

以下の情報を見つけたので、Personal Access Tokenを発行することでコミットできました。
https://github.com/gitextensions/gitextensions/issues/4916

バッジについて

ワークフローのステータスを表示するバッジも用意されています。
https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/configuring-a-workflow#referencing-a-container-on-docker-hub

テスト実行のアクションについて

テスト実行のアクションは、各種プラグインでも使えるように Redmine plugin test action として作成しました。作成方法はGitHubのドキュメント8を参考に進めました。ほとんど書いてある通りで進められました。
実質的な動作はシェルスクリプトで行なっており、内容もTravis-CI910で行なっていたのと同じです。シェルスクリプトの実行は、Chrome Driverのインストールを行うアクション11を参考にしました。

まとめ

Travis-CIにはとてもお世話になってましうたが、GitHubで完結する形でCIを行えるのも、なかなかいいなと思いました。比較的簡単に実現できるので、プラグイン開発時に使っていけるといいなと思います。

明日は「akiko_pusu」さんの「何か作ってみます :)」です。


  1. GitHub アクションでワークフローを自動化する 

  2. Scheduled builds of non-default branch - GitHub Community Forum 

  3. GitHubアクションについて - 使用制限 

  4. Installing Redmine - Requirements - Ruby interpreter 

  5. この投稿を準備していた前日12/6まではv2.3.xも動いていたが、setup-rubyでインストールできなかったと当日のスケジュールイベントでエラーになった。バッジがレッドで投稿したくなかったため、言い訳のために書いたのが本当のところもうちょっとあとで頑張るつもり。 

  6. Setup Ruby for use with actions 

  7. setup-ruby 

  8. JavaScript アクションを作成する 

  9. Travis Integration for Redmine Plugins 

  10. RedmineプラグインのCI環境を作る 

  11. setup-chromedriver