jenkins介紹與操做

Jenkins使用

1.1 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 的主要開發者是川口耕介。JENKINS 是在 MIT 許可證下發布的自由軟件。
官方網站:https://jenkins.io/
清華鏡像地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins

1.2 企業代碼上線發展史

代碼發佈上線是每個 IT 企業必需要面臨的,並且無論是對開發或者是運維來講,代碼上線自己就是一個件很是痛苦的事情,不少時候每一次發佈都是一次考驗。爲了提升上線的效率,代碼上線的方式,方法,工具也不斷的發展,基本上能夠分爲如下幾個階段:
階段 1-沒有構建服務器
軟件在開發者的機器上經過 Ant 或其它腳本手動構建,代碼保存在中央源碼倉庫中,可是開發者不是常常提交本地的修改。每次須要發佈的時候,開發者手動合併修改,這個過程是至關痛苦的。
階段 2-晚上進行構建
在這個階段,團隊有構建服務器,自動化的構建在晚上進行。構建過程只是簡單的編譯代碼,沒有可靠的和可重複的單元測試。然而,開發人員天天提交代碼。若是某個開發人員提的代碼和其餘人的代碼衝突的話,構建服務器會在次日經過郵件通知團隊。因此又一段時間構建是處於失敗狀態的。
階段 3-晚上進行構建並進行自動化測試
團隊對 CI 和自動化測試愈來愈重視。不管何時版本管理系統中的代碼改變了都會觸發編譯構建過程,團隊成員能夠看到是代碼中的什麼改變觸發了這個構建。而且,構建腳本會編譯應用而且會執行一系列的單元測試或集成測試。除了郵件,構建服務器還能夠經過其餘方式通知團隊成員,如:IM。失敗的構建被快速的修復。
階段 4-代碼質量度量
自動化的代碼質量和測試覆蓋率的度量手段有助於評價代碼的質量和測試的有效性。代碼質量的構建會產生 API 文檔。
階段 5-更加認真地對待測試
CI 和測試緊密相關。現在,像測試驅動開發被普遍地使用,使得對自動化的構建更加有信心。應用不只僅是簡單地編譯和測試,而是若是測試成功會被自動的部署到一個應用服務器上來進行更多的綜合的 end-to-end 測試和性能測試。
階段 6-驗收測試和更加自動化的部署
驗收測試驅動的開發被使用,使得咱們可以瞭解項目的狀態。這些自動化的測試使用行爲驅動的開發和測試驅動的開發工具來做爲交流和文檔工具,發佈非開發人員也能讀懂的測試結果報告。因爲測試在開發的早起就已經被自動化的執行了,因此咱們能更加清楚地瞭解到什麼已經作了,什麼尚未作。每當代碼改變或晚上,應用被自動化地部署到測試環境中,以供 QA 團隊測試。當測試經過以後,軟件的一個版本將被手工部署到生產環境中,團隊也男孩IT教育能夠在出現問題的時候回滾以前的發佈。
階段 7-持續部署
對自動化的單元測試,集成測試和驗收測試的信心使得咱們可使用自動化的部署技術將軟件直接部署到生產環境中。可是測試仍是有可能不能真正的反映現實的環境

1.3 Jenkins安裝

1.3.1 環境準備

小硬件需求:256M 內存、1G 磁盤空間,一般根據須要 Jenkins 服務器至少 1G 內存,50G+磁盤空間。
軟件需求:因爲 jenkins 是使用 java 語言編寫的,因此須要安裝 java 運行時環境(jdk)html

1.3.1 安裝JDK

下載JDK https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
在/etc/profile中添加
tar xf jdk-8u201-linux-x64.tar.gz
mv jdk1.8.0_201/ /application/
ln -s jdk1.8.0_201/ /application/jdk
編輯/etc/profile文件,進行添加
export JAVA_HOME=/application/jdk
export PATH=$PATH:$JAVA_HOME/bin;
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile
java -version
下載jenkins
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/jenkins-2.170-1.1.n
oarch.rpm
安裝jenkins
[root@ci-node2 tools]# rpm -ivh jenkins-2.170-1.1.noarch.rpm 
warning: jenkins-2.170-1.1.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID d50582e6: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:jenkins-2.170-1.1                ################################# [100%]
[root@ci-node2 tools]#

