jenkins流水線學習一(語法)


聲明:學習資料來源於 https://blog.csdn.net/u011541946/category_8223796.html ,本人只是做了一些歸納和練習 

一、創建項目

1、在創建項目類型時選擇流水線(pipeline)項目;

2、在創建頁面的pipeline區域(類型默認是pipeline script),輸入框右上角有示例選擇,選擇其中一個后,點擊保存。

3、構建

這樣一個簡單的流水線demo就完成了

一般我們類型選擇pipeline script from SCM(pipeline來自於配置)

1、SCM選擇Git

2、填寫好git路徑和鑒權秘鑰

3、腳本路徑填寫groove文件在git項目中的路徑。比如HelloWorld.groovy文件在根目錄,我直接填寫HelloWorld.groovy即可

二、groovy語法

官網語法:https://jenkins.io/doc/book/pipeline/syntax/

三、關鍵字pipeline、agent、node、stages、stage、steps

// Declarative類型 
pipeline {
    agent any
    // 指定運行機器
    // agent {
    //     node {
    //          label "win-anthony"
    //          customWorkspace "${env.JOB_NAME}/${env.BUILD_NUMBER}"
    //     }
    // } 
    stages {
        stage('Build') { 
            steps {
                // 這里是Groovy語法,寫了一個打印語句
                println "Build" 
            }
        }
        stage('Test') { 
            steps {
                // 在linux上執行
                sh "echo `pwd`"
            }
        }
        stage('Deploy') { 
            steps {
                println "Deploy" 
            }
        }
    }
}
// Scripted類型:
// 1、行數精簡,很短。但是不好寫,也不好讀,維護起來相等困難;
// 2、沒有stages這個關鍵字;
// 3、可以node('Node name') {}來開頭,Node name就是從節點或master節點的名稱
// node {  
//     stage('Build') { 
//         // 
//     }
//     stage('Test') { 
//         // 
//     }
//     stage('Deploy') { 
//         // 
//     }
// }

1、pipeline
  告訴Jenkins接下來{}中的代碼就是pipeline代碼,和普通的函數或者方法隔離出來。
2、agent
  代理,一般在pipeline下面,這個和選擇用jenkins平台上那一台機器去執行任務構建有關;
  如果 agent 設置為none,那么stage中則需要指定 agent;  

  如果 agent 設置為指定機器,需要用到機器標簽名、運行路徑等信息(在jenkins的系統管理—節點管理頁面,新建節點時會有這些信息填寫)參考:https://blog.csdn.net/u011541946/article/details/83591148

3、node
  用來區分Jenkins環境中不同的節點環境
4、stages和 stage
  a、一個stages包含多個stage;
  b、stage指一段代碼塊,一般一個stage包含一個業務場景的自動化,例如build是一個stage, test是第二個stage,deploy是第三個stage;
  c、在一個Declarative Pipeline腳本中,只允許出現一次stages ;
  通過stage隔離,讓Pipeline代碼讀寫非常直觀。
5、steps
  a、Declarative 模式中,不支持在steps {…} 里面嵌套寫step{…} ,一個stage 下至少有一個steps,一般也就是一個steps
  b、steps指一個步驟,一般來說,一個steps{}里面就寫幾行代碼,或者一個try catch語句

四、關鍵字post、environment、options、parameters、triggers、tools

pipeline {
    agent any 
    environment {
        // 定義一些變量並賦值,這些變量就是環境變量;
        unit_test = true
    }
    options {
        // options指令允許在Pipeline本身內配置Pipeline專用選項;下面示例是構建失敗會執行三次
        retry(3)
    }
    parameters {
        // 提供用戶在觸發Pipeline時應提供的參數列表
    }
    triggers {
        // 觸發條件
        pollSCM (‘H H(9-16)/2 * * 1-5)’)
    }
    tools {
        // 自動安裝和放置工具的部分PATH
        jdk 'jdk8' 
    }
    stages {
        stage('Deploy') { 
            steps {
                if(unit_test == true) {
                    // call run unit test methods
                }
            }
        }
    }
    post {
        //寫相關post部分代碼
        always {
            script {
                //寫相關清除/恢復環境等操作代碼
            }
        }
    }
}

1、post
  a、和agent{…}同級,也可以放在stage里面
  b、使用post的場景基本上執行完一個構建,進行發送消息通知,例如構建失敗會發郵件通知
  c、在post代碼塊區域,支持多種條件指令,這些指令有
    always(無論Pipeline運行的完成狀態如何都會執行這段代碼)、
    changed(與上一次構建的結果不同時就執行。例如,你最近幾次構建都是成功,突然變成不是成功狀態,里面就觸發發郵件通知)、
    failure(構建失敗)、
    success(構建失敗)、unstable,和aborted
2、environment
  environment{…}, 定義一些變量並賦值,這些變量就是環境變量;
  作用范圍取決你environment{…}所寫的位置
3、options
  該options指令允許在Pipeline本身內配置Pipeline專用選項;比如retry,失敗會重復執行
  作用范圍取決於你寫的位置
