Jenkins

JENKINS 是一個用 JAVA 編寫的開源的持續集成工具。在與 ORACLE 發生爭執後,項目從HUDSON 項目獨立出來。 JENKINS 提供了軟件開發的持續集成服務。
它運行在 SERVLET 容器中(例如 APACHE TOMCAT)。它支持軟件配置管理(SCM)工具(包括 ACCUREV SCM、CVS、SUBVERSION、GIT、PERFORCE、CLEARCASE 和 RTC),能夠執行基於 APACHE ANT 和 APACHE MAVEN的項目,以及任意的 SHELL 腳本和 WINDOWS 批處理命令。JENKINS 是在 MIT 許可證下發布的自由軟件html

二 企業代碼上線發展史

代碼發佈上線是每個 IT 企業必需要面臨的,並且無論是對開發或者是運維來講,代碼上線自己就是一個件很是痛苦的事情,不少時候每一次發佈都是一次考驗。爲了提升上線的效率,代碼上線的方式,方法,工具也不斷的發展,基本上能夠分爲如下幾個階段:java

階段 1-沒有構建服務器
軟件在開發者的機器上經過 Ant 或其它腳本手動構建,代碼保存在中央源碼倉庫中,可是開發者不是常常提交本地的修改。每次須要發佈的時候,開發者手動合併修改,這個過程是至關痛苦的node

階段 2-晚上進行構建
在這個階段,團隊有構建服務器,自動化的構建在晚上進行。構建過程只是簡單的編譯代碼,沒有可靠的和可重複的單元測試。然而,開發人員天天提交代碼。若是某個開發人員提的代碼和其餘人的代碼衝突的話,構建服務器會在次日經過郵件通知團隊。因此有一段時間構建是處於失敗狀態的。linux

階段 3-晚上進行構建並進行自動化測試
團隊對 CI 和自動化測試愈來愈重視。不管何時版本管理系統中的代碼改變了都會觸發編譯構建過程,團隊成員能夠看到是代碼中的什麼改變觸發了這個構建。而且,構建腳本會編譯應用而且會執行一系列的單元測試或集成測試。除了郵件,構建服務器還能夠經過其餘方式通知團隊成員,如:IM。失敗的構建被快速的修復git

階段 4-代碼質量度量
自動化的代碼質量和測試覆蓋率的度量手段有助於評價代碼的質量和測試的有效性。代碼質量的構建會產生 API 文檔web

階段 5-更加認真地對待測試
CI 和測試緊密相關。現在,像測試驅動開發被普遍地使用,使得對自動化的構建更加有信心。應用不只僅是簡單地編譯和測試,而是若是測試成功會被自動的部署到一個應用服務器上來進行更多的綜合的 end-to-end 測試和性能測試。shell

階段 6-驗收測試和更加自動化的部署
驗收測試驅動的開發被使用,使得咱們可以瞭解項目的狀態。這些自動化的測試使用行爲驅動的開發和測試驅動的開發工具來做爲交流和文檔工具,發佈非開發人員也能讀懂的測試結果報告。
因爲測試在開發的早起就已經被自動化的執行了,因此咱們能更加清楚地瞭解到什麼已經作了,什麼尚未作。每當代碼改變或晚上,應用被自動化地部署到測試環境中,以供 QA 團隊測試。當測試經過以後,軟件的一個版本將被手工部署到生產環境中,團隊也能夠在出現問題的時候回滾以前的發佈數據庫

階段 7-持續部署
對自動化的單元測試,集成測試和驗收測試的信心使得咱們可使用自動化的部署技術將軟件直接部署到生產環境中。可是測試仍是有可能不能真正的反映現實的環境apache

三 Jenkins的安裝

 使用RPM方式安裝編程

 [root@localhost ~]# yum install -y  java-1.8.0-openjdk java-1.8.0-openjdk-devel
 [root@localhost ~]# wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.121.1-1.1.noarch.rpm
 [root@localhost ~]# rpm -ivh jenkins-2.121.1-1.1.noarch.rpm 
 [root@localhost ~]# systemctl start jenkins
 [root@localhost ~]# systemctl enable jenkins
 jenkins.service is not a native service, redirecting to /sbin/chkconfig.
 Executing /sbin/chkconfig jenkins on

 Jenkins 默認監聽 8080,服務啓動後咱們能夠在瀏覽器中輸入 http://您服務器的 ip地址:8080 訪問 jenkins 服務。

 

四 Jenkins的插件管理

 Jenkins 自己是一個引擎、一個框架,只是提供了很簡單功能,其強大的功能都是經過插件來實現的,jenkins 有一個龐大的插件生態系統,爲 Jenkins 提供豐富的功能擴展。下面咱們來介紹經常使用的幾種插件安裝方式

1 自動安裝插件

在 jenkins 主頁面,點擊系統管理在右側選擇管理插件:

進入插件管理頁面,點擊可選插件,選擇你須要安裝的插件

安裝完成後,通常狀況下不須要重啓 Jenkins,具體根據提示操做

2 手工安裝插件

除了上面的插件安裝方法,Jenkins 還爲咱們提供了手工安裝插件的方式,特別是在國內,因爲網絡的緣由,有時候咱們使用上述方法安裝插件會常常不成功,因此咱們能夠採用下載插件,而後再上傳的方式來安裝插件

官方的插件下載地址:http://updates.jenkins-ci.org/
國內的源:https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/

若是是在官方網站下載插件,最好下載與你 jenkins 版本對應的插件,若是是在清華鏡像下載插件,則不存在版本的問題。下載後獲得的一個以.hpi 爲擴展名的文件
下載 ssh.hpi 後,咱們手動安裝 ssh 插件,進入到插件管理頁面

3 覆蓋插件目錄

