Versioner sammenlignet

Nøgle

  • Linjen blev tilføjet.
  • Denne linje blev fjernet.
  • Formatering blev ændret.

...

All scripts and the crontab stuff assumes that there is a "jira" user with access to /opt/jira-cron/

Atlassian CLI

The Atlassian CLI must be installed and prepared

iq processor

jq command-line JSON processor must be available to the scripts

https://stedolan.github.io/jq/Workflow


My IssueType is called "Repeatable Task" and has a very small workflow:

...

Upon the Transition of Initiate (id 61), the Post Function:

  • creates Creates a copy of the Issue as a subtask
  • sets Sets the the issue back to Status "Frozen"

...

The Issuetype has a custom field called "Cron Scheduling" (Text Field (single line)), as this will hold the schedules for the Issue:

...

Kodeblok
titlejiraMakeCrontab.sh
linenumberstrue
#!/bin/bash

rm /tmp/crontab > /dev/null 2>&1

cd /opt/jira-cron/

IFS=$(echo -en "\n\b")
TODAY=`date +%Y-%m-%d.%H:%M:%S`

TransitionScript="/opt/jira-cron/jiraTransitionIssue.sh"
JIRAFilter="issuetype%20%3D%20%22Repeatable%20Task%22%20AND%20status%20in%20%28Frozen%29%20%20and%20%22Cron%20Scheduling%22%20IS%20NOT%20NULL&maxResults=999"
JIRAUSER=""
JIRAPASS=""issuetype = \"Repeatable Task\" AND status in (Frozen)  and \"Cron Scheduling\" IS NOT NULL"
FIELD="12821"
CHAR="'"
CRONTABUSER="jira"

rm /tmp/crontab 2> /dev/null
rm /tmp/value 2> /dev/null

echo " --------- " >>

#echo https://jira.server.dk/rest/api/2/search?jql=$JIRAFilter

CURLOPT_HEADER=0
export CURLOPT_HEADER
curl -D -k -u $JIRAUSER:$JIRAPASS -X GET -H "Content-Type: application/json" https://jira.server.dk/rest/api/2/search?jql=$JIRAFilter > /tmp/issuelist.json

IssueTotal=`cat /tmp/issuelist.json | ./jq-linux64 '.total'`
echo "$TODAY Total: $IssueTotal" >> /opt/jira-cron/jiraMakeCrontab.log

issueList=`/opt/atlassian-cli/jira.sh --action getIssueList --search "$JIRAFilter" --outputFormat 200  | grep -v "issues" | grep -v "Created"`
for issue in $issueList
do
        issueKey=`echo $issue | awk '{print $1}' | sed 's/,//g'`
        CustomFieldValue=`/pack/atlassian-cli/jira.sh --action GetFieldValue --issue "$issueKey" --field "customfield_$FIELD" --file /tmp/value`
        if [ -f /tmp/value ]
        then
                crontabEntry=`cat /tmp/value | sed 's/'"$CHAR"'//g'`
                echo "#Crontabs for $issueKey" >> /tmp/crontab
                for cronEntry in $crontabEntry
                do
                        echo "$cronEntry $TransitionScript $issueKey >> /opt/jira-cron/jiraTransitionIssue.logCount=0
for IssueId in `cat /tmp/issuelist.json | ./jq-linux64 '.issues[] .id'`
do

  Count=$(($Count + 1))

  IssueId=`echo $IssueId | sed "s/\"//g"`
  curl -D -k -u $JIRAUSER:$JIRAPASS -X GET -H "Content-Type: application/json" https://jira.server.dk/rest/api/2/issue/$IssueId > /tmp/issue.json

  IssueKey=`cat /tmp/issue.json | ./jq-linux64 '.key'| sed "s/\"//g"`
  #IssueStatus=`cat /tmp/issue.json | ./jq-linux64 '.fields.status.name'i | sed "s/\"//g"`
  cat /tmp/issue.json | ./jq-linux64 '.fields.customfield_12821' | sed "s/\"//g" | sed "s/\\\r//g" | sed "s/\\\n/;/g" | sed "s/\\\t/ /g" > /tmp/cronfield.json

  for CronEntry in `cat /tmp/cronfield.json | tr ";" "\n"`
  do

    echo "$CronEntry $TransitionScript $IssueKey > /dev/null 2>&1" >> /tmp/crontab
                        echo "$TODAY Added ($Count): $cronEntry $TransitionScript $issueKey$IssueKey to /tmp/crontab" >> /opt/jira-cron/jiraMakeCrontab.log
              
  done
             
   echo "" >> /tmp/crontab

