Jenkins 入門

Jenkins 入門

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 可以通過第三方的插件來擴展。

  • 跨平臺

支持幾乎所有的平臺:

  1. Arch Linux
  2. Docker
  3. FreeBSD
  4. Gentoo
  5. macOS
  6. OpenBSD
  7. openSUSE
  8. Red Hat/Fedora/CentOS
  9. Ubuntu/Debian
  10. OpenIndiana Hipster
  11. 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 了


Jenkins 入門


  • 運行 JavaHelloWorld 的 job

進入 JavaHelloWorld 的主頁面,點擊 build now 鏈接進行 build,build 後可以在此主頁面

上看到所有的 build 歷史,如下:

Jenkins 入門


然後還可以點擊某個 build 的鏈接,查看某個 build 的詳細日誌,如下:

Jenkins 入門

參考: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。

  • 內置的環境變量
  1. BUILD_NUMBER, 唯一標識一次 build,例如 23;
  2. BUILD_ID,基本上等同於 BUILD_NUMBER,但是是字符串,例如 2011-11-15_16-06-21;
  3. JOB_NAME, job 的名字,例如 JavaHelloWorld;
  4. BUILD_TAG, 作用同 BUILD_ID,BUILD_NUMBER,用來全局地唯一標識一此 build,例如 jenkins-JavaHelloWorld-23;
  5. EXECUTOR_NUMBER, 例如 0;
  6. NODE_NAME,slave 的名字,例如 MyServer01;
  7. NODE_LABELS,slave 的 label,標識 slave 的用處,例如 JavaHelloWorld MyServer01;
  8. JAVA_HOME, java 的 home 目錄,例如 C:\Program Files (x86)\Java\jdk1.7.0_01;
  9. WORKSPACE,job 的當前工作目錄,例如 c:\jenkins\workspace\JavaHelloWorld;
  10. HUDSON_URL = JENKINS_URL, jenkins 的 url,例如 http://localhost:8000/ ;
  11. BUILD_URL,build 的 url 例如 http://localhost:8000/job/JavaHelloWorld/23/;
  12. JOB_URL, job 的 url,例如 http://localhost:8000/job/JavaHelloWorld/;
  13. 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。

Jenkins 入門


在 Slave 的配置頁面,輸入如下:

  1. *executors 的數量,1 或多個;
  2. *輸入 Slave 上的跟目錄,例如 c:\jenkins;
  3. *Usage 選擇:Leave this machine for tied jobs only;
  4. *Lunch Method 選擇:Launch slave agents via Java Web Start;
  5. * Avaliablitiy選擇:Keep this slave online as much as possible;
  6. * 然後保存。

在Slave所在的機器登錄Jenkins master,且進入Manage Jenkins-->Manage Nodes-->新

建的 Note,點擊 launch,然後安裝 slave 為 service 如下:

Jenkins 入門

安裝成功後顯示如下:

Jenkins 入門

  • 在Slave上運行Job

對上面的 slave 增加 label,從而表示此 slave 的用處,且同時對 uage 選擇 leave this machine for tied jobs only:

Jenkins 入門

對 Jenkins 構建 JavaHelloWorld 中的 job 修改如下:

選擇 restrict where this project can be run 且輸入 note(slave)的 label;

另外注意 SVN 的地址因該正確,jenkins 會提示輸入 svn 的用戶名和密碼。


Jenkins 入門

此時 job 將會在slave所在的機器運行,當然 build 所需要的環境要在slave上配置好,運行如下:

Jenkins 入門

注 意: 對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 入門

確保 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 入門

Jenkins Master/Slave 架構

  • Jenkins Master/Slave架構

Master/Slave相當於Server和agent的概念。Master 提供 web 接口讓用戶來管理job和slave,job可以運行在master本機或者被分配到slave上運行。一個master可以關聯多個slave用來為不同的job或相同的job的不同配置來服務。

Jenkins 入門

當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 入門

寫在最後

Jenkins作為一款開源的CI/CD工具,結合插件使用,功能已經十分強大。可以滿足大部分中小公司的需求。

美中不足的是,Jenkins對於artifact(編譯產物)的管理做的不是很好,即使使用插件,這方面的短板還是無法的大力解決(Bamboo做的就很好)。所以在這裡就不得不說到另外的兩個工具,JFrog和Nexus。

下次繼續。


分享到:


相關文章: