Redmine Advent Calendar 2019の7日目です!6日めは「yuki476さん」の「チケットの書き方」でした。
RedmineプラグインをGitHub Actionsでテストしてみました。
ざっくり以下を行なっていました。
- 以前Travis-CIで行なっていたテストを移行した。
- いろいろなプラグインで使えるようにアクションを作成した。
ワークフローの作成
ワークフローを作成については、GitHubのサイト1にまとまっています。
Redmine Auto Assign Group Pluginで、テストを行うワークフローを作成しました。これを例に見ていきます。
name: CI
on:
push:
pull_request:
schedule:
- cron: '0 20 * * *' # JST 5:00
ワークフローの名前とトリガーとなるイベントを指定します。指定できるイベントはここに詳細があります。
この例では、プッシュ、プルリクエストとスケジュールでの実行を指定しています。
スケジュールに関しては、デフォルトブランチでのみ実行されます2。
Redmineのプラグインに関しては、Redmine本体側の修正の影響で動作しなくなるケースがあるので、日次でもテストを実行するようにしています。
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
steps:
- uses: actions/checkout@v1
ここからが、アクションの実行内容です。
まずは、リポジトリの内容をチェックアウト。
/home/runner/work/redmine_auto_assign_group/redmine_auto_assign_group
と言った感じのパスでチェックアウトされます。
- name: Setup System
run: |
sudo apt-get update
sudo apt-get install libsqlite3-dev
sqlite3でテストするので、必要なパッケージをインストール。
- 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のサポート期間が終了していることもあり、マトリクスの条件から外しています。
- name: Set up chromedriver
uses: nanasess/setup-chromedriver@master
with:
chromedriver-version: '77.0.3865.40'
テストにChrome headlessを使っているので、chromedriverをインストール。
こちらもアクションを作成されている方がいる6ので、サクッと書くだけ。
- 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」さんの「何か作ってみます :)」です。
-
Scheduled builds of non-default branch - GitHub Community Forum ↩
-
この投稿を準備していた前日12/6まではv2.3.xも動いていたが、setup-rubyでインストールできなかったと当日のスケジュールイベントでエラーになった。バッジがレッドで投稿したくなかったため、言い訳のために書いたのが本当のところもうちょっとあとで頑張るつもり。 ↩