Jenkins Pipeline script 指令創建和變量定義


一、Jenkins Pipeline 

Pipeline,是一套運行於Jenkins上的工作流框架,將原本獨立運行於單個或者多個節點的任務連接起來,實現單個任務難以完成的復雜流程編排與可視化。

 

Stage:階段,一個Pipeline可以划分成若干個Stage,每個Stage代表一組操作,例如:“Build”,“Test”,“Deploy”。

【注意】Stage是一個邏輯分組的概念,可以跨多個Node

Node:節點,一個Node就是一個Jenkins節點,或者是Master,或者是Agent,是執行Step的具體運行環境。

Step:步驟,Step是最基本的操作單元,小到創建一個目錄,大到構建一個Docker鏡像,由各類Jenklins Plugin提供,例如:sh ‘make’

Pipeline五大特性

代碼:Pipeline以代碼的形式實現,通常被檢入源代碼控制,使團隊能夠編輯、審查和迭代其CD流程。
可持續性:Jenklins重啟或者中斷后都不會影響Pipeline Job。
停頓:Pipeline可以選擇停止並等待任工輸入或批准,然后再繼續Pipeline運行。
多功能:Pipeline支持現實世界的復雜CD要求,包括fork/join子進程,循環和並行執行工作的能力
可擴展:Pipeline插件支持其DSL的自定義擴展以及與其他插件集成的多個選項。

 

聲明式Pipeline的基本語法和表達式遵循與Groovy語法相同的規則,但有以下例外:

1、聲明式pipeline必須包含在固定格式pipeline{}快內
2、每個聲明語句必須獨立一行,行尾無需使用分號
3、塊(blocks{})只能包含章節(Sections),指令(Directives)步驟(Steps)或賦值語句
4、屬性引用語句被視為無參數方法調用。例:輸入被視為 input()

塊(blocks{})
由大括號括起來的語句,如pipeline{},Section{},parameters{},script{}
章節(Sections)
通常包含一個或多個指令或步驟。如 agent 、post、stages、steps
指令(Directives)
environment、options、parameters、triggers(觸發)、stage、tools、when
步驟(Steps)
Pipeline steps reference
執行腳本式pipeline:使用script{}

指令agent
必須存在,agent必須在pipeline塊內的頂層定義,但stage內是否使用使可選的

指令stages 必須,包括順序執行的一個或多個stage命令,在pipeline內僅能使用一次,通常位於agent/options后面,例子如上

指令steps 必須,steps位於stage指令塊內部,包括一個或多個step。僅有一個step的情況下可以忽略關鍵字step及其{},例子如上

指令environment 不是必須的,該environment指令指定一系列鍵值對,這些對值將被定義為所有步驟的環境變量或階段特定步驟,具體取決於environment指令位於Pipeline中的位置。

解釋一下什么意思,environment{…}, 大括號里面寫一些鍵值對,也就是定義一些變量並賦值,這些變量就是環境變量。環境變量的作用范圍,取決你environment{…}所寫的位置,你可以寫在頂層環境變量,讓所有的stage下的step共享這些變量,也可以單獨定義在某一個stage下,只能供這個stage去調用變量,其他的stage不能共享這些變量。一般來說,我們基本上上定義全局環境變量,如果是局部環境變量,我們直接用def關鍵字聲明就可以,沒必要放environment{…}里面。

environment {CC='clang'}
environment {AN_ACCESS_KEY = credentials('my-prefined-secret-text')}
steps {sh 'printenv'}

指令options ,該options指令允許在Pipeline本身內配置Pipeline專用選項,不是必須的 預定義pipeline專有的配置信息,僅可定義一次

pipeline {
    agent any
    options{
    timeout(time:1,unit: 'HOURS')
    }
    ...
}

指令parameters ,改parameters是參數的意思,不是必須的 定義參數化構建的參數,可選參數如下:

booleanParam布爾值參數

就是定義一個布爾類型參數,用戶可以在Jenkins UI上選擇是還是否,選擇是表示代碼會執行這部分,如果選擇否,會跳過這部分。一般需要使用布爾值的場景有,執行一些特定集成的腳本或則工作,或者事后清除環境,例如清楚Jenkins的workspace這樣的動作。

Pipeline {
    agent any
    parameters {
        booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '')
    }
}

choice選擇參數