1.3.2 啓動、配置jenkins

[root@ci-node2 tools]# systemctl start jenkins
[root@ci-node2 tools]# systemctl enable jenkins
jenkins.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig jenkins on
[root@ci-node2 tools]# systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: active (running) since Mon 2019-04-01 16:22:16 CST; 23s ago
     Docs: man:systemd-sysv-generator(8)
   CGroup: /system.slice/jenkins.service
           └─10395 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=...

Apr 01 16:22:15 ci-node2 systemd[1]: Starting LSB: Jenkins Automation Server...
Apr 01 16:22:15 ci-node2 runuser[10380]: pam_unix(runuser:session): session opened for user j...=0)
Apr 01 16:22:16 ci-node2 jenkins[10375]: Starting Jenkins [  OK  ]
Apr 01 16:22:16 ci-node2 systemd[1]: Started LSB: Jenkins Automation Server.
Hint: Some lines were ellipsized, use -l to show in full.

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


此頁面要用戶選擇初始化安裝的插件,咱們選擇跳過此步,後面咱們採用其餘方式安裝插件。進入主頁後進行修改admin的密碼
java

1.4 Jenkins插件管理

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

1.4.1 自動安裝插件

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

進入插件管理頁面,點擊可選插件,選擇你須要安裝的插件,安裝完成後,通常狀況下不須要重啓Jenkins,具體根據提示操做。
linux

1.4.2 手動安裝插件

除了上面的插件安裝方法,Jenkins 還爲咱們提供了手工安裝插件的方式,特別是在國內,因爲網絡的緣由,有時候咱們使用上述方法安裝插件會常常不成功,因此咱們能夠採用下載插件,而後再上傳的方式來安裝插件。
官方的插件下載地址:http://updates.jenkins-ci.org/
國內源:https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/

若是是在官方網站下載插件,好下載與你 jenkins 版本對應的插件,若是是在清華鏡像下載插件,則不存在版本的問題。下載後獲得的一個以.hpi 爲擴展名的文件

下載 ssh.hpi 後,咱們手動安裝 ssh 插件,進入到插件管理頁面,上傳完成後,從新啓動 jenkins,完成插件的安裝
git

1.4.3 覆蓋插件目錄

能夠備份已經安裝好插件的Jenkins服務器上的/var/lib/jenkins/plugins目錄,而後把備份文件上傳到咱們須要安裝插件的新 Jenkins 服務器的對應目錄上,而後重啓Jenkins。

先在百度網盤中下載 plugins.tar.gz 包,將 plugins.tar.gz 上傳至服務器,進行解壓後複製到/var/lib/jenkins/plugins目錄,重啓jenkinsweb

[root@ci-node2 ~]# tar xf plugins.tar.gz
[root@ci-node2 plugins]# mv *  /var/lib/jenkins/plugins/
[root@ci-node2 plugins]# systemctl restart jenkins

重啓完畢後,查看插件管理,發現已經多了不少的插件
正則表達式

1.5 Jenkins的經常使用目錄及文件

jenkins下一切兼文件,也就是說 jenkins 沒有數據庫,全部的數據都是以文件的形式存在
查看jenkins目錄及文件位置
[root@ci-node2 plugins]# 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.5.1 Jenkins主配置文件

/etc/sysconfig/jenkins 是 Jenkins 的主配置文件:咱們在這裏主要配置 Jenkins 的工做目錄、啓動用戶、啓動端口

Jenkins 默認的用戶爲 jenkins,生產環境建議使用 jenkins 用戶,而後使用 sudo 進行受權,爲了不各類權限問題,改成 root 用戶

shell

1.5.2 Jenkins的主目錄

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

[root@ci-node2 plugins]# cd /var/lib/jenkins/
[root@ci-node2 jenkins]# ll
..........
drwxr-xr-x   3 jenkins jenkins    20 Apr  1 17:45 jobs # 存放jobs的配置及每次構建的結果
drwxr-xr-x 121 jenkins jenkins 12288 Apr  2 10:07 plugins # Jenkins的插件目錄,存放已安裝的插件
drwxr-xr-x   3 jenkins jenkins    56 Apr  1 16:23 users # 存放用戶相關的配置文件
drwxr-xr-x   3 jenkins jenkins    20 Apr  1 19:06 workspace # 工做區目錄,每次job執行構建的工做目錄

1.5.3 Jenkins主程序目錄

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

1.5.4 其它目錄及文件

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

1.6 Jenkins建立自由風格項目

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

進入建立 job 頁面

注:一、job 名稱須要有規劃,以便於後面的權限管理;二、建立 job 後不要輕易更更名稱,由於 jenkins 一切皆文件,不少關於 job 的文件,都是以該名稱命名,當你更名後,通常不會刪除舊文件,而是會再從新建立一份新的文件。

輸入 job 名稱,選擇類型後,點擊 OK 後建立 job,進入 job 配置頁面,此時在 Jenkins的主目錄下的 jobs 目錄已經生成了以你 Job 名稱命名的文件夾

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

1.6.1 執行linux命令、腳本

通用配置選項卡

勾選「丟棄舊的構建」,這是咱們必須提早考慮的重要方面,就是咱們如何處理構建歷史,構建做業會消耗大理的磁盤空間,尤爲是你存儲的構建產物(好比執行 java 構建時會生成的 JAR、WAR 等)該選項容許你限制在構建歷史記錄的做業數。你能夠告訴 Jenkins 只保留近的幾回構建,或者只保留指定數量的構建,此外,Jenkins 永遠不會刪除後一個穩定和成功的構建。具體數據的指定要根據你項目的實際狀況而定,我通常設置爲 五、5

構建部分,選擇execute shell




查看輸出信息

1.6.2 鏈接gitlab獲取倉庫代碼

先複製gitlab中的代碼地址

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

粘貼完倉庫地址後,出現以下圖所示錯誤提示

根據提示信息顯示爲 key 認證失敗,由於咱們使用的 SSH 方式鏈接倉庫,因此須要配置SSH認證,實際上在前面咱們學習Gitlab的時候,咱們已經配置ci-node2這臺機子的root用戶的公鑰在 Gitlab 上的 dev 用戶,由於jenkins服務啓動的用戶是jenkins

咱們在gitlab上配置的是root用戶的公鑰,如今有兩個種方式能夠解決這個問題,一、在jenkins上配置使用root用戶的私鑰鏈接gitlab二、配置root用戶啓動jenkins
第一種方法:


根據提示添加用戶認證後,回到配置倉庫頁面,選擇認證方式爲新添加的認證,錯誤消失。

第二種方法:
修改配置/etc/sysconfig/jenkins 文件,配置 Jenkins 的啓動用戶爲 root,而後重啓 Jenkins 服務


回到源碼管理界面,此時也看不到任何的報錯信息

保存配置,點擊當即構建,在工做空間裏能夠看到從gitlab拉取的代碼信息

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


1.6.3 利用linux腳本實現部署

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

1.6.3.1 安裝httpd服務

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

[root@ci-node1 git_data]# yum -y install httpd
[root@ci-node1 git_data]# vim /etc/httpd/conf/httpd.conf 
........
#Listen 12.34.56.78:80
Listen 10001
[root@ci-node1 git_data]# systemctl start httpd

使用10.0.0.11:10001進行訪問

1.6.3.2 配置ssh認證

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

[root@ci-node2 git_data]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.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 al
ready installed/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to ins
tall the new keysroot@172.16.1.11's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@172.16.1.11'"
and check to make sure that only the key(s) you wanted were added.

[root@ci-node2 git_data]# ssh 172.16.1.11
Last login: Tue Apr  2 14:32:26 2019 from 10.0.0.253

1.6.3.3 編寫部署腳本

[root@ci-node2 scripts]# vim deploy.sh 
#!/bin/bash
#主機的ip地址
HOST=$1
#job的名稱
JOB_NAME=$2
#文件名稱
NAME=web-$(date +%F)-$(($RANDOM+10000))
#壓縮
cd /var/lib/jenkins/workspace/${JOB_NAME} && tar zcf /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 -rf ${NAME}.tar.gz"
#使用軟連接進行部署服務
ssh ${HOST} "rm -rf /var/www/html && ln -s /var/www/${NAME} /var/www/html"

1.6.3.4 Jenkins配置構建

在jenkins上進行配置,上面的連接能夠查看全部的環境變量

點擊當即構建,就會發現web項目已部署好了

1.6.4 Git push 自動觸發構建

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

1.6.4.1 Jenkins配置構建解發器

