4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Github Actionsを使って自動テスト(PHPunit)をパスしないとマージできないようにする

Posted at

自分でもCI/CD環境を構築したい!と思いつつ、CircleCIはチョット敷居が高い・・・。
と思ったら、GithubでもGithub Actionsを使って自動テストができるらしいことを知ったので設定してみました!

Githubアクションとは何なのか?

設定ファイル(yml)を元にイベント駆動で処理を実行してくれるCI/CDサービス。
Githubで用意した仮装サーバー(ランナーと呼ぶ)使ってジョブを実行する
個人利用の範囲なら無料で利用できる。

手順

1.アカウント連携
2.ワークフローファイル(./github/workflows/test.yml)を作成(編集)
3.プルリクを立ててActions実行の確認
4.ブランチ保護設定でワークフローを指定
5.テストに失敗するプルリクを立ててブランチが保護されているのを確認

アカウント連携をする

Github Actionsはリポジトリ管理の拡張機能なので、普通にgithubを使っている方でも利用のための設定をする必要があります。

といってもそれほど難しいことはなく、githubにログインした状態でリポジトリを閲覧できるページとかで表示されるGithub Actionsボタンを押すだけです。

*ここに画像挿入

これでアカウントとしてGithub Actionsを使えるようになりました。

ワークフローファイルの作成

アカウント連携をした後でリポジトリページを開くと、タブメニューにActionsが追加されているので、これをクリックします。
すると、↓のようにリポジトリの内容からワークフローの内容をサジェストしてくれているはずです!
image.png

Set up this workflowボタンを押すと、ymlのテンプレートが表示されます。

ymlファイルの項目解説

name: Laravel

on:
  # masterブランチへのpush時
  push:
    branches: [ master ]
  # masterブランチへのプルリク作成時
  pull_request:
    branches: [ master ]

#
jobs:
  laravel-tests:

    runs-on: ubuntu-latest

    steps:
    # 自動テスト用.envのを作成(.env.exampleをコピー)し、ライブラリインストール
    - uses: actions/checkout@v2
    - name: Copy .env
      run: php -r "file_exists('.env') || copy('.env.example', '.env');"
    - name: Install Dependencies
      run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
    # laravelの初期設定コマンド
    - name: Generate key
      run: php artisan key:generate
    - name: Directory Permissions
      run: chmod -R 777 storage bootstrap/cache
    # テスト用DB作成
    - name: Create Database
      run: |
        mkdir -p database
        touch database/database.sqlite
    # .envにテスト用環境変数を書き込みphpunit実行
    - name: Execute tests (Unit and Feature tests) via PHPUnit
      env:
        DB_CONNECTION: sqlite
        DB_DATABASE: database/database.sqlite
      run: vendor/bin/phpunit

ファイル内にコメントを書いてますが、
各項目の役割はこんな感じです↓

項目 役割
name ワークフローの名前
on どんな操作があった時にジョブを起動するか
jobs ワークフローで行われるジョブのグループ
runs-on ジョブを実行するランナー(CI/CD処理を行うサーバー)の設定
steps ジョブで段階的に実行される処理
uses コマンドを再利用可能な形に定義したもの。ワークフロー、パブリックリポジトリ、公開Dockerコンテナイメージで定義されているアクションを指定・使用できる
name 各stepsの名前
runs stepsで実行するコマンド
env ワークフローを実行する時の環境変数

参考:公式:ワークフローファイルを理解する

CI/CDを自分の手で設定したので備忘録として書いておくと、
ワークフロー・ジョブ・ステップの違いは
・ジョブはファイルによって実行されるCI/CD処理(自動テスト)内容のこと
・ステップはジョブを実行するための段階的手順のこと
・起動イベントを含めた処理全体をワークフロー
と捉えておけばいいのかな、と思いました。

ワークフロー実行の確認

ymlファイルを作るページからそのままプルリクエストを作りましょう。
image.png
※ テンプレートをそのまま使った場合、マージ先がmasterに向いてないとワークフローが実行されないので注意

また、Actionsタブからもワークフローの経過・結果を確認することができます。

ブランチ保護設定

最後に、ブランチ保護設定(ステータス)でワークフローと結びつける設定を行います。

Settings画面の左メニューBranchesを選択後、
Branch protection rules>Add Rulesをクリック。

image.png

Branch name patternに保護したいブランチの名前
Require status checks to pass before mergingにチェックを入れ、先ほど追加したワークフローを選択
・管理者にも保護ルールを適用させたい場合はInclude administratorsにチェック
をして、画面下部のCreateボタンで設定を確定します。

テスト失敗時にマージできないうことの確認

設定は全て完了したので、最後にテストコードが失敗した時にマージできなくなっていることを確認します。

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/');
        // 200でパスするケースを失敗するよう編集
        $response->assertStatus(300);
    }
}

↑をpushした後にプルリクのマージボタンを確認すると、マージできなくなっているのが分かります。
image.png

また、自分の場合はInclude administratorsにチェックを入れてなかったため、Use your administrator...にチェックを入れて制約を無視したマージができるようになっています。

補足

・設定に使うymlファイルの名前はなんでもOK。Githubは./github/workflowsにあるymlファイルを読み込んでGithub Actionsに使用する
・パブリックリポジトリである必要がある
・sqlite以外のDBを使用する場合はymlファイルの編集が必要

参考資料

Github Actions公式リファレンス
Github Actions 8ヶ月使ってみてわかったことまとめ
【Github Actions】プッシュ時にgithubに自動でテストを実行してもらおう!
GitHub Actionsを使ってLaravelアプリケーションをCI/CDする

4
6
0

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
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?