Jenkins 入門總結
Jenkins 是 Continous Integration Server,是 Hudson 的繼續。 類似的產品: Bamboo,BuildBot,TeamCity,BuildForge 等。
Jenkins 的突出特點:
- 開源,免費,免費,免費;
- 跨平臺,支持所有的平臺;
- 支持分佈式部署,管理;
- Web可視化管理;
- 安裝簡單,上手快;
- Plugin Market十分豐富,大部分還都是免費的。
Jenkins 安裝
Jenkins的
容易安裝,只需要執行 Java -jar jenkins.war, 或者直接部署到服務器中。
- 首先,安裝Java
Java 8或者11 (JRE和Java Development Kit (JDK) 都可以)。
- 然後,下載Jenkins.war
鏈接:http://mirrors.jenkins.io/war-stable/latest/jenkins.war
- 運行
java -jar jenkins.war --httpPort=[端口號]
- 訪問
打開瀏覽器(推薦Chrome),訪問 http://localhost:[端口號]
Jenkins 的主要特點
Jenkins 的主要功能是監視重複工作的執行,例如軟件工程的構建或需要反覆運行的自動化測試。
具體地:
- 軟件的持續構建和測試
此時 Jenkins 與 CruiseControl 或 DamageControl 相似。本質上提供了一個易於使用的持續集成系統,使 得開發人員更容易地將改變集成到工程中,使得用戶更容易獲得一個新的 build。自動化,持續的構建提高了軟件開發的效率。
- 監視外部運行 的 job 的執行
例如 cron jobs 或 procmail jobs,即使這些 jobs 是運行在遠程的機器上。例如,對於 cron,你將會收到 email 包含 job 的 output,你需要檢查 email 來確認是否 job broke。Jenkins 將保持這些 outputs 且使得你更加容易地注意到 job 的 broke。
- 容易配置
jenkins 可以完全地通過友好的 web GUI 來配置,且配置頁面支持配置項的錯
誤檢查和很好的在線幫助。不需要手動地編輯 xml 的配置文件,但是 jenkins 也支持手動
修改 xml 配置文件。
- 項目源碼修改的檢測
Jenkins 能夠從項目的倉庫(例如SVN,Git等等)生成最近修改的集合列表,且改方式非常有效,不會增加 Subversion/CVS Repository的負載。
- 永久的鏈接
Jenkins 對於大部分頁面都生成清楚的可讀的永久的鏈接,例如''latest build"/"latest successful build",因此可以容易地在其他的地方引用 jenkins 的生成的pages。
- RSS/EMail/IM 集成
可以通過 RSS,EMail 或 IM 來實時地監視 build 的失敗。
- Build 完成後仍然可以 tag
支持在 build 完成後 tag 或重 tag。
- Junit/TestNG 測試報告
能夠很好地顯示各種測試的報告,且可以生成失敗的趨向圖。也可以根據測試報告的xsl文件(樣式文件)對測試報告進行解析。
- 分佈式
Jenkins 能夠分發 build/test 的負載到多臺機器,能夠更好地利用硬件資源,縮短 build 的時間。
- 文件標識
Jenkins 可以標識 build 產生的文件,例如 jars。
- 插件支持
jenkins 可以通過第三方的插件來擴展。
- 跨平臺
支持幾乎所有的平臺:
- Arch Linux
- Docker
- FreeBSD
- Gentoo
- macOS
- OpenBSD
- openSUSE
- Red Hat/Fedora/CentOS
- Ubuntu/Debian
- OpenIndiana Hipster
- Windows
Jenkins 構建 JavaHelloWorld
JavaHelloworld 運行在 master,即 Jenkins 所在的機器。
- Java 的 HelloWorld 程序
Ant 構建腳本:c:\JavaHelloWorld\build.xml
<code> /<code>
Java 的 helloworld: c:\JavaHelloWorld\src\oata\helloworld.java
<code>package oata; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } }/<code>
- 創建 job 來運行 JavaHelloWorld
在 ie 中打開 http://localhost:8080,單擊 new job 鏈接,為 javahelloworld 新建 job,且編譯 job 的配置如下:
注意 jenkins 默認已經安裝了 svn 的 plugin 了
- 運行 JavaHelloWorld 的 job
進入 JavaHelloWorld 的主頁面,點擊 build now 鏈接進行 build,build 後可以在此主頁面
上看到所有的 build 歷史,如下:
然後還可以點擊某個 build 的鏈接,查看某個 build 的詳細日誌,如下:
參考:http://ant.apache.org/manual/tutorial-HelloWorldWithAnt.html
Jenkins 的配置
- 修改Jenkins的根目錄
默認地在 C:\Documents and Settings\AAA\.jenkins。
.jenkins
├─jobs
│ └─JavaHelloWorld
│ ├─builds
│ │ ├─2011-11-03_16-48-17
│ │ ├─2011-11-03_16-49-05
│ │ ├─2011-11-03_16-49-29
│ │ ├─2011-11-03_17-01-49
│ │ └─2011-11-03_17-11-42
│ └─workspace
│ ├─build
│ │ ├─classes
│ │ │ └─oata
│ │ └─jar
│ └─src
│ └─oata
├─plugins
├─usercontent
├─war
可以通過設置環境變量來修改,例如: set JENKINS_HOME=C:\jenkins
然後重新啟動 jenkins。
- 備份和恢復Jenkins
只需要備份 JENKINS_HOME 下的所有文件和文件夾,恢復的時候需要先停止 jenkins。
- 移動,刪除或修改 jobs
對於移動或刪除 jobs,只需要簡單地移動或刪除%JENKINS_HOEM%\jobs 目錄。
對於修改 jobs 的名字,只需要簡單地修改%JENKINS_HOEM%\jobs 下對應 job 的文件夾的名字。
對於不經常使用的 job,只需要對%JENKINS_HOEM%\jobs 下對應的 jobs 的目錄 zip 或 tar後存儲到其他的地方。
- url 中執行命令
如下:
http://[jenkins-server]/[command]
命令可以為:
<code>exit shutdown jenkins restart restart jenkins reload to reload the configuration/<code>
- Jenkins 啟動時的命令行參數
--httpPort=$HTTP_PORT,用來設置 jenkins 運行時的 web 端口。
--httpsPort=$HTTP_PORT,表示使用 https 協議。
--httpListenAddress=$HTTP_HOST,用來指定 jenkins 監聽的 ip 範圍,默認為所有的 ip 都可以訪問
此 jenkins server。
- 修改 jenkins 的 timezone
如果Jenkins所在的server的timezone不同於用戶的timezone,這時候需要修改 jenkins 的timezone,需要在 jenkins 啟動的時候增加下列參數:
<code>-Dorg.apache.commons.jelly.tags.fmt.timeZone=TZ/<code>
- 最好通過一個腳本來啟動 jenkins,確保 jenkins 每次都運行在相同的環境下
例如 startjenkins.bat
<code>set JENKINS_HOME=c:\jenkins cd /d %JENKINS_HOME% java -jar %JENKINS_HOME%\jenkins.war --httpPort=8000/<code>
- Jenkins在後臺運行
如果 jenkins 是部署在 servlet 容器中,例如 apache,tomcat 中。因為 servlet 容器一般都在後臺運行,所以 jenkins 也就已經在後臺運行了。
對於Windows用戶需要在Jenkins的管理頁面中點擊 insall as windows service 來將Jenkins部署為 service。但是感覺比較好的方法還是手動將啟動Jenkins 的腳本部署為Windows Service,從而可以更靈活地設置更多的參數。
- Jenkins的系統信息
可以在Jenkins 的管理頁面下的系統信息中,查看所有的 jenkins 的信息,例如Jenkins的啟動配置,所依賴的系統的環境變量,所安裝的plugins。
- 內置的環境變量
- BUILD_NUMBER, 唯一標識一次 build,例如 23;
- BUILD_ID,基本上等同於 BUILD_NUMBER,但是是字符串,例如 2011-11-15_16-06-21;
- JOB_NAME, job 的名字,例如 JavaHelloWorld;
- BUILD_TAG, 作用同 BUILD_ID,BUILD_NUMBER,用來全局地唯一標識一此 build,例如 jenkins-JavaHelloWorld-23;
- EXECUTOR_NUMBER, 例如 0;
- NODE_NAME,slave 的名字,例如 MyServer01;
- NODE_LABELS,slave 的 label,標識 slave 的用處,例如 JavaHelloWorld MyServer01;
- JAVA_HOME, java 的 home 目錄,例如 C:\Program Files (x86)\Java\jdk1.7.0_01;
- WORKSPACE,job 的當前工作目錄,例如 c:\jenkins\workspace\JavaHelloWorld;
- HUDSON_URL = JENKINS_URL, jenkins 的 url,例如 http://localhost:8000/ ;
- BUILD_URL,build 的 url 例如 http://localhost:8000/job/JavaHelloWorld/23/;
- JOB_URL, job 的 url,例如 http://localhost:8000/job/JavaHelloWorld/;
- SVN_REVISION,svn 的 revison, 例如 4。
Windows Slave 配置
參考:https://wiki.jenkinsci.org/display/JENKINS/Step+by+step+guide+to+set+up+master+and+slave+machines
- 創建新的Slave
注意 Jenkins 中 slave 稱為 node。 所以下面文章中的slave和node指的是一回事。
在 Manage Jenkins-->Manage Nodes -->New Node 下:輸入 Node Name,且選擇Dumb Slave作為Slave 的類型,然後 OK。
在 Slave 的配置頁面,輸入如下:
- *executors 的數量,1 或多個;
- *輸入 Slave 上的跟目錄,例如 c:\jenkins;
- *Usage 選擇:Leave this machine for tied jobs only;
- *Lunch Method 選擇:Launch slave agents via Java Web Start;
- * Avaliablitiy選擇:Keep this slave online as much as possible;
- * 然後保存。
在Slave所在的機器登錄Jenkins master,且進入Manage Jenkins-->Manage Nodes-->新
建的 Note,點擊 launch,然後安裝 slave 為 service 如下:
安裝成功後顯示如下:
- 在Slave上運行Job
對上面的 slave 增加 label,從而表示此 slave 的用處,且同時對 uage 選擇 leave this machine for tied jobs only:
對 Jenkins 構建 JavaHelloWorld 中的 job 修改如下:
選擇 restrict where this project can be run 且輸入 note(slave)的 label;
另外注意 SVN 的地址因該正確,jenkins 會提示輸入 svn 的用戶名和密碼。
此時 job 將會在slave所在的機器運行,當然 build 所需要的環境要在slave上配置好,運行如下:
注 意: 對Slave系統環境變量的修改,Jenkins slave 不會立即生效,需要重啟Jenkins Slave Service。
參考:
https://wiki.jenkins-ci.org/display/JENKINS/Distributed+builds
http://community.jboss.org/wiki/HudsonWindowsSlavesSetup
Jenkins的Linux的Slave的配置
作為 slave 的 Linux 機器為 centos 系統。
- Linux的Slave設置
創建Jenkins用戶
<code>sudo /usr/sbin/useradd -m jenkins -d /home/jenkins/<code>
查看Jenkins 用戶及組的信息 id jenkins
<code>uid=506(jenkins) gid=506(jenkins) groups=506(jenkins) /<code>
使用 sudo /usr/bin/passwd jenkins 來設置用戶 jenkins 的密碼為 0;
切換到用戶 jenkins 環境下
<code>su - jenkins/<code>
安裝 ant
<code>yum install ant/<code>
- 在Slave的Linux機器上創建public/private key pair
確保當前用戶為 jenkins
執行 ssh-keygen 來創建 public/private key pair,直接 enter,表示 key將存儲在/home/jenkins/.ssh/id_rsa 下,再直接 enter,表示不設置密碼,再次 enter 確認密碼為空;
創建 authorized_keys
<code>cd .ssh cat id_rsa.pub > authorized_keys chmod 700 authorized_keys/<code>
將 id_rsa(相當於 privatekey)拷貝到 jenkins master 機器上,例如 c:\jenkins\id_rsa 下。
- 創建Slave(node)
確保 jenkins 中 ssh slave plugin 正確安裝,一般默認安裝。
然後 lunch slave,使得 master 和 slave 通過 ssh 成功連接。其實 launch 的時候 jenkins 自動地從http://yourserver:port/jnlpJars/slave.jar拷貝slave.jar 到 slave,然後通過命令運行
<code>java -jar slave.jar/<code>
來運行 slave。
- 在新建的 Linux 的 Slave 上運行上節中的 JavaHelloWorld(Jenkins 構建JavaHelloWorld)
且需要修改 JavaHelloWorld job 的 Label 為 JavaHelloWorldLinux 來使用此 slave,運行如下:
Jenkins Master/Slave 架構
- Jenkins Master/Slave架構
Master/Slave相當於Server和agent的概念。Master 提供 web 接口讓用戶來管理job和slave,job可以運行在master本機或者被分配到slave上運行。一個master可以關聯多個slave用來為不同的job或相同的job的不同配置來服務。
當job被分配到slave上運行的時候,此時master和slave其實是建立的雙向字節流的連接,其中連接方法主要有如下幾種:
- master通過ssh來啟動slave
Jenkins 內置有 ssh 客戶端實現,可以用來與遠程的 sshd 通信,從而啟動 slave agent。這是對unix系統的slave最方便的方法,因為unix系統一般默認安裝有 sshd。在創建ssh連接的 slave 的時候,你需要提供slave的host名字,用戶名和ssh證書。創建public/private keys,然後將public key拷貝到slave 的~/.ssh/authorized_keys 中,將 private key 保存到master上某ppk文件中。Jenkins將會自動地完成其他的配置工作。
- master通過WMI+DCOM來啟動Windows slave
對 於Windows的Slave,Jenkins可以使用Windows2000及以後內置的遠程管理功能(WMI+DCOM),你只需要提供對 slave 有管理員訪問權限的用戶名和密碼,Jenkins將遠程地創建Windows Service然後遠程地啟動和停止他們。
對於Windows 的系統,這是最方便的方法,但是此方法不允許運行有顯示交互的GUI程序。
- 實現腳本來啟動Slave
如果上面成套的方法不夠靈活,你可以實現自己的腳本來啟動 slave。你需要將啟動腳本放到master,然後告訴Jenkins Master 在需要的時候調用此腳本來啟動 slave。
典型地,你的腳本使用遠程程序執行機制,例如SSH,RSH或類似的方法(在Windows,可以通過cygwin 或 psexec 來完成),在腳本的最後需要執行類似 java -jar slave.jar 來啟動 slave。slave.jar 可以從http://yourjenkinsserver:port/jnlpjars/slave.jar 下載,從而保證 slave.jar 正確的版本。 但是如果使用 ssh slave plugin 的話,此 plugin 將自動地更新 slave.jar。
- 通過Java web start啟動Slave
jave web start(jnlp)是另一種啟動 slave 的方法。用這種方法你需要登錄到 slave,打開瀏覽器,打開Slave 的配置頁面來連接。還可以安裝為Windows Service 來使得Slave在後臺運行。
如果你需要運行的程序需要 UI的交互,使用下面的方法:在 slave 系統上創建 jenkins 用
戶,設置自動登錄,在系統的 startup items 增加 slave JNLP 文件的快捷方式,使得 slave
在系統登錄的時候自動啟動。
- 直接啟動Slave
此方式類似於 java web start,可以方便地在*unix 系統上將 slave 運行為 daemon。需要配置 slave 為 JNLP 類型連接,然後在 slave 機器上執行
<code>java -jar slave.jar -jnlpUrl http://yourserver:port/computer/slave-name/slave-agent.jnlp/<code>
Slave 配置的建議
- 每個 slave 都有用戶 jenkins,所有的機器使用相同的 UID 和 GID,使得 slave 的管理更加簡單;
- 每個機器上 jenkins 用戶的 home 目錄都相同/home/jenkins, 擁有相同的目錄結構使得維護簡單;
- 所有的 slave 運行 sshd,windows 運行 cygwin sshd;
- 所有的 slave 安裝 ntp client,用來與相同的 ntp server 同步;
- 使用腳本 sh 來自動地配置 slave 的環境,例如創建 jenkins 用戶,安裝 sshd,安裝 java,ant,maven 等;
- 使用腳本來啟動 slave,保證 slave 總是運行在相同的參數下:
<code>#!/bin/bash JAVA_HOME=/opt/SUN/jdk1.6.0_04 PATH=$PATH:$JAVA_HOME/bin export PATH java -jar /var/jenkins/bin/slave.jar/<code>
寫在最後
Jenkins作為一款開源的CI/CD工具,結合插件使用,功能已經十分強大。可以滿足大部分中小公司的需求。
美中不足的是,Jenkins對於artifact(編譯產物)的管理做的不是很好,即使使用插件,這方面的短板還是無法的大力解決(Bamboo做的就很好)。所以在這裡就不得不說到另外的兩個工具,JFrog和Nexus。
下次繼續。