在My-web配置界面下

1.6.4.2 gitlab倉庫配置

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

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

如遇到如下報錯

解決方法


配置完成後,在頁面下面測試觸發設置

咱們在 jenkins job 主頁面看到構建任務被觸發

接着咱們將倉庫克隆到客戶端,在客戶端測試觸發 push 操做
[root@ci-node2 test]# git clone git@10.0.0.11:oldboy/monitor.git
Cloning into 'monitor'...
remote: Enumerating objects: 435, done.
remote: Counting objects: 100% (435/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 | 8.42 MiB/s, done.
Resolving deltas: 100% (53/53), done.
[root@ci-node2 monitor]# vim index.html
[root@ci-node2 monitor]# git add .
[root@ci-node2 monitor]# git commit -m "modify index"
[root@ci-node2 monitor]# git remote add gitlab http://10.0.0.11/oldboy/monitor.git
[root@ci-node2 monitor]# git push -u gitlab
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

Username for 'http://10.0.0.11': root
Password for 'http://root@10.0.0.11': 
Counting objects: 9, done.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 2.53 KiB | 0 bytes/s, done.
Total 7 (delta 4), reused 0 (delta 0)
To http://10.0.0.11/oldboy/monitor.git
   f6070e1..ff82fb9  master -> master
Branch master set up to track remote branch master from gitlab.

Gitlab 收到本次推送的內容

Jenkins 對應的 job 已經觸發構建

網站內容已被更新

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

1.6.5 配置構建後操做

1.6.5.1 配置構建後通知gitlab

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

添加認證,先在gitlab上生成TOKEN碼

複製生成好的TOKEN碼Jenkins上

選擇TEST進行測試

在my-web的配置頁面上進行配置

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



能夠看到jenkins的日誌輸出信息

1.6.5.2 配置構建後發送郵件

每次執行完構建任務後,咱們均可以經過郵件來通知相關人員構建的執行狀況,具體配置以下:
在 jenkins 系統管理—>系統設置
在系統設置中找到 Jenkins Locaction 填好 JenkinsURL 跟系統管理員的郵件地址,注意必填

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

進入到my-web配置界面

E-mail Notification 選項配置比較簡

當構建失敗後,會發郵件通知

Editable Email Notification 配置

2.1 Jenkins建立maven項目

2.1.1 什麼是Maven?

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

2.1.2 centos 7下安裝maven

2.1.2.1 安裝jdk

下載JDK https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
在/etc/profile中添加
tar xf jdk-8u201-linux-x64.tar.gz
mv jdk1.8.0_201/ /application/
ln -s jdk1.8.0_201/ /application/jdk
編輯/etc/profile文件,進行添加
export JAVA_HOME=/application/jdk
export PATH=$PATH:$JAVA_HOME/bin;
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile
java -version

2.1.2.2 獲取並安裝maven

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

[root@ci-node1 tools]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz
[root@ci-node1 tools]# tar xf apache-maven-3.6.0-bin.tar.gz 
[root@ci-node1 tools]# mv apache-maven-3.6.0 /application/
[root@ci-node1 tools]# cd /application/
[root@ci-node1 application]# ln -s /application/apache-maven-3.6.0/ /application/maven
[root@ci-node1 application]# /application/maven/bin/mvn -v
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T02:41:47+08:00)
Maven home: /application/maven
Java version: 1.8.0_201, vendor: Oracle Corporation, runtime: /usr/java/jdk1.8.0_201-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"
#加入環境變量配置
[root@ci-node1 application]# vim /etc/profile
export PATH=/application/maven/bin/:$PATH
[root@ci-node1 application]# source /etc/profile

2.1.3 認識maven安裝目錄

