Automatisation d’une MEP

En général, quand nous faisons une MEP, plusieurs étapes doivent être effectuées:

  • merger les PR ou les MR
  • déployer chaque projet
  • créer une version JIRA
  • taguer chaque ticket avec cette version
  • déplacer les tickets dans « prod »
  • déployer la version
  • publier le changelog

 

Et… si nous automatisions tout cela? L’idéal est de lancer un script bash (via jenkins, ou un hook lors du merge de la PR/MR) qui va tout faire pour nous.

Le script se lancerait ainsi:

bash deployment.sh -v maVersion -i ticket1,ticket2,ticket3 -p CodeDeMonProjet -m deploymentTicketFilename -u JiraApiToken -j https://jiraHost

Les arguments:

  • -v le numéro de la version de la MEP
  • -i la liste de tous les tickets traités, séparés par une virgule
  • -p le code Jira du projet (tous les tickets commencent par ce code suivi d’un tiret)
  • -m un ticket jira dans lequel nous allons publier un commentaire de la version meppée (le changelog)
  • -u le token jira, qui correspond à un base64 de: username:password
  • -j le host de votre jira

 

Les fonctions du script:

  • création d’une version dans jira
function createVersion
{
	body=$(cat  << EOF
{
  "name": "${version}",
  "project": "${project}"
}
EOF
)

	response=$(curl --silent -X POST "${jiraApiHost}/rest/api/2/version" -H 'Content-Type: application/json' -H "Authorization: Basic ${jiraApiToken}" -d "${body}")

	if echo "$response" | jq -e 'has("errors")' > /dev/null; then
    	echo "$response" | jq -r '.errors.name'
    	exit
	fi

	versionId=$(jq -r '.id' <<<"$response")
	echo Version $versionId créée
}

 

  • mise à jour de chaque ticket avec la version