咱們能夠備份已經安裝好插件的 Jenkins 服務器上的/var/lib/jenkins/plugins 目錄,而後把備份文件上傳到咱們須要安裝插件的新 Jenkins 服務器的對應目錄上,而後重啓Jenkins
這種方法其實給咱們提供了一種更加快速的安裝 Jenkins 插件的方法。建議在初始安裝jenkins 時,可使用此方法,其餘時候儘可能使用前兩種方式。咱們本教程使用此方式安裝插件。前面咱們在初始化 jenkins 的時候,跳過了插件的安裝,如今咱們的 Jenkins 插件目錄爲空,由於咱們沒有安裝任何插件:

[root@ci-node2 ~]# cd /var/lib/jenkins/plugins/
[root@ci-node2 plugins]# ll
[root@ci-node2 ~]# ll plugins.tar.gz
-rw-r--r-- 1 root root 164431230 May 31 16:46 plugins.tar.gz
[root@ci-node2 ~]# tar xf plugins.tar.gz
[root@ci-node2 ~]# cd plugins
[root@ci-node2 plugins]# mv * /var/lib/jenkins/plugins/
完成後,重啓 jenkins 服務
[root@ci-node2 plugins]# systemctl restart Jenkins

 五 Jenkins 經常使用目錄及文件

學習 Jenkins,首先要明白一點,那就是 jenkins 下一切兼文件,也就是說 jenkins 沒有數據庫,全部的數據都是以文件的形式存在,因此我要了解 Jenkins 的主要目錄及文件,經過命令咱們能夠查看到全部的 jenkins 目錄及文件的位置

[root@ci-node2 ~]# rpm -ql jenkins
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/usr/lib/jenkins
/usr/lib/jenkins/jenkins.war
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins
/var/log/Jenkins

1 Jenkins 主配置文件

/etc/sysconfig/jenkins 是 Jenkins 的主配置文件:咱們在這裏主要配置 Jenkins 的工做目錄、啓動用戶、啓動端口。
Jenkins 默認的用戶爲 jenkins,生產環境建議使用 jenkins 用戶,而後使用 sudo 進行受權,咱們實驗過程爲了不各類權限問題,改成 root 用戶。

2 Jenkins 主目錄

/var/lib/jenkins 是 Jenkins 默認配置的主工做目錄,咱們能夠在主配置文件進行設置

[root@ci-node2 ~]# cd /var/lib/jenkins/
[root@ci-node2 jenkins]# ll
total 64
-rw-r--r-- 1 jenkins jenkins 788 Aug 4 21:53
com.dabsquared.gitlabjenkins.connection.GitLabConnectionConfig.xml
-rw-r--r-- 1 jenkins jenkins 365 Aug 4 21:53
com.dabsquared.gitlabjenkins.GitLabPushTrigger.xml
-rw-r--r-- 1 jenkins jenkins 1592 Aug 4 21:53 config.xml
-rw-r--r-- 1 jenkins jenkins 159 Aug 4 21:53
hudson.model.UpdateCenter.xml
-rw-r--r-- 1 jenkins jenkins 370 Aug 4 21:53
hudson.plugins.git.GitTool.xml
-rw------- 1 jenkins jenkins 1712 Aug 4 16:05 identity.key.enc
-rw-r--r-- 1 jenkins jenkins 94 Aug 4 16:05 jenkins.CLI.xml
-rw-r--r-- 1 jenkins jenkins 4 Aug 4 21:53
jenkins.install.InstallUtil.lastExecVersion
-rw-r--r-- 1 jenkins jenkins 4 Aug 4 20:18
jenkins.install.UpgradeWizard.state
drwxr-xr-x 2 jenkins jenkins 6 Aug 4 16:05 jobs
drwxr-xr-x 3 jenkins jenkins 19 Aug 4 16:05 logs
-rw-r--r-- 1 jenkins jenkins 907 Aug 4 21:53 nodeMonitors.xml
drwxr-xr-x 2 jenkins jenkins 6 Aug 4 16:05 nodes
drwxr-xr-x 97 jenkins jenkins 8192 Aug 4 21:52 plugins
-rw-r--r-- 1 jenkins jenkins 129 Aug 4 21:53 queue.xml.bak
-rw-r--r-- 1 jenkins jenkins 64 Aug 4 16:05 secret.key
-rw-r--r-- 1 jenkins jenkins 0 Aug 4 16:05 secret.key.not-so-secret
drwx------ 4 jenkins jenkins 4096 Aug 4 16:05 secrets
-rw-r--r-- 1 jenkins jenkins 0 Aug 5 10:16 ThinBackup Worker Thread.log
drwxr-xr-x 2 jenkins jenkins 182 Aug 4 21:53 updates
drwxr-xr-x 2 jenkins jenkins 24 Aug 4 16:05 userContent
drwxr-xr-x 3 jenkins jenkins 19 Aug 4 16:05 users
drwxr-xr-x 2 jenkins jenkins 6 Aug 4 21:53 workflow-libs

其中主要的目錄爲 jobs 目錄:存放 jobs 的配置及每次構建的結果;plugins 目錄:Jenkins 插件目錄,存放咱們已經安裝的插件;worksspace:工做區目錄,每次 job 執行構建時的工做目錄,users 目錄,存放與用戶相關的配置文件。

3 Jenkins 主程序目錄

/usr/lib/jenkins/jenkins.war 是 Jenkins 的主程序

4 其餘目錄及文件

/var/log/Jenkins Jenkins 日誌文件目錄
/etc/init.d/Jenkins Jenkins 啓動文件

六 Jenkins建立freestyle 項目

構建做業是一個持續集成服務器的基本職能,構建的形式多種多樣,能夠是編譯和單元測試,也多是打包及部署,或者是其餘相似的做業。在 Jenkins 中,構建做業很容易創建,並且根據你的須要你能夠安裝各類插件,來建立多種形式的構建做業,下面咱們先來學習建立自由式構建做業
自由式的構建做業是最靈活和可配置的選項,而且能夠用於任何類型的項目,它的配置相對簡單,其中不少配置在的選項也會用在其餘構建做業中。

