GitHub Actions を使って継続的インテグレーションを設定する

:mag: 概要

Discourse 向けの堅牢な拡張機能を構築する際、プラグインまたはテーマコンポーネントに継続的インテグレーション (CI) を組み込むと賢明です。これにより、エラーを早期に検出し、コードにバグが発生する可能性を低減できます。

GitHub Actions を使用してビルドとテストを自動化するための CI ワークフローを設定することは、Discourse チームがすべてのコンポーネントで採用しているアプローチであり、あなたにも同じことをお勧めします。

:gear: セットアップ

GitHub Actions による自動化ワークフローを追加して検出を行うには、リポジトリのルートディレクトリに .github/workflows フォルダを作成する必要があります。

workflows フォルダ内では、GitHub Actions が実行する必要がある一連の自動化処理を定義できます。例えば、リンティングやテスト用の .yml ファイルなどが挙げられます。

プラグインテーマコンポーネント 両方に対応するテンプレートワークフローを作成しました。これらは、こちら にある当社の「再利用可能なワークフロー」定義に接続されています。

テンプレートのスケルトンリポジトリでは、GitHub 上で Use this template ボタンをクリックすることで、テンプレートに基づいたプラグイン/テーマコンポーネントのリポジトリを作成できます。

または、すでにプロジェクトが存在し、そこにワークフローを追加したい場合は、関連するワークフローをリポジトリの .github/workflows/ フォルダにコピーするだけです。

:electric_plug: プラグイン: discourse-plugin.yml

:jigsaw: テーマおよびテーマコンポーネント: discourse-theme.yml

:point_up: これらのテンプレートは、再利用可能なワークフローの特定のメジャーバージョンにロックされています。ワークフローに行った小さな改善は、あなたのテーマ/プラグインに自動的に反映されます。破壊的な変更(例:新しいリンターを導入する場合)がある場合、再利用可能なワークフローのメジャーバージョンを上げ、ワークフローを新しいバージョンを指すように更新する必要があります。

:tada: 完成です!セットアップはこれで完了です。リポジトリにコミットまたは PR を作成するだけで、GitHub Actions がワークフローを自動検出し、ジョブの実行を開始します。

GitHub Actions は各テストの内訳を表示し、実行後、テストが成功したか失敗したかに応じて :white_check_mark: または :x: を表示します。

テストが失敗した場合、詳細をクリックすると何が失敗したかに関する情報が得られ、コードの問題点や修正すべき点の手がかりが得られるかもしれません。

例を見る

:white_check_mark: 独自のテストを追加する

プラグインやコンポーネントのテストを効果的に機能させるためには、プラグインまたはテーマコンポーネントに対してテストを書くことが重要です。

EmberJS を使用したフロントエンドテストの書き方に関する詳細は、以下のリンクを参照してください:

Rails を使用した RSpec テストの書き方に関する詳細は、以下のリンクを参照してください:

:bulb:

皆さんのために、堅牢なテストが統合されているプラグインやテーマコンポーネントの例をいくつか選んでみました:


このドキュメントはバージョン管理されています。変更を提案するには GitHub をご利用ください。

「いいね!」 15

GitHub - discourse/discourse-theme-skeleton: Template for Discourse themes を明示的に言及し、それらのファイルの変更に注意するためにウォッチする必要があることを指摘するとよいでしょう。

「いいね!」 4

再利用可能なワークフローがマージされ、テンプレートから作成された新しいリポジトリがテンプレートリポジトリから直接ワークフローを使用するようになれば、この部分は関連性が低くなることが期待されます。

「いいね!」 2

@pfaffman@Simon_Manning、ありがとうございます。良い点ですね。OPをそれに応じて更新しました。

「いいね!」 4

OPを更新し、新しい「再利用可能なワークフロー」の使用方法に関する説明を追加しました。ワークフロー定義に加えるマイナーな変更は、手作業なしでテーマ/プラグインに自動的に適用できるようになります。

「いいね!」 3

最新の tests-passed および stable に対してプラグインをテストするために、何か特別なことをする必要がありますか?

「いいね!」 1

プラグインスケルトンワークフローは以下を使用しており、これはデフォルトのブランチ、つまりmainに対してテストされると思います。再利用可能なワークフローにはオプションのcore_ref入力があり、私の知る限り、それがない場合、discourse/discourseリポジトリのデフォルトブランチがチェックアウトされます。

jobs:
  ci:
    uses: discourse/.github/.github/workflows/discourse-plugin.yml@v1

これが実際にmainに限定してテストされるかどうかは断言できませんが、もしそうであれば、テストしたい各リファレンスに対して1回実行するマトリックス戦略を追加できます。

jobs:
  ci:
    strategy:
      matrix:
        target: [tests-passed, stable]
    uses: discourse/.github/.github/workflows/discourse-plugin.yml@v1
    with:
      core_ref: ${{ matrix.target }}
「いいね!」 3

はい、これで大丈夫でしょう。または、マトリックスを使用せずに、2つのジョブを手動で記述することもできます。

name: Discourse Plugin

on:
  push:
    branches:
      - main
  pull_request:

jobs:
  ci:
    uses: discourse/.github/.github/workflows/discourse-plugin.yml@v1

  ci-stable:
    uses: discourse/.github/.github/workflows/discourse-plugin.yml@v1
    with:
      core_ref: stable

ただし、注意点として、これらのジョブは .discourse-compatiblity をチェックしません。そのため、このファイルを使用せず、同時に mainstable の両方との互換性が必要なプラグインでのみ、これを行う価値があります。

CDCK のすべての公開テーマ/プラグインでは、ディスコース互換性エントリを追加して、すべての安定リリースでそれらを「フリーズ」します。そうすれば、開発中に安定互換性を気にする必要がなくなります。

「いいね!」 5

お二人ともありがとうございます。

ええ、おそらくそれが最も簡単なアプローチでしょう。唯一の欠点は、機能(および新しいバグ修正)が遅れる可能性があることです。

「いいね!」 2