Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
automatizace:jenkins [2023/01/18 18:19]
tomas [Jenkins]
automatizace:jenkins [2024/02/15 19:19]
tomas [Dokumentace]
Line 1: Line 1:
          
-====Jenkins====+=====Jenkins=====
  
 Integracni nastroj postaveny na Jave (frontend bezi na Tomcatu). Podporuje SCM (Source Contrl Management):\\ Integracni nastroj postaveny na Jave (frontend bezi na Tomcatu). Podporuje SCM (Source Contrl Management):\\
Line 9: Line 9:
 [[http://www.slideshare.net/dstine4/jenkins-and-chef-infrastructure-ci-and-automated-deployment|Prezentace o Jenkinsovi]]\\ [[http://www.slideshare.net/dstine4/jenkins-and-chef-infrastructure-ci-and-automated-deployment|Prezentace o Jenkinsovi]]\\
  
-=== Skripty Groovy === +==== Dokumentace ==== 
-[[https://groovy-lang.org/documentation.html|Groovy]] jazyk+JENKINS_URL/env-vars.html ... popis preddefinovanych promennych\\ 
 +/queue/api/\\ 
 +/api\\ 
 +/script ... scriptovaci konzole\\
  
- +==== API ==== 
-=== API === +curl -u UZIVATEL:TOKEN -k https://SERVER/cesta\\
-curl -u UZIVATEL:TOKEN -k https://SERVER/cesta+
 curl -u $juser:$token -k https://SERVER/job/CESTA/job/JOB/1201/doDelete -v -X POST ... smazání buildu\\ curl -u $juser:$token -k https://SERVER/job/CESTA/job/JOB/1201/doDelete -v -X POST ... smazání buildu\\
  
Line 30: Line 32:
 https://SERVER/job/SLOZKA/job/SLOZKA/job/deployer/457/consoleFull ... výstup z konzole jobu 457 v HTML formě\\ https://SERVER/job/SLOZKA/job/SLOZKA/job/deployer/457/consoleFull ... výstup z konzole jobu 457 v HTML formě\\
  
 +==== Skripty Groovy ====
 +[[https://groovy-lang.org/documentation.html|Groovy]] jazyk\\
 +[[https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#using-environment-variables|Environment variables]] ... výchozí hodnoty prostředí Jenkinse, přistupuje se k nim přes ${env.WORKSPACE}\\
 +
 +=== Kostra kódu ===
 +kdekoliv může být definice proměnné, ne jen v environment sekci:
 +def skipPublishDefault = (BRANCH_NAME == 'hotfix') ? true : false ... podmíněná definice
 +
 +<code>
 +@Library([path])
 +pipeline {
 +  agent none //
 +  options {}
 +  triggers {}
 +  parameters {}
 +  environment {}
 +  stages {
 +    stage {}
 +    stage {}
 +    post {}
 +  }
 +  post {}
 +}
 +</code>
 +
 +nebo když se nedefinuje akce souborem ale v UI:
 +
 +<code>
 +node {
 +  stage {}
 +  stage {}
 +}
 +</code>
 +
 +=== sekce agent ===
 +label "docker" || "linux" ... selekce agenta podle labelu\\
 +
 +any ... jakykoliv
 +
 +none ... žádný agent se nealokuje
 +
 +node {} ... jak label, ale umožňuje další možnosti, vice na [[https://www.jenkins.io/doc/book/pipeline/syntax/]]
 +
 +<code>docker {
 +image 'maven:1.2.3'
 +label 'moje'
 +args '-v /tmp'
 +registryUrl 'https://myregistry.com/'
 +registryCredentialsId 'myPredefinedCredentialsInJenkins'
 +}</code>
 +
 +dockerfile {} ... vice na [[https://www.jenkins.io/doc/book/pipeline/syntax/]]
 +
 +<code>kubernetes {
 +                            label "android-slave-dynamic"
 +                            defaultContainer "android-slave"
 +                            yaml libraryResource("agents/android-agent.yaml")
 +                        }</code>
 +
 +
 +=== tools ===
 +sekce v pipeline, nainstaluje pro běh na agentovi nástroj dané verze: maven, jdk, gradle
 +
 +=== sekce triggers ===
 +cron cron('H */4 * * 1-5') ... časové spouštění
 +
 +pollSCM('H */4 * * 1-5')
 +
 +upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS) ... když skončí specifikované joby specifikovaným tresholdem
 +
 +
 +=== sekce options ===
 +Parametry celkového běhu, komplet popis viz [[https://www.jenkins.io/doc/book/pipeline/syntax/]]
 +
 +disableConcurrentBuilds()\\
 +buildDiscarder(logRotator(numToKeepStr: '40', artifactNumToKeepStr: '40'))\\
 +timeout(time: 3, unit: 'HOURS')\\
 +timestamps ()\\
 +
 +=== sekce parameters ===
 +vstupní parametry pro běh pipeliny
 +
 +''%%string name: 'SERVICE_NAME', description: 'Service name.', trim: true%%'' ... textový parametr\\
 +''%%choice name: 'ENVIRONMENT', choices: ['dev', 'stg'], defaultValue: 'NotProvided', description: 'Target environment.'%%'' ... výběr\\
 +''%%booleanParam name: 'PIPELINE_REFRESH', description: """
 +OPTIONAL
 +Reload this pipeline from pipeline definition, parameters etc."""%%'' ... pravda, nepravda, popis na víc řádků\\
 +text(name: 'BIOGRAPHY') ... víceřádkový text\\
 +password(name: 'PASSWORD') ... heslo - skryje se v logu\\
 +
 +=== sekce environment ===
 +Proměnné, přistupuje se k nim přes ${TARGET}
 +
 +KLIC = 'hodnota'\\
 +SETTINGS_XML = credentials('maven_settings') ... mžnost použít i secret text\\
 +
 +=== sekce stage ===
 +agent {} ... viz sekce agent\\
 +when {} ... podmínka, kdy step jede a jestli\\
 +environment {} ... viz sekce environment\\
 +options {} ... parametry pro stage, jako trřeba timeout, více na [[https://www.jenkins.io/doc/book/pipeline/syntax/]]\\
 +input {} ... uživatlský vstup\\
 +stages {} || parallel {} || matrix {} || steps {} ... obsahuje max. 1 z uvedených\\
 +try {} catch () {}\\
 +for (int i = 0; i < browsers.size(); ++i) { echo "${pole[i]} " }\\
 +
 +=== sekce when ===
 +beforeAgent true\\
 +expression { !params.SPUSTIT && BRANCH ==~ /(dev|test|PR-.*)/ }\\
 +
 +=== sekce steps ===
 +script {} ... umožnuje vnořit akce, včetně smyček atd.\\
 +if (sharedTools.shouldRun("build")) {} .. podmínka, provede akce v {} když je podmínka spněna\\
 +dir('android') {} ... provede akce v {} v adresáři android\\
 +script {} ... posloupnost akcí v {}\\
 +echo '' ... nativni Jenkins funkce pro echo\\
 +sh 'echo ahoj' ... shell skript\\
 +
 +withCredentials() {} ... obsah {} se provede s kredencema načtenýma ze secretu, přiřazenýmá do proměnné\\
 +withCredentials([file(credentialsId: "AA${BB}", variable: 'VAR')]) { writeFile file: '.env.'+ ENV_TYPE.toLowerCase(), text: readFile(VAR) }\\
 +withCredentials([ string(credentialsId: 'AA', variable: 'BB'), string(credentialsId: 'CC', variable: 'DD') ]) { echo "${CC} ${DD}"}
 +%%withCredentials([ usernamePassword(credentialsId: 'dxl-cz-github-user', usernameVariable: 'username', passwordVariable: 'password') ]) {sh 'git remote set-url origin "https://${username}:${password}@github.vodafone.com/VFCZ-DXL/${microserviceName}.git"' }%%\\
 +withNPM(npmrcConfig: 'npmrcs-cz') {} ... použije file npmrcs-cz a udělá z něj .npmrc\\
 +%%checkout([$class: 'GitSCM', branches: [[name: 'develop']], extensions: [[$class: 'CleanBeforeCheckout']],userRemoteConfigs: [[credentialsId: 'secret1',url: 'https://user@github.bbb.com/ccc/ddd.git']]])%%\\
 +withDockerRegistry([credentialsId: 'aaa', url: "https://REPOSITORY"]) ... provede docker login s kredencema\\
 +
 +<code>configFileProvider([fileId:'conf_file', variable:'soubor']) {
 +      script {
 +        echo "Ctu soubor '${soubor}' ..." 
 +        servers = readJSON(file:soubor)  } }</code>
 +
 +
 +=== sekce post ===
 +Je buď ve sekci pipelines, nebo steps, více viz [[https://www.jenkins.io/doc/book/pipeline/syntax/]]. Je to jako step, ale záleží na okolnostech:
 +
 +always {} ...vždy\\
 +changed {} ... jen když se změnil status od minulého běhu (success > fail např.)\\
 +fixed {} ... \\
 +regression {} ...\\
 +aborted {} ... jen, když se běh přeruší\\
 +success {} ... jen když vše bylo v pořádku\\
 +unstable {} ...\\
 +unsuccessful {} ...\\
 +cleanup {} ... poslední step, provede se po všech ostatních post krocích, ať dopadly jakkoli\\
  
 +=== Definice funkcí ===
 +def call(body) {def pipelineParams = [:] } ... definice funkce v knihovně. 1 soubor = jedna funkce, název funkce = název souboru, např. /vars/aaa.groovy, funkce aaa(parametr1=2), pipelineParams.parametr1 je vstupní parametr s hodnotou 2\\