Vedlejší tým pro který jsem nasazoval své řešení DevOps používá jméno Git větve (branch) obsahující číslo aktuálního Scrum sprintu. Tento design dělá poněkud problém v CI nástroji Jenkins, jehož pipeline na to nejsou připravené.
Repozitář s jobem tedy vyzvedávám v master branch a kde je následující konstrukce. Doplňuji, že Jenkins hostuje Windows Server a pro rozhodnutí o větvi se používá PowerShell script.
pipeline //jenkinsfile in master
{
environment
{
branchORcommit = "sprint-*"
}
optionsstages
{
skipDefaultCheckout()
}
{
stage('Invoke')
{
steps
{
script
{
branchORcommit = powershell(returnStdout: true, script:'((git branch -r --list "sprint-*").trim() | ForEach-Object {$_.Replace("origin/","")} | Sort-Object($_) -Descending | Select-Object -First 1).Trim()').trim()
}
echo "Used branch is ${branchORcommit}"
script
{
checkout([$class: 'GitSCM', branches: [[name: "${branchORcommit}"]], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CloneOption', noTags: true, reference: '', shallow: true]], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'FILLHEREID', url: 'FILLHEREURL']]])
}
//rest-of-pipeline
}
}
}
}
Nejprve si založím obecnou proměnnou, která drží jméno branche (může to být taky parametr, ale pak je třeba používat konstrukci ${params.branchORcommit}.
Je nutné zjistit jméno branche, která má dvě části: pevný řetězec a číslo (vyšší číslo = aktuální větev). Toto rozhodnutí provede jednořádkový PowerShell script (případně vytvořte ekvivalent pro jinou platformu) a jméno větve vrátí do JenkinsFile scriptu.
Následně je třeba udělat stažení repozitáře, respektive by mělo dojít k nahrazení aktuálního adresáře. Tímto způsobem lze vyřešit dynamickou volbu git větve pro Jenkins Pipeline v Groovy.
Moje řešení je ještě více komplexní, ale pokus jsem se udělat abstraktní zjednodušení a veřejně si ho tady odložím, kdybych to ještě někdy potřeboval, snad to pomůže i někomu dalšímu.