【Laravel】GitHub Actionsでテストを自動実行する方法(Vite環境対応)

自作プログラミング言語 Laravel

はじめに

自動テストサーバはGoogle Cloudの Google Compute Engine を使いました。

なぜ既存のCircleCIやJenkinsを使わずに、自前で用意したかというと、幾つか理由があります。

  • コストパフォーマンス
  • カスタマイズ性

上記2つの理由でGCE上でテストサーバを作りました。昔CircleCIで自動テストサーバを構築してましたが、今回は自分で一から作りました。今回はGitHub Actions の学習も兼ねてです。

※セキュリティの観点でも、プライベートリポジトリが望ましいです。

自動テストサーバのスペック

  • リージョン: us-central1-f
  • マシンタイプ: e2-micro(無料枠)
  • OS: Ubuntu 22.04 LTS
  • ストレージ: 10GB永続標準ディスク

はい、上記の通り最小構成となっております。キツキツの1GBなので、今回はdockerは使わずにサーバ内に諸々インストールしてテストを実行しました。

念の為、スワップ領域を代用するように設定しました。

# 1. 2GBの空ファイルを作成(スワップ用の場所を確保)
sudo fallocate -l 2G /swapfile

# 2. パーミッションを制限
sudo chmod 600 /swapfile

# 3. ファイルをスワップ形式にフォーマット
sudo mkswap /swapfile

# 4. スワップを有効化
sudo swapon /swapfile

# 5. 再起動後も自動で有効になるように設定
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

#設定確認
free -h

GitHub Actions について(Self-hosted runner)

本来であれば、自動テストサーバは自前で用意せずとも、GitHub Actions でも無料(制限はありますが)で使うことができます。GitHub-hosted runnerと言われるものですね。

今回の私の場合は、 Self-hosted runner と言われるものです。

セルフホステッド ランナー - GitHubドキュメント
独自のランナーをホストして、GitHub Actionsワークフロー中でジョブの実行に使われる環境をカスタマイズできます。

セルフホステッド ランナー:

  • GitHub-hosted runners が提供するよりも、ハードウェア、オペレーティング システム、およびソフトウェア ツールをより詳細に制御できます。 オペレーティング システムとその他のすべてのソフトウェアを更新する責任があることに注意してください。
  • 会社が既に管理し、使用するために支払っているマシンとサービスを使用できるようにします。
  • GitHub Actions と共に無料で利用できますが、ランナー マシンのメンテナンス コストは、お客様の負担となります。
  • 処理能力やメモリの要件に応じて、カスタムのハードウェア構成を作成できます。たとえば、大規模なジョブを実行したり、ローカル ネットワーク内で使用可能なソフトウェアをインストールしたりするための構成が可能です。
  • セルフホステッド ランナー アプリケーションの自動更新プログラムを受け取ることができますが、自動更新を無効にすることもできます。
  • ジョブを実行するたびにクリーンなインスタンスを用意する必要はありません。
  • 物理環境、仮想環境、コンテナ、オンプレミス、クラウドなど、さまざまな環境に配置できます。

設定方法

まずは、プロジェクトにymlファイルを追加します。

ルート直下に.githubを作成します。その中にworkflows/test.yml を作成します。

test.yml の内容はこんな感じです。

name: Remote Test on Google Cloud

on: [push]

jobs:
  laravel-test:
    runs-on: self-hosted
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Run Tests
        #ここからサーバ内での処理
        run: |
          cd src
          composer install --no-interaction --prefer-dist --optimize-autoloader
          
          cp .env.example .env
          echo "APP_KEY=base64:$(openssl rand -base64 32)" >> .env
          echo "DB_CONNECTION=sqlite" >> .env
          echo "DB_DATABASE=:memory:" >> .env
          echo "VITE_SKIP_PRECOGNITION=true" >> .env

          mkdir -p public/build
          echo '{"resources/css/app.css": {"file": "assets/app.css", "src": "resources/css/app.css", "isEntry": true}, "resources/js/app.js": {"file": "assets/app.js", "src": "resources/js/app.js", "isEntry": true}}' > public/build/manifest.json
          
          php artisan test

