? ? ? ? 最近花了一段時間研究jenkins這個工具。所以寫下這篇文章,算是當做記錄吧!
# 一、jenkins是什么?
? ? ? ? Jenkins是一個開源的、提供友好操作界面的持續集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持續、自動的構建/測試軟件項目、監控外部任務的運行(這個比較抽象,暫且寫上,不做解釋)。Jenkins用Java語言編寫,可在Tomcat等流行的servlet容器中運行,也可獨立運行。通常與版本管理工具(SCM)、構建工具結合使用。常用的版本控制工具有SVN、GIT,構建工具有Maven、Ant、Gradle。
# 二、CI/CD是什么?
? ? ? ? ?CI(Continuous integration,中文意思是持續集成)是一種軟件開發時間。持續集成強調開發人員提交了新代碼之后,立刻進行構建、(單元)測試。根據測試結果,我們可以確定新代碼和原有代碼能否正確地集成在一起。借用網絡圖片對CI加以理解。

CI
? ? ? ? CD(Continuous Delivery, 中文意思持續交付)是在持續集成的基礎上,將集成后的代碼部署到更貼近真實運行環境(類生產環境)中。比如,我們完成單元測試后,可以把代碼部署到連接數據庫的Staging環境中更多的測試。如果代碼沒有問題,可以繼續手動部署到生產環境。下圖反應的是CI/CD 的大概工作模式。

CI/CD
# 三、使用Jenkins進行PHP代碼(單元)測試、打包。
? ? ? ? Jenkins是一個強大的CI工具,雖然本身使用Java開發,但也能用來做其他語言開發的項目CI。下面講解如何使用Jenkins創建一個構建任務。
?登錄Jenkins, 點擊左側的新建,創建新的構建任務。

跳轉到如下界面。任務名稱可以自行設定,但需要全局唯一。輸入名稱后選擇構建一個自由風格的軟件項目(其他選項不作介紹)。并點擊下方的確定按鈕即創建了一個構建任務。之后會自動跳轉到該job的配置頁面。

新建自由風格的軟件項目
下圖是構建任務設置界面,可以看到上方的幾個選項**"General", "源碼管理", "構建觸發器","構建環境", "構建", "構建后操作"**。下面逐一介紹。
##

## 1.General
General是構建任務的一些基本配置。名稱,描述之類的。

General
**項目名稱:?**是剛才創建構建任務步驟設置的,當然在這里也可以更改。
**描述:?**對構建任務的描述。??
**丟棄舊的構建:** 服務器資源是有限的,有時候保存了太多的歷史構建,會導致Jenkins速度變慢,并且服務器硬盤資源也會被占滿。當然下方的"保持構建天數" 和 保持構建的最大個數是可以自定義的,需要根據實際情況確定一個合理的值。
其他幾個選項在這里不做介紹,有興趣的可以查看Jenkins"幫助信息", 會有一個大概的介紹。不過這些"幫助信息"都是英文的。

點擊右方的這些"問號"查看"幫助信息"
## 2.源碼管理
源碼管理就是配置你代碼的存放位置。

源碼管理
**Git:** 支持主流的github 和gitlab代碼倉庫。因我們的研發團隊使用的是gitlab,所以下面我只會對該項進行介紹。
**Repository URL**:倉庫地址
**Credentials**:憑證。可以使用HTTP方式的用戶名密碼,也可以是RSA文件。 但要通過后面的"ADD"按鈕添加憑證。
**Branches to build**:構建的分支。\*/master表示master分支,也可以設置為其他分支。
**源碼瀏覽器**:你所使用的代碼倉庫管理工具,如github, gitlab.??
**URL**:填入上方的倉庫地址即可。
**Version: 8.7**? ?這個是我們gitlab服務器的版本。
**Subversion:**就是SVN,這里不作介紹。
## **3.構建觸發器**
構建觸發器,顧名思義,就是構建任務的觸發器。

**觸發遠程構建(例如,使用腳本):** 該選項會提供一個接口,可以用來在代碼層面觸發構建。這里不做介紹,后期可能會用到。
**Build after other projects are built:** 該選項意思是"在其他projects構建后構建"。這里不作介紹,后期可能會用到該選項。
**Build periodically:** 周期性的構建。很好理解,就是每隔一段時間進行構建。日程表類似? ? ? ? linux crontab書寫格式。如下圖的設置,表示每隔30分鐘進行一次構建。

周期構建
**Build when a change is pushed to GitLab:**當有更改push到gitlab代碼倉庫,即觸發構建。后面會有一個觸發構建的地址,一般被稱為webhooks。需要將這個地址配置到gitlab中,webhooks如何配置后面介紹。這個是常用的構建觸發器。
**Poll SCM:**該選項是配合上面這個選項使用的。當代碼倉庫發生改動,jenkins并不知道。需要配置這個選項,周期性的去檢查代碼倉庫是否發生改動。

