Github(Enterprise)を利用してチーム開発を行っており、開発メンバー全員の環境でpre-commitにてESLintを自動実行したくなった。
けど、.git/hooksにpre-commitを作成してもGithub上で管理できない。。
以下、workaroundをメモとして残す。
目的
チーム開発において、commit直前にESLintを自動実行したい。
方針
チームメンバー全員の.git/hooks配下にpre-commitを配置するシェルスクリプトを用意する。
前提
ディレクトリ構成は以下の通りとする。
├ bin
├ node_modules
└ .git/hooks
手順
package.jsonにESLintを追加する
ESLintが無いと何も始まらないね。
$ npm install eslint --save-dev
コピー元となるpre-commitを作成する
binディレクトリに作成する。
次項のshを実行することにより、このpre-commitが.git/hooks配下にコピーされる。
i.e. 各開発メンバーの.git/hooks配下にコピーされる。
bin/pre-commit
#!/bin/sh
echo "\nValidating·JavaScript:\n"
files=$(git diff --cached --name-only --diff-filter=ACM | grep ".js$")
if [ "$files" = "" ]; then
echo "\n\033[42mNO FILE MATCHED\033[0m\n"
exit 0
fi
pass=true
for file in ${files}; do
result=$(node node_modules/eslint/bin/eslint.js ${file} -f compact | grep "Error")
if [ "$result" = "" ]; then
echo "\t\033[32mESLint Passed: ${file}\033[0m"
else
echo "\t\033[31mESLint Failed: ${file}\033[0m"
pass=false
fi
done
echo "\nJavaScript validation complete\n"
if ! $pass; then
echo "\033[41mCOMMIT FAILED:\033[0m Your commit contains files that should pass ESLint but do not. Plead fix the ESLint errors and try again.\n"
exit 1
else
echo "\033[42mCOMMIT SUCCEEDED\033[0m\n"
exit 0
fi
bin/pre-commitを.git/hooks配下にコピーするスクリプトを作成する
.git/hooks配下にコピーするスクリプト。
各開発メンバーにこのスクリプトを実行してもらう。
bin/pre-commit.sh
#/!bin/bash
__chmod=`which chmod`
# 起動スクリプトの絶対パスを取得
pushd `dirname $0` >/dev/null 2>&1
[ $? -eq 1 ] && exit 1
__script_dir=`pwd`
popd >/dev/null 2>&1
# 起動スクリプトの絶対パス
__base_dir=`dirname ${__script_dir}`
GIT_HOOKS_DIR=".git/hooks"
__hooks_dir=${__base_dir}/${GIT_HOOKS_DIR}
# make hooks directory
if [ ! -d $__hooks_dir ]; then
echo "[INFO] make hooks directory"
mkdir $__hooks_dir
fi
# make pre-commit
__pre_commit_path=${__base_dir}/${GIT_HOOKS_DIR}/pre-commit
if [ -f $__pre_commit_path ]; then
echo "[INFO] already pre-commit: ${__pre_commit_path}"
exit 0
fi
echo "[copy pre-commit] ${__pre_commit_path}"
cp ${__base_dir}/bin/pre-commit ${__pre_commit_path}
echo "${__chmod} +x ${__pre_commit_path}"
${__chmod} +x ${__pre_commit_path}
開発メンバーに共有する
各開発メンバーに
$ bin/pre-commit.sh
してもらえばOK。
(ちゃんと実行権限を与えること)
もしくは、
$ npm run setup
で環境構築できるようにするとスマート。