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

[Redmine Advent Calendar 2019](https://adventar.org/calendars/4221)の7日目です！6日めは「yuki476さん」の「[チケットの書き方](https://qiita.com/yuki476/items/d8a2e68d47b94961de76)」でした。

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

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

### ワークフローの作成

ワークフローを作成については、GitHubのサイト[^1]にまとまっています。
[Redmine Auto Assign Group Plugin](https://github.com/two-pack/redmine_auto_assign_group)で、テストを行う[ワークフロー](https://github.com/two-pack/redmine_auto_assign_group/tree/master/.github/workflows)を作成しました。これを例に見ていきます。


```yaml:ci.yml
name: CI
on:
  push:
  pull_request:
  schedule:
    - cron: '0 20 * * *' # JST 5:00
```
ワークフローの名前とトリガーとなるイベントを指定します。指定できるイベントは[ここ](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/events-that-trigger-workflows)に詳細があります。
この例では、プッシュ、プルリクエストとスケジュールでの実行を指定しています。
スケジュールに関しては、デフォルトブランチでのみ実行されます[^2]。
Redmineのプラグインに関しては、Redmine本体側の修正の影響で動作しなくなるケースがあるので、日次でもテストを実行するようにしています。

```yaml: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](https://github.com/redmine/redmine)のブランチ/タグに対応しています。
rubyのバージョンはRedmineのサポートとしてはもっと広い[^4]のですが、[既にrubyとしてはサポート終了している](https://www.ruby-lang.org/ja/news/2019/03/31/support-of-ruby-2-3-has-ended/)ことからv2.4.x以降にしました。[^5]

```yaml:ci.yml
    steps:
      - uses: actions/checkout@v1
```
ここからが、アクションの実行内容です。
まずは、リポジトリの内容をチェックアウト。
**/home/runner/work/redmine_auto_assign_group/redmine_auto_assign_group**
と言った感じのパスでチェックアウトされます。

```yaml:ci.yml
      - name: Setup System
        run: |
          sudo apt-get update
          sudo apt-get install libsqlite3-dev
```
sqlite3でテストするので、必要なパッケージをインストール。

```yaml: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のサポート期間が終了していることもあり、マトリクスの条件から外しています。

```yaml:ci.yml
      - name: Set up chromedriver
        uses: nanasess/setup-chromedriver@master
        with:
          chromedriver-version: '77.0.3865.40'
```
テストにChrome headlessを使っているので、chromedriverをインストール。
こちらもアクションを作成されている方がいる[^6]ので、サクッと書くだけ。

```yaml: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](https://github.com/redmine/redmine)のブランチ/タグに対応しています。

ここまででワークフローの設定が完了ですが、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](https://github.com/two-pack/redmine-plugin-test-action) として作成しました。作成方法はGitHubのドキュメント[^9]を参考に進めました。ほとんど書いてある通りで進められました。
実質的な動作はシェルスクリプトで行なっており、内容もTravis-CI[^10][^11]で行なっていたのと同じです。シェルスクリプトの実行は、Chrome Driverのインストールを行うアクション[^8]を参考にしました。

### まとめ

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

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

[^1]: [GitHub アクションでワークフローを自動化する](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions)
[^2]: [Scheduled builds of non-default branch - GitHub Community Forum](https://github.community/t5/GitHub-Actions/Scheduled-builds-of-non-default-branch/td-p/32270)
[^3]: [GitHubアクションについて - 使用制限](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/about-github-actions#usage-limits)
[^4]: [Installing Redmine - Requirements - Ruby interpreter](http://www.redmine.org/projects/redmine/wiki/RedmineInstall#Ruby-interpreter)
[^5]: この投稿を準備していた前日12/6まではv2.3.xも動いていたが、setup-rubyでインストールできなかったと当日のスケジュールイベントでエラーになった。バッジがレッドで投稿したくなかったため、[言い訳のため](https://github.com/two-pack/redmine_auto_assign_group/issues/20)に書いたのが本当のところ:confounded:もうちょっとあとで頑張るつもり。
[^6]: [Setup Ruby for use with actions](https://github.com/marketplace/actions/setup-ruby-for-use-with-actions)
[^7]: [setup-ruby](https://github.com/actions/setup-ruby#setup-ruby)
[^8]: [setup-chromedriver](https://github.com/nanasess/setup-chromedriver)
[^9]: [JavaScript アクションを作成する](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/creating-a-javascript-action)
[^10]: [Travis Integration for Redmine Plugins](https://github.com/alexbevi/redmine_plugins_travis-ci)
[^11]: [RedmineプラグインのCI環境を作る](http://two-pack-sbs.blogspot.com/2014/07/redmineci.html)