#選擇(choice)參數就是支持用戶從多個選擇項中,選擇一個值用來表示這個變量的值。工作中常用的場景,有選擇服務器類型,選擇版本號等。

Pipeline {
    agent any
    parameters {
        choice(name: 'ENV_TYPE', choices: ['test', 'dev', 'product'], description: 'test means test env,….')
 
    }
}

file文件參數

文件(file)參數就是在Jenkins 參數化構建UI上提供一個文件路徑的輸入框,Jenkins會自動去你提供的網絡路徑去查找並下載。一般伴隨着還有你需要在Pipleline代碼中寫解析文件。也有這樣場景,這個構建job就是把一個war包部署到服務器上特定位置,你可以使用這個文件參數。

Pipeline {
    agent any
    parameters {
        name: 'FILE', description: 'Some file to upload')
    }
 
}

text文本參數

文本(text)的參數就是支持寫很多行的字符串:

Pipeline {
    agent any
    parameters {
        text(name: 'Welcome_text', defaultValue: 'One\nTwo\nThree\n', description: '')
    }
 
}

password密碼參數

密碼(password)參數就是在Jenkins 參數化構建UI提供一個暗文密碼輸入框,例如,我需要在一些linux機器上做自動化操作,需要提供機器的用戶名和密碼,由於密碼涉及安全問題,一般都采用暗文顯示,這個時候你就不能用string類型參數,就需要使用password參數類型。

Pipeline {
    agent any
    parameters {
        password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'A secret password')
 
    }
}

string字符串參數

就是定義一個字符串參數,用戶可以在Jenkins UI上輸入字符串,常見使用這個參數的場景有,用戶名,收件人郵箱,文件網絡路徑,主機名稱的或者url等

Pipeline {
    agent any   
    parameters {
        string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '')
    }
}

tool字符串參數

定義自動安裝和放置工具的部分PATH。如果agent none指定,這將被忽略。特點:只支持定義maven jdk gradle三種工具的環境變量。代碼舉例:

pipeline {
    agent any
    tools {
        // Install the Maven version configured as "M3" and add it to the path.
        maven "M3"
    }
}

參數情況

paramenters {
    choice(name:'PerformMavenRelease',choices:'False\nTrue',description:'desc')
   choice(name:'ENV_TYPE',choices:['test', 'dev', 'product'],description:'test means test env,…')
   password(name:'CredsToUse',description:'Apassword to build with',defaultValue:'')
   string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '')
}
environment {
    BUILD_USR_CHOICE="${params.PerformMavenRelease}"
    BUILD_USR_CREDS="${params.CredsToUse}"
}

 

二、快速創建一個pipeline
  1.新建 Item ,點擊紅框中的"新建Item":

在這里插入圖片描述

  2.新建 pipeline,輸入任務名稱,點擊紅框中的"新建流水線",點擊確定:

在這里插入圖片描述

  3.接下來會彈出詳細設置的表單,如下圖,選擇"流水線"的Tab頁,在頁面上直接輸入一段pipeline內容,再點擊左下角的"保存"按鈕:

 

pipeline script參考:

pipeline{
    agent any
    stages {
        stage('Build') {
            steps{
                echo 'This is a build step' 
            }
        }
        stage('Test') {
            steps{
                echo 'This is a test step'  
            }
        }
        stage('Deploy') {
            steps{
                echo 'This is a deploy step'    
            }
        }
    }
}

  4.點擊下圖紅框中的"立即構建",即可執行剛才輸入的pipeline腳本:

   5.任務執行完畢后如下圖所示,點擊紅框中的圖標,即可查看本次任務執行過程中的控制台輸出:

 

 

 

常用的輔助工具

· Snipper Generator(代碼片段生成器,語法檢查器)
· Replay Pipeline(重放pipeline,可以修改script,修改后的不存入config.xml)
· DSL Reference 語法參考手冊
· 全局變量引用
· Stage View
· BlueOcean(可視化)
· Pipeline神器:可視化編輯器
· 命令行Pipeline調試工具

三、變量的傳遞

  1. 自定義變量(局部)
def username = 'Jenkins'
echo "Hello Mr.${username}"
#注意一定要用雙引號,單引號識別為字符串

      2.環境變量(局部)

withEnv(['MYTOOL_HOME=/usr/local/mytool']){
    sh '$MYTOOL_HOME/bin/start'
}

  3.環境變量(全局)

