🎼

コードの内容を正規表現でチェックして Danger で警告を出す

2021/07/02に公開

Danger とは?

Danger 使ったことない人のために軽く説明すると、Danger は プルリクエストをだすと、自動で lniter ツールなどから発行される警告をレビューコメントとして残してくれる といったソフトウェアです。

こういう風に優しく指摘してくれるわけです。

Danger は便利でプラグインもいろいろあって楽しいです。コードの lint はだいぶ網羅されてますし、textlint を使ったライティングのチェックもできるんで最高です。

https://github.com/danger/danger/

https://github.com/Kesin11/danger-textlint

この記事でやりたいこと

もともとセキュリティ対策として HTML を記述する時に「target="_blank" でリンクを作ったら rel="noopener noreferrer" が入ってないかチェックする」というルールが入ってるんですけど、これ、Danger からは普通のコメントとして投稿されるようになっていて、コードの特定の行の上に付くインラインコメントではありませんでした。

どこのこと言ってるのかわからないし…これは不満。

普通に人間がコードレビューする時みたいに「この行がおかしいですよ」って言わせたい。

というわけで結論

Dangerfile にはこんな風に書いてます。

active_files = (git.modified_files + git.added_files).uniq
active_files.each do |filename|
  next unless filename.end_with?('.html')

  chunk = git.diff_for_file(filename)
  next if chunk.binary?

  diff = chunk.patch.lines

  file = File.read(filename)
  file.lines.each_with_index do |l,i|
    # リンクチェック
    if l.match?(/_blank/) &&
      l.match?(/target/) &&
      l.match?(/https?:/) &&
      !l.match?(/noopener/) &&
      !l.match?(/example.jp\//) && # ← 自社ドメインを入れる
      diff.include?("+#{l}")
      warn('target="_blank" で外部サイトへのリンクを設置する場合は rel="noopener noreferrer" がついているか確認してください',
        file: filename, line: i+1)
    end
  end
end

タイトルに正規表現とか書いたけど、こんなレベルですまん笑。ちゃんと書き換えないとなと改めて思いました。

git.modified_files, git.added_files で追加変更したファイル名が取れるので、それらのファイルの中身をわりとベタに読み込ませてます。git オブジェクトの中身は以下のドキュメントを参考にしてどんなことができるのか調べました。

https://rubydoc.info/gems/git/Git

本当は diff の中身だけをチェックさせるのが効率的かと思うのですが、ファイルの何行目かを判定するためには diff に含まれる @@ -1,4 +1,5 @@ みたいなやつをパースする必要があってそれだけのためにコードがまあまあ増えそうだなと感じたので、今の方法でやってます。

目的は達成したのでヨシ、ですね。

Discussion