[root@ci-node1 application]# cd /application/maven/
[root@ci-node1 maven]# ll
total 28
lrwxrwxrwx 1 root root     32 Apr  2 18:49 apache-maven-3.6.0 -> /application/apache-maven-3.6.0/
drwxr-xr-x 2 root root     97 Apr  2 18:48 bin # 這些腳本用來配置 java 命令,準備好 classpath和相關的 Java 系統屬性,而後執行 Java 命令。其中 mvn 是基於 UNIX 平臺的腳本,mvn.bat是基於 Windows 平臺的腳本
drwxr-xr-x 2 root root     42 Apr  2 18:48 boot # 該目錄只包含一個文件,該文件是一個類加載器框架,Maven 使用該框架加載本身的類
drwxr-xr-x 3  501 games    63 Oct 25 02:38 conf # 該目錄包含了一個很是重要的文件settings.xml。用於全局定義 Maven 的行爲。也能夠將該文件複製到~/.m2/目錄下,在用戶範圍內定製 Maven 行爲
drwxr-xr-x 4  501 games  4096 Apr  2 18:48 lib # 該目錄包含了全部 Maven 運行時須要的 Java 類庫
-rw-r--r-- 1  501 games 13439 Oct 25 02:43 LICENSE
-rw-r--r-- 1  501 games   182 Oct 25 02:43 NOTICE
-rw-r--r-- 1  501 games  2530 Oct 25 02:38 README.txt
[root@ci-node1 maven]#

2.1.4 maven經常使用命令

mvn clean:命令用於清理項目生產的臨時文件,通常是模塊下的target目錄 
mvn package:命令用於項目打包,會在模塊下的 target 目錄生成 jar 或者 war 等文件
mvn test:命 令 用 於 測 試 , 用 於 執 行 src/test/java/ 下 的 測 試 用 例 , 使 用-Dmaven.test.skip=true 
mvn install:命令用於模塊安裝,將打包好的 jar/war 文件複製到你的本地倉庫中,供其它模塊使用

2.1.5 Maven倉庫

在 Maven 中,任何一個依賴、插件或者項目構建的輸出,均可以稱之爲構件。Maven 在某個統一的位置存儲全部項目的共享的構件,這個統一的位置,咱們就稱之爲倉庫。(倉庫就是存放依賴和插件的地方)任何的構件都有惟一的座標,Maven 根據這個座標定義了構件在倉庫中的惟一存儲路徑。
Maven 倉庫分爲兩類:本地倉庫和遠程倉庫。遠程倉庫又能夠大體分爲如下三類:中央倉庫,這是 Maven 核心自帶的遠程倉庫,它包含了絕大部分開源的構件;私服是一種特殊的遠程倉庫,通常是爲了節省帶寬和時間,在企業局域網內架設的一個私有倉庫服務器(如nexus)用其代理全部外部的遠程倉庫,內部的項目還能夠部署到私服上供其餘項目使用;還有就是其餘的公開的遠程倉庫,常見的有 Java.net Maven 庫、JBoss Maven 庫等
默認配置下,Maven 根據座標尋找構件的時候,首先他會查看本地倉庫,若是本地倉庫存在,則直接使用;若是本地倉庫不存在,則 Maven 就會去遠程倉庫查找,存在則先下載到本地倉庫使用,不存在 Maven 就會報錯。

2.1.5.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>

建議修改.m2 目錄下的 setting.xml 文件,修改只針對用戶

2.1.5.2 遠程倉庫

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

<repositories> 
    <repository>
        <id>central</id>
        <name>CentralRepository</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 中央倉庫被請求的數量是巨大的,配置私服也能夠大大下降中央倉庫的壓力當前主流的 maven 私服:1.Apache的Archiva、2.JFrog 的 Artifactory3.Sonatype
的Nexus

2.1.5.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,就會覆蓋中央倉庫的配置。
name:倉庫的名稱,讓咱們直觀方便的知道倉庫是哪一個,暫時沒發現其餘太大的含義。
url:指向了倉庫的地址,通常來講,該地址都基於 http 協議,Maven 用戶均可以在瀏覽器中打開倉庫地址瀏覽構件。
releases 和 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 徹底忽略校驗和錯誤

3.1 利用Nexus搭建Maveny庫

3.1.1 Nexus介紹

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

3.1.2 安裝JDK

因上一次安裝過了,此處略

[root@ci-node2 ~]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

3.1.3 安裝nexus

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

[root@ci-node2 tools]# tar xf nexus-3.15.2-01-unix.tar.gz  
[root@ci-node2 tools]# mv nexus-3.15.2-01 /application/
[root@ci-node2 tools]# cd /application/
[root@ci-node2 application]# ln -s nexus-3.15.2-01/ /application/nexus
[root@ci-node2 application]# /application/nexus/bin/nexus start
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
Starting nexus
[root@ci-node2 application]# /application/nexus/bin/nexus status
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
nexus is running.

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