done

#Replace JIRA Users crontab
if [    fi
	rm! -f /tmp/value 2> /dev/null
done
rm /tmp/value 2> /dev/null

#Replace JIRA Users crontab
su - jira -c "crontab ]
then
 
  echo "" > /tmp/crontab
 
fi
 
crontab /tmp/crontab"crontab

The final line, making the JIRA crontab, can be extended with an error handler.

 

After running the script; - the /var/spool/cron/crontabs/jira (on Ubuntu LTS) should look like this: 

Kodeblok
linenumberstrue
#Crontabs for SUPPORT-513
* * 1 * * /opt/jira-cron/jiraTransitionIssue.sh SUPPORT-513 >> /opt/jira-cron/jiraTransitionIssue.log 2>&1

#Crontabs for HOMEPAGE-3846
0 5 2 * * /opt/jira-cron/jiraTransitionIssue.sh HOMEPAGE-3846 >> /opt/jira-cron/jiraTransitionIssue.log 2>&1

#Crontabs for HOMEPAGE-2933
0 0 1 * * /opt/jira-cron/jiraTransitionIssue.sh HOMEPAGE-2933 >> /opt/jira-cron/jiraTransitionIssue.log 2>&1

#Crontabs for PROJECTTOOLS-2467
0 5 5 * * /opt/jira-cron/jiraTransitionIssue.sh PROJECTTOOLS-2467 >> /opt/jira-cron/jiraTransitionIssue.log 2>&1

...

Make the Transition Script

Make sure the "jira" user has executeable acess to this. The TRANSITIONJSON defines the Initiate Transition (id 61)

Kodeblok
titlejiraTransitionIssue.sh
linenumberstrue
#!/bin/bash
# CLI Reference: https://bobswift.atlassian.net/wiki/display/JCLI/JIRA+Command+Line+Interface

IFS=$(echo -en "\n\b")
CHARTRANSITIONJSON="'{"
OKSTATUS=transition"Frozen (10003)"

issueKey=$1
if [ $issueKey != '' ]
then
        StatusFieldValue=`/opt/atlassian-cli/jira.sh --action GetFieldValue --issue "$issueKey" --field "Status" --file /tmp/value`
        if [ -f /tmp/value ]
        then
                Status=`cat /tmp/value | sed 's/'"$CHAR"'//g'`
                if [ $Status == $OKSTATUS ]
                then
                        # Transition issue
                        /opt/atlassian-cli/jira.sh --action progressIssue --issue "$issueKey" --step "Initiate" >> /opt/jira-cron/jiraTransitionIssue.log 2>&1
                else
                        echo "Issue $issueKey was not in $OKSTATUS State, but in $Status"
                fi
        fi
else
: {"id": "61"}}'
JIRAUSER=""
JIRAPASS=""
CURLOPT_HEADER=0
export CURLOPT_HEADER

cd /tmp

IssueKey=$1

if [ $IssueKey != '' ]
then

  curl -D header.txt -u $JIRAUSER:$JIRAPASS -X POST --data $TRANSITIONJSON -H "Content-Type: application/json" https://jira.server.dk/rest/api/2/issue/$IssueKey/transitions
  rm header.txt

else

	echo "No IssueKey as parameter"

fi

 

The Master Cron

To make the JIRA users crontab on a regular basis, I use /etc/crontab on Ubuntu:

Kodeblok
0 20 * * * rootjira /opt/jira-cron/jiraMakeCrontab.sh 

 

Troubleshooting

...

Make sure the crontab is functioning, look in /var/log/syslog for tings like:

 

Cron reloading the new crontab for JIRA user:

Kodeblok
Apr  5 13:28:50 docs02myserver crontab[12857]: (jira) REPLACE (jira)
Apr  5 13:29:01 docs02myserver cron[4946]: (jira) RELOAD (crontabs/jira)

...

Kodeblok
Apr  5 05:00:01 myserver: CRON[1563]: (jira) CMD (/opt/jira-cron/jiraTransitionIssue.sh HOMEPAGE-2467 >> /opt/jira-cron/jiraTransitionIssue.log 2>&1)


 

FIELD and STATE variables in the script files

Remember to change the variables to Your setup