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
5 comments
Ha sympa comme script.
C’est simple et efficace !
Merci John 😉
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 😉
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 !
Bonjour!
Pour moi, chaque branche ne devrait traiter que d’un user case ^^
Merci