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

Commentaires