4、parameters
  jenkins項目配置中的General中的參數化構建也可以,這里是代碼的方式來創建,不需要在jenkins UI上一個一個創建
  parameters指令提供用戶在觸發Pipeline時應提供的參數列表
5、triggers 觸發器
  對於與源代碼集成的Pipeline,如GitHub或BitBucket,triggers可能不需要基於webhook的集成可能已經存在。
  目前有三個可用的觸發器是cron(定時任務)和pollSCM(輪詢) 和 upstream
6、tools
  a、定義自動安裝和放置工具的部分PATH。如果agent none指定,這將被忽略。
  b、只支持定義maven jdk gradle三種工具的環境變量。
  c、工具名稱必須在Jenkins 管理Jenkins → 全局工具配置中預配置。例如,上面代碼寫了jdk,那么必須在jenkins管理的全局工具配置中有jdk配置

四、關鍵字input、when

1、input
該指令允許在一個stage{…}顯示提示輸入等待。
在inpt{…}寫一些條件,然后用戶觸發構建這個job,但是這個時候沒有接收到有效的input, job會一直在等待中。
需要在構建頁面點擊這個stage,就會彈出input中的內容

pipeline {
    agent any
    stages {
        stage('Example') {
            input {
                message "Should we continue?"
                ok "Yes, we should."
                submitter "admin,anthony"
                parameters {
                    string(name: 'PERSON', defaultValue: 'Mr Anthony', description: 'Who should I say hello to?')
                }
            }
            steps {
                echo "Hello, ${PERSON}, nice to meet you."
            }
        }
    }
}

 貌似上面的submitter限制無效

2、when
a、When{…}是寫在stage{…}里面一層條件控制,根據給定的條件確定是否執行該階段。
b、必須至少包含一個條件,且所有條件為真
c、when{…}支持的一些內置條件命令,如下
  branch
  當正在構建的分支與給出的分支模式匹配時執行階段,例如:when { branch 'master' }。請注意,這僅適用於多分支Pipeline。
  environment
  當指定的環境變量設置為給定值時執行階段,例如: when { environment name: 'DEPLOY_TO', value: 'production' }
  expression
  當指定的Groovy表達式求值為true時執行階段,例如: when { expression { return params.DEBUG_BUILD } }
  not
  當嵌套條件為false時執行階段。必須包含一個條件。例如:when { not { branch 'master' } }
  allOf
  當所有嵌套條件都為真時,執行舞台。必須至少包含一個條件。例如:when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } }
  anyOf
  當至少一個嵌套條件為真時執行。必須至少包含一個條件。例如:when { anyOf { branch 'master'; branch 'staging' } }

pipeline {
    agent any
    environment {
        quick_test = false
    }
    stages {
        stage('Example Build') {
            steps {
                script {
                    echo 'Hello World'
                }
            }
        }
        stage('Example Deploy') {
            when {
                expression { 
                   return  (quick_test == "true" )
                }
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}

判斷條件那里的true得帶雙引號,不知道為什么。因為我寫false的時候不會執行后面的steps,但是帶雙引號的false后則會執行后面的steps

五、stage順序嵌套
1、所有的stage,都會內嵌在最外層的stages{…}
2、一個stage{…}下可以內嵌有且只有一個stages{…}
3、多層嵌套只支持在最后一個stage{…}里面
4、嵌套越多越復雜,最簡單就是觀察每一個stage的大括號的范圍

pipeline {
    agent none
    stages {
        stage('Non-Sequential Stage') {
            agent {
                label 'for-non-sequential'
            }
            steps {
                echo "On Non-Sequential Stage"
            }
        }
        stage('Sequential') {
            agent {
                label 'for-sequential'
            }
            environment {
                FOR_SEQUENTIAL = "some-value"
            }
            stages {
               stage('In Sequential 1') {
                   steps {
                       echo "In Sequential 1"
                   }
               }
               stage('In Sequential 2') {
                   steps {
                       echo "In Sequential 2"
                   }
               }
            }
        }
    }
}
View Code

六、stage並行
1、並行stage{…}需要用到指令paraller, 有一個paraller{…} 里面包含多個stage{…},最后一個stage{…}內部支持嵌套多個stages{…}。
2、在paraller{…}如果要設置只要里面有一個stage{…}運行失敗就強制停止,可以使用表達式failFast true 來條件控制。

pipeline {
    agent any    
    stages {
        stage('Non-Parallel Stage') {
            steps {
                echo 'This stage will be executed first.'
            }
        }
        stage('Parallel Stage') {
            // 並行二給了一個錯誤的指令,構建時出現問題,並行三會終止
            failFast true
            parallel {
                stage('並行一') {
                    steps {
                        echo "並行一"
                    }
                }
                stage('並行二') {
                    steps {
                        // 錯誤的指令
                        echo1 "並行二"
                    }
                }
                stage('並行三') {
                    stages {
                        stage('Nested 1') {
                            steps {
                                echo "In stage Nested 1 within Branch C"
                            }
                        }
                        stage('Nested 2') {
                            steps {
                                echo "In stage Nested 2 within Branch C"
                            }
                        }
                    }
                }
            }
        }
    }
}
View Code

 


免責聲明!

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



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