在 Jenkins 主頁面,點擊左側菜單欄的「新建」或者「New job」 進入建立 job 頁面

注:一、job 名稱須要有規劃,以便於後面的權限管理;二、建立 job 後不要輕易更更名稱,由於 jenkins 一切皆文件,不少關於 job 的文件,都是以該名稱命名,當你更名後,通常不會刪除舊文件,而是會再從新建立一份新的文件。
輸入 job 名稱,選擇類型後,點擊 OK 後建立 job,進入 job 配置頁面,此時在 Jenkins的主目錄下的 jobs 目錄已經生成了以你 Job 名稱命名的文件夾

Job 配置頁面,主要包括通用配置、源碼管理、構建觸發器、構建環境、構建、構建後操做等幾個部分,根據你選擇的構建類型不一樣,可能配置項會有一些小的差異。咱們經過幾個示例來學習具體的配置。

1 執行linux命令和腳本

首先咱們來看通用配置選項

勾選「丟棄舊的構建」,這是咱們必須提早考慮的重要方面,就是咱們如何處理構建歷史,構建做業會消耗大理的磁盤空間,尤爲是你存儲的構建產物(好比執行 java 構建時會生成的 JAR、WAR 等)

該選項容許你限制在構建歷史記錄的做業數。你能夠告訴 Jenkins 只保留最近的幾回構建,或者只保留指定數量的構建,此外,Jenkins 永遠不會刪除最後一個穩定和成功的構建。具體數據的指定要根據你項目的實際狀況而定,我通常設置爲 五、5,

下拉至「構建」部分

添加構建操做,選擇「execute shell」

保存設置後,回到 job 主頁面

點擊「當即構建」執行 job 的構建任務,咱們的 job 就是執行一條 linux 命令

點擊下拉菜單的「console output」

在上面的控制檯輸出內容中,咱們能夠看到 job 執行時的當前工做目錄爲 Jenkins 主目錄+workspaces+以 job 名稱命名的文件夾,知道這一點對於咱們後面寫腳本執行部署任務時很是重要。咱們也能夠經過命令行進行確認。

[root@localhost jobs]# pwd
/var/lib/jenkins/jobs
[root@localhost jobs]# cd /var/lib/jenkins/workspace/My-freestyle-Job/
[root@localhost My-freestyle-Job]# ll
total 0
-rw-r--r--. 1 jenkins jenkins 0 May 15 23:03 a

並且咱們進一步也能夠看到 job 主頁面,工做空間所對應的位置也是此目錄。經過這個例子,咱們能夠聯想到,咱們可使用 Jenkins 執行任何 linux 命令,這也就是咱們前面講的要注意 Jenkins 啓動用戶的配置,若是是 root 用戶啓動的Jenknis,那Jenkins的安全及權限配置必定要作好控制。咱們在學習初期,爲了節省時間,可使用 root 用戶啓動jenkins。

 2 鏈接 gitlab 獲取倉庫代碼 

咱們使用上面的 job 進行配置,在「源碼管理」部分配置拉取 Gitlab 上的 monitor 倉庫,該倉庫是一個純 html 代碼項目,首先在 Gitlab 上覆制倉庫地址

而後回到 Jenkins 上 My-freestyle-job 配置頁面,下拉到「源碼管理」部分,勾選 git選項

根據提示信息顯示爲 key 認證失敗,由於咱們使用的 SSH 方式鏈接倉庫,因此須要配置SSH 認證
而咱們在 Gitlab上配置的 root用戶的公鑰,如今咱們有兩種方式解決認證失敗的問題,

1在 jenkins 上配置使用 root 用戶的私鑰鏈接 Gitlab,2配置使用 root 用戶啓動 jenkins。

下面咱們來看第一種方式

保存配置後,回到 job 主頁面,點擊「當即構建」,構建完成後,咱們在工做空間內能夠看到從 Gitlab 倉庫拉到的代碼

同時咱們在「console output」頁面能夠看到整個控制檯輸出內容

在「源碼管理」配置部分,咱們能夠配置從分支獲取代碼,也能夠配置從標籤獲取代碼、還能夠配置從某一次 commit 獲取代碼,以下圖所示

3 利用 linux 腳本實現部署

在上面的示例中,咱們已經將代碼獲取至咱們 Jenkins 服務器上,因爲咱們的項目是使用html編寫的,不須要編譯,直接能夠打包發佈(實際工做中,可能須要更換配置文件)

(1) 安裝httpd

咱們在 ci-node1 機子上安裝 httpd 服務,並配置服務端口爲 10001

Httpd 服務的默認網站放在/var/www/html 目錄下,爲了簡單咱們能夠將咱們的網站發佈該目錄,實現咱們的代碼發佈,固然在實際工做中咱們須要從新配置發佈目錄

(2) 配置 ssh 免密登陸

由於咱們要使用腳本將 ci-node1 上的程序代碼推送到 ci-node2 上,因此須要配置ci-node1 到 ci-node2 的 ssh 免密碼登陸

