https://jenkins.io/zh/doc/book/pipeline/syntax/
https://blog.csdn.net/taishanduba/article/details/61423121
https://www.cnblogs.com/kevingrace/p/6022447.html
通用規則
- Agent
- Agent通常是一個機器或容器,它連接到Jenkins主機,並在主控器指導時執行任務。
- Artifact
-
在Build或Pipeline 運行期間生成的不可變文件,該文件歸檔到Jenkins Master上以供用戶隨后檢索。
- Build
-
項目 單次執行的結果
- Cloud
-
提供動態代理 配置和分配的系統配置,例如由Azure VM Agents 或 Amazon EC2插件提供的配置和分配 。
- Core
-
主要的Jenkins應用程序(
jenkins.war
)提供了 可以構建Plugins的基本Web UI,配置和基礎。 - Downstream
-
配置Pipeline或項目時被觸發作為一個單獨的Pipeline或項目的執行的一部分。
- Executor
-
用於執行由節點上的Pipeline或 項目定義的工作的插槽。節點可以具有零個或多個配置的執行器,其對應於在該節點上能夠執行多少並發項目或Pipeline。
- Fingerprint
-
考慮全局唯一性的哈希追蹤跨多個Pipeline或項目的工件或其他實體 的使用 。
- Folder
-
類似於文件系統上的文件夾的Pipeline和/或 項目 的組織容器。
- Item
-
Web UI中的實體對應於:Folder, Pipeline, or Project.
- Job
-
一個不推薦的術語,與項目同義。
- Label
-
用於分組代理的用戶定義的文本,通常具有類似的功能或功能。例如
linux
對於基於Linux的代理或docker
適用於支持Docker的代理。 - Master
-
存儲配置,加載插件以及為Jenkins呈現各種用戶界面的中央協調過程。
- Node
-
作為Jenkins環境的一部分並能夠執行Pipeline或項目的機器。無論是the Master還是Agents都被認為是Nodes。
- Project
-
用戶配置的Jenkins應該執行的工作描述,如構建軟件等。
- Pipeline
-
用戶定義的連續輸送Pipeline模型,以便更多閱讀本手冊中的“ Pipeline”一章。
- Plugin
-
與Jenkins Core分開提供的Jenkins功能擴展。
- Publisher
-
完成發布報告,發送通知等的所有配置步驟后的 構建的 一部分。
- Stage
-
stage
是Pipeline的一部分,用於定義整個Pipeline的概念上不同的子集,例如:“構建”,“測試”和“部署”,許多插件用於可視化或呈現Jenkins Pipeline狀態/進度。 - Step
-
單一任務從根本上講,指的是Jenkins 在Pipeline或項目中做了什么。
- Trigger
-
觸發新Pipeline運行或構建的標准。
- Update Center
-
托管插件和插件元數據的庫存,以便在Jenkins內部進行插件安裝。
- Upstream
-
配置的Pipeline或項目,其觸發單獨的Pipeline或項目作為其執行的一部分。
- Workspace
-
Noede文件系統上的一次性目錄, 可以由Pipeline或項目完成工作。在Build或 Pipeline運行完成后,工作區通常會保留原樣,除非在Jenkins Master上已經設置了特定的Workspace清理策略。
1.Freestyle project
這個是jenkins的基礎功能,可以用它來執行各種構建任務,他只能構建在一個電腦上,如果沒有太多的需求,這個job基本夠用了,它包含了所有基礎功能.
2.Pipeline
真實的工作環境有很多job,比如先編譯,然后執行靜態代碼檢查、單元測試、然后部署服務器、服務器重啟、進行ui測試等。我們需要對這些job進行一些設置將它們的上下游關系配置好。這個時候就需要pipeline配置了.詳細的可以參考這篇文章
3.External job
用來監視外部執行的job.
4.Multi-configuration project
可以讓job跑在不同的機器上.這個需要添加機器(節點),流程的話可以參考這篇文章
后面還有一些,這里不一一介紹了,有需要的可以自己google.
我們選擇最基礎的freestyle創建一個job,點擊ok按鈕.
1)代碼上線要經歷四個場景:Dev開發環境-->Test測試環境-->Beta驗收環境-->Online線上環境
Dev開發環境:開發人員在開發機上自行開發,開發后將代碼上傳到svn/git版本控制系統里。
Test測試環境:將代碼從svn下載並同步到測試機(Test環境發版),通知測試同事進行上線前的業務測試。
Beta驗收環境:測試同事測試ok后,將代碼同步到Beta機上(Beta環境發版),然后通知產品/運營同事進行上線前的驗收。
Online線上環境:待Beta驗收ok后,再將代碼同步到線上機器上,最終完成Online發版。
聲明式和腳本化的流水線語法
Jenkinsfile
能使用兩種語法進行編寫 - 聲明式和腳本化。
聲明式和腳本化的流水線從根本上是不同的。 聲明式流水線的是 Jenkins 流水線更近的特性:
-
相比腳本化的流水線語法,它提供更豐富的語法特性,
-
是為了使編寫和讀取流水線代碼更容易而設計的。
然而,寫到`Jenkinsfile`中的許多單獨的語法組件(或者 "步驟"), 通常都是聲明式和腳本化相結合的流水線。 在下面的 [pipeline-concepts] 和 [pipeline-syntax-overview] 了解更多這兩種語法的不同。
Why Pipeline?
本質上,Jenkins 是一個自動化引擎,它支持許多自動模式。 流水線向Jenkins中添加了一組強大的工具, 支持用例 簡單的持續集成到全面的CD流水線。通過對一系列的相關任務進行建模, 用戶可以利用流水線的很多特性:
-
Code: 流水線是在代碼中實現的,通常會檢查到源代碼控制, 使團隊有編輯, 審查和迭代他們的交付流水線的能力。
-
Durable: 流水線可以從Jenkins的主分支的計划內和計划外的重啟中存活下來。
-
Pausable: 流水線可以有選擇的停止或等待人工輸入或批准,然后才能繼續運行流水線。
-
Versatile: 流水線支持復雜的現實世界的 CD 需求, 包括fork/join, 循環, 並行執行工作的能力。
-
Extensible:流水線插件支持擴展到它的DSL [1]的慣例和與其他插件集成的多個選項。
然而, Jenkins一直允許以將自由式工作鏈接到一起的初級形式來執行順序任務, [4] 流水線使這個概念成為了Jenkins的頭等公民。
構建一個的可擴展的核心Jenkins值, 流水線也可以通過 Pipeline Shared Libraries 的用戶和插件開發人員來擴展。 [5]
下面的流程圖是一個 CD 場景的示例,在Jenkins中很容易對該場景進行建模:
流水線概念
下面的概念是Jenkins流水線很關鍵的一方面 , 它與流水線語法緊密相連 (參考 overview below).
階段
stage
塊定義了在整個流水線的執行任務的概念性地不同的的子集(比如 "Build", "Test" 和 "Deploy" 階段), 它被許多插件用於可視化 或Jenkins流水線目前的 狀態/進展. [6]
步驟
本質上 ,一個單一的任務, a step 告訴Jenkins 在特定的時間點要做_what_ (或過程中的 "step")。 舉個例子,要執行shell命令 ,請使用 sh
步驟: sh 'make'
。當一個插件擴展了流水線DSL, [1] 通常意味着插件已經實現了一個新的 step。
流水線語法概述
聲明式流水線基礎
在聲明式流水線語法中, pipeline
塊定義了整個流水線中完成的所有的工作。
pipeline {
agent any #1
stages {
stage('Build') { #2
steps {
// #3
}
}
stage('Test') { #4
steps {
// #5
}
}
stage('Deploy') { #6
steps {
// #7
}
}
}
}
1 | 在任何可用的代理上,執行流水線或它的任何階段。 |
2 | 定義 "Build" 階段。 |
3 | 執行與 "Build" 階段相關的步驟。 |
4 | 定義"Test" 階。 |
5 | 執行與"Test" 階段相關的步驟。 |
6 | 定義 "Deploy" 階段。 |
7 | 執行與 "Deploy" 階段相關的步驟。 |
腳本化流水線基礎
在腳本化流水線語法中, 一個或多個 node
塊在整個流水線中執行核心工作。 雖然這不是腳本化流水線語法的強制性要求, 但它限制了你的流水線的在`node`塊內的工作做兩件事:
-
通過在Jenkins隊列中添加一個項來調度塊中包含的步驟。 節點上的執行器一空閑, 該步驟就會運行。
-
創建一個工作區(特定為特定流水間建立的目錄),其中工作可以在從源代碼控制檢出的文件上完成。
Caution: 根據你的 Jenkins 配置,在一系列的空閑后,一些工作區可能不會自動清理 。參考 JENKINS-2111 了解更多信息。
Jenkinsfile (Scripted Pipeline) node { #1 stage('Build') { #2 // #3 } stage('Test') { #4 // #5 } stage('Deploy') { #6 // #7 } }
1 |
在任何可用的代理上,執行流水線或它的任何階段。 |
2 | 定義 "Build" 階段。 stage blocks 在腳本化流水線語法中是可選的。 然而, 在腳本化流水線中實現`stage` 塊 ,可以清楚的顯示Jenkins UI中的每個`stage`的任務子集。 |
3 | 執行與 "Build" 階段相關的步驟。 |
4 | 定義 "Test" 階段。 |
5 | 執行與 "Test" 階段相關的步驟。 |
6 | 定義 "Deploy" 階段。 |
7 | 執行與 "Deploy" 階段相關的步驟。 |
流水線示例
這有一個使用聲明式流水線的語法編寫的`Jenkinsfile` 文件 - 可以通過點擊下面 Toggle Scripted Pipeline 鏈接來訪問它的等效的腳本化語法:
pipeline { #1
agent any #2
stages {
stage('Build') { #3
steps { #4
sh 'make' #5
}
}
stage('Test'){
steps {
sh 'make check'
junit 'reports/**/*.xml' #6
}
}
stage('Deploy') {
steps {
sh 'make publish'
}
}
}
}
1 | pipeline 是聲明式流水線的一種特定語法,他定義了包含執行整個流水線的所有內容和指令的 "block" 。 |
2 | agent 是聲明式流水線的一種特定語法,它 指示 Jenkins 為整個流水線分配一個執行器 (在節點上)和工作區。 |
3 | stage 是一個描述 stage of this Pipeline的語法塊。在 Pipeline syntax 頁面閱讀更多有關聲明式流水線語法的`stage`塊的信息。如 above所述, 在腳本化流水線語法中,stage 塊是可選的。 |
4 | steps 是聲明式流水線的一種特定語法,它描述了在這個`stage`中要運行的步驟。 |
5 | sh 是一個執行給定的shell命令的流水線 step (由 Pipeline: Nodes and Processes plugin提供) 。 |
6 | junit 是另一個聚合測試報告的流水線 step (由 JUnit plugin提供)。 |
7 | node 是腳本化流水線的一種特定語法,它指示 Jenkins 在任何可用的代理/節點上執行流水線 (和包含在其中的任何階段)這實際上等效於 聲明式流水線特定語法的`agent`。 |
1.General:一般設置
Project name:項目名稱
Description:項目描述,多人寫作請一定要加上
Discard old builds:(discard 丟棄)該選項配置如何拋棄舊的構建
每次構建相關的文件都會保存下來,將會漸漸耗光磁盤空間,為此提供兩種方式供選擇:
- Days to keep builds:保留N天之內的構建文件
- Max # of builds to keep:保留最多#個最近構建的相關文件
- days to keep artifcts 指定產品保留時間,但是log,歷史記錄會保留
- builds to keep with artifacts 保留最近幾個構建的產品
This project is parameterized(參數化構建過程):可以設置用戶可輸入的參數,沒有輸入則使用默認值,有字符串,多行字符串,布爾值等可以設置.wiki
Throttle builds:設置兩個build任務之間最小間隔和同一個時間內最大任務數量
Disable this project:停止這個job,當例如源碼不可用時,可以暫時勾選這個停止build
Execute concurrent builds if necessary: 如果可以會並發執行build.勾選上后.如果有足夠的線程池則會並發,否則不會.並發構建會在不同的workspace中.如果用戶自己設置的workspace則不會分開,這個是有風險的.
Restrict where this project can be run: 設置是否必須在某個機器上運行.如果是分布式部署或者遷移job,注意移除或修改此項配置
Quiet period:配置等待未發生提交變化的時間. 由於 jenkins檢測到代碼變化時,就自動立即構建,但是有些情況下, 需要多次提交代碼到版本控制系統上,此時,可能發生代碼還沒完整提交就開始構建,造成構建失敗,為防止此種情況發生,可以配置值X,則jenkins會在代碼變化后等待X秒,如果沒在發生代碼提交,才開始構建,保證穩定性。
Block build when downstream project is building:該選項當多個相關聯的項目由一個提交所影響,但是它們必須以一個指定的順序進行構建的時候非常有用。當你選擇這個選項的時候,Jenkins將會在啟動這個構建之前,完成任何上游構建Job; 例如使用pipes的時候
2.Source Code Management:源碼管理
通過這里設置源碼管理路徑,這個與后面的輪詢源碼變化觸發編譯是成對的.不想設置或者后面有腳本可以自主管理可以選擇none
Build Triggers:構建(編譯,任務等等)觸發時機
Trigger builds remotely (e.g., from scripts):外部通過url命令觸發,拼接token和url就可以進行遠程觸發了
Build after other projects are built:監控其他job的構建狀態,觸發此job.如監聽代碼提交,然后觸發UITest,靜態分析等.
Build periodically:定時觸發.選擇 Build periodically,在 Schedule 中填寫 0 * * * .第一個參數代表的是分鍾 minute,取值 0~59;第二個參數代表的是小時 hour,取值 0~23;第三個參數代表的是天 day,取值 1~31;第四個參數代表的是月 month,取值 1~12;最后一個參數代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。所以 0 * * * 表示的就是每個小時的第 0 分鍾執行一次構建。舉個例子:每周六10點構建 0 10 * * 6,0-0分鍾, 10-10點 -任意天 -任務月份 6-周六, 0可以改為H.
Poll SCM:定時感知代碼分支是否有變化,如果有變化的話,執行一次構建.示例:H/5 * * * * 每五分鍾去檢查一下遠程倉庫,看代碼是否發生變化。
**GitHub hook trigger for GITScm polling:**hookplugin檢測到源碼的push操作觸發構建,感覺Poll SCM更方便些,如果提交頻繁,則這個觸發就會頻繁,看業務需要設置.
3.Build Environment(設置構建環境)
Delete workspace before build starts:默認刪除所有的,也可以設置刪除特定的文件
- Patterns for files to be deleted:正則匹配刪除哪些文件
- Apply pattern also on directories:規則是否也應用到文件夾
- Check parameter:是否刪除,是個bool值,true則刪除,false不刪除.為毛感覺這個有點雞肋
- External Deletion Command:執行外部刪除命令
Abort the build if it’s stuck:構建阻塞的時候,根據超時策略處理.
- Time-out strategy:超時策略,有絕對時間,相對時間,根據以前的構建時間判斷等
- Time-out variable:超時時間
- Time-out actions:超時后的處理,如終結,faile調或者寫描述
- Add timestamps to the Console Output:在輸出界面添加時間戳
- Use secret text(s) or file:使用密文,用於全局性的管理密碼等,勾選后會在下方出現Binding,輸入需要的用戶名,密碼證書等就可以了
4.Build(構建)
這個可以執行多種命令,如window的批處理,shell等一般shell就可以了.平時的自定義編譯命令,打包等等,都可以寫在這里.jenkins推薦將過長的命令寫到下載的源碼里,由這個里面的shell命令調用.jenkins執行的時候會默認把所有的命令都打印出來,這樣方便調試.可以創建多個build step,這些step是串行的,一個faile,,后面的step都不會執行了.
5.Post-build Actions
可以根據build的結果設置發送郵件,打包,執行其他任務等等.build成功還是失敗都會走到這一步.
三.總結
jenkins很強大,目前剛入門.他的作用不僅僅是編譯代碼,還可以執行其他任意定時任務,監控任務.配合分布式部署,可以實現大規模的協作使用.后面將對jenkins的插件開發和源碼結構進行分析.