読者です 読者をやめる 読者になる 読者になる

はむはむエンジニアぶろぐ

このブログのコンセプトは"ハッキングの為なら愛する家族を傷つけることをいとわない" 自分にとってエンジニアリングは "手段ではなく生きる目的" である

Travis CIでデバッグコードの混入を検知する

f:id:secret_hamuhamu:20151002053012j:plain
プロダクションのコードにデバッグコードを混ぜてはいけません。
コードの見通しが悪くなりますし、そのシステムを扱うユーザに見せては情報を見せてしまう可能性もあります。
それにより、システムユーザに悪用されてしまうかも知れません。

とはいえ、デバッグコードを誤って混入させてしまうかもしれません。
それをレビューなどで、防衛するのは確実ではありません。

人間が苦手なことは、機械にやらせましょう。
Travis CIにデバッグコードを検知してもらいましょう。

Travis CIの設定

.travis.yml の設定例です。

language: php
php:
- 5.4
- 5.5
- 5.6
- nightly
before_script:
  - composer install --dev
script:
    - script/check.sh

script という項目に、GitHubにpushされた際に実行されるシェルスクリプトファイルを記述します。
シェルスクリプトファイルではなく、シェルスクリプトをそのまま記述してもよい。


script/check.sh の設定例。

#!/bin/bash

# grepして、var_dumpという文字列にマッチすれば変数に格納される
greped_var_dump=$(find ./ -name '?*.php' -type f | xargs grep var_dump)
[[ -n $greped_var_dump ]] && {
    echo 'var_dumpが検出されました'
    echo $greped_var_dump

    exit 1
}

echo 'テスト実行'
phpunit --bootstrap bootstrap.php tests/
echo 'テスト完了'

PHPでは、デバッグコードに var_dump がよく使われるので、var_dumpが検知された際は exit 1 (実行失敗)としています。
もちろん、 var_dump 以外のもデバッグコードはあるはずなので環境に合わせてよしなにという感じです。


CIの実行

では、デバッグコードが混入している場合と混入していない場合のTravis CIの実行結果を確認します。

  • デバッグコードが混入している場合

f:id:secret_hamuhamu:20160102032032p:plain


  • デバッグコードが混入していない場合

f:id:secret_hamuhamu:20160102032039p:plain


さらにCIする

Travis CIの実行失敗を素早く知ることはとても大事です。
実行失敗から時間が経ってしまうと、場合によっては修正するのが大変だったり実行失敗に気づかずリリースされてしまうかもしれません。
過去に遡るコミットの数が多いほど大変だったりコミットログを綺麗に保つことが難しくなることがわかります。

素早く失敗に気づく仕掛けとしては、Slackと連携するとよさそうです。
Travis CI と Slackを連携させてみた


それから、Travis CIが先ほどの script/check.sh 実行する前に、ローカルリポジトリで実行しておけばTravis CIの実行結果を待たずに済みます。
git hookのpre-commitを使うとよさそうです。
git hookを使ってデバッグコードをコミットできないようにする