什么是Jenkins的流水線
Jenkins 流水線 (或簡單的帶有大寫"P"的"Pipeline") 是一套插件,它支持實現和集成持續交付流水線 到Jenkins。
(CD) pipeline_是你的進程的自動表達,用於從版本控制向用戶和客戶獲取軟件。 你的軟件的每次的變更 (在源代碼控制中提交)在它被釋放的路上都經歷了一個復雜的過程 on its way to being released. 這個過程包括以一種可靠並可重復的方式構建軟件, 以及通過多個測試和部署階段來開發構建好的軟件 (c成為 "build") 。
流水線提供了一組可擴展的工具,通過 Pipeline domain-specific language (DSL) syntax. [1]對從簡單到復雜的交付流水線 "作為代碼" 進行建模。
對Jenkins 流水線的定義被寫在一個文本文件中 (成為 Jenkinsfile),該文件可以被提交到項目的源代碼的控制倉庫。 [2] 這是"流水線即代碼"的基礎; 將CD 流水線作為應用程序的一部分,像其他代碼一樣進行版本化和審查。 創建 Jenkinsfile
並提交它到源代碼控制中提供了一些即時的好處:
- 自動地為所有分支創建流水線構建過程並拉取請求。
- 在流水線上代碼復查/迭代 (以及剩余的源代碼)。
- 對流水線進行審計跟蹤。
- 該流水線的真正的源代碼 [3], 可以被項目的多個成員查看和編輯。
While定義流水線的語法, 無論是在 web UI 還是在 Jenkinsfile 中都是相同的, 通常認為在Jenkinsfile
中定義並檢查源代碼控制是最佳實踐
聲明式和腳本化的流水線語法
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).
流水線
流水線是用戶定義的一個CD流水線模型 。流水線的代碼定義了整個的構建過程, 他通常包括構建, 測試和交付應用程序的階段 。
另外 , pipeline 塊是 聲明式流水線語法的關鍵部分.
節點
節點是一個機器 ,它是Jenkins環境的一部分 and is capable of執行流水線。
另外, node
塊是 腳本化流水線語法的關鍵部分
階段
stage 塊定義了在整個流水線的執行任務的概念性地不同的的子集
jenkins創建Pipeline項目
本次環境為:
主機名 | IP地址 | 安裝的應用 | 系統版本 |
---|---|---|---|
jenkins | 192.168.23.143 | tomcat jenkins | CentOS 8 |
客戶機 | 192.168.23.144 | tomcat jenkins | CentOS 8 |
安裝Pipeline、Publish Over SSH、Publish Over SSH、SSH Build Agents、Git、GitHub、GitLab、Gitee插件
- Gitee配置公鑰
[root@jenkins ~]# ssh-keygen -t rsa -b 2048 -C "yanchuanglol@163.com" -N "" -f /root/.ssh/id_rsa
Generating public/private rsa key pair.
Created directory '/root/.ssh'.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:MtYf5/dFCJuwZ37E4sO3as6b5r0i3xbdoArF1ABiQv8 qinghao_yu@163.com
The key's randomart image is:
+---[RSA 2048]----+
| .o o ...o |
| + . . . |
| . o. . |
| o oo =.. |
| + E.o B.+oo|
| . o.. X.o..o|
| ...* +..|
| o.+O.o.|
| BO==..|
+----[SHA256]-----+
-
登錄Gitee然后將公鑰復制進去
-
添加私鑰
[root@jenkins ~]# cat /root/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
······
DVnODEbPs8q/FQM09wp8Cjk5ephdqdkyiUIyQPAAAAAwEAAQAAAQEAttAv7CgVzBpdYyyN
O0Lkzo0W/vmEtkI+O7kThleV9OBao8usZShckZyprJp0S376JG9W/ipG2FvF583ipR+Ulf
sEFD14o8OhoGa2E82WIr+sVjKM0tlJh0ncJGqd9aFAk23LEDcAAACBAN+sdj81xrcRXWob
EfqJGeXHHtiHgrtFBIzGnduthLCUJn97IrnSV0Tj+0AE6o1CKrko4ZuOFjMuGpFfN62sjC
yw8w1MVMG7xAfkvJiRDbetPeRa8mfMXTKiBPi5Bx8NDW9ctXSDomv8ChP25b7CEh71imLk
......
-----END OPENSSH PRIVATE KEY-----
創建一個項目
//在本地查看拉取下來的代碼
[root@jenkins ~]# cd .jenkins/
[root@jenkins .jenkins]# ls
com.dabsquared.gitlabjenkins.connection.GitLabConnectionConfig.xml
com.dabsquared.gitlabjenkins.GitLabPushTrigger.xml
com.gitee.jenkins.connection.GiteeConnectionConfig.xml
com.gitee.jenkins.trigger.GiteePushTrigger.xml
config.xml
hudson.model.UpdateCenter.xml
hudson.plugins.git.GitTool.xml
identity.key.enc
jenkins.install.InstallUtil.lastExecVersion
jenkins.install.UpgradeWizard.state
jenkins.model.JenkinsLocationConfiguration.xml
jenkins.security.apitoken.ApiTokenPropertyConfiguration.xml
jenkins.security.QueueItemAuthenticatorConfiguration.xml
jenkins.security.UpdateSiteWarningsConfiguration.xml
jenkins.telemetry.Correlator.xml
jobs
logs
nodeMonitors.xml
nodes
org.jenkinsci.plugins.workflow.flow.FlowExecutionList.xml
plugins
queue.xml
queue.xml.bak
secret.key
secret.key.not-so-secret
secrets
updates
userContent
users
workflow-libs
workspace
[root@jenkins .jenkins]# cd workspace/
[root@jenkins workspace]# ls
tomcat_demo
[root@jenkins workspace]# ls tomcat_demo/
db Dockerfile LICENSE pom.xml README.md src
- 開始打包
pipeline {
agent any
stages {
stage('pull code') {
steps {
git 'http://github.com/lizhenliang/tomcat-java-demo.git'
}
}
stage('package') {
steps {
sh """
mvn clean
mvn package
"""
}
}
}
}
-
看到下面內容表示拉取完成
-
給客戶機做免密認證
[root@Jenkins ~]# ssh-keygen -t rsa
[root@Jenkins ~]# ssh-copy-id root@192.168.23.144
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.23.144's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.23.144'"
and check to make sure that only the key(s) you wanted were added.
yc
//關閉防火牆與selinux0
setenforce 0
systemctl disable --now firewalld
//圖中完整代碼為
pipeline {
agent any
stages {
stage('pull code') {
steps {
git 'http://github.com/lizhenliang/tomcat-java-demo.git'
}
}
stage('package') {
steps {
sh """
mvn clean
mvn package
"""
}
}
stage('deploy') {
steps {
sh """
scp target/ly-simple-tomcat-0.0.1-SNAPSHOT.war root@192.168.23.144:/usr/src/tomcat/webapps/
ssh root@192.168.23.144 '/usr/src/tomcat/bin/catalina.sh stop && /usr/src/tomcat/bin/catalina.sh start'
"""
}
}
}
}
-
看到與下圖內容相同則成功
-
瀏覽器訪問yc的ip看到下圖內容則成功