Over a million developers have joined DZone.

Automate It: Be Lazy (Part 1)

DZone's Guide to

Automate It: Be Lazy (Part 1)

Learn how to take steps to automate parts of your JIRA workflow, saving you time when working on projects like Apache Maven.

· DevOps Zone ·
Free Resource

Download the blueprint that can take a company of any maturity level all the way up to enterprise-scale continuous delivery using a combination of Automic Release Automation, Automic’s 20+ years of business automation experience, and the proven tools and practices the company is already leveraging.

Based on my passion as an open source developer, in particular for the Apache Maven Project, I work JIRA-based, which helps us and myself to organize our work and, of course, follow the reported issues, feature requests, etc.

Usually, I start my work based on a particular issue in JIRA and go via the following process:

The Process

  1. Create an issue for myself (if it already exists, move to step 2).

  2. Create a branch within the appropriate project based on the issue.

  3. Assign the issue to myself.

  4. Migrate the issue into the state of IN PROGRESS.

  5. Do some work on the branch and commit.

  6. Push the branch to remote and let Jenkins check the branch. Repeat with Step 5 until I finish my work.

  7. Rebase against the master, if needed.

  8. Merge the created branch into the master and delete the remote and local branch.

  9. Close the appropriate JIRA issue with a reference to the commit in a comment.

Let us take a look at a real-life example. The exemplary issue is MCLEAN-87, which has been worked on and committed with an appropriate commit message, which should look like the following: 

[JIRA-ISSUE] - Summary Text 
Optional description

The real-life commit looks like this:

commit c6eed44352c9ab623836a9329b7645dbb61413bc (HEAD -> master, origin/master, m/master)
Author: Karl Heinz Marbaise <khmarbaise@apache.org>
Date: Sat Jul 21 18:00:20 2018 +0200

  [MCLEAN-87] - Upgrade maven-plugins parent to version 32

If you take a look at the list of process steps, it is a huge number of steps. Unfortunately, many of the steps are manual steps, which is time-consuming and error-prone.

So, about four or five months ago, I started to automate/simplify some steps of the above process.

Automation Step 1

In step 6, while I was working on a branch, I had to push the current state of the branch over and over again to remote and let Jenkins check if everything was going fine. Furthermore, it could be that I needed to rebase this branch against the master, which has to be followed by a  git push --force BRANCHbut a  --force is very dangerous, which means I had to use  git push --force-with-lease BRANCH instead. I already had a bash completion for git running, which saves a lot of typing, but I would like to make it more comfortable.

I started to write a bash script comprised of the following steps:

  1. Check if we are on a branch, just to be sure.

  2. Get the branch name .

  3. git push origin --force-with-lease BRANCH 

This means, in the end, I simply call the script:

$ gitpushwithlease.sh

The first step of automation is accomplished, which means a little bit of improvement, but not enough.

Automation Step 2

After a time working with that, I thought about step 8, which is a lot of typing and is error-prone. Let me summarize the steps:

  1. Check if we are on a branch.

  2. Get the branch name.

  3. Check out the master.

  4. Merge the branch only if a fast forward is possible — fail otherwise.

  5. Push changes to the remote master.

  6. Delete the remote branch.

  7. Delete the local branch.

The result was my gitmergeandclean.sh script which I use, like the following:

$ gitmergeandclean.sh

The output looks like this:

~/ws-git-maven/plugins/maven-clean-plugin (MCLEAN-87)$ gitmergeandclean.sh
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
Updating 19b981e..c6eed44
pom.xml | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
Total 0 (delta 0), reused 0 (delta 0)
remote: Sending notification emails to: ['"commits@maven.apache.org" <commits@maven.apache.org>']
remote: To git@github:apache/maven-clean-plugin.git
remote: 19b981e..c6eed44 c6eed44352c9ab623836a9329b7645dbb61413bc -> master
remote: Syncing refs/heads/master...
To https://gitbox.apache.org/repos/asf/maven-clean-plugin.git
19b981e..c6eed44 master -> master
remote: Sending notification emails to: ['"commits@maven.apache.org" <commits@maven.apache.org>']
remote: To git@github:apache/maven-clean-plugin.git
remote: - [deleted] MCLEAN-87
remote: Syncing refs/heads/MCLEAN-87 (FORCED)...
To https://gitbox.apache.org/repos/asf/maven-clean-plugin.git
- [deleted] MCLEAN-87
Deleted branch MCLEAN-87 (was c6eed44).

The second step of automation is accomplished, which means more improvement, but not enough.

Automation Step 3

If I work on a branch, I often do several commits on it until I think I am done. The result is a branch which contains 5, 6, or more commits which should be squashed into a single commit with a good commit message and a reference to the issue I am working on. This can be done manually and interactive via the following steps:

  1. Count the number of commits you would like to squash.

  2. git rebase -i HEAD~NUMBEROFCOMMIT 

  3. Going through the editor and replace pick with s for "squash."

  4. Save and rewrite the commit message.

This was really cumbersome, so I decided to find a scripted way to handle that. After some experiments, I found a solution which results in my gitrebasebranch.sh script:

$ gitrebasebranch.sh

and in the editor, I only rework the commit message. That's it. After this, I can 

$ gitpushwithlease.sh

The third step of automation is accomplished, which means more improvement, but not enough.

The story will be continued in my next post.

Download the ‘Practical Blueprint to Continuous Delivery’ to learn how Automic Release Automation can help you begin or continue your company’s digital transformation.

java ,maven ,devops ,automation ,tutorial

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}