2019-01-31

Jenkins pipeline dynamic branch name

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-*"
    }

options
{
    skipDefaultCheckout()
}

    stages
    {
        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.