Lukáš Mešťan

Software engineer with a background in full-stack Web development & Open Source Enthusiast.


Poznáte Jenkinsfile?

- 3 mins

Vo všeobecnosti je považované za dobrú “best practice” vytvárať a načítať pipeline skript z iného zdroja, ktorý môžete použiť pomocou verziovacieho systému (VCS). Komplexný pipeline skript je ťažkopádne písať a udržiavať v rámci rozhrania UI Jenkins-u.

Používanie Jenkinsfile v rámci repozitára prináša niekoľko výhod:

Praktická ukážka

Groovy skript môže obsahovať funkcie (napríklad def test(type) {), podmienené kroky/testy, cykly, try/catch/finally bloky, premenné (pomocou príkazu def def premenna = hodnota) a podobne.

#!groovy

node {
    try {
        stage('Checkout') { 
            checkout([
                $class: 'GitSCM', 
                branches: [[name: '*/master']], 
                browser: [
                    $class: 'BitbucketWeb', 
                    repoUrl: 'https://bitbucket.org/user/project'
                ], 
                doGenerateSubmoduleConfigurations: false, 
                userRemoteConfigs: [[
                    credentialsId: 'jenkins', 
                    url: 'git@bitbucket.org:user/project.git'
                ]]
            ])
        }
        stage('Lint') {
            sh "find . -type f -name '*.php' -exec php -l {} ; | grep -v \"No syntax errors detected\""
        }
        stage('Test') {
            parallel(
                'resultUnit': {
                    junit 'tests/_output/*.xml'
                },
                'resultHtml': {
                    publishHTML([
                        allowMissing: false, 
                        alwaysLinkToLastBuild: true, 
                        keepAll: false, 
                        reportDir: 'tests/_output/', 
                        reportFiles: 'report.html', 
                        reportName: 'HTML Report'
                    ])
                }
            )
        }
        stage('Results') {
            echo "Success"
            step([$class: 'WsCleanup'])
        }
    } catch (e) {
        currentBuild.result = "FAILED"
        throw e
    }
}

Node

node {

Vačšina úloh v rámci pipeline skriptu je vykonávaná v kontexte jedného alebo viacerých blokov node.

Vykonáva dve veci:

  1. Naplánuje úlohu, ktorá sa pridá do fronty na spustenie a akonáhle je executor voľný, krok sa spustí.
  2. Vytvára pracovný priestor (workspace), iba pre spustenú úlohu.

Pokiaľ máte nakonfigurovaného iného agent-a môžete ho vynútiť tým že zadáte parameter príkazu node, napríklad: node('nazovagenta') { v inom prípade sa použije hlavný master agent.

Stage

Stage je krok, ktorý výtvára podmnožinu v rámci pipeline, napríklad: “Checkout”, “Test”, “Deploy”… Tento krok využívajú mnohé doplnky na vizualizáciu alebo na prezentáciu statusu prípadne postupu.

jenkins-pipeline

Parallel

Paralelizmus vykonáva súčasne veľa práce s prostriedkami, ktoré má k dispozícii.

Dôvody prečo a kedy používať paralelizmus pri spúšťaní:

jenkins-pipeline

Step

step([$class: 'WsCleanup'])

Step je úloha na spustenie, ktorá vraví Jenkinsu, čo sa má vykonať.

Napríklad, spustenie shell príkazu sa vykonáva sh([script: 'echo hello']), prípadne, skrátena verzia sh 'echo hello'. Príkaz step([$class: 'WsCleanup']) vyčistí pracovný priestor vykonávaného job-u.

Na rozdiel od “jednoduchého” používania príkazov git je príkaz checkout( všeobecnejší krok špecifikujúci akúkoľvek zložitú konfiguráciu podporovanú doplnom Git.

Zdroje