3.1.4 配置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.12:8081/repository/maven-public/</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <releases>
            <enabled>true</enabled>
        </releases>
    </repository>
</repositories>
<pluginRepositories>
<!--插件庫地址-->
    <pluginRepository>
        <id>nexus</id>
        <url>http://10.0.0.12:8081/repository/maven-public/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>
</profile>
</profiles>
在<settings></settings>之間加入下面的配置,激活使用上面的配置 
  <activeProfiles>
    <activeProfile>my-nexus</activeProfile>
  </activeProfiles>
注:profile 名字要對應
在<mirros></mirros>之間加入以下配置
<mirror>
    <id>nexus-myself</id>
    <!--*指的是訪問任何倉庫都使用咱們的私服-->
    <mirrorOf>*</mirrorOf>
    <name>Nexus myself</name>
    <url>http://10.0.0.12:8081/repository/maven-public/</url>
</mirror>

配置完成後,當咱們再次執行 mvn 命令時,下載構件的地址變爲咱們的私服地址

咱們的私服也緩存了相應的構件在本地

4.1 建立Maven Job

一、在 Gitlab 建立一個 java 的代碼倉庫,咱們把前面在命令使用的 helloword 項目初始化爲一個 git 倉庫,而後 push 到咱們的 Gitlab 上

[root@ci-node2 tools]# cd hello-world/
[root@ci-node2 hello-world]# git init
Initialized empty Git repository in /server/tools/hello-world/.git/
[root@ci-node2 hello-world]# git remote add origin http://10.0.0.11/root/hello_world.git
[root@ci-node2 hello-world]# git add .
[root@ci-node2 hello-world]# git commit -m "Initial commit"
[master (root-commit) 322526c] Initial commit
 3 files changed, 84 insertions(+)
 create mode 100644 pom.xml
 create mode 100644 src/main/java/com/juvenxu/mvnbook/helloworld/HelloWorld.java
 create mode 100644 src/test/java/com/juvenxu/mvnbook/helloworld/HelloWorldTest.java
[root@ci-node2 hello-world]# git push -u origin master
Username for 'http://10.0.0.11': root
Password for 'http://root@10.0.0.11': 
Counting objects: 18, done.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (18/18), 1.77 KiB | 0 bytes/s, done.
Total 18 (delta 0), reused 0 (delta 0)
To http://10.0.0.11/root/hello_world.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.


二、在 jenkins 配置 maven,打開系統管理—>全局工具配置頁面,下拉新增一個 maven 配置

三、回到 Jenkins 主頁面,點擊「新建 Item」進入建立 Job 頁面

四、通用部分配置「丟棄舊的構建」

五、源碼管理配置從 git 倉庫獲取咱們 helloword 倉庫的代碼

六、配置要執行的 maven 命令,保存配置,返回 job 主頁面,執行構建。

七、在「工做空間」咱們能夠看到構建後的產物

4.1 Jenkins建立Pipline項目

4.1.1 Jenkins Pipline簡介

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

4.1.2 Pipline基本概念

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

4.1.3 Jenkinsfile語法

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

Jenkinsfile (聲明式)

pipeline{
    agent any
    stages{
        stage("get code"){
           steps{
               echo "get code from scm"
           }
        }
        stage("package"){
            steps{
                echo "packge code"
            }
        }
        stage("deploy"){
            steps{
                echo "deploy packge to node1"
            }
        }
    }
}

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

node { 
    stage('Build') { 
            // 
    } 
    stage('Test') {
        // 
    } 
    stage('Deploy') { 
            // 
    } 
}

在腳本式 jenkinsfile 裏,你能夠定義一個 node 或者多個 node 塊,而後在 node 塊裏定義你的 stage,在 stage 裏定義你的 step 便可

4.1.4 Popeline Job 示例

一、登陸到 jenkins 主頁面,點擊左側菜單欄的 New Item,進入到新建 Job 頁面,輸入 job 名稱,在下面選擇 Pipeline 類型,而後點擊 OK

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

pipeline{
    agent any
    stages{
        stage("get code"){
           steps{
               echo "get code from scm"
           }
        }
        stage("package"){
            steps{
                echo "packge code"
            }
        }
        stage("deploy"){
            steps{
                echo "deploy packge to node1"
            }
        }
    }
}

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

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

