Automate it - Be Lazy - Part I
So based on my passion as 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 request etc.
So usually I start my work based on a particular issue in JIRA and go via the following process:
The process
- Create an issue for myself (if already existing move to step 2)
- Create a branch within the appropriate project based on the issue
- Assign the issue to myself
- Migrate the issue into the state of
IN PROGRESS
- Do some work on the branch and commit
- Push the branch to remote and let Jenkins check the branch repeat with Step 5 until I finished my work.
- Rebase against master if needed
- Merge the created branch into master and delete the remote and local branch.
- Close the appropriate jira issue with a reference to the commit in comment.
Let us take a look at a real life example. The exemplary issue is MCLEAN-87 which has been worked on and commited with an appropriate commit message which should look like the following:
1[JIRA-ISSUE] - Summary Text
2Optional description
So the real life commit looks like this:
1commit c6eed44352c9ab623836a9329b7645dbb61413bc (HEAD -> master, origin/master, m/master)
2Author: Karl Heinz Marbaise <khmarbaise@apache.org>
3Date: Sat Jul 21 18:00:20 2018 +0200
4
5 [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/simplifying some steps of the above process.
Automation Step 1
In process step 6 while I was working on a branch
I have to push the current state of the branch over and over again
to remote and let Jenkins check if everything is going fine.
Furthermore it could be that I need to rebase this branch
against master which has to be followed by a git push --force BRANCH
but a --force
is very dangerous which means I have to use
git push --force-with-lease BRANCH
instead. I already have a bash
completion for git running which safes a lot of typing but I would
like to make it more comfortable.
So I started to write a bash script which comprises of the following steps:
- Check if we are on a branch just to be sure.
- Get the branch name
git push origin --force-with-lease BRANCH
So this means in the end I simply call the script:
1$ gitpushwithlease.sh
The first step of automation accomplished which means a little bit improvement but not enough.
Automation Step 2
So after a time working with that I thought about process step 8 wich is really much typing and error-prone. Let me summarize the steps:
- check if we are on a branch
- get the branch name
- checkout master
- merge the branch only if a fast forward is possible fail otherwise
- push changes to remote master
- delete the remote branch
- delete the local branch
The result was my gitmergeandclean.sh script which I use like the following:
1$ gitmergeandclean.sh
The output looks like this:
1~/ws-git-maven/plugins/maven-clean-plugin (MCLEAN-87)$ gitmergeandclean.sh
2Switched to branch 'master'
3Your branch is up to date with 'origin/master'.
4Updating 19b981e..c6eed44
5Fast-forward
6 pom.xml | 3 +--
7 1 file changed, 1 insertion(+), 2 deletions(-)
8Total 0 (delta 0), reused 0 (delta 0)
9remote: Sending notification emails to: ['"commits@maven.apache.org" <commits@maven.apache.org>']
10remote: To git@github:apache/maven-clean-plugin.git
11remote: 19b981e..c6eed44 c6eed44352c9ab623836a9329b7645dbb61413bc -> master
12remote: Syncing refs/heads/master...
13To https://gitbox.apache.org/repos/asf/maven-clean-plugin.git
14 19b981e..c6eed44 master -> master
15remote: Sending notification emails to: ['"commits@maven.apache.org" <commits@maven.apache.org>']
16remote: To git@github:apache/maven-clean-plugin.git
17remote: - [deleted] MCLEAN-87
18remote: Syncing refs/heads/MCLEAN-87 (FORCED)...
19To https://gitbox.apache.org/repos/asf/maven-clean-plugin.git
20 - [deleted] MCLEAN-87
21Deleted branch MCLEAN-87 (was c6eed44).
The second step of automation 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:
- Count the number of commits you would like to squash
- git rebase -i HEAD~NUMBEROFCOMMIT
- Going through the editor and replace
pick
withs
for squash. - Safe and rewrite the commit message.
(I assume I have missed something). So 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
1$ gitrebasebranch.sh
and in the editor I only rework the commit message. That's it. After this I can do:
1$ gitpushwithlease.sh
The third step of automation accomplished which means more improvement but not enough.
The story will be continued in my next post.