I constantly look for ways to make my work more productive. One of the things I like to do is make batch files to string together commands that have to be done in order.
The Problem:
On one project, I have to do this 5-30 times a day:
Compile the code
Stop the server
Deploy the project to the server
Start the server
However, about once a week the temporary directory gets corrupted. Sometimes that takes HOURS to debug. Also, checking out a new branch sometimes points me to the wrong environment and eats up time, too. To avoid it I just overwrite these files each time I deploy. But now I do this 5-30 times a day:
Compile the code
Stop the server
Clean out the temp files
Copy the configuration files
Deploy the server
Start the server
How can we make this easier?
The Solution:
I have a directory that is on my PATH (I work in Windows, but Linux would be the similar) that holds all my batch files. They are short and all follow the same format:
- Set up the environment
- Do the work
- Show that you are done
1. Setup
Setting up the environment doesn’t seem like a big deal at first. You know what version of Java you’re using, where tomcat is installed, and what ant version to use, so you can just hard code those paths. However, it only takes a few extra minutes to set up a file that sets environment variable that you can use (and re-use) in other batch files. I set tomcat install directories, useful code directories, and add directories to other useful tools.
apsetup.bat:
set JAVA_HOME=C:\bea9\jdk150_04
set ANT_HOME=C:\apps\ant\apache-ant-1.6.5
set ANT_OPTS=”-Xmx512M”
set PATH=%ANT_HOME%\bin;%JAVA_HOME%\bin;%PATH%
set PATH=C:\work\bin;%PATH%
set SVN_EDITOR=c:\windows\system32\notepad.exe
set TOMCAT_HOME=c:\apps\Tomcat7.0.27
set AP=\work\awesomeProject\version_3\repo
now if I run \work\apsetup.bat I can type
cd %ap%
instead of
cd \work\awesomeProject\version_3\repo
However, if I want to change %ap% to a different version, I can change the last line “set AP=…” to that directory.
2. Do the work
Now that I have the environment set up, I can call %ap%\compile.bat ore %ap%\runTests.bat from the command line window. Or add this like to skip %AP%\ each time:
set PATH=%AP%\bin;%PATH%
Do the work
Once your environment is set, it’s handy to use absolute paths to show which programs.
%AP%\bin\compileAP.bat
Where compileAP can
Kill the server
Compile cleanly (and remember all the options)
Remove temp files
Deploy
Or %AP%\bin\bounce.bat can
Kill the server
Clean the temp files (but not the deployed ones)
Start the server
3. Show you’re done
Sometimes it takes a while to complete all these steps. If distractions occur it make be a while before I get back to my tasks. It’s frustrating to lose track of where you are and have to start over.
To solve this, I try to do two things: Give a status update with a timestamp, and give an audible cue when I’m done.
For timestamps I like to use the tools at http://unxutils.sourceforge.net/ , which give you unix-style commands from the windows command line. Most of the useful commands are there, and I use them all day. It’s easy to put a “date” command at the end of a long process, so I know when it got done. Also, using the tee command (split output to the stdout and a file) is super handy if we need to see what happened when.
The other timesaver is to send a beep command to the standard out. For long running commands this reminds me to stop writing email and get back to work. In windows this can be tricky, but the easiest way I’ve found is to type this in a directory on your path
copy con beep.bat
Then type control-G control-Z. This gives you two beeps, no muss, no fuss.