---
# System prepended metadata

title: jenkins declarative pipeline
tags: [declarative pipeline, jenkins]

---

# jenkins declarative pipeline

declarative pipeline

0. gitlab webhook get wrong commit
1. env/params/local variable
2. variable scope
3. git checkout and git push 
4. literal template/ java string
5. groovy vs bash
6. mkdir in pipeline
7. jib command example
8. parallel block 
9. each bash as another brand new workspace

---
### 0. webhook trigger by test button only send the lastest commit id

![](https://i.imgur.com/Zb3q3le.png)

those test only send the default branch lastest commit id 

---
### 1. env/params/local variable
${var} => read local var 
${params.var} => read from params
${env.var} => read enviroment var 

```
    environment {
        GIT_AUTH = credentials('marketing-cloud-gitlab_ops_cred') 
    }
    
    parameters {
        string(name: 'JAVA_CHECKOUT_COMMIT', defaultValue: "${env.gitlabAfter}", description: 'commitId ${env.gitlabAfter} for webhook carried info, or use refs/heads/main get the main branch newest commit id')
        string(name: 'OPS_MAIN_BRANCH', defaultValue: "main", description: 'ops main branch')
        string(name: 'OPS_UAT_BRANCH', defaultValue: "deployment/uat", description: 'OPS_BRANCH')
        string(name: 'IMAGE_PREFIX', defaultValue: "", description: "test/ for test purpose, left this input empty for uat/prod run replace ")
    }


```

### 2. variable scope


2a. each bash is new environment, its env variables are copied from the outer runtime. 
2b. local varible declare in script block 
    w/ def : scope within this script block  
    w/o def: global var
2c. order of searching variable: local(def)-> global -> params -> env
```  
script{
    def script_block_scope_var="value"
    global_block_scope_var="val"
}

```


### 3. git checkout and git push 
clone,pull:
ps. name can replace with git commit id
```
checkout([$class: 'GitSCM',
    branches: [[
    name:'refs/heads/main']],
    userRemoteConfigs: [[
        url: 'https://git.systex.com/2021_10B17C/ob17b20110002/code/marketing-cloud-ops.git',
        credentialsId: 'gitlab-systex-OB17B20110002-code-systexcloud-uat-eks-jenkins',
    ]]]) 
```

push:
```
environment {
      GIT_AUTH = credentials('gitlab_ops_cred') 
}

steps{
/*
project_{project_id}_bot   
project{project_id}_bot@noreply.{Gitlab.config.gitlab.host}
git config --global user.email "project3028_bot@noreply.git.systex.com"
git config --global user.name "project_3028_bot"
*/
				
sh'''
	git config --local credential.helper "!f() { echo username=${env.GIT_AUTH_USR}; echo password=${env.GIT_AUTH_PSW}; }; f"		
	git config --global user.email "project3028_bot@noreply.git.systex.com"
	git config --global user.name "project_3028_bot"		
'''
}
```



### 4. literal template(double quote)/ java string(single quote)
double quote script for groovy templatable String(replace var by groovy)
```
VAR="VALUE"

"$VAR" will replace by groovy variable => VALUE 
"\$VAR" escape template string replacement=> $VAR for bash
'$VAR' pure java string => $VAR for bash
```

### 5. groovy vs bash
communicate with bash,echo for standard output to params, 
trim for unpredictable blank string

```
UPDATED_JAVA_SCHED_TAG=sh(returnStdout:true,script:"""
#!bin/bash
UPDATED_JAVA_SCHED_TAG=\$(cat ./marketing-cloud-sched-api-appsrv/target/jib-image.json | yq -r '.tags[0]')
echo \$UPDATED_JAVA_SCHED_TAG
""").trim()
```

### 6. bash mkdir command cant work,
for create new folder (ex. for multi_repo checkout)
```
dir('folder_name'){
}
```

### 7. jib::maven
```
AWS_PROFILE=ecr mvn -B package jib:build -T 1.5C     -DskipTests -Dmaven.test.skip \
    -Djib.allowInsecureRegistries=false \
    -Djib.to.credHelper=ecr-login \
    -Djib.image.repo=$ECR_REPO \
    -Djib.image.name=$imagename\
    -f  ./marketing-cloud-front-web-api-appsrv-lib/pom.xml ;
```
### jib::gradle
```
AWS_PROFILE=ecr gradle jib \
	-Djib.to.credHelper=ecr-login  \
	-PjibImageRepo=866485381963.dkr.ecr.ap-northeast-1.amazonaws.com/jcic/
```



### 8. parallel failfast: 平行處理多工, 設定其中一件fail就中斷所有平行工作

```
pipeline {
    environment {
          GIT_AUTH = credentials('marketing-cloud-gitlab_ops_cred') 
    }
    options {
        parallelsAlwaysFailFast() //all parallel fail fast
    }
    agent any 
           stage('Parallel In Sequential') {
                    parallel {
                        stage('In Parallel 1') {
                            steps {
                                echo "In Parallel 1"
                            }
                        }
                        stage('In Parallel 2') {
                            steps {
                                echo "In Parallel 2"
                            }
                        }
                    }
                }
    }
```


p.s. blank block are forbidden
```
ex. environment{
	}
```

###### tags: `jenkins` `declarative pipeline`
