search
LoginSignup
1

More than 3 years have passed since last update.

posted at

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でインストールできなかったと当日のスケジュールイベントでエラーになった。バッジがレッドで投稿したくなかったため、言い訳のために書いたのが本当のところ:confounded:もうちょっとあとで頑張るつもり。 

  6. Setup Ruby for use with actions 

  7. setup-ruby 

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

  9. Travis Integration for Redmine Plugins 

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

  11. setup-chromedriver 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1