A Guide to Automated Jira Issue Key Insertion to Changesets

365kim
3 min readJul 30, 2023

--

Photo by Austin Distel on Unsplash

The Changesets tool is very handy for managing the changelog of your project. But did you know it could be even more powerful when paired with JIRA? Let’s explore a quick method to automatically insert JIRA issue keys into your changesets using a shell script. A touch of automation to make your life easier!

Check out the script:

#!/bin/bash

# Get staged .changeset/*.md files
FILES=$(git diff --cached --name-only --diff-filter=d | grep ".changeset/.*.md$")

if [ "$FILES" == "" ]
then
exit 0
else
for FILE in $FILES
do
# Only proceed if the changeset document starts with ---
if [ "$(head -n 1 "$FILE")" == "---" ]; then

TICKET=$(git rev-parse --abbrev-ref HEAD | grep -Eo '^(\w+/)?(\w+[-_])?[0-9]+' | grep -Eo '(\w+[-])?[0-9]+' | tr "[:lower:]" "[:upper:]")

# Skip if there's no ticket number in the branch name
if [[ $TICKET == "" ]]; then
continue
fi

LINE_NUMBER=$(awk '/---/{i++} i==2{print NR+2; exit}' $FILE)

# Skip if there are no written changes
if [[ $LINE_NUMBER == "" ]]; then
continue
fi

LINE_TEXT=$(awk -v LINE_NUMBER=$LINE_NUMBER 'NR==LINE_NUMBER{print $0; exit}' $FILE)

# Skip if the ticket number has already been added
if [[ $LINE_TEXT == *"]" ]]; then
continue
fi

TEMP=$(mktemp)

awk -v LINE_NUMBER=$LINE_NUMBER -v TICKET=$TICKET 'NR==LINE_NUMBER{$0=$0 " [" TICKET "]"}1' $FILE > $TEMP && mv $TEMP $FILE
echo "$FILE has been augmented with a JIRA ticket number."
git add $FILE
fi
done
fi

Let’s break this down:

First, the script gets all staged markdown files under .changeset directory.

FILES=$(git diff --cached --name-only --diff-filter=d | grep ".changeset/.*.md$")

If no files are found, the script ends.

if [ "$FILES" == "" ]
then
exit 0

If files are found, it processes each file, checking if it starts with ---.

    else
for FILE in $FILES
do
# Only proceed if the changeset document starts with ---
if [ "$(head -n 1 "$FILE")" == "---" ]; then

It then extracts the JIRA ticket number from the branch name. If no ticket number exists in the branch name, it moves on to the next file.

                TICKET=$(git rev-parse --abbrev-ref HEAD | grep -Eo '^(\w+/)?(\w+[-_])?[0-9]+' | grep -Eo '(\w+[-])?[0-9]+' | tr "[:lower:]" "[:upper:]")

# Skip if there's no ticket number in the branch name
if [[ $TICKET == "" ]]; then
continue
fi

The script identifies the line where the changes are mentioned. If there are no changes, it skips to the next file.

                LINE_NUMBER=$(awk '/---/{i++} i==2{print NR+2; exit}' $FILE)
LINE_TEXT=$(awk -v LINE_NUMBER=$LINE_NUMBER 'NR==LINE_NUMBER{print $0; exit}' $FILE)

# Skip if there are no written changes
if [[ $LINE_TEXT == "" ]]; then
continue
fi

If changes are present, it checks if the ticket number is already there.

                # Skip if the ticket number has already been added
if [[ $LINE_TEXT == *"]" ]]; then
continue
fi

If not, the script appends the JIRA ticket number to the end of the changeset line, creates a copy of the file, replaces the original file with the modified one, adds the file to the staging area, and displays a success message.

                TEMP=$(mktemp)

awk -v LINE_NUMBER=$LINE_NUMBER -v TICKET=$TICKET 'NR==LINE_NUMBER{$0=$0 " [" TICKET "]"}1' $FILE > $TEMP && mv $TEMP $FILE
echo "$FILE has been updated with a JIRA ticket number."
git add $FILE

And that’s it! Your changesets are now more functional with their new JIRA companions. Happy coding!

--

--

365kim

Web Front-End Developer who believes Every Day Counts!