十分鐘檢查一次
# 4.構建環境
構建環境就是構建之前的一些準備工作,如指定構建工具(在這里我使用ant)。

構建環境中的構建工具
**With Ant:**選擇這個工具,并指定ant版本和jdk版本。這兩個工具的版本我都事先在服務器上安裝,并且在jenkins全局工具中配置好了。
其他選項不作介紹,同樣可以查看"幫助信息" 獲得使用幫助。
# 5.構建
? ? ? ?選擇下方的增加構建步驟。

增加構建步驟
可以選擇的項很多。這里就介紹"Invoke Ant" 和"Execute shell".
**Eexcute shell**: 執行shell命令,該工具是針對linux環境的,windows環境也有對應的工? ? ? ? ? ? 具"Execute Windows batch command"。 在構建之前,可能我們需要執行一些命令,比如壓縮包的解壓之類的。為了演示,我就簡單的執行? "echo $RANDOM" 這樣的linux shell下生產隨機數命令。
**Invoke Ant**:Ant是一款java項目構建工具,當然也能用來構建php。

**Ant Version**: 選擇Ant版本。這個ant版本是安裝在jenkins服務器上的版本,并且需要在jenkins"系統工具"中設置好。
**Targets**:要執行的操作,一行一個操作任務。以上圖為例,build是構建,tar是打包。
**Build File:** 是Ant構建的配置文件,如果不指定,則是在項目路徑下的workspace目錄中的build.xml。build.xml文件具體怎么配置,后面再細講。
**properties:** 設定一些變量,這些變量可以在build.xml 中被引用。
**Send files or execute commands over SSH:**發送文件到遠程主機或執行命令(腳本)

**Name**: SSH Server的名稱。SSH Server可以在jenkins-系統設置中配置。
**source files**: 需要發送給遠程主機的源文件。
**Remove prefix:** 移除前面的路徑。如果不設置這個參數,則遠程主機會自動創建構建源 source files 包含的那個路徑。
**Remote directory**: 遠程主機目錄。
**Exec command**:在遠程主機上執行的命令,或者執行的腳本。
# **6.構建后操作**
構建后操作,就是對project構建完成后的一些后續操作,比如生成相應的代碼測試報告。


郵件通知
**Publish Clover PHP Coverage Report:**發布代碼覆蓋率xml格式的文件報告。路徑會在"build.xml"文件中定義
**Publish HTML reports**:發布代碼覆蓋率的HTML報告。??
**Report Crap:** 發布crap報告**。**
**E-mail Notification:** 郵件通知,構建完成后發郵件到指定的郵箱。
**以上配置完成后,點擊保存。**
# **7.其他相關配置**
**?SSH Server配置**
登錄jenkins -- 系統管理 -- 系統設置
配置請看下圖

SSH SERVER
**SSH Servers:** 由于jenkins服務器公鑰文件我已經配置好,所以之后新增SSH Servers 只需要配置這一項即可。?
**Name:** 自定義,需要全局唯一。
**HostName:** 主機名,直接用ip地址即可。
**Username:** 新增Server的用戶名,這里配置的是root。
**Remote Directory:** 遠程目錄。jenkins服務器發送文件給新增的server默認是在這個目錄。
### Ant 配置文件 "build.xml"
接下來講解Ant 構建配置文件"build.xml"。 之所以是build.xml 這是因為官方慣例。就好比任何編程語言的入門都會是打印"Hello world".? 你也可以用其他名稱代替"build.xml" .
下面針對配置文件"build.xml" 關鍵配置進行說明。

project name就是項目名稱,和jenkins所創建的對應。
target name="build" 就是構建的名稱,和jenkins構建步驟 那里的targets對應。depends指明構建需要進行的一些操作。
property 用來設置變量。
fileset 這一行指明了一個文件夾,用include來指明需要包含的文件,exclude指明不包含的文件,"tar"即是打包這個文件夾中匹配到的文件。
下面的這些target都是一些實際的操作步驟,比如make\_runtime這個"target" 就是創建了一些目錄。phpcs就是利用PHP\_CodeSniffer這個工具 對PHP代碼規范與質量檢查工具。


最后這個target "tar" 就是打包文件。因為上面的build 并沒有包含這個target,所以默認情況下,執行build是不會打包文件的,所以在jenkins project配置界面,Ant構建那一步的targets,我們才會有"build" 和 "tar" 這兩個targets。如果build.xml 中 "build"這個target depends中已經包含"tar" , 就不需要在jenkins中增加"tar"了。
其他一些target 都是利用一些工具對php代碼的操作,比如phpunit是進行php單元測試。這一些方面我沒有深入的研究,只是進行了一些簡單的配置,畢竟不是這方面的專業人士。
### 配置 Gitlab webhooks
在gitlab的project頁面 打開**settings**,再打開 **web hooks** 。點擊**"ADD WEB HOOK"** 添加webhook。把之前jenkins配置中的那個url 添加到這里,添加完成后,點擊**"TEST HOOK"**進行測試,如果顯示SUCCESS 則表示添加成功。


#



配置phpunit.xml
phpunit.xml是phpunit這個工具用來單元測試所需要的配置文件。這個文件的名稱同樣也是可以自定義的,但是要在"build.xml"中配置好名字就行。默認情況下,用"phpunit.xml", 則不需要在"build.xml"中配置文件名。

build.xml中phpunit配置
fileset dir 指定單元測試文件所在路徑,include指定包含哪些文件,支持通配符匹配。當然也可以用exclude關鍵字指定不包含的文件。

# 四、進行jenkins project 構建
第一次配置好jenkins project之后,會自動觸發一次構建。此后,每當有commit 提交到master分支(前面設置的是master分支,也可以設置為其他分支),就會觸發一次構建。當然也可以在project頁面手動觸發構建。點擊左邊的"立即構建" 手動觸發構建。

手動觸發構建
# 五、構建結果說明
#### **構建狀態**
**Successful藍色**:構建完成,并且被認為是穩定的。
**Unstable黃色**:構建完成,但被認為是不穩定的。
**Failed紅色**:構建失敗。
**Disable灰色**:構建已禁用
#### 構建穩定性
構建穩定性用天氣表示:**晴、晴轉多云、多云、小雨、雷陣雨**。天氣越好表示構建越穩定,反之亦然。
#### **構建歷史界面**
**?console output:?**輸出構建的日志信息
# **六、jenkins權限管理**
由于jenkins默認的權限管理體系不支持用戶組或角色的配置,因此需要安裝第三發插件來支持角色的配置,本文將使用Role Strategy Plugin。基于這個插件的權限管理設置請參考這篇文章:[http://blog.csdn.net/russ44/article/details/52276222](https://link.jianshu.com?t=http%3A%2F%2Fblog.csdn.net%2Fruss44%2Farticle%2Fdetails%2F52276222),這里不作詳細介紹。
至此,就可以用jenkins周而復始的進行CI了,當然jenkins是一個強大的工具,功能絕不僅僅是以上這些,其他方面要是以后用到,我會更新到這篇文章中。有疑問歡迎在下方留言。
最后,放上一張Jenkins的思維導圖
作者:哥本哈根月光
鏈接:https://www.jianshu.com/p/5f671aca2b5a
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
- 常見功能
- 第三方授權登錄
- 郵件發送
- 簡易聊天室
- 獲取各國匯率
- PHP獲取服務器硬件指標
- 數據上報之
- web開發
- 開發規范
- 前端
- 踩坑
- 將footer固定在底部
- bootstrap
- Metronic
- 用到的jquery插件
- bootstrap-hover-dropdown
- jquery.slimscroll
- jquery.blockui
- bootstrap-switch
- js.cookie
- moment
- bootstrap-daterangepicker
- morris
- raphael
- jquery.waypoints
- jquery.counterup
- select2
- 取值和設置默認值
- vue
- axios
- 瀏覽器
- 谷歌瀏覽器
- 谷歌插件
- layui
- layui-表格
- layui-表單
- layui-彈窗
- layui-分頁
- 后端
- 操作系統
- linux
- 用戶管理
- 文件管理
- 目錄管理
- 壓縮和解壓縮
- 進程查看
- 端口查看
- 開機自啟動服務
- 定時任務
- shell腳本
- 殺掉運行超過指定時長指定服務的進程
- 獲取服務器使用狀態
- bash-shell連接socket
- 自定義快捷命令
- centos-踩坑
- 防火墻
- 軟件
- yum
- vim
- screen
- window
- 語言
- PHP
- 配置優化
- 框架
- thinkphp5.1+
- think命令行
- laravel6.+
- 維護模式
- 根據環境讀取不同配置
- laravel6.+采坑
- laravel坑位
- 數據庫事務
- 任務調度
- 文件權限問題
- 增強框架
- larvel:elastic-search
- 圖形驗證碼
- laravel獲取ip
- 函數
- strtotime
- 正則匹配
- 類
- 接口類與抽象類
- 類相關的關鍵字 - abstract
- 類相關的關鍵字 - interface
- PHP有關類的調用方式"->"與"::"的區別
- 擴展
- 問題歸納
- json_encode和json_decode
- 字符串的運算
- curl
- 優化php效率
- 數組相加合并與array_merge
- 時區轉換
- 不常用特性
- php反射
- 包管理器-composer
- GuzzleHttp
- Python
- Go
- 數據庫
- Redis
- 安裝
- 本地化-數據備份
- php-redis操作
- Mysql
- mysql-命令集合
- 設置終端可訪問
- 數據庫設計
- 用戶基礎信息表
- 踩坑集合
- mysql-2002
- mysql-2054
- 優化策略
- mysql-密碼驗證插件
- 一些牛逼的sql查詢
- topN
- 無限級分類
- Memcache
- MongoDb
- 安裝mongo-server
- 安裝php-mongodb擴展
- 在laravel中使用mongoDB
- 客戶端軟件
- Hbase
- Elasticsearch
- elastic-search
- restfulApi操作es
- web服務器
- 1.nginx
- 配置語法規則
- 配置詳解
- rewrite規則
- request_filename
- 2.apache
- 功能設計
- 加密解密
- Base64
- 對亞馬遜SKU加密
- 兼職項目中的加解密
- 騰訊外包時的加密
- 接口設計
- 接口限流設計
- 分庫分表
- 遍歷展示文件目錄結構
- 時區換算
- 文件切割
- 解析xml字符串
- 項目
- 博客后臺管理
- 亞馬遜廣告API
- 官方指引文檔
- 開發人員中心
- 應用商店
- 第三方庫
- 申請API郵件記錄
- 亞馬遜MWS
- 付款報告
- 亂碼
- 亞馬遜管理庫存報告
- 報告
- 商品
- 入庫
- 履行
- 出庫
- 財務
- 訂單
- 異步任務處理
- 集群如何同步代碼
- 基本開發流程
- 文檔管理
- showdoc
- 運行環境
- 開發環境
- vagrant
- windows上配置安裝
- vagrant安裝插件緩慢
- 更換ssh默認端口映射
- 設置x-shell密碼登錄
- 使用市場的box-homestead
- homestead-7: Box 'lc/homestead'
- 常見問題
- 虛擬環境reboot
- 突然無法使用
- phpStudy
- wamp
- 壓測性能
- VPN
- vultr
- 凌空圖床
- 寶塔
- 自動化部署
- 版本管理軟件鉤子
- 線上環境-LNMP
- centos7
- nginx
- mysql
- mysql開機自啟
- mysql-更換默認端口
- datetime字段類型默認值
- php
- php擴展安裝
- redis
- swoole
- gd
- BCMath
- igbinary
- zstd
- 包管理器:composer
- 優化性能
- nodejs
- 更新gcc版本
- 版本控制
- git
- 常用命令
- gitlab
- 版本管理規范
- 使用阿里云創建遠程倉庫
- git自動化部署
- svn
- 忽略指定文件
- 拉取代碼
- 自動化運維
- jekins
- 容器
- 集群
- 架構設計
- 設計原則
- 閱讀參考
- 代碼規劃
- 架構實戰
- 服務治理
- 權限控制設計
- 具體設計
- 計劃
- 疑問知識點
- 讀書筆記
- 高性能Mysql
- TCP-IP詳解-卷一:協議
- 思考
- php如何實現并發執行
- 對接調用設計
- 如何在瀏覽器上實現插件
- 如何設計一個app結合業務告警
- mysql的where查詢沒有用到索引
- 為啥in查詢比循環嵌套sql的查詢還要慢
- 使用git來創建屬于自己的composer包
- 翻頁獲取數據的時候又新增了數據
- 安全思路
- 月報
- PHP ?? 和 ?: 的區別
- PHP異步執行
- redis集群的目標是什么
- 大文件數據處理
- 性能瓶頸分析
- 命令行里輸出帶顏色的字體
- 面試問題合集
- 基礎
- 安全
- 算法
- 冒泡排序
- 快速排序
- 二分法查詢數組指定成員
- 字符查找匹配
- 令牌桶
- 漏桶
- 計數器
- 代理
- 協議
- http
- 狀態碼
- tcp
- udp
- Oauth2.0
- 設計模式
- 單例模式
- 適配器模式
- 工廠模式
- 觀察者模式
- 流程化
- 地址欄輸入網址到返回網頁的流程
- 題目收集
- 工具
- rabbitMq
- rabbitMQ用戶管理
- 生產者
- 消費者
- 支持TP5.*的think-queue
- 消息丟失
- 消費者報錯
- rabbitMQ配置優化
- 磁盤滿載導致服務掛掉
- PHP類庫
- rabbitMQ踩坑
- navicat
- vscode
- phpstorm
- 激活碼
- markdown
- PHP自定義類庫
- 工具類
- 領導力
- 任務分配
- 代碼組織
- 不要重復
- 避免污染
- 接口定義規范
- 小業務需求
- 獲取充值面額組成
- 監控服務器CPU和內存
- shell腳本版本