作者:馮雅傑
來源:簡書
是的,這篇文章是來給大家普及Jenkins知識的。下面我們先來了解一下它。
Jenkins是一個廣泛用於持續構建的可視化Web工具,持續構建說得更直白點,就是各種項目的"自動化"編譯、打包、分發部署。
Jenkins可以很好的支持各種語言(比如:Java,C#,PHP等)的項目構建,也完全兼容ant、maven、gradle等多種第三方構建工具,同時跟SVN、Git能無縫集成。
也支持直接與知名原始碼託管網站,比如GitHub、Bitbucket直接集成。
簡單點說,
Jenkins其實就是一個框架集,可以整合任何你想整合的內容,實現公司的整個持續集成體系!
如:自動化,性能,打包,部署,發布&發布結果自動化驗證,接口測試,單元測試,每日構建,等等.
各種你能想到的,和不能想到的,都可以。
Jenkins可自由部署在各平臺:
Windows, Linux, Mac
Jenkins是一款能提高效率的軟體,它能幫你把軟體開發過程形成工作流,典型的工作流包括以下幾個步驟
開發
提交
編譯
測試
發布
有了Jenkins的幫助,在這5步中,除了第1步,後續的4步都是自動化完成的,具體的,當你完成了提交,Jenkins會自動運行你的編譯腳本,編譯成功後,再運行你的測試腳本,這一步成功後,接著它會幫你把新程序發布出去,特別的,在最後一步,你可以選擇手動發布,或自動發布,畢竟發布這件事情,還是需要人為的確認一下比較好。
簡而言之,Jenkins可以幫你在寫完代碼後,一鍵完成開發過程中的一系列工作。
使用Jenkins的好處顯而易見,它減少了你的重複勞動。更重要的是,一個團隊的開發流程一開始是不一致的,不一致往往會帶來各種各樣的問題,最終體現在軟體的質量或開發效率不夠高,而Jenkins會幫你規範大家的行為,從而避免一系列的問題。
Jenkins安裝非常簡單,以CentOS為例,執行以下命令即可
sudo wget -O /etc/yum.repos.d/jenkins.repo http:
sudo rpm --import https:
sudo yum -y install jenkins
值得注意的是,如果你的作業系統是CentOS,且運行的是GCJ版本的Java,則需要做一下更新
$ java -version
java version "1.5.0"
gij (GNU libgcj) version 4.4.6 20110731 (Red Hat 4.4.6-3)
$ sudo yum remove java
$ sudo yum install -y java-1.7.0-openjdk
$ java -version
java version "1.7.0_79"
OpenJDK Runtime Environment (rhel-2.5.5.1.el6_6-x86_64 u79-b14)
OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)
如果你的Jenkins使用Git作為數據傳輸的管道,那麼的所有Jenkins節點都要安裝Git
$ sudo yum install -y git
設置Git帳戶
$ git config --global user.name "yourname"
$ git config --global user.email "yourmail"
安裝成功後,配置文件在/etc/sysconfig/jenkins下,默認埠為8080,你需要設置一下防火牆,讓該埠可以被外部訪問到。
設置允許開機啟動
$ sudo chkconfig jenkins on
確保系統中有一個jenkins帳戶,如果沒有則需要創建,理論上安裝了Jenkins後,會自動創建該用戶。
然後創建ssh密鑰,密鑰被用來在多個節點中進行免密訪問,同時幫助打通git數據通道。在這之前要確認jenkins用戶的home目錄是否有效(在下面的例子中home是/var/bin/jenkins),並切換到jenkins用戶下
$ grep jenkins /etc/passwd
jenkins:x:496:496:Jenkins Continuous Integration Server:/var/lib/jenkins:/bin/bash
$ su jenkins
$ cd ~
$ pwd
/var/lib/jenkins
創建非對稱密鑰,執行ssh-keygen命令,並一路回車
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/fengyajie/.ssh/id_rsa): Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/fengyajie/.ssh/id_rsa.
Your public key has been saved in /home/fengyajie/.ssh/id_rsa.pub.
The key fingerprint is:
The key's randomart image is:
+--[ RSA 2048]----+
| .... +=|
| ... |
| . ...o +|
| E. . *.|
| S .= + |
| . o + . |
| . o o |
| o o |
| o |
+--+
$ ls ~/.ssh/
id_rsa id_rsa.pub known_hosts
Jenkins是一個Master-Slave的架構,它可以把任務發布到不同的節點上執行,典型的應用場景是你有2個運行環境,一個是測試環境,一個是生產環境,你可以指定工作流中,哪些任務在測試環境中執行,哪些任務在生產環境中執行。當然,如果你沒有這樣的需求,也可以不配置Slave,這篇文章討論的是有Slave的情況。
如果你需要配置Slave,在Slave節點上創建一個jenkins用戶,並建立Master和Slave的授信關係(你需要將下面的host替換為具體的伺服器IP,注意一定要保證Master和Slave之間是內網通信的,否則公網環境延遲較大,經常會出現Slave掉線情況)
ssh jenkins@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
同時,為了讓jenkins可以執行更高權限的命令,所有節點都需要把jenkins用戶設置為sudo用戶。當然,我這是為了偷懶,更好的辦法是設置一個專門的用戶組,讓這個組有一定的權限,然後把jenkins加入到這個用戶組。
$ sudo grep jenkins /etc/sudoers
jenkins ALL=(ALL) NOPASSWD: ALL
以上為全部終端的配置,剩下操作基本都在Jenkins提供的Web頁面上完成。
打開Jenkins頁面http://hostname:8080,進入管理頁面,點擊New Node
配置Node,Labels是環境設置,例如開發環境,測試環境,編譯環境等,後續可以根據Lables值,指定具體的任務在某個環境中執行
設置Master到Node間的授信方式
成功後,可以在控制臺看到新增的Node
基本環境搭建好後,我們來配置一個工作流親自感受一下。
工作流在Jenkins中被稱為pipeline,pipeline的運行行為由用戶自己定義,定義的內容存放在一個Jenkinsfile文件中,並將該文件存放在git倉庫的根目錄,大致的流程如下:
用戶將代碼提交到git
Jenkins從git拉取最新代碼
讀取根目錄下的Jenkinsfile文件,並依次執行文件中定義的任務
下面是具體的配置步驟
pipeline {
agent {
label 'Production'
}
stages {
stage('Build') {
steps {
echo 'Building'
}
}
stage('Test') {
steps {
echo 'Testing'
}
}
stage('Deploy - Staging') {
steps {
sh './deploy staging'
sh './run-smoke-tests'
}
}
stage('Sanity check') {
steps {
input "Does the staging environment look ok?"
}
}
stage('Deploy - Production') {
steps {
sh './deploy production'
}
}
}
post {
always {
echo 'One way or another, I have finished'
deleteDir() /* clean up our workspace */
}
success {
echo 'I succeeeded!'
}
unstable {
echo 'I am unstable :/'
}
failure {
echo 'I failed :('
}
changed {
echo 'Things were different before...'
}
}
}
以上是一個基本的Jenkinsfile模板,其中有以下幾個關鍵概念
agent - 指定在哪臺機器上執行任務,還記得上面配置Node時候填的Label嗎,如果這兩個label匹配得上,就在該Node中執行
stage - 組成工作流的大的步驟,這些步驟是串行的,例如build,test,deploy等
steps - 描述stage中的小步驟,同一個stage中的steps可以並行
sh - 執行shell命令
input - 需要你手動點擊確定,pipeline才會進入後續環節,常用於部署環節,因為很多時候部署都需要人為的進行一些確認
post - 所有pipeline執行完成後,會進入post環節,該環節一般做一些清理工作,同時還可以判斷pipeline的執行狀態
了解了這些後,你會發現寫一個Jenkinsfile是一件很容易的事情。好了,現在要測試pipeline功能,把上面的代碼中的sh換成echo,拷貝到你的Jenkinsfile中,並存放在git倉庫的根目錄。
回到Jenkins web頁面,添加pipeline
如果你想每次git commit時自動執行該pipeline,有兩種方法,一種是讓Jenkins對git進行輪詢,每分鐘檢查git倉庫有沒有更新,如下配置:
另一種方式是使用git提供的hook,該方式原理是git一旦提交,便會觸發hook中的腳本,讓腳本給Jenkins發送執行pipeline的指令,這種方式更優雅,但相應要做的事情更多一點,這裡就不演示這種方法了,感興趣的同學可以自己研究一下。
最後,我們需要設置git的地址,其中的授信設置,和上面說的Master到Node的授信設置一致
設置完畢後,一旦你的git倉庫收到新的提交,就會觸發這個pipeline的運行,以下這張圖是上面Jenkinsfile例子的運行狀態,可以看到當運行到Sanity check這一步時,需要你手動觸發是否執行後面的操作。
最後總結一下,這篇教程主要講述了以下幾個方面:
Jenkins是什麼,及它的應用場景舉例
如何搭建一個Jenkins服務
Jenkins Pileline是什麼,我們如何定義一個Pipeline
如何具體的操作一個Pipeline
Have fun!
END
長按左側二維碼關注
微信ID:xhmsvip
小黑QQ1:275326202(已滿)
小黑QQ2:3251175005
QQ群:252568026
小黑微博:小黑黑的格子屋
☟ 點個 讓本黑知道你來過~