Jenkins是一款能提高效率的軟件客年,它能幫你把軟件開發(fā)過程形成工作流屡谐,典型的工作流包括以下幾個步驟
- 開發(fā)
- 提交
- 編譯
- 測試
- 發(fā)布
有了Jenkins的幫助筷登,在這5步中,除了第1步先舷,后續(xù)的4步都是自動化完成的艰管,具體的,當你完成了提交蒋川,Jenkins會自動運行你的編譯腳本牲芋,編譯成功后,再運行你的測試腳本捺球,這一步成功后缸浦,接著它會幫你把新程序發(fā)布出去,特別的氮兵,在最后一步裂逐,你可以選擇手動發(fā)布,或自動發(fā)布泣栈,畢竟發(fā)布這件事情絮姆,還是需要人為的確認一下比較好。簡而言之
Jenkins可以幫你在寫完代碼后秩霍,一鍵完成開發(fā)過程中的一系列工作
使用Jenkins的好處顯而易見,它減少了你的重復(fù)勞動蚁阳。更重要的是铃绒,一個團隊的開發(fā)流程一開始是不一致的,不一致往往會帶來各種各樣的問題螺捐,最終體現(xiàn)在軟件的質(zhì)量或開發(fā)效率不夠高颠悬,而Jenkins會幫你規(guī)范大家的行為,從而避免一系列的問題定血。
安裝
Jenkins安裝非常簡單赔癌,以CentOS為例,執(zhí)行以下命令即可
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum -y install jenkins
值得注意的是澜沟,如果你的操作系統(tǒng)是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作為數(shù)據(jù)傳輸?shù)墓艿烂K洌敲吹乃蠮enkins節(jié)點都要安裝git
$ sudo yum install -y git
設(shè)置git賬戶
$ git config --global user.name "yourname"
$ git config --global user.email "yourmail"
配置
安裝成功后刊苍,配置文件在/etc/sysconfig/jenkins
下,默認端口為8080
濒析,你需要設(shè)置一下防火墻正什,讓該端口可以被外部訪問到
設(shè)置允許開機啟動
$ sudo chkconfig jenkins on
確保系統(tǒng)中有一個jenkins賬戶,如果沒有則需要創(chuàng)建号杏,理論上安裝了Jenkins后婴氮,會自動創(chuàng)建該用戶。
然后創(chuàng)建ssh密鑰,密鑰被用來在多個節(jié)點中進行免密訪問主经,同時幫助打通git數(shù)據(jù)通道荣暮。在這之前要確認jenkins用戶的home
目錄是否有效(在下面的例子中home
是/var/bin/jenkins
),并切換到j(luò)enkins用戶下
$ grep jenkins /etc/passwd
jenkins:x:496:496:Jenkins Continuous Integration Server:/var/lib/jenkins:/bin/bash
$ su jenkins
$ cd ~
$ pwd
/var/lib/jenkins
創(chuàng)建非對稱密鑰旨怠,執(zhí)行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的架構(gòu),它可以把任務(wù)發(fā)布到不同的節(jié)點上執(zhí)行鉴腻,典型的應(yīng)用場景是你有2個運行環(huán)境迷扇,一個是測試環(huán)境,一個是生產(chǎn)環(huán)境爽哎,你可以指定工作流中蜓席,哪些任務(wù)在測試環(huán)境中執(zhí)行,哪些任務(wù)在生產(chǎn)環(huán)境中執(zhí)行课锌。當然厨内,如果你沒有這樣的需求,也可以不配置Slave渺贤,這篇文章討論的是有Slave的情況雏胃。
如果你需要配置Slave,在Slave節(jié)點上創(chuàng)建一個jenkins用戶志鞍,并建立Master和Slave的授信關(guān)系(你需要將下面的host
替換為具體的服務(wù)器IP瞭亮,注意一定要保證Master和Slave之間是內(nèi)網(wǎng)通信的,否則公網(wǎng)環(huán)境延遲較大固棚,經(jīng)常會出現(xiàn)Slave掉線情況)
ssh jenkins@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
同時统翩,為了讓jenkins可以執(zhí)行更高權(quán)限的命令,所有節(jié)點都需要把jenkins用戶設(shè)置為sudo用戶此洲。當然厂汗,我這是為了偷懶,更好的辦法是設(shè)置一個專門的用戶組呜师,讓這個組有一定的權(quán)限娶桦,然后把jenkins加入到這個用戶組。
$ sudo grep jenkins /etc/sudoers
jenkins ALL=(ALL) NOPASSWD: ALL
以上為全部終端的配置汁汗,剩下操作基本都在Jenkins提供的web頁面上完成
設(shè)置Slave
打開Jenkins頁面http://hostname:8080
趟紊,進入管理頁面,點擊New Node
配置Node碰酝,Labels
是環(huán)境設(shè)置霎匈,例如開發(fā)環(huán)境,測試環(huán)境送爸,編譯環(huán)境等铛嘱,后續(xù)可以根據(jù)Lables
值暖释,指定具體的任務(wù)在某個環(huán)境中執(zhí)行
設(shè)置Master到Node間的授信方式
成功后,可以在控制臺看到新增的Node
創(chuàng)建Pipeline
基本環(huán)境搭建好后墨吓,我們來配置一個工作流親自感受一下
工作流在Jenkins中被稱為pipeline球匕,pipeline的運行行為由用戶自己定義,定義的內(nèi)容存放在一個Jenkinsfile文件中帖烘,并將該文件存放在git倉庫的根目錄亮曹,大致的流程如下:
- 用戶將代碼提交到git
- Jenkins從git拉取最新代碼
- 讀取根目錄下的Jenkinsfile文件,并依次執(zhí)行文件中定義的任務(wù)
下面是具體的配置步驟
編寫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模板秘症,其中有以下幾個關(guān)鍵概念
- agent - 指定在哪臺機器上執(zhí)行任務(wù)照卦,還記得上面配置
Node
時候填的Label
嗎,如果這兩個label
匹配得上乡摹,就在該Node
中執(zhí)行 - stage - 組成工作流的大的步驟役耕,這些步驟是串行的,例如build聪廉,test瞬痘,deploy等
- steps - 描述stage中的小步驟,同一個stage中的steps可以并行
- sh - 執(zhí)行shell命令
- input - 需要你手動點擊確定板熊,Pipeline才會進入后續(xù)環(huán)節(jié)框全,常用于部署環(huán)節(jié),因為很多時候部署都需要人為的進行一些確認
- post - 所有pipeline執(zhí)行完成后干签,會進入post環(huán)節(jié)津辩,該環(huán)節(jié)一般做一些清理工作,同時還可以判斷pipeline的執(zhí)行狀態(tài)
了解了這些后筒严,你會發(fā)現(xiàn)寫一個Jenkinsfile是一件很容易的事情。好了情萤,現(xiàn)在要測試pipeline功能鸭蛙,把上面的代碼中的sh
換成echo
,拷貝到你的Jenkinsfile中筋岛,并存放在git倉庫的根目錄
創(chuàng)建pipeline
回到Jenkins web頁面娶视,添加pipeline
如果你想每次git commit
時自動執(zhí)行該pipeline,有兩種方法睁宰,一種是讓Jenkins對git進行輪詢肪获,每分鐘檢查git倉庫有沒有更新,如下配置
另一種方式是使用git提供的hook柒傻,該方式原理是git一旦提交孝赫,便會觸發(fā)hook中的腳本,讓腳本給Jenkins發(fā)送執(zhí)行pipeline的指令红符,這種方式更優(yōu)雅青柄,但相應(yīng)要做的事情更多一點伐债,這里就不演示這種方法了,感興趣的同學可以自己研究一下致开。
最后峰锁,我們需要設(shè)置git的地址,其中的授信設(shè)置双戳,和上面說的Master到Node的授信設(shè)置一致
設(shè)置完畢后虹蒋,一旦你的git倉庫收到新的提交,就會觸發(fā)這個pipeline的運行飒货,以下這張圖是上面Jenkinsfile例子的運行狀態(tài)魄衅,可以看到當運行到Sanity check
這一步時,需要你手動觸發(fā)是否執(zhí)行后面的操作膏斤。
下面我們來總結(jié)一下徐绑,這篇教程主要講述了以下幾個方面:
- Jenkins是什么,及它的應(yīng)用場景舉例
- 如何搭建一個Jenkins服務(wù)
- Jenkins Pileline是什么莫辨,我們?nèi)绾味x一個Pipeline
- 如何具體的操作一個Pipeline
Have fun傲茄!