environment {CC='clang'}
echo "Compiler is ${env.CC}"

  4.參數化構建(全局)

parameters {string(name:'Jenkins',defaultValue:'Hello',description:'How should I greet the world')}
ehco "${params.Greeting} World!"

 

判斷

when僅用於stage內部
when的內置條件為:

 - when {branch 'master'}
 - when {environment name:'DEPLOY_TO',value:'production'}
#當有環境變量 name 為 DEPLOY_TO 值是 production 條件成立
 - when {expression {return params.DEBUG_BUILD}}
#表達式返回值為真時
 - when {not {branch 'master'}}
 - when {allOf {branch 'master'; environment name:'DEBUG_TO',value:'production'}}
#allOf 所有條件都滿足時
 - when {anyOf {branch 'master' ; branch 'staging'}}
#anyOf有一個條件滿足時即可

判斷和異常處理
流程控制if/else條件

node {
    stage('Example'){
        if(env.BRANCH_NAME == 'master'){
            echo 'I only execute on the master branch'
        }else {
            echo 'Iexecute elsewhere'
        }
    }
}

循環
for循環僅存在域腳本式pipeline中,但是可以通過在聲明式pipeline中調用script step來執行

pipeline {
    agent any
    stages {
        stage('Example'){
            steps{
                echo 'Hello world!'
                script {
                    def browsers = ['chrome','firefox']
                    for (int i = 0;i < browers.size();++i){
                        echo "Testing the ${browsers[i]} browser"
                    }
                }
            }
        }
    }
}

 

 實操舉例:

pipeline {
    agent any

  tools {定義maven工具和變量}
   environment {定義Git地址,服務器IP,服務器目錄}
   parameters  {定義參數默認值,名稱,定義trim函數移除字符串兩側的空白字符或其他預定義字符}
   stages {
        stage('checkout')檢出步驟
        stage('build')編譯步驟
        stage('deploy')部署步驟
}
}
pipeline {
    agent any

    tools {
        // Install the Maven version configured as "M3" and add it to the path.
        maven "M3"
    }
    environment {
        __GIT_URL = "http://10.191.X.XXX:3000/Developments/DIOT.git"
        // __APP_NAME = "bigdata-pv"
        __REMOTE_IP = "10.191.X.XXX"
        __REMOTE_DIR = "/opt/backend/"
    }

    parameters {
        string defaultValue: 'master', description: '', name: 'BRANCH_TAG', trim: true
    }
    

    stages {
        stage('checkout') {
            
            steps {
                
                // Get some code from a GitHub repository
                checkout([$class: 'GitSCM', branches: [[name: '${BRANCH_TAG}']],
                    userRemoteConfigs: 
                            [[
                                credentialsId: '9c848141-f748-4491-b547-6379452a37ad', 
                                url: "${__GIT_URL}"
                            ]]]
                        )
            }
            
        }
        stage('build') {
            
            steps {
                sh "cd ui-ngx/"
                sh "mvn clean package -DskipTests"
                sh "cd .."
                sh "mvn clean package -DskipTests"
                
            }
        }
        stage('deploy') {
            steps {
                // sh "scp ${WORKSPACE}/application/target/*.rpm root@${__REMOTE_IP}:${__REMOTE_DIR}"
                // sh "ssh root@${__REMOTE_IP} -t 'systemctl stop thinsboard && sleep 3 && sudo rpm -Uvh thingsboard.rpm --nodeps --force && sleep3 && systemctl start thinsboard; bash'"
                sh "scp ${WORKSPACE}/application/target/*-boot.jar root@${__REMOTE_IP}:${__REMOTE_DIR}"
                sh "ssh root@${__REMOTE_IP} -t 'cd ${__REMOTE_DIR} && sleep 3 && ./start.sh; bash'"
                
            }
        }
        stage('Test') {
            steps {
                echo 'test....'
            }
        }
        // stage('歸檔') {
        //     steps {
        //         archiveArtifacts artifacts: 'target/*.jar'
        //     }
        // }
    }
}

 

 

 

————————————————

參考鏈接:https://blog.csdn.net/diantun00/article/details/81075007

Jenkins高級篇之Pipeline語法篇-6-Declarative Pipeline指令:environment/options/parameters_Anthony_tester的博客-CSDN博客_jenkins parameters


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM