Lazy Developer: Using git pre-commit to auto tun test and findbugs


The Goal:
We developers wish our code is perfect, no bug, and we never want to check in code that will break test and found out later by peers.


We should always use tools like findbugs to check our code and run test locally before we push the change to git repository.

But would be better if git could just run test, check bugs for us before commit or push?

Using git pre-commit to run mvn test automatically
Luckily we can use git pre-commit hooks to do this for us.
We just need create pre-commit file in .git/hooks folder, make it executable(chmod 755), In this script, we can do anything we want.

In the following script, it will check whether we changed java code or pom file in this commit, if no, just commit it(we don't have test for UI side yet).

If yes, it will first stash(save and hide) unstaged changes before running tests, so we are really testing code that will be committed. 
#!/bin/bash
# At root folder project: run ln -s ../../utils/git/pre-commit .git/hooks/pre-commit
echo "running pre-commit hooks"

STAGED_FILES_CMD=`git diff --cached --name-only | grep -E "(\.java$)|(pom.xml)"`
# Determine if a file list is passed
ECHO "INPUT: $#"
if [ "$#" -eq 1 ]
then
 oIFS=$IFS
 IFS='
 '
 SFILES="$1"
 IFS=$oIFS
fi
SFILES=${SFILES:-$STAGED_FILES_CMD}

echo "STAGED_FILES_CMD: $STAGED_FILES_CMD, SFILES: $SFILES"
# Determine whether need run maven java test
if [ "$SFILES" == "" ]
then
 echo "no need to run maven test";
 exit 0;
fi

echo "Running maven clean test for errors"

# Stash changes
git stash -q --keep-index

# retrieving current working directory, if don't want to call this hook, run git commit --no-verify
CWD=`pwd`
MAIN_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# go to main project dir
cd $MAIN_DIR/../../
mkdir logs/

set -o pipefail
/usr/local/bin/mvn clean test package | tee logs/mvn.log

RESULT=$?
# Restore changes
git stash pop -q

if [ $RESULT -ne 0 ]; then
  echo "Error while testing the code"
  # in case when we run it in eclipse.
  open logs/mvn.log
  # go back to current working dir
  cd $CWD
  exit 1
fi
# go back to current working dir
cd $CWD
Add pre-commit hooks into git
Each developer should run ln -s ../../tools/git/pre-commit .git/hooks/pre-commit
So if we make any change, others can just pick the change.

Run findbugs during compile, fail build if find bugs
Add findbugs to pom:
<plugin>
 <groupId>org.codehaus.mojo</groupId>
 <artifactId>findbugs-maven-plugin</artifactId>
 <version>${org.codehaus.mojo.version}</version>
 <configuration>
  <effort>Max</effort>
  <threshold>Medium</threshold>
  <xmlOutput>true</xmlOutput>
  <failOnError>true</failOnError>
 </configuration>
 <executions>
  <!-- Ensures that FindBugs inspects source code when project is compiled. -->
  <execution>
   <id>analyze-compile</id>
   <phase>compile</phase>
   <goals>
    <goal>check</goal>
   </goals>
  </execution>
 </executions>
</plugin>

We also added Google Error Prone as a step of mvn compile
Resources:

Labels

adsense (5) Algorithm (69) Algorithm Series (35) Android (7) ANT (6) bat (8) Big Data (7) Blogger (14) Bugs (6) Cache (5) Chrome (19) Code Example (29) Code Quality (7) Coding Skills (5) Database (7) Debug (16) Design (5) Dev Tips (63) Eclipse (32) Git (5) Google (33) Guava (7) How to (9) Http Client (8) IDE (7) Interview (88) J2EE (13) J2SE (49) Java (186) JavaScript (27) JSON (7) Learning code (9) Lesson Learned (6) Linux (26) Lucene-Solr (112) Mac (10) Maven (8) Network (9) Nutch2 (18) Performance (9) PowerShell (11) Problem Solving (11) Programmer Skills (6) regex (5) Scala (6) Security (9) Soft Skills (38) Spring (22) System Design (11) Testing (7) Text Mining (14) Tips (17) Tools (24) Troubleshooting (29) UIMA (9) Web Development (19) Windows (21) xml (5)