2025-01-01 deploy: A helper script to simplify the execution of reoccurring project specific commands
A helper script to execute many command lines
In this blog I'd like to present a little script
deploy
that has a nice solution for a problem that I often had: managing and quickly executing project specific command
sequences.
BTW: if you're using maven you might also use this mvn wrapper which follows a similar idea to locate the appropriate settings.xml file from the project directory upwards.
The problem: complicated command lines you often need to execute
When you're working with several projects at once you often have to execute the same command lines again and again, e.g. to build or deploy the project on a server or start / stop a server etc., but these command lines vary from project to project. Consider for instance this for a quick deployment with Maven, skipping all tests, with often different profiles for the several projects:
mvn clean install -Dmaven.test.skip=true -Dmaven.test.skip.exec -DskipITs -Paemlocal,autoInstallSinglePackage,autoInstallPackage
Not something you want to type. Often you can fetch them by searching the bash history using the Ctrl-R shortcut, but that's a hassle, too, since you'll have to remember the distinguishing features of the command lines to find them. Sometimes I added a comment after the command line and searched for that comment. Sometimes I created a bin/ directory in the project and put various scripts there, but that makes the most sense if the other people in the project are using the same commandlines - and you can only easily execute it if you are in the top project directory.
The solution: collecting command lines in a file and have a script that can execute them from that file
The nice script
deploy
which I'd like to share with you works as follows. You can create a file .deploycmds for
instance in your project top level directory that contains the command lines for that project, one per line and with a
name as first word. E.g:
9090 cleanTargets ; time mvn -P test,cpmLocal,installBundle,installPackage,installContent,installTestContent clean install # Full deployment on Sling instance on port 9090
8080 cleanTargets ; time mvn -P test,cpmLocalDefault,installBundle,installPackage,installContent,installTestContent clean install # Full deployment on Sling instance on port 9090
aem cleanTargets ; time mvn clean install -PautoInstallSinglePackage,autoInstallPackage # Deployment for AEM
Here 9090, 8080 and aem are keys to identify the command lines. So if you want to deploy that project on AEM you
just go deploy aem and it searches upwards from the current directory, looks whether there is a command with the key
aem and if it finds one it executes it.
Setting Up Command Line Completion
If you like you can set up bash command line completion, so that you type deploy and then press the Tab key and it
will offer you the keys you have in your .deploycmds file. This is done by adding the following to your .bashrc:
eval "$(deploy -c)"
Advanced usage
You can have .deploycmds files at several levels: the script will search upwards from the current directory until it
hits your home directory or the file system root, and collects commands from every .deploycmds file it finds, where
lower levels override upper levels. The command help (deploy -h) shows you also some other options:
-h prints this help message.
-l lists the available deployment types and exits,
-s prints a short list of available deployment types and exits,
-v prints all .deploycmds files relevant to this directory and the commands they contain and exits,
-c prints a script that can be used for bash command line completion and exits: use e.g. as eval "$(deploy -c)"
If you need that command executed in e.g. the top level of the project where the .deploycmds file is: the
environment variable DEPLOYCMDLOC is set to the directory where the command was found, so you could have e.g. this
command line in your .deploycmds file and have the whole project built even if you call deploy buildall from a
subdirectory:
buildall: cd $DEPLOYCMDLOC ; mvn clean install