git flow release

Bastardising git flow for release automation

For a number of reasons (some historical, some legacy, some just daft), the optional Interlok components live in various git providers. This isn’t a post that argues that git flow is great; it’s well understood so we use it to remove the friction of understanding a bespoke tagging/branching system. When we do a product release there’s a Jenkins pipeline that builds all the artefacts based on the release branch from git flow release. That means that when we decide that it’s time to prepare for a release, we have to do a git release start on every project and publish that branch; all of which is nice and scriptable.

Sadly though, when we do a git flow release finish, things aren’t that simple as git flow finish does like to have a merge message when you merge into both the master and develop branch. The beauty of git is that all these sub-commands are just shell scripts so all we need to do is patch git-flow-common and git-flow-release so that we don’t have to enter a merge message when that part of the pipeline fires.

git-flow-common

First of all, we add a new function to git-flow-common that generates the merge message (available as a diff).

#
# gitflow_render_merge_message
#
# Inputs:
# $1 = source branch
# $2 = destination branch
#
# Renders a pre-defined merge message.
gitflow_render_merge_message() {
  local src_branch=$1
  local dst_branch=$2
  local msg=$(eval "echo $(git config --get gitflow.merge.message)")
  if [ "$msg" != "" ]; then
    echo "$msg"
  fi
}

git-flow-release

Then we need to patch the cmd_finish function in git-flow-release so that when a merge is attempted on both the master and develop branches (so it may be 2 places you make some changes). In the end it’ll look something like this (available as a diff) :


 # try to merge into master
 # in case a previous attempt to finish this release branch has failed,
 # but the merge into master was successful, we skip it now
 if ! git_is_branch_merged_into "$BRANCH" "$MASTER_BRANCH"; then
         git checkout "$MASTER_BRANCH" || \
           die "Could not check out $MASTER_BRANCH."

         local msg=$(gitflow_render_merge_message "$BRANCH" "$MASTER_BRANCH")

         if noflag squash; then
                 if [ "$msg" != "" ]; then
                         git merge --no-ff -m "$msg" "$BRANCH" || \
                                 die "There were merge conflicts."
                 else
                         git merge --no-ff "$BRANCH" || \
                                 die "There were merge conflicts."
                 fi
                 # TODO: What do we do now?
         else
                 git merge --squash "$BRANCH" || \
                         die "There were merge conflicts."
                 git commit
         fi
 fi

.gitconfig

Finally you need to modify your local git config so that you define the merge message :


[gitflow "merge"]
        message = Automated Merge of \\'$src_branch\\' into \\'$dst_branch\\'.


© all-the-years. All rights reserved.

Powered by Hydejack v9.2.1