function updateIssuesWithVersion
{
	IFS=',' read -r -a issuesArray <<< "$issues"
	total=${#issuesArray[*]}

	body=$(cat  << EOF
{
  "update": {
    "fixVersions": [
      {
        "set": [
          {
            "name": "${version}"
          }
        ]
      }
    ]
  }
}
EOF
)

	for (( i=0; i<${total}; i++ ))
		do
			response=$(curl --silent -X PUT "${jiraApiHost}/rest/api/2/issue/${issuesArray[i]}" -H 'Content-Type: application/json' -H "Authorization: Basic ${jiraApiToken}" -d "${body}")
			if echo "$response" | jq -e 'has("errorMessages")' && [[ ! -z $response ]]  > /dev/null; then
				errorMessage=$(echo "$response" | jq -r '.errorMessages')
				echo $errorMessage : ${issues[i]}
				exit
			else
				echo "${issuesArray[i]} taggué"
			fi
		done
}

 

  • publication de la version
function releaseVersion
{
	body=$(cat  << EOF
{
  "released": true
}
EOF
)

   response=$(curl --silent -X PUT "${jiraApiHost}/rest/api/2/version/${versionId}" -H 'Content-Type: application/json' -H "Authorization: Basic ${jiraApiToken}" -d "${body}")

   if echo "$response" | jq -e 'has("errorMessages")' > /dev/null; then
		echo "$response" | jq -r '.errorMessages'
		exit
   fi

   echo "${versionId} déployée"
}

 

  • ajout du commentaire du ticket de changelog
function addCommentToDeploymentFilenameTicket
{

	body=$(cat  << EOF
{
    "update": {
        "comment": [
            {
                "add": {
                    "body": "MEP ${version}\n- ${jiraApiHost}/browse/${project}/fixforversion/${versionId}"
                }
            }
        ]
    }
}
EOF
)

	response=$(curl --silent -X PUT "${jiraApiHost}/rest/api/2/issue/${deploymentTicketFilename}" -H 'Content-Type: application/json' -H "Authorization: Basic ${jiraApiToken}" -d "${body}")

	if echo "$response" | jq -e 'has("errorMessages")' && [[ ! -z $response ]] > /dev/null; then
		errorMessage=$(echo "$response" | jq -r '.errorMessages')
		echo $errorMessage : ${issues[i]}
		exit
	fi

	echo "Commentaire ajouté dans la file MEP"
}

 

Et voici le script en entier:

#!/usr/bin/env bash

# This script created a version, updates every issue for a deployment with this version, releases the version and add a comment into "MEP file"

function showHelp
{
    echo "Help:"
    echo " -v      version name"
    echo " -i      issues code"
    echo " -p      project code"
    echo " -m      MEP ticket"
    echo " -u      jira api token"
    echo " -j      jira api host"
    echo " -h      Display this help"
}

function createVersion
{
	body=$(cat  << EOF
{
  "name": "${version}",
  "project": "${project}"
}
EOF
)

	response=$(curl --silent -X POST "${jiraApiHost}/rest/api/2/version" -H 'Content-Type: application/json' -H "Authorization: Basic ${jiraApiToken}" -d "${body}")

	if echo "$response" | jq -e 'has("errors")' > /dev/null; then
    	echo "$response" | jq -r '.errors.name'
    	exit
	fi

	versionId=$(jq -r '.id' <<<"$response")
	echo Version $versionId créée
}


function updateIssuesWithVersion
{
	IFS=',' read -r -a issuesArray <<< "$issues"
	total=${#issuesArray[*]}

	body=$(cat  << EOF
{
  "update": {
    "fixVersions": [
      {
        "set": [
          {
            "name": "${version}"
          }
        ]
      }
    ]
  }
}
EOF
)

	for (( i=0; i<${total}; i++ ))
		do
			response=$(curl --silent -X PUT "${jiraApiHost}/rest/api/2/issue/${issuesArray[i]}" -H 'Content-Type: application/json' -H "Authorization: Basic ${jiraApiToken}" -d "${body}")
			if echo "$response" | jq -e 'has("errorMessages")' && [[ ! -z $response ]]  > /dev/null; then
				errorMessage=$(echo "$response" | jq -r '.errorMessages')
				echo $errorMessage : ${issues[i]}
				exit
			else
				echo "${issuesArray[i]} taggué"
			fi
		done
}


function releaseVersion
{
	body=$(cat  << EOF
{
  "released": true
}
EOF
)

   response=$(curl --silent -X PUT "${jiraApiHost}/rest/api/2/version/${versionId}" -H 'Content-Type: application/json' -H "Authorization: Basic ${jiraApiToken}" -d "${body}")

   if echo "$response" | jq -e 'has("errorMessages")' > /dev/null; then
		echo "$response" | jq -r '.errorMessages'
		exit
   fi

   echo "${versionId} déployée"
}


function addCommentToDeploymentFilenameTicket
{

	body=$(cat  << EOF
{
    "update": {
        "comment": [
            {
                "add": {
                    "body": "MEP ${version}\n- ${jiraApiHost}/browse/${project}/fixforversion/${versionId}"
                }
            }
        ]
    }
}
EOF
)

	response=$(curl --silent -X PUT "${jiraApiHost}/rest/api/2/issue/${deploymentTicketFilename}" -H 'Content-Type: application/json' -H "Authorization: Basic ${jiraApiToken}" -d "${body}")

	if echo "$response" | jq -e 'has("errorMessages")' && [[ ! -z $response ]] > /dev/null; then
		errorMessage=$(echo "$response" | jq -r '.errorMessages')
		echo $errorMessage : ${issues[i]}
		exit
	fi

	echo "Commentaire ajouté dans la file MEP"
}


if [ $# -eq 0 ]; then
    echo "No arguments supplied"
    showHelp
    exit
fi

version=""
issues=""
project=""
deploymentFilenameTicket=""
jiraApiToken=""
jiraApiHost=""

while getopts v:i:p:m:t:u:j:h opts; do
   case ${opts} in
      v ) version=${OPTARG} ;;
      i ) issues=${OPTARG} ;;
      p ) project=${OPTARG} ;;
      m ) deploymentTicketFilename=${OPTARG} ;;
      u ) jiraApiToken=${OPTARG} ;;
      j ) jiraApiHost=${OPTARG} ;;
      h )
	  showHelp
          exit ;;
   esac
done

if [[ version == "" || issues == "" || project == "" || deploymentTicketFilename == ""  || jiraApiToken == "" || jiraApiHost == "" ]]; then
	echo "All arguments must be provided"
	showHelp
	exit 1;
fi

createVersion
updateIssuesWithVersion
releaseVersion
addCommentToDeploymentFilenameTicket

 

Rédigé par

5 comments

    1. Merci Seb! Oui, j’en avais assez de faire tout au clic alors j’ai pris sur mon temps libre pour écrire ce petit script 😉

      1. Bonjour,

        C’est excellant ton script !

        Mais moi la problématique que j’ai « par exemple lorsqu’on fait plusieurs ticket sur un seul commit.
        Et on souhaite récupérer les IDs Tickets par exemple un commit de cette façon « [#0001] and [#0002] and [#0003] and [#0004] » de tel sorte qu’on aura ça « 0001, 0002, 0003, 0004 » comme résultat à la fin.

        Merci d’avance !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.