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
automatizace:jenkins [2023/01/18 18:19]
tomas [Jenkins]
automatizace:jenkins [2024/02/15 19:49] (current)
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\\ 
 +/jnlpJars/jenkins-cli.jar ... stáhne jenkins-cli.jar pro Jenkins CLI\\
  
- +====Jenkins CLI==== 
-=== API ===+java -jar jenkins-cli.jar -s http://jenkins-test.oskarmobil.cz/ -noCertificateCheck -http -auth user:password  groovy = <plugins.groovy\\ 
 +==== 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 35:
 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\\