概要
開発をする時、コードの品質を高めるためにLintなどの静的解析ツールを使います。しかし、静的解析ツールは一般的なルールしか提供せず、すべてのルールを提供しません。そのため、静的解析ツールが提供していないルールをコード検査に追加したい場合は、Lintのカスタムルールを追加して使ったりします。
このように追加したカスタムルールはLintの対象となるコードだけ検査が可能ですが、コメントなどの部分は検査を行えない場合があります。このような場合、Semgrep
を使って正規表現を使ってカスタムルールを作成することができます。
Semgrep
Semgrep
はコードの安全性、品質、スタイルを自動で検査して改善するための静的解析ツールです。主にソースコードを解析してセキュリティ脆弱性、バグ、コード品質の問題を見つけるのに使われます。
- Semgrep: https://github.com/semgrep/semgrep
Semgrep
はユーザー定義ルールを正規表現パターンで書くことができます。これを使うとLintなどの静的解析ツールでは検査が難しい部分を検査することができます。
今回のブログポストでは、Semgrep
を使って正規表現でコードを検査する方法について説明します。
Semgrepのインストール
Semgrep
はPythonで動作するため、基本的にPythonがインストールされている必要があります。各OSにPythonをインストールする方法は省略します。
Semgrep
はPythonパッケージとしてインストールすることができます。Semgrep
をインストールするために次のコマンドを実行します。
pip install semgrep
インストールしたら、他の場所でも使えるようにrequirements.txt
を作成します。
pip freeze > requirements.txt
requirements.txt
を開くと、次のような内容が追加されていることを確認できます。
semgrep==1.97.0
このrequirements.txt
を使って、他の場所でSemgrep
をインストールするためには次のコマンドを使います。
pip install -r requirements.txt
Semgrepルールの設定
次は、Semgrep
を使って正規表現でコードを検査するためのコードルールを作成してみます。まず、code-rules.yaml
ファイルを作成し、次の内容を書きます。
rules:
- id: missing-param-description
severity: ERROR
message: 【Comment error】 Add correct comment.
languages:
- javascript
- typescript
patterns:
- pattern-regex: \*\s*@.*-\s*(\n|\r\n|$)
このルールは次のような内容を検査します。
❌ Incorrect
次のようにコメントを書いていないまま-
を残している場合、エラーが発生します。
/**
* Add two numbers
* @param {number} a - number for addition
* @param {number} b -
* @returns {number}
*/
✅ Correct
次のようにすべてのコメントが書かれている場合、エラーは発生しません。
/**
* Add two numbers
* @param {number} a - number for addition
* @param {number} b - number for addition
* @returns {number}
*/
Semgrepの実行
次はSemgrep
を使ってコードを検査してみましょう。次のコマンドを実行すると、Semgrep
がコードを検査して結果を出力します。
semgrep --config=code-rules.yaml --error
このコマンドを実行すると、次のような結果が確認できます。
┌──── ○○○ ────┐
│ Semgrep CLI │
└─────────────┘
Scanning 7035 files (only git-tracked) with 1 Code rule:
CODE RULES
Scanning 5089 files.
SUPPLY CHAIN RULES
No rules to run.
PROGRESS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
┌──────────────────┐
│ 93 Code Findings │
└──────────────────┘
apps/sample/view/index.ts
❯❯❱ missing-param-description
【Comment error】 Add correct comment.
12┆ * @param {Params} params -
13┆ * @return {number}
...
GitHub Actions
このように設定したSemgrep
を使って、GitHub Actionsでコードを検査することができます。.github/workflows/semgrep.yml
ファイルを作成し、次の内容を書きます。
name: Check code by Semgrep
on:
pull_request:
jobs:
semgrep:
name: Check code by Semgrep
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: '3.13'
cache: 'pip'
- run: pip install -r requirements.txt
- name: Run Semgrep
run: |
semgrep --config=code-rules.yaml --error
これでGitHub ActionsでPRを作成すると、次のようなエラーが発生することが確認できます。
Run semgrep --config=code-rules.yaml --error
METRICS: Using configs from the Registry (like --config=p/ci) reports pseudonymous rule metrics to semgrep.dev.
To disable Registry rule metrics, use "--metrics=off".
Using configs only from local files (like --config=xyz.yml) does not enable metrics.
More information: https://semgrep.dev/docs/metrics
┌─────────────┐
│ Scan Status │
└─────────────┘
Scanning 7034 files tracked by git with 1 Code rule:
Scanning 5087 files.
┌──────────────────┐
│ 93 Code Findings │
└──────────────────┘
apps/agencyTool/src/feature/AdminStaffDetailDialog/controller/actions/initialize/index.ts
❯❯❱ missing-param-description
【Comment error】 Add correct comment.
12┆ * @param {Params} params -
13┆ * @return {number}
...
完了
以上で、Semgrep
を使って正規表現でコードを検査する方法について説明しました。Semgrep
を使うと、Lintなどの静的解析ツールでは検査が難しい部分を検査することができます。
コードレビューで同じ問題が繰り返し指摘されている場合は、まずESLintなどの静的解析ツールにその問題に関するルールがあるかどうかを調べ、ある場合はそのルールを追加します。
もし、そのルールがなく、その問題が定型化されたパターンを持っている場合は、Semgrep
を使って正規表現でコードを検査する方法を試してみてください。
このブログポストがSemgrep
を使ってコードの品質を向上させるのに役立てば幸いです。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。