はじめに
今回は、開発プロセスに欠かせない コード品質の自動レビュー について解説します。特に、DockerとGitHub Actionsを組み合わせることで、PHPのPHPStanやJavaScriptのESLintといった静的解析ツールをCI/CDパイプラインに組み込む方法を、具体的なコードを交えて紹介します。
なぜ静的解析ツールをCIに組み込むべきか
静的解析は、コードを実行せずにバグやコーディング規約違反を検出する手法です。CI(継続的インテグレーション)に静的解析を組み込むことで、以下のメリットが得られます。
- 問題の早期発見: バグや脆弱性を開発の初期段階で検知できます。
- コード品質の統一: チーム内で一貫したコーディングスタイルを保ちやすくなります。
- レビュー効率の向上: レビュー担当者は、スタイルガイドのチェックではなく、より本質的なロジックのレビューに集中できます。
- 手戻りの削減: コーディング規約違反をコミット前に自動で修正できるため、手戻りを減らせます。
コード品質を保つための静的解析の重要性
コード品質は、アプリケーションの長期的な保守性や開発速度に直結します。静的解析は、ヒューマンエラーによる単純なミスを見つけ出すだけでなく、より複雑なロジックの潜在的な問題を指摘してくれるため、ソフトウェアの信頼性を高める上で非常に重要な役割を果たします。
本記事で構築する自動レビューフローの全体像
本記事では、GitHubにプッシュされたプルリクエスト(PR)をトリガーに、GitHub Actionsが自動で起動し、Dockerコンテナ上でPHPStanとESLintを実行して、コード品質をレビューするフローを構築します。
静的解析ツールの選定と準備
プロジェクトの技術スタックに合わせたツールの選定
静的解析ツールは、使用する言語やフレームワークによって異なります。
- PHP: PHPStan、Psalm、PHP_CodeSnifferなど。PHPStanは、型チェックに優れており、バグの検出能力が高いことで知られています。
- JavaScript / TypeScript: ESLint、Prettierなど。ESLintはコーディング規約違反を、Prettierはコードのフォーマットを自動で修正してくれます。
- CSS: Stylelintなど。
本記事では、PHPStanとESLintを例に進めます。
ツールごとの設定ファイルの準備
各ツールには、プロジェクトのルールに合わせた設定ファイルが必要です。
- PHPStan: プロジェクトのルートディレクトリにphpstan.neonファイルを作成します。
YAML
# phpstan.neon
parameters:
level: 5 # 厳密さのレベル (0-9)
paths:
- app
- tests
- ESLint: プロジェクトのルートディレクトリに.eslintrc.jsファイルを作成します。
JavaScript
// .eslintrc.js
module.exports = {
root: true,
env: {
node: true,
browser: true,
es2021: true
},
extends: [
'eslint:recommended',
'plugin:vue/vue3-essential'
],
rules: {
// カスタムルールを追加
}
};
これらの設定ファイルをGitで管理することで、チーム全体で同じルールを適用できます。
Dockerコンテナでのツール実行環境の構築
CI環境で静的解析ツールを実行するには、ツールをインストールした環境が必要です。Dockerを利用すれば、CI環境に依存することなく、プロジェクト固有の環境でツールを実行できます。
ここでは、LaravelプロジェクトのDocker環境を前提に、既存のdocker-compose.ymlとDockerfileを利用します。
CI/CDパイプラインの構築
GitHub Actionsの概要とワークフローファイルの作成
GitHub Actionsは、GitHubのイベント(プッシュやプルリクエストなど)をトリガーに、定義された一連のタスク(ワークフロー)を自動で実行するCI/CDサービスです。
ワークフローは、プロジェクトの.github/workflowsディレクトリ内にYAMLファイルとして記述します。今回は、code-review.ymlというファイルを作成します。
プルリクエスト(PR)をトリガーにしたワークフローの定義
onセクションで、ワークフローを実行するトリガーを定義します。プルリクエストがmainブランチにオープンされたり、更新されたりしたときに実行するように設定します。
YAML
# .github/workflows/code-review.yml
name: Code Quality Review
on:
pull_request:
branches:
- main
Dockerコンテナを利用した静的解析の実行
jobsセクションで、実行するタスクを定義します。Dockerコンテナを利用して静的解析を行うには、docker-composeコマンドをGitHub Actionsのrunステップで実行します。
YAML
jobs:
static-analysis:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Build and start Docker containers
run: docker-compose up -d --build
- name: Run PHPStan static analysis
run: docker-compose exec -T app php vendor/bin/phpstan analyse
- name: Run ESLint static analysis
run: docker-compose exec -T frontend npm run lint
このワークフローは、以下の手順で実行されます。
- actions/checkout@v3: GitHubリポジトリのコードをチェックアウトします
- docker-compose up -d --build: docker-compose.ymlに基づき、コンテナをビルドして起動します
- docker-compose exec: execコマンドを使って、起動したコンテナ(appとfrontend)内で静的解析ツールを実行します
具体的なワークフローの実装
PHPStanを使ったPHPコードのレビュー
PHPStanのコマンドをワークフローに記述します。docker-compose.ymlで定義したappコンテナ(PHPアプリケーション)上でvendor/bin/phpstanを実行します。
YAML
- name: Run PHPStan static analysis
run: docker-compose exec -T app php vendor/bin/phpstan analyse
#-Tオプションは、ターミナルに関連付けずにコマンドを実行するためのもので、CI環境でのエラーを防ぐために重要です。
ESLintを使ったJavaScript/TypeScriptコードのレビュー
ESLintのコマンドも同様に、frontendコンテナ(JavaScriptアプリケーション)上で実行します。
YAML
- name: Run ESLint static analysis
run: docker-compose exec -T frontend npm run lint
この例では、package.jsonで定義されたlintスクリプトを実行しています。
実行結果の可視化とフィードバック
静的解析ツールがエラーを検出した場合、CIは失敗となり、プルリクエストにその情報が通知されます。
これにより、マージする前にコード品質の問題を確実に把握できます。さらに、GitHub ActionsのAnnotation機能を使えば、コードの行単位でエラーを指摘できるため、レビュー担当者と開発者の双方にとって非常に便利です。
まとめと応用
自動レビューフローのメリットとデメリット
メリット:
- 品質の保証: すべてのコードが一定の品質基準を満たしていることを保証できます
- 開発速度の向上: 手動でのレビュープロセスを省略し、開発者がより早くフィードバックを受け取れます
- 学習機会の提供: 静的解析ツールが指摘する問題を通して、開発者のスキルアップにつながります
デメリット:
- 初期設定の手間: ワークフローやツールの設定に初期コストがかかります
- 厳密さのバランス: 厳しすぎるルールは開発の妨げになるため、適切なバランスを見つける必要があります
- テストと組み合わせたより堅牢な品質保証
静的解析は、コードの構文や潜在的な問題を検出しますが、ロジックの正しさまでは保証しません。静的解析に加えて、ユニットテストやインテグレーションテストをCIパイプラインに組み込むことで、より堅牢な品質保証体制を構築できます。
チームでの運用方法と改善のヒント
- ルール共有: 静的解析の設定ファイルは、Gitで管理し、チーム全員で共有します。
- 強制力: ブランチ保護ルールを設定し、静的解析が成功しないとマージできないようにすることで、ルールへの強制力を持たせることができます。
- 定期的な改善: ツールが報告する新しい警告や、チームの成長に合わせて、ルールの厳密さを定期的に見直しましょう。
本記事ではDockerとGitHub Actionsを活用して、開発プロセスに静的解析によるコード品質の自動レビューを組み込む方法を解説しました。この仕組みを導入することで、チーム全体の生産性を向上させ、高品質なソフトウェア開発に貢献できることと思います。
安心安全のホワイト高還元SESに転職を考えている方へ
新しい挑戦に踏み出すことは、人生において重要な一歩です。 転職活動は自分自身を知り、成長する貴重な機会でもあり、夢や成長を追求するためには必要な要素の一つ になるかと思います。 どんな選択をされるにせよ、その決断があなたに取って素晴らしい未来を切り開くことを願っています! グラディートと一緒に誇れるエンジニアを目指しましょう!
■『株式会社グラディート』では受託開発・SES・ブランディングデザイン・事業コンサルティングなどを事業として行う都内のIT企業です。現在、不遇な待遇で困っているエンジニアさんは、ぜひ一度グラディートに相談してみてね!(年収査定・SESへの転職相談も承っております!)
株式会社グラディート採用情報はこちら▼
https://en-gage.net/gradito/
株式会社グラディート公式サイトはこちら▼
https://www.gradito.co.jp/