on: [push] 自動テスト実行のトリガーとなる操作。(対象ブランチを指定することも可能)

steps:
– name: Checkout code
uses: actions/checkout@v4

ここでソースを落としてます。GitHub上のソースコードを、GCE(テストサーバー)の actions-runner 作業ディレクトリ内にコピーしてくる処理です。

– name: Run Tests

からが、サーバ内で実行する処理になります。私の場合、Laravel プロジェクトをdockerで構築しているので、vendor以下に何も入っていないので、composer でインストールしたりしてます。

そして、↓でNode.js(npm)をインストールせず、ビルドもせず、「フロントエンドのフリ」をしてバックエンドのテストを通してます。なぜかというと冒頭で説明したように、実行サーバのメモリが少ないからです、、、

 mkdir -p public/build
          echo '{"resources/css/app.css": {"file": "assets/app.css", "src": "resources/css/app.css", "isEntry": true}, "resources/js/app.js": {"file": "assets/app.js", "src": "resources/js/app.js", "isEntry": true}}' > public/build/manifest.json

GitHub のリポジトリの設定画面を開きます。Actions → Runners の項目を押します。画面右上にある New self-hosted runner ボタンを押します。OS選択できるところがあるので、サーバのOSに合わせて選択してください。

Download
# Create a folder
$ mkdir actions-runner && cd actions-runner# Download the latest runner package
$ curl -o actions-runner-linux-x64-2.334.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.334.0/actions-runner-linux-x64-2.334.0.tar.gz# Optional: Validate the hash
$ echo "048024cd2c848eb6f14d5646d56c13a4def2ae7ee3ad12122bee960c56f3d271  actions-runner-linux-x64-2.334.0.tar.gz" | shasum -a 256 -c# Extract the installer
$ tar xzf ./actions-runner-linux-x64-2.334.0.tar.gz

Configure
# Create the runner and start the configuration experience
# 実際のトークンは機密情報のため伏せ字にしています
$ ./config.sh --url https://github.com/[YOUR_USER_NAME]/[YOUR_REPO_NAME] --token [YOUR_TEMP_TOKEN] # Last step, run it!
$ ./run.sh

Using your self-hosted runner
# Use this YAML in your workflow file for each job
runs-on: self-hosted

実際のコマンドは各自の画面で異なるため、必ず、GitHubの画面上からコピペしてください。

上記を実行することでシェルスクリプトが起動され、監視してくれます。(フォアグラウンド実行なので、ssh切断すると監視は止まります。)

ホスト名@test:~/saunas-rally/actions-runner$ ./run.sh

√ Connected to GitHub

Current runner version: '2.334.0'
2026-04-25 09:24:04Z: Listening for Jobs
2026-04-25 09:30:21Z: Running job: test
2026-04-25 09:30:32Z: Job test completed with result: Failed
2026-04-25 09:35:16Z: Running job: laravel-test
2026-04-25 09:35:36Z: Job laravel-test completed with result: Failed
2026-04-25 09:38:26Z: Running job: laravel-test
2026-04-25 09:38:45Z: Job laravel-test completed with result: Failed
2026-04-25 09:42:06Z: Running job: laravel-test
2026-04-25 09:42:21Z: Job laravel-test completed with result: Succeeded
2026-04-25 09:46:47Z: Running job: laravel-test
2026-04-25 09:47:06Z: Job laravel-test completed with result: Succeeded

√ Connected to GitHub

Current runner version: '2.334.0'
2026-04-25 09:54:22Z: Listening for Jobs

SSH切断しても監視してもらうには

sudo ./svc.sh install
sudo ./svc.sh start

#状態確認
sudo ./svc.sh status

これでpush時に自動テストが実行されるようになります。

最後に

今回は自前のサーバで自動テスト環境を作りましたが、結構面倒いので、Jenkins などを使った方が楽かもしれませんね、、、

コメント

タイトルとURLをコピーしました