4.1.5 經過 scm 獲取 Jenkinsfile

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

pipeline{
    agent any
    stages{
        stage("get code"){
           steps{
               echo "get code from scm"
           }
        }
        stage("package"){
            steps{
                echo "packge code"
            }
        }
        stage("deploy"){
            steps{
                echo "deploy packge to node1"
            }
        }
    }
}

三、Jenkins 新建一個 pipeline job,命名爲 My-pipeline01,在 My-pipeline-job01 的配置頁面,點擊 Pipeline 選項卡,下拉到pipeline 部分,選擇從 scm 獲取 pipeline script,如圖下示

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

4.1.6 Pipeline 語法生成器

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


4.1.7 使用 pipeline 實現 monitor 倉庫代碼的發佈

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

pipeline{
    agent any
    stages{
        stage("get code"){
           steps{
              checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'git@10.0.0.11:oldboy/monitor.git']]])
           }
        }
        stage("package"){
            steps{
                sh 'cd /var/lib/jenkins/workspace/My-pipeline01 && tar czf /opt/web-$(date +%F).tar.gz  ./* --exclude=./git --exclude=Jenkinsfile'
                sh 'ssh 172.16.1.11 "cd /var/www && mkdir web-$(date +%F)"'
                sh 'scp /opt/web-$(date +%F).tar.gz 172.16.1.11:/var/www/web-$(date +%F)'
            }
        }
        stage("deploy"){
            steps{
                sh 'ssh 172.16.1.11 "cd /var/www/web-$(date +%F) && tar xf web-$(date +%F).tar.gz && rm -rf web-$(date+%F).tar.gz"'
                sh 'ssh 172.16.1.11 "cd /var/www && rm -rf html &&  ln -s /var/www/web-$(date +%F) /var/www/html"'
            }
        }
    }
}

二、新建job項目,選擇pipeline類型,進入配置界面,以下圖

3.保存後選擇當即構建,查看輸出,代碼已成功部署


5.1 Jenkins 權限管理

Jenkins 自己自帶安全管理的功能,可是通常狀況下不多去使用,更可能是使用插件的方式進行更加靈活的處理。
Jenkins 的權限管理須要依賴 Jenkins 的權限管理插件。經過配置插件 role-base,能夠很方便給不一樣用戶不一樣 job 的管理和執行權限。

5.1.1 插件的安裝與配置

在系統管理、插件管理中搜索 role-base 插件,能夠進行安裝,插件安裝完成以後
全局安全」中啓用插件,打開「系統管理->全局安全配置」頁面,選擇受權策略爲「Role Based Strategy」

保存退出後,在系統管理頁面出現一個角色管理工具,點擊進入以後,就能夠對咱們的用戶進行權限配置。

5.1.2 建立用戶與權限分配

一、,在「系統管理」中,選擇「管理用戶」

2.新建用戶


三、進行權限分配,在「系統管理」,選擇「Manage and Assign Roles」進入角色管理頁


四、點擊「Manage Role」,建立一個全局的 dev 角色,受權只讀的權限

五、在「角色管理頁面」,選擇「Assign Roles」,將 dev 用戶賦予 dev 角色

六、使用 dev 用戶登陸,發現沒有任何 job,由於尚未爲 dev 用戶配置查看的 job 的權限(ps:以前 admin 或 root 的權限選項不要移除,不然這些用戶可能沒法登陸)

七、回到角色管理頁面,添加一個 dev 的 job 角色,使用正則表達式匹配 dev 角色能夠管理的 job 的名稱

八、在「Assign Roles」頁面,將剛纔建立的 job 角色配置給 dev 用戶

九、再次使用 dev 用戶登陸 jenkins,便可以看到匹配到的 job,並且能夠執行配置的操做

6.1 Jenkins 備份、升級、遷移

6.1.1 升級

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

6.1.2 遷移、備份

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

6.1.3 使用 thinbackup 插件備份

一、安裝thinbackup插件,按照以前的插件流程安裝便可
二、配置插件



三、手動備份

四、查看備份的目錄

6.1.4 恢復備份

一、咱們刪除/var/lib/jenkins/jobs目錄下的全部文件

二、選擇Restore

三、選擇最後一次備份,進行恢復

四、再查看var/lib/jenkins/jobs目錄

相關文章
相關標籤/搜索