LoginSignup
10
9

More than 5 years have passed since last update.

チーム開発において、commit直前にESLintを自動実行する

Posted at

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

で環境構築できるようにするとスマート。

10
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9