[root@ci-node2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.0.0.11
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed:
"/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter
out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are
prompted now it is to install the new keys
root@10.0.0.11's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@10.0.0.11'"
and check to make sure that only the key(s) you wanted were added

(3) 編寫部署腳本(deploy.sh)

[root@localhost My-freestyle-Job]# mkdir /server/scripts -p
[root@localhost My-freestyle-Job]# cd /server/scripts/
#!/bin/bash
#目標服務器 IP 地址
host=$1
#job 名稱
job_name=$2
#包名
name=web-$(date +%F)-$(($RANDOM+10000))
#打包
cd /var/lib/jenkins/workspace/${job_name} && tar czf /opt/${name}.tar.gz ./*
#發送包到目標服務器
ssh ${host} "cd /var/www/ && mkdir ${name}"
scp /opt/${name}.tar.gz $host:/var/www/${name}
#解包
ssh ${host} "cd /var/www/${name} && tar xf ${name}.tar.gz && rm -f ${name}.tar.gz"
#使用軟連接方式部署服務
ssh ${host} "cd /var/www && rm -rf html && ln -s /var/www/${name} /var/www/html"

(4 )Jenkins 配置構建 

接下來咱們在 Jenkins 上配置構建執行咱們編寫的部署腳本,回到 My-freestyle-job配置頁面,配置構建

點擊頁面上的連接能夠查看全部可用的 jenkins 環境變量保存配置
回到 job 主頁面,點擊「當即構建」後,訪問 httpd 服務的主頁面,咱們發現服務已經部署成功。

 

4 Git push 觸發自動構建

在上面的job 中咱們已經成功實現了將Gitlab中monitor倉庫的代碼部署到httpd服務中,可是每次部署須要咱們手動去點擊「當即構建」,下面咱們將實現當 Gitlab 收到push 請求後,就觸發 Jenkins 構建,將倉庫的變化部署到 httpd 服務中。

(1) Jenkins job 配置構建觸發器

回到 My-freestyle-job 的配置頁面,下拉到構建觸發器部分

勾選 gitlab 觸發選項,進入具體配置頁面

(2) Gitlab 倉庫配置 webhooks

進入 Gitlab 中 monitor 倉庫的設置頁面

進入集成配置頁面,複製 jenkins 觸發器配置頁面的 url 及 Token

配置完成後,在頁面下面測試觸發設置咱們在 jenkins job 主頁面看到構建任務被觸發

接着咱們將倉庫克隆到客戶端,在客戶端測試觸發 push 操做

root@localhost ~]# git clone git@192.168.15.128:backend/monitor.git
Cloning into 'monitor'...
remote: Counting objects: 435, done.
remote: Compressing objects: 100% (372/372), done.
remote: Total 435 (delta 53), reused 435 (delta 53)
Receiving objects: 100% (435/435), 8.78 MiB | 0 bytes/s, done.
Resolving deltas: 100% (53/53), done.
Checking connectivity... done.
#PUSH操做
[root@localhost monitor]# vim index.html 
[root@localhost monitor]# git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

 modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")
[root@localhost monitor]# git add .
[root@localhost monitor]# git commit -m 'modify index'
[master 429055f] modify index
1 file changed, 1 insertion(+), 1 deletion(-)
[root@localhost monitor]# git push -u origin master
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 311 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To 192.168.15.128:backend/monitor.git
    f6070e1..429055f  master -> master
Branch master set up to track remote branch master from origin.

Gitlab 收到本次推送的內容

 

Jenkins 對應的 job 已經觸發構建

網站 index.html 內容被更新:

同時咱們在 jenkins 中 job 主頁面的「最新修改記錄」部分能夠看到咱們的修改日誌。

5 配置構建後通知 Gitlab

構建完成後,jenkins 能夠把構建的結果反饋給 Gitlab,這樣在 Gitlab 上就能夠查看每一次 push 後構建的執行結果
首先在 Jenkins上配置,能夠訪問 Gitlab,打開 jenkins 系統管理—>系統設置頁面,下拉找到 Gitlab 部分,

添加認證 注意:TOken爲gitlab用戶生成的token

在 Gitlab 中 root 用戶設置頁面,選擇左側 Access Tokens,進入 Access Token 管理頁面,

認證添加成功後,回到系統設置頁面,爲 Gitlab 選擇認證並測試,成功後保存退出系統設置。

其次,在 job 配置頁面添加構建後操做

保存 job 配置,回到 job 主頁面,執行「當即構建」。構建成功後,在 Gitlab 倉庫,commits列表頁面

 

點擊進入後,咱們能夠看到更多的信息

6 配置構建發送郵件

每次執行完構建任務後,咱們均可以經過郵件來通知相關人員構建的執行狀況,具體配置以下:

在 jenkins 系統管理—>系統設置,

在系統設置中找到 Jenkins Locaction 填好JenkinsURL跟系統管理員的郵件地址,注意必填

下拉到最下面「郵件通知」部分

注 一、郵箱跟最開始設置的管理員郵箱是一致的,二、密碼根據您使用的郵箱進行設置,16三、QQ 郵箱,都使用受權碼,而不是您的郵件密碼

進入 job 配置頁面,下拉至構建後操做部分,

E-mail Notification 選項配置比較簡單

附加 Editable Email Notification 配置

 七 Jenkins建立maven項目

1 什麼是Maven?

Maven 是一個項目管理和綜合工具。Maven 提供了開發人員構建一個完整的生命週期框架。開發團隊能夠自動完成項目的基礎工具建設,Maven 使用標準的目錄結構和默認構建生命週期
Maven 簡化和標準化項目建設過程。處理編譯,分配,文檔,團隊協做和其餘任務的無縫鏈接。 Maven增長可重用性並負責創建相關的任務。
Maven 項目的結構和內容在一個 XML 文件中聲明,pom.xml 項目對象模型(POM),這是整個 Maven 系統的基本單元。用來管理項目的構建,相關性和文檔。最強大的功能就是可以自動下載項目依賴庫

2 Centos 7 下安裝 Maven

(1) 安裝JDK
可使用 YUM 方式安裝安裝 open JDK1.8 版本,也可使用rpm 安裝,這裏咱們使用 RPM 方式安裝

[root@ci-node2 src]# rpm -ivh jdk-8u121-linux-x64.rpm
[root@localhost monitor]# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)

(2) 安裝Maven

官網:http://maven.apache.org/download.cgi
清華鏡像:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/

[root@localhost monitor]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
[root@localhost monitor]# tar xf apache-maven-3.3.9-bin.tar.gz 
[root@localhost monitor]# mv apache-maven-3.3.9 /usr/local/
[root@localhost monitor]# cd /usr/local/
[root@localhost local]# ln -s /usr/local/apache-maven-3.3.9/ /usr/local/maven
[root@localhost local]# /usr/local/maven/bin/mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T11:41:47-05:00)
Maven home: /usr/local/maven
Java version: 1.8.0_212, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"

(3) 配置 Maven

編輯/etc/profile文件,在末尾添加export PATH=/usr/local/apache-maven-3.3.9/bin/:$PATH ,將maven命令加入系統環境變量。

[root@localhost local]# source /etc/profile
[root@localhost local]# mv
mv        mvn       mvnDebug  mvnyjp    mvxattr   
[root@localhost local]# mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T11:41:47-05:00)
Maven home: /usr/local/apache-maven-3.3.9

3 認識 Maven 安裝目錄

安裝完成後,maven 的安裝目錄結構以下:

[root@localhost apache-maven-3.3.9]# ll
total 32
drwxr-xr-x. 2 root root 97 May 16 23:25 bin
drwxr-xr-x. 2 root root 42 May 16 23:25 boot
drwxr-xr-x. 3 root root 63 Nov 10 2015 conf
drwxr-xr-x. 3 root root 4096 May 16 23:25 lib
-rw-r--r--. 1 root root 19335 Nov 10 2015 LICENSE
-rw-r--r--. 1 root root 182 Nov 10 2015 NOTICE
-rw-r--r--. 1 root root 2541 Nov 10 2015 README.txt

bin:該目錄包含了mvn運行的腳本,這些腳本用來配置java命令,準備好classpath和相關的Java系統屬性,而後執行Java命令。其中mvn是基於UNIX平臺的腳本,mvn.bat是基於 Windows 平臺的腳本。
boot:該目錄只包含一個文件,該文件是一個類加載器框架,Maven 使用該框架加載本身的類庫。
conf:該目錄包含了一個很是重要的文件 settings.xml。用於全局定義 Maven 的行爲。也能夠將該文件複製到~/.m2/目錄下,在用戶範圍內定製 Maven 行爲。
Lib:該目錄包含了全部 Maven 運行時須要的 Java 類庫。

4 經常使用 maven 命令

首先咱們建立一個名爲 hello-world 的 Maven 項目,項目的目錄結構以下:

咱們在此項目的基本上測試經常使用的 maven 命令
mvn clean 命令用於清理項目生產的臨時文件,通常是模塊下的 target 目錄

[root@ci-node2 hello-world]# mvn clean
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective

mvn package 命令用於項目打包,會在模塊下的 target 目錄生成 jar 或者 war 等文件

[root@ci-node2 hello-world]# mvn package
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective

mvn test命令用於測試 , 用於執行 src/test/java/下的測試用例,使用 -Dmaven.test.skip=true參數能夠跳過測試。

mvn install 命令用於模塊安裝,將打包好的 jar/war 文件複製到你的本地倉庫中,供其餘模塊使用

[root@ci-node2 hello-world]# mvn install
[INFO] Scanning for projects...
[WARNING]

 5 Maven倉庫

在Maven中,任何一個依賴、插件或者項目構建的輸出,均可以稱之爲構件。Maven在某個統一的位置存儲全部項目的共享的構件,這個統一的位置,咱們就稱之爲倉庫。(倉庫就是存放依賴和插件的地方)任何的構件都有惟一的座標,Maven 根據這個座標定義了構件在倉庫中的惟一存儲路徑
Maven 倉庫分爲兩類:本地倉庫和遠程倉庫。

遠程倉庫又能夠大體分爲如下三類:

  • 中央倉庫,這是 Maven 核心自帶的遠程倉庫,它包含了絕大部分開源的構件;
  • 私服是一種特殊的遠程倉庫,通常是爲了節省帶寬和時間,在企業局域網內架設的一個私有倉庫服務器(如nexus)用其代理全部外部的遠程倉庫,內部的項目還能夠部署到私服上供其餘項目使用;
  • 還有就是其餘的公開的遠程倉庫,常見的有 Java.net Maven 庫、JBoss Maven 庫等。

默認配置下,Maven 根據座標尋找構件的時候,首先他會查看本地倉庫,若是本地倉庫存在,則直接使用;若是本地倉庫不存在,則 Maven 就會去遠程倉庫查找,存在則先下載到本地倉庫使用,不存在 Maven 就會報錯

(1) 本地倉庫

顧名思義,就是 Maven 在本地存儲構件的地方。maven 的本地倉庫,在安裝 maven 後並不會建立,它是在第一次執行 maven 命令的時候才被建立。maven 本地倉庫的默認位置:不管是 Windows 仍是 Linux,在用戶的目錄下都有一個.m2/repository/的倉庫目錄,這就是Maven 倉庫的默認位置。這個能夠經過修改.m2/settings.xml 文件(不存在能夠建立)或者maven 安裝目錄/conf/settings.xml 進行配置。
在 settings.xml 文件中,設置 localRepository 元素的值爲想的倉庫地址便可

<settings>
    <localRepository>/opt/maven_repository</localRepository>
</settings>

(2) 遠程倉庫

說到遠程倉庫先從最核心的中央倉庫開始,中央倉庫是默認的遠程倉庫,maven 在安裝的時候,自帶的就是中央倉庫的配置,全部的 maven 項目都會繼承超級 pom,具體的說,包含了下面配置的 pom 咱們就稱之爲超級 pom

<repositories>
    <repository>
        <id>central</id>
        <name>Central Repository</name>
        <url>http://repo.maven.apache.org/maven2</url>
        <layout>default</layout>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

中央倉庫包含了絕大多數流行的開源 Java 構件,以及源碼、做者信息、SCM、信息、許可證信息等。通常來講,簡單的 Java 項目依賴的構件均可以在這裏下載獲得。
私服是一種特殊的遠程倉庫,它是架設在局域網內的倉庫服務,私服代理廣域網上的遠程倉庫,供局域網內的 Maven 用戶使用。
當 Maven 須要下載構件的時候,它從私服請求,若是私服上不存在該構件,則從外部的遠程倉庫下載,緩存在私服上以後,再爲 Maven 的下載請求提供服務。咱們還能夠把一些沒法從外部倉庫下載到的構件上傳到私服上

Maven 私服的 個特性:

  1. 節省本身的外網帶寬:減小重複請求形成的外網帶寬消耗
  2. 加速 Maven 構件:若是項目配置了不少外部遠程倉庫的時候,構建速度就會大大下降
  3. 部署第三方構件:有些構件沒法從外部倉庫得到的時候,咱們能夠把這些構件部署到內部倉庫(私服)中,供內部 maven 項目使用
  4. 提升穩定性,加強控制:Internet 不穩定的時候,maven 構建也會變的不穩定,一些私服軟件還提供了其餘的功能
  5. 下降中央倉庫的負荷:maven 中央倉庫被請求的數量是巨大的,配置私服也能夠大大下降中央倉庫的壓力

(3) 配置使用遠程倉庫

在平時的開發中,咱們每每不會使用默認的中央倉庫,默認的中央倉庫訪問的速度比較慢,訪問的人或許不少,有時候也沒法知足咱們項目的需求,可能項目須要的某些構件中央倉庫中是沒有的,而在其餘遠程倉庫中有,如 JBoss Maven 倉庫。這時,能夠在 pom.xml中配置該倉庫,代碼以下:

<!-- 配置遠程倉庫 -->
<repositories>
    <repository>
        <id>jboss</id>
        <name>JBoss Repository</name>
        <url>http://repository.jboss.com/maven2/</url>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
        </releases>
        <snapshots>
            <enabled>false</enabled>
            <checksumPolicy>warn</checksumPolicy>
        </snapshots>
        <layout>default</layout>
    </repository>
</repositories>

repository:在 repositories 元素下,可使用 repository 子元素聲明一個或者多個遠程倉庫。
id:倉庫聲明的惟一 id,尤爲須要注意的是,Maven 自帶的中央倉庫使用的 id 爲 central,若是其餘倉庫聲明也使用該 id,就會覆蓋中央倉庫的配置。
url:指向了倉庫的地址,通常來講,該地址都基於 http 協議,Maven 用戶均可以在瀏覽器中打開倉庫地址瀏覽構件
eleases 和 snapshots:用來控制 Maven 對於發佈版構件和快照版構件的下載權限。須要注意的是 enabled 子元素,該例中 releases 的 enabled 值爲 true,表示開啓 JBoss 倉庫的發佈版本下載支持,而 snapshots 的 enabled 值爲 false,表示關閉 JBoss 倉庫的快照版本的下載支持。根據該配置,Maven 只會從 JBoss 倉庫下載發佈版的構件,而不會下載快照版的構件
layout:元素值 default表示倉庫的佈局是 Maven2及 Maven3的默認佈局,而不是 Maven1的佈局。基本不會用到 Maven1 的佈局。
其餘:對於 releases 和 snapshots 來講,除了 enabled,它們還包含另外兩個子元素updatePolicy 和 checksumPolicy。
元素 updatePolicy 用來配置 Maven 從遠處倉庫檢查更新的頻率,默認值是 daily,表示 Maven 天天檢查一次。其餘可用的值包括:never-從不檢查更新;always-每次構建都檢查更新;interval:X-每隔 X 分鐘檢查一次更新(X 爲任意整數)。
元素 checksumPolicy 用來配置 Maven 檢查校驗和文件的策略。當構建被部署到 Maven倉庫中時,會同時部署對應的檢驗和文件。在下載構件的時候,Maven 會驗證校驗和文件,若是校驗和驗證失敗,當 checksumPolicy 的值爲默認的 warn 時,Maven 會在執行構建時輸出警告信息,其餘可用的值包括:fail-Maven遇到校驗和錯誤就讓構建失敗;ignore-使Maven徹底忽略校驗和錯誤

6 利用Nexus搭建私有Maven庫

Nexus 是一個強大的 Maven 倉庫管理器,它極大地簡化了本地內部倉庫的維護和外部倉庫的訪問。
Nexus 在代理遠程倉庫的同時維護本地倉庫,以下降中央倉庫的負荷,節省外網帶寬和時間。
Nexus 是一套「開箱即用」的系統不須要數據庫,它使用文件系統加 Lucene 來組織數據。
Nexus 使用 ExtJS 來開發界面,利用 Restlet 來提供完整的 REST APIs,經過 m2eclipse與 Eclipse 集成使用
NExus 支持 WebDAV 與 LDAP 安全身份認證。
Nexus 還提供了強大的倉庫管理功能,構件搜索功能,它基於 REST,友好的 UI 是一個extjs 的 REST 客戶端,它佔用較少的內存,基於簡單文件系統而非數據庫。

安裝並啓動Nexus

下載地址:https://www.sonatype.com/download-oss-sonatype

[root@localhost ~]# wget https://sonatype-download.global.ssl.fastly.net/repository/repositoryManager/3/nexus-3.16.1-02-unix.tar.gz
[root@localhost ~]# tar xf nexus-3.16.1-02-unix.tar.gz.1 
[root@localhost ~]# mv nexus-3.16.1-02/ /usr/local/
[root@localhost ~]# ln -s /usr/local/nexus-3.16.1-02/ /usr/local/nexus
[root@localhost ~]# /usr/local/nexus/bin/nexus start
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
Starting nexus

上面啓動成功後會警告不要使用 root 用戶啓動,這裏能夠新建一個用戶,也能夠指定root 用戶啓動,使他不出現警告,下面配置指定 root 用戶啓動,編輯 bin 目錄下的 nexus.rc文件,修改內容爲:
run_as_user="root"

配置Maven 項目使用 Nexus 倉庫
在 maven的setting.xml文件中配置私服配置,這種方式配置後全部本地使用該配置的maven項目的pom文件都無需配置私服下載相關配置
在<profiles></profiles>之間加入下面的配置

<profile>
        <id>my-nexus</id>
<repositories>
<!-- 私有庫地址-->
    <repository>
        <id>nexus</id>
        <name>nexus</name>
        <url>http://10.0.0.13:8081/repository/maven-public/</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <releases>
            <enabled>true</enabled>
        </releases>
    </repository>
</repositories>
<pluginRepositories>
<!--插件庫地址-->
    <pluginRepository>
        <id>nexus</id>
        <url>http://192.168.15.128:8081/repository/maven-public/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>

</profile><settings></settings>之間加入下面的配置,激活使用上面的配置
<activeProfiles>
    <activeProfile>my-neuxs</activeProfile>
</activeProfiles>

注:profile 名字要對應
在<mirros></mirros>之間加入以下配置

<mirror>
    <id>nexus-myself</id>
    <!--*指的是訪問任何倉庫都使用咱們的私服-->
    <mirrorOf>*</mirrorOf>
    <name>Nexus myself</name>
    <url>http://192.168.15.128:8081/repository/maven-public/</url>
</mirror>
配置完成後,當咱們再次執行 mvn 命令時,下載構件的地址變爲咱們的私服地址

7 建立Maven Job

1 在 Gitlab 建立一個 java 的代碼倉庫,咱們把前面在命令使用的 helloword 項目初始化爲一個 git 倉庫,而後 push 到咱們的 Gitlab 上(具體方法請參考前面相關內容)。
2 在 jenkins 配置 maven打開系統管理—>全局工具配置頁面,下拉新增一個 maven 配置
3 回到 Jenkins 主頁面,點擊「新建 Item」進入建立 Job 頁面
4 輸入 Job 名稱,選擇 maven 類型,點擊確認按鈕,建立 job,進入 job 配置頁面, 通用部分配置「丟棄舊的構建」 配置要執行的 maven 命令,保存配置,返回 job 主頁面,執行構建。在「工做空間」咱們能夠看到構建後的產物

八 Jenkins建立Pipeline項目

1 Jenkins Pipeline簡介

Jenkins pipeline是Jenkins 2.0的精髓,是幫助Jenkins實現CI到CD轉變的重要角色。
簡單來講,就是一套運行於Jenkins上的工做流框架,將本來獨立運行於單個或者多個節點的任務鏈接起來,實現單個任務難以完成的複雜發佈流程。
Pipeline的實現方式是一套 Groovy DSL,任何發佈流程均可以表述爲一段 Groovy 腳本,而且 Jenkins 支持從代碼庫直接讀取腳本,從而實現了Pipeline as Code 的理念。

2 Pipeline 的基本概念和 Jenkinsfile

(1) Pipeline 的幾個基本概念

  • Node:一個Node 就是一個Jenkins節點,能夠是 Master,也能夠是 Slave,是 Pipeline中具體 Step 的運行環境。
  • Stage:一個Pipeline 有多個Stage組成,每一個Stage包含一組 Step。注意一個Stage能夠跨多個Node執行,即Stage其實是Step的邏輯分組。
  • Step:是最基本的運行單元,能夠是建立一個目錄、從代碼庫中 checkout 代碼、執行一個 shell 命令、構建 Docker 鏡像、將服務發佈到 Kubernetes 集羣中。Step由Jenkins和Jenkins各類插件提供。

(2) Jenkinsfile 語法

Jenkins Pipeline 支持兩種語法,一種 Declarative Pipeline(聲明式),一種 ScriptedPipeline(腳本式)。
聲明式的 Pipeline 限制用戶使用嚴格的預選定義的結構,是一種聲明式的編程模型,對比腳本式的 Pipeline 學習起來更加簡單;
腳本式的 Pipeline 限制比較少,結構和語法的限制由 Groovy 自己決定,是一種命令式的編程模型。因此咱們學習使用聲明式的方式編寫 jenkinsfile。
通常來講 jenkinsfile 會被放在代碼庫的根目錄下。固然也能夠在 Web 頁面定義。下面是兩種不一樣方式的 jenkinsfile 示例

Jenkinsfile (聲明式)

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo 'Building..'
            }
        }
        stage('Test') {
           steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
            echo 'Deploying....'
            }
        }
    }
}

前面咱們說過,聲明式的Pipeline有嚴格的預約義格式結構,最外層必須是pipeline{},緊接着是agent指示Jenkins分配一個執行器和工做空間來執行下面的Pipeline,stages和steps是申明式Jenkinsfile必須的,全部的stage必需要定義在stages 裏,每個stage下的step要定義在一個steps裏

3 PipelineJob示例

(1) 經過Web頁面建立jenkinsfile

登陸到 jenkins 主頁面,點擊左側菜單欄的 New Item

進入到新建Job頁面,輸入 job 名稱,在下面選擇 Pipeline 類型,而後點擊OK。

打開 Pipeline 配置頁面,點 Pipeline 選項卡,下拉到 pipeline 部分,選擇 pipeline script,在頁面定義 jenkinsfile 的方式,在腳本框輸入下面的內容

pipeline {
    agent any
    stages {
        stage('Stage 1') {
            steps {
                echo 'Hello world!'
            }
        }
    }
}

 

保存後回到 Job 主頁面,點擊「當即構建」,
構建執行完成後,在頁面的右側以圖形的形式顯示 pipeline 的結構,點擊對應的位置能夠查看構建執行的狀況,

在構建歷史處,點擊#1查看此次構建的運行狀況,點擊「console output」能夠看到Pipeline的詳細運行狀況

(2) 經過 scm 獲取 Jenkinsfile

首先咱們在 gitlab 上的 monitor 倉庫的根目錄下建立一個 Jenkins 文件,文件的內容爲:

pipeline {
    agent any
    stages {
        stage('Stage 1') {
            steps {
                echo 'Hello world!'
            }
        }
    }
}

進入到 scm 配置頁面,選擇從 git 倉庫獲取

進入到 git 倉庫配置頁面,輸入倉庫地址,配置認證,選擇分支等,而後點擊保存。

保存配置後,回到Job主頁面,執行「當即構件」,在」console output」中,咱們能夠看到,首先從 gitlab倉庫獲取了全部的代碼文件,而後識別到 Jenkins 文件,執行文件中定義的構建任務

(3) Pipeline 語法生成器

隨着Pipeline一塊兒發佈的內建的文檔,使得建立複雜的 Pipelines更加容易。內建的文檔能夠根據安裝在Jenkins實例中的插件,被自動生成和更新。
內建的文檔能夠經過連接被找到: localhost:8080/pipeline-syntax/。假設你已經有了一個正運行在本地 8080 端口上的實例。一樣的文檔能夠鏈接到這裏,經過任何項目的左邊菜單」Pipeline Syntax」。

語法生成器是動態填充的,其中列出了可供 jenkins 使用的步驟,可用的步驟取決於安裝的插件
打開 Pipeline Syntax。

在「示例步驟」下拉菜單中,選擇須要的步驟(根據需求選擇)

輸入所選擇步驟須要的參數信息,點擊「生成流水線腳本」生成腳本 生成出pipline腳本語句

(4) 使用 pipeline 實現 monitor 倉庫代碼的發佈)

在 Gitlab 在 monitor 倉庫的根目錄上添加 Jenkinsfile 文件,文件內容以下:

pipeline {
    agent any
    stages {
        stage('replace file') {
            steps {
                echo "replace config file use cp "
            }
        }
        stage('test') {
            steps {
                echo "unit test "
            }
        }
        stage('package') {
                steps {
                    sh 'tar czf /opt/web-${BUILD_ID}.tar.gz ./* --exclude=./git --exclude=Jenkinsfile'
                }
            }
        stage('deploy') {
                steps {
                    sh 'ssh 192.168.15.129 "cd /var/www && mkdir web-${BUILD_ID}"'
                    sh 'scp /opt/web-${BUILD_ID}.tar.gz 192.168.15.129:/var/www/web-${BUILD_ID}'
                    sh 'ssh 192.168.15.129 "cd /var/www/web-${BUILD_ID} && tar xf web-${BUILD_ID}.tar.gz &&rm -f web-${BUILD_ID}.tar.gz"'
                    sh 'ssh 192.168.15.129 "cd /var/www && rm -rf html && ln -s /var/www/web-${BUILD_ID}" /var/www/html'
                }
            }
        stage('test') {
                steps {
                    echo "deploy after test "
                }
            }
    }
}

此 jenkinsfile 包括五個 stage,分爲 replace file、test、package、deploy,對於非編譯項目,咱們通常包括這五個階段。
在 jenkins 上建立一新的 Job,job 名稱爲 monitor-web,類型爲 pipeline 配置 gitlab 自動觸發構建(具體請參與前面部分相關內容)。

配置從 scm 獲取 jenkins

保存配置,返回 job 主頁面,執行構建便可

九 Jenkins 備份、升級、遷移

1 升級

下載新版 Jenkins.war 文件,替換舊版本 war 文件,重啓便可。
Jenkins.war 文件的位置通常爲/usr/lib/jenkins/Jenkins.war。

2 遷移、備份

Jenkins 的全部的數據都是以文件的形式存放在 JENKINS_HOME 目錄中。
因此無論是遷移仍是備份,只須要操做JENKINS_HOME就行。建議將 JENKINS_HOME 打包後在拷貝,windows上能夠用 zip,rar 等,Linux 上有 zip,tar 等。而後將打包的文件解壓到新的 JENKINS_HOME目錄就好了。

3 使用 thinbackup 插件備份

1)安裝插件:
安裝 ThinBackup 插件,可能 參考前面插件管理部分。

2)配置插件:

3)手動備份

咱們到備份目錄查看:

[root@localhost conf]# cd /data/jenkins/
[root@localhost jenkins]# ll
total 4
drwxr-xr-x. 4 root root 4096 May 20 02:58 FULL-2019-05-20_02-58

4)測試從備份恢復

咱們刪除/var/lib/jenkins/job 目錄下的 my‐freestyle‐job 目錄

[root@localhost jenkins]# rm -rf /var/lib/jenkins/jobs/My-freestyle-Job/
[root@localhost jobs]# ll
total 0
drwxr-xr-x. 3 root root 101 May 20 02:47 monitor-web
drwxr-xr-x. 3 root root 101 May 19 23:59 My-pipeline-job
drwxr-xr-x. 3 root root 101 May 20 02:00 My-pipeline-job01

而後咱們使用剛纔的備份恢復:

恢復完成後,我發現剛纔刪除的目錄又回來了

[root@localhost jobs]# ll
total 0
drwxr-xr-x. 3 root root 101 May 20 02:58 monitor-web
drwxr-xr-x. 3 root root  38 May 20 02:58 My-freestyle-Job
drwxr-xr-x. 3 root root 101 May 20 02:58 My-pipeline-job
drwxr-xr-x. 3 root root 101 May 20 02:58 My-pipeline-job01
相關文章
相關標籤/搜索