教程:https://www.yiibai.com/jenkins/
本節(jié)內(nèi)容:
- Jenkins介紹
- 安裝部署Jenkins
- Jenkins構(gòu)建maven風(fēng)格的job
- Jenkins郵件通知設(shè)置
- Sonar
- Jenkins與Docker結(jié)合
一、Jenkins介紹
Jenkins是一個(gè)開源軟件項(xiàng)目,是基于Java開發(fā)的一種持續(xù)集成工具型酥,用于監(jiān)控持續(xù)重復(fù)的工作颖医,旨在提供一個(gè)開放易用的軟件平臺(tái),使軟件的持續(xù)集成變成可能。
二嚣鄙、安裝部署Jenkins
下載地址:https://jenkins.io/download/
我這里下載war包安裝,版本:1.642.3 LTS .war
**1. 環(huán)境信息 **
| 主機(jī)名 | 操作系統(tǒng)版本 | IP地址 | 安裝軟件 |
| osb30 | Redhat 6.5 | 172.16.206.30 | jenkins |
*2. 新建Jenkins用戶
[root@osb30 ~]``# groupadd jenkins
[root@osb30 ~]``# useradd -g jenkins jenkins
[root@osb30 ~]``# id jenkins
uid=501(jenkins) gid=501(jenkins) ``groups``=501(jenkins)
[root@osb30 ~]``# echo "wisedu" | passwd --stdin jenkins &> /dev/null
|
3. Jenkins安裝方式
安裝jenkins有兩種方式鳍怨,tomcat方式部署和java部署啟動(dòng)呻右。本次實(shí)驗(yàn)我以tomcat下部署啟動(dòng)為例。
(1)tomcat方式部署
a.首先安裝tomcat和JAVA鞋喇,配置環(huán)境變量(此步驟不再講述声滥,java配置不可缺少)
我這里安裝的是jdk 1.8.0_65。
b.將從官網(wǎng)下載下來的jenkins.war文件放入tomcat下的webapps目錄下侦香,進(jìn)入tomcat的/bin目錄下落塑,啟動(dòng)tomcat即啟動(dòng)jenkins。
我這里用的是tomcat8罐韩。
c.啟動(dòng)jenkins時(shí)憾赁,會(huì)自動(dòng)在webapps目錄下建立jenkins目錄,訪問地址為:http://localhost:8080/jenkins
[jenkins@osb30 ~]$ ``tar
zxf apache-tomcat-8.0.30.``tar``.gz
[jenkins@osb30 ~]$ ``mv
jenkins.war apache-tomcat-8.0.30``/webapps/
[jenkins@osb30 ~]$ ``cd
apache-tomcat-8.0.30
[jenkins@osb30 apache-tomcat-8.0.30]$ bin``/startup``.sh
Jenkins home directory: ``/home/jenkins/``.jenkins found at: $user.home/.jenkins
如果啟動(dòng)時(shí)報(bào)錯(cuò):
Caused by:java.awt.AWTError: Can``'t connect to X11 window server using '``:0' as the value of the DISPLAY varible...
解決:
[jenkins@osb30 ~]$ ``cd
apache-tomcat-8.0.30``/bin/
[jenkins@osb30 bin]$ vim catalina.sh
JAVA_OPTS=``"-Xms1024m -Xmx1024m -Djava.awt.headless=true"
d.訪問jenkins
http://172.16.206.30:8080/jenkins
(2)java部署啟動(dòng)jenkins
切換到j(luò)enkins.war存放的目錄散吵,輸入如下命令:
$ java -jar jenkins.war
可以修改啟動(dòng)端口
$ java -jar jenkins.war --httpPort=8000
然后在瀏覽器中(推薦用火狐龙考、chrom)輸入http://localhost:8080,localhost可以是本機(jī)的ip矾睦,也可以是計(jì)算機(jī)名晦款。就可以打開jenkins;修改端口后枚冗,訪問地址的端口需同步變更缓溅。
4. Jenkins授權(quán)和訪問控制
默認(rèn)地Jenkins不包含任何的安全檢查,任何人可以修改Jenkins設(shè)置赁温,job和啟動(dòng)build等坛怪。顯然地在大規(guī)模的公司需要多個(gè)部門一起協(xié)調(diào)工作的時(shí)候,沒有任何安全檢查會(huì)帶來很多的問題股囊。 我們可以通過下面的方式來增強(qiáng)Jenkins的安全:
訪問jenkins:http://172.16.206.30:8080/jenkins
點(diǎn)擊系統(tǒng)管理—> Configure Global Security酝陈,點(diǎn)擊”啟用安全”,可以看到可以使用多種方式來增強(qiáng)Jenkins的授權(quán)和訪問控制:
查看策略:
如上圖所示毁涉,默認(rèn)是”任何用戶可以做任何事情(沒有任何限制)”沉帮。
我們?cè)凇卑踩颉边x擇”Jenkins專有用戶數(shù)據(jù)庫”,”允許用戶注冊(cè)”贫堰;并先在“授權(quán)策略”點(diǎn)擊“任何用戶可以做任何事情(沒有任何限制)”穆壕, 防止注冊(cè)之后無法再管理jenkins。此時(shí)就可以刷新一下jenkins的頁面看到右上角有登錄其屏、注冊(cè)的按鈕喇勋。
(1)注冊(cè)管理員賬號(hào)
a.點(diǎn)擊注冊(cè),首先注冊(cè)一個(gè)管理員賬號(hào)偎行。
b.點(diǎn)擊系統(tǒng)管理—> Configure Global Security川背,在“授權(quán)策略”選擇”安全矩陣”贰拿,添加用戶/組——添加admin賬戶——為admin賬戶添加所有權(quán)限,為匿名用戶勾選你希望對(duì)方了解的功能熄云。
【注意】:匿名用戶一定要開啟此處的可讀權(quán)限膨更,若不開啟,后面github或者bitbucket的webhook自動(dòng)構(gòu)建會(huì)沒有權(quán)限缴允。
并且勾選上該項(xiàng)荚守,點(diǎn)擊保存。
做完此部操作之后练般,即可用admin帳號(hào)登錄矗漾,取消登錄用戶可以做任何事的權(quán)限。
以上操作薄料,即可完成jenkins的授權(quán)和訪問控制敞贡。
5. Jenkins系統(tǒng)配置
登錄jenkins——系統(tǒng)管理——系統(tǒng)設(shè)置,為jenkins添加上需要的功能配置摄职,有如下幾個(gè)方面:
(1)JDK配置
在jdk的選項(xiàng)誊役,點(diǎn)擊”新增JDK”,取消自動(dòng)安裝琳钉,輸入jdk別名(名稱隨意),JAVA_HOME大家應(yīng)該都很了解蛛倦,在此處填寫jenkins所在服務(wù)器安裝的java程序的HOME位置即可歌懒,根據(jù)不同操作系統(tǒng)填寫不同路徑,如win7 D:\Java\jdk1.8 linux /usr/lib/jvm/jdk1.7.0_51溯壶。
設(shè)置完了請(qǐng)記得保存及皂。
(2)git/svn版本控制添加
根據(jù)使用的版本選擇控制版本的應(yīng)用程序的路徑,如jdk配置即可且改。
【注意】:如果使用Git作為版本控制庫验烧,Jenkins默認(rèn)情況下是沒有安裝Git的。我們需要到插件管理界面中選中Git又跛,然后點(diǎn)擊直接安裝碍拆。
點(diǎn)擊系統(tǒng)管理—>管理插件—>可選插件,在右上角”過濾”處輸入git進(jìn)行搜索:
找到Git client plugin和Git plugin慨蓝,在前面打上√感混,點(diǎn)擊直接安裝。
安裝插件中礼烈。弧满。。
安裝成功后此熬,重啟jenkins庭呜。
[jenkins@osb30 ~]$ ``cd
apache-tomcat-8.0.30
[jenkins@osb30 apache-tomcat-8.0.30]$ bin``/shutdown``.sh
[jenkins@osb30 apache-tomcat-8.0.30]$ bin``/startup``.sh ;``tail
-f logs``/catalina``.out
(3)Jenkins添加maven配置
先判斷jenkins所在主機(jī)是否安裝了maven:
# mvn –version
-``bash``: mvn: ``command
not found
如果沒有安裝滑进,請(qǐng)先安裝maven。
a.CentOS 安裝maven
[root@osb30 ~]``# cd /usr/local/
[root@osb30 ``local``]``# wget http://apache.opencas.org/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
[root@osb30 ``local``]``# tar zxf apache-maven-3.3.9-bin.tar.gz
[root@osb30 ``local``]``# ln -s apache-maven-3.3.9 maven
[root@osb30 ``local``]``# vim /etc/profile
# 添加如下配置:
# Maven configuration.
MAVEN_HOME=``/usr/local/maven
export
PATH=$MAVEN_HOME``/bin``:$PATH
[root@osb30 ``local``]``# source /etc/profile
[root@osb30 ``local``]``# mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: ``/usr/local/maven
Java version: 1.8.0_65, vendor: Oracle Corporation
Default locale: en_US, platform encoding: UTF-8
OS name: ``"linux"``, version: ``"2.6.32-431.el6.x86_64"``, arch: ``"amd64"``, family: ``"unix"
b.Jenkins配置maven
安裝完成后募谎,登錄jenkins扶关。點(diǎn)擊系統(tǒng)管理—>系統(tǒng)設(shè)置。
三近哟、Jenkins構(gòu)建maven風(fēng)格的job
1. 新建maven任務(wù)
登錄jenkins驮审,點(diǎn)擊新建。輸入Item名稱吉执,選擇“構(gòu)建一個(gè)maven項(xiàng)目”疯淫,點(diǎn)擊OK。
2. 構(gòu)建任務(wù)配置
3. 源碼管理配置
進(jìn)入配置頁面戳玫,找到”源碼管理”熙掺。我這里是svn,輸入項(xiàng)目所在版本庫的地址咕宿。
4. 構(gòu)建觸發(fā)器配置
在”源碼管理”下面是”構(gòu)建觸發(fā)器”币绩。
”構(gòu)建觸發(fā)器”是一個(gè)持續(xù)集成的觸發(fā)器插件,可以根據(jù)已經(jīng)完成構(gòu)建的結(jié)果府阀,觸發(fā)新Job或者傳遞參數(shù)缆镣。默認(rèn)的選項(xiàng)是Build whenever a SNAPSHOT dependency is built,意思是依賴于快照的構(gòu)建试浙,意思是依賴于快照的構(gòu)建董瞻,當(dāng)代碼有更新時(shí)就構(gòu)建項(xiàng)目。
Build periodically和Poll SCM可以設(shè)置定時(shí)自動(dòng)構(gòu)建田巴。兩者區(qū)別如下:
- Poll SCM:定時(shí)檢查源碼變更(根據(jù)SCM軟件的版本號(hào))钠糊,如果有更新就checkout最新code下來,然后執(zhí)行構(gòu)建動(dòng)作壹哺。
- Build periodically:定時(shí)進(jìn)行項(xiàng)目構(gòu)建(它不care源碼是否發(fā)生變化)抄伍。
我這里設(shè)置為每12小時(shí)構(gòu)建一次。
5. Maven構(gòu)建設(shè)置
(1)Pre Step
Pre Steps選項(xiàng)用來配置構(gòu)建前的工作管宵,這里不作更改截珍。
(2)配置Root POM和Goals and options
因?yàn)槭荕aven項(xiàng)目,所以Build選項(xiàng)有Root POM和Goals and options的設(shè)置箩朴。Root POM:填寫你項(xiàng)目的pom.xml文件的位置笛臣,注意:是相對(duì)位置,如果該文件不存在隧饼,會(huì)有紅色字提示沈堡。
比如我這里是:
**(3)Post Steps **
在maven項(xiàng)目創(chuàng)建完成后,我們還需要實(shí)現(xiàn)每次構(gòu)建完成燕雁,將war發(fā)布到阿里云主機(jī)上诞丽,以實(shí)現(xiàn)自動(dòng)發(fā)布打掘。我們通過添加shell實(shí)現(xiàn)自動(dòng)發(fā)布揭绑。
找到Post steps下有個(gè)Execute shell:
【注意】:Jenkins在執(zhí)行該shell腳本的時(shí)候是以jenkins這個(gè)用戶身份去執(zhí)行。某些場景下請(qǐng)注意環(huán)境變量PATH。
將構(gòu)建完成后箕憾,所要采取的動(dòng)作福扬,shell腳本腳本內(nèi)容如下:
shell腳本
配置阿里云主機(jī)信任內(nèi)網(wǎng)的這臺(tái)jenkins主機(jī):
由于是war包在內(nèi)網(wǎng)服務(wù)器上脯倒,發(fā)布的環(huán)境是在阿里云主機(jī)上愿吹,所以要配置主機(jī)互信,防止scp war包時(shí)還需要輸入密碼浊洞。我這里內(nèi)網(wǎng)服務(wù)器ip是172.16.206.30牵敷,外網(wǎng)是114.55.29.246。
[jenkins@osb30 ~]$ ``ssh``-keygen -t rsa -f .``ssh``/id_rsa
[jenkins@osb30 ~]$ ``ssh``-copy-``id
-i .``ssh``/id_rsa``.pub root@114.55.29.246
四法希、Jenkins郵件通知設(shè)置
1. 配置jenkins自帶的郵件功能
(1)找到系統(tǒng)設(shè)置
(2)填寫系統(tǒng)管理員郵箱
【注意】:這個(gè)系統(tǒng)管理員郵件地址一定要填寫枷餐,否則郵件發(fā)不出去,連下面的測(cè)試郵件都發(fā)不出去苫亦。
(3)找到郵件通知毛肋,輸入SMTP服務(wù)器地址,點(diǎn)擊高級(jí)屋剑,輸入發(fā)件人帳號(hào)和密碼
(4)勾選上”通過發(fā)送測(cè)試郵件測(cè)試配置”润匙,然后輸入收件人帳號(hào)
此時(shí)我們已經(jīng)可以發(fā)送郵件了。在具體job配置處唉匾,找到”構(gòu)建設(shè)置”孕讳,輸入收件人信箱,但是你會(huì)發(fā)現(xiàn)只能在構(gòu)建失敗時(shí)發(fā)郵件肄鸽∥啦。可以安裝插件Email Extension Plugin來自定義油啤。
2. 安裝使用插件Email Extension Plugin
(1)安裝插件Email Extension Plugin
該插件支持jenkins 1.5以上的版本典徘。
在系統(tǒng)管理-插件管理-安裝Email Extension Plugin。它可根據(jù)構(gòu)建的結(jié)果益咬,發(fā)送構(gòu)建報(bào)告逮诲。該插件支持jenkins 1.5以上的版本。
【注意】:安裝完如果使用Email Extension Plugin幽告,就可以棄用自帶的那個(gè)郵件功能了梅鹦。
(2)配置使用插件Email Extension Plugin
點(diǎn)擊”系統(tǒng)配置”—>”系統(tǒng)設(shè)置”。
找到Extended E-mail Notification處冗锁,輸入如下的配置:
【注意】:上面的User Name和Password需要點(diǎn)開“高級(jí)設(shè)置”后才能看到齐唆,必須輸入用戶名和密碼,否則郵件發(fā)不出去冻河。
Email Extension Plugin配置內(nèi)容
點(diǎn)擊下面的保存箍邮。
然后去job配置頁面激活這個(gè)插件茉帅。找到需要發(fā)郵件的項(xiàng)目,點(diǎn)擊進(jìn)去锭弊。
點(diǎn)擊配置堪澎,點(diǎn)擊”增加構(gòu)建后操作步驟”,選擇Editable Email Notification味滞。
附上構(gòu)建日志樱蛤,點(diǎn)擊高級(jí)設(shè)置。
配置Triggers:
更詳細(xì)的介紹:http://www.cnblogs.com/zz0412/p/jenkins_jj_01.html
五剑鞍、Sonar
官方文檔:http://docs.sonarqube.org/display/SONARQUBE45/Documentation
1. sonar簡介
Sonar是一個(gè)用于代碼質(zhì)量管理的開源平臺(tái)昨凡,用于管理Java源代碼的質(zhì)量。通過插件機(jī)制攒暇,Sonar 可以集成不同的測(cè)試工具土匀,代碼分析工具,以及持續(xù)集成工具形用,比如pmd-cpd就轧、checkstyle、findbugs田度、Jenkins妒御。通過不同的插件對(duì)這些結(jié)果進(jìn)行再加工處理,通過量化的方式度量代碼質(zhì)量的變化镇饺,從而可以方便地對(duì)不同規(guī)模和種類的工程進(jìn)行代碼質(zhì)量管理乎莉。
與持續(xù)集成工具(例如 Hudson/Jenkins 等)不同,Sonar 并不是簡單地把不同的代碼檢查工具結(jié)果(例如 FindBugs奸笤,PMD 等)直接顯示在 Web 頁面上惋啃,而是通過不同的插件對(duì)這些結(jié)果進(jìn)行再加工處理,通過量化的方式度量代碼質(zhì)量的變化监右,從而可以方便地對(duì)不同規(guī)模和種類的工程進(jìn)行代碼質(zhì)量管理边灭。
在對(duì)其他工具的支持方面,Sonar 不僅提供了對(duì) IDE 的支持健盒,可以在 Eclipse 和 IntelliJ IDEA 這些工具里聯(lián)機(jī)查看結(jié)果绒瘦;同時(shí) Sonar 還對(duì)大量的持續(xù)集成工具提供了接口支持,可以很方便地在持續(xù)集成中使用 Sonar扣癣。
此外惰帽,Sonar 的插件還可以對(duì) Java 以外的其他編程語言提供支持,對(duì)國際化以及報(bào)告文檔化也有良好的支持父虑。
2. 環(huán)境要求
http://docs.sonarqube.org/display/SONAR/Requirements
3. 新建用戶
[root@osb30 ~]``# groupadd sonar
[root@osb30 ~]``# useradd -g sonar sonar
[root@osb30 ~]``# id sonar
uid=502(sonar) gid=502(sonar) ``groups``=502(sonar)
[root@osb30 ~]``# echo "wisedu" | passwd --stdin sonar &> /dev/null
4. 安裝jdk
[sonar@osb30 ~]$ java -version
java version ``"1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
5. 安裝配置數(shù)據(jù)庫
[root@osb30 ~]``# mysql -uroot –p
mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> CREATE USER ``'sonar'
IDENTIFIED BY ``'sonar'``;
mysql> GRANT ALL ON sonar.* TO ``'sonar'``@``'%'
IDENTIFIED BY ``'wisedu'``;
mysql> GRANT ALL ON sonar.* TO ``'sonar'``@``'localhost'
IDENTIFIED BY ``'wisedu'``;
mysql> FLUSH PRIVILEGES;
6. 安裝sonar
我這里用的版本是SonarQube 4.5.7 (LTS *)该酗,上傳該軟件到sonar用戶的家目錄下。
[sonar@osb30 ~]$ unzip -oq sonarqube-4.5.7.zip
[sonar@osb30 ~]$ vim sonarqube-4.5.7``/conf/sonar``.properties
修改如下字段(就是配置數(shù)據(jù)庫信息士嚎,其他不用動(dòng)):
sonar.jdbc.username: sonar
sonar.jdbc.password: wisedu
sonar.jdbc.url: jdbc:mysql:``//localhost``:3306``/sonar``?useUnicode=``true``&characterEncoding=utf8&rewriteBatchedStatements=``true
# Optional properties
sonar.jdbc.driverClassName: com.mysql.jdbc.Driver
|
7. 啟動(dòng)sonar
Sonar默認(rèn)集成了jetty容器呜魄,可以直接啟動(dòng)提供服務(wù)烁焙,也可以通過腳本構(gòu)建為war包,部署在tomcat容器中耕赘。
Sonar默認(rèn)的端口是”9000”骄蝇、默認(rèn)的上下文路徑是”/”、默認(rèn)的網(wǎng)絡(luò)接口是”0.0.0.0”操骡,默認(rèn)的管理員帳號(hào)和密碼為:admin/admin九火,這些參數(shù)都可以在配置文件sonar.properties中修改。我這里修改下port册招,因?yàn)楸緳C(jī)的9000端口被其他程序占用了岔激。
[sonar@osb30 ~]$ vim sonarqube-4.5.7``/conf/sonar``.properties
sonar.web.port=9003
[sonar@osb30 ~]$ sonarqube-4.5.7``/bin/linux-x86-64/sonar``.sh start
查看日志:
[sonar@osb30 ~]$ ``tail
-f sonarqube-4.5.7``/logs/sonar``.log
可以看到第一次啟動(dòng)時(shí),初始化語句:
8. 關(guān)閉sonar
[sonar@osb30 ~]$ sonarqube-4.5.7``/bin/linux-x86-64/sonar``.sh stop
|
9. 訪問sonar
瀏覽器輸入http://172.16.206.30:9003/
默認(rèn)的管理員帳號(hào)和密碼為:admin/admin是掰。
10. sonar插件
Sonar支持多種插件虑鼎,插件的下載地址為:http://docs.codehaus.org/display/SONAR/Plugin+Library
將下載后的插件上傳到${SONAR_HOME}extensions\plugins目錄下,重新啟動(dòng)sonar键痛。
sonar默認(rèn)集成了Java Ecosystem插件炫彩,該插件是一組插件的合集:
- Java [sonar-java-plugin]:java源代碼解析,計(jì)算指標(biāo)等
- Squid [sonar-squid-java-plugin]:檢查違反Sonar定義規(guī)則的代碼
- Checkstyle [sonar-checkstyle-plugin]:使用CheckStyle檢查違反統(tǒng)一代碼編寫風(fēng)格的代碼
- FindBugs [sonar-findbugs-plugin]:使用FindBugs檢查違反規(guī)則的缺陷代碼
- PMD [sonar-pmd-plugin]:使用pmd檢查違反規(guī)則的代碼
- Surefire [sonar-surefire-plugin]:使用Surefire執(zhí)行單元測(cè)試
- Cobertura [sonar-cobertura-plugin]:使用Cobertura獲取代碼覆蓋率
- JaCoCo [sonar-jacoco-plugin]:使用JaCOCO獲取代碼覆蓋率
11. 與jenkins集成
可以通過maven集成絮短,也可以直接與jenkins集成江兢。我這里選擇直接與jenkins集成。
(1)修改maven的主配置文件(${MAVEN_HOME}/conf/settings.xml文件或者 ~/.m2/settings.xml文件)丁频,在其中增加訪問Sonar數(shù)據(jù)庫及Sonar服務(wù)地址杉允,添加如下配置:
<``profile``>
<``id``>sonar</``id``>
<``properties``>
<``sonar.jdbc.url``>jdbc:mysql://localhost:3306/sonar</``sonar.jdbc.url``>
<``sonar.jdbc.driver``>com.mysql.jdbc.Driver</``sonar.jdbc.driver``>
<``sonar.jdbc.username``>sonar</``sonar.jdbc.username``>
<``sonar.jdbc.password``>sonar</``sonar.jdbc.password``>
`<sonar.host.url
>http://localhost:9003</sonar.host.url
> ```
</``properties``>
</``profile``>
<``activeProfiles``>
<``activeProfile``>sonar</``activeProfile``>
</``activeProfiles``>
...
|
這部分內(nèi)容具體可參照網(wǎng)上http://www.cnblogs.com/gao241/p/3190701.html
(2)在jenkins的插件管理中選擇安裝sonar jenkins plugin,該插件可以使項(xiàng)目每次構(gòu)建都調(diào)用sonar進(jìn)行代碼度量席里。
a.安裝插件
b.系統(tǒng)配置添加sonar的配置
進(jìn)入系統(tǒng)配置頁面對(duì)sonar插件進(jìn)行配置叔磷,如下圖:
然后點(diǎn)擊下面的保存。
c.配置構(gòu)建項(xiàng)目奖磁,增加Post Build Action
點(diǎn)擊要構(gòu)建的項(xiàng)目改基,在點(diǎn)擊左側(cè)的配置。
在頁面的最下面找到”構(gòu)建后操作”署穗,選擇SonarQube寥裂。
It is no longer recommended to use SonarQube maven builder. It is preferable to set up SonarQube in the build environment and use a standard Jenkins maven target.
【解決】:
http://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Jenkins
修改Build處:
最后去jenkins構(gòu)建項(xiàng)目嵌洼,構(gòu)建完查看sonar控制臺(tái):
12. 常見問題
Jenkins構(gòu)建完成后案疲,sonar掃描代碼報(bào)錯(cuò):
解決: 卸載sonar的JavaScript插件。
六麻养、Jenkins與Docker結(jié)合
我這里沒有使用Docker Pipeline褐啡,直接在構(gòu)建完成后,執(zhí)行shell腳本鳖昌,這樣更靈活备畦。
1. 部署流程
- 研發(fā)push到svn代碼庫
- Jenkins 構(gòu)建低飒,pull svn代碼 使用maven進(jìn)行編譯打包
- 打包生成的代碼,生成一個(gè)新版本的鏡像懂盐,push到本地docker倉庫harbor
- 發(fā)布褥赊,測(cè)試機(jī)器 pull 新版本的鏡像,并刪除原來的容器莉恼,重新運(yùn)行新版本鏡像拌喉。
2. 環(huán)境說明
| 主機(jī)名 | 操作系統(tǒng)版本 | IP地址 | 用途 | 安裝軟件 |
| osb30 | Redhat 6.5 | 172.16.206.30 | svn代碼庫、Jenkins俐银、Docker | jenkins尿背、svn、Docker 1.7.1 |
| spark32 | CentOS 7.0 | 172.16.206.32 | 本地docker倉庫捶惜、業(yè)務(wù)部署測(cè)試環(huán)境 | harbor田藐、Docker 17.06.1-ce |
3. 配置
由于在Jenkins機(jī)器上docker是使用root用戶運(yùn)行的,而Jenkins是使用普通用戶jenkins運(yùn)行的吱七,所以要先配置下jenkins用戶可以使用docker命令汽久。
[root@osb30 ~]``# visudo
jenkins ALL=(root) NOPASSWD: ``/usr/bin/docker
另外在Jenkins機(jī)器上配置:
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
# You have to run "ssh -t hostname sudo <cmd>".
#
#Defaults requiretty
Defaults:jenkins !requiretty
如果不配置這個(gè),在執(zhí)行下面腳本時(shí)踊餐,會(huì)報(bào)錯(cuò)誤:
+ ``cp
-f ``/home/jenkins/``.jenkins``/workspace/godseyeBranchForNov/godseye-container/target/godseye-container-wisedu``.war ``/home/jenkins/docker-file/godseye_war/godseye``.war
+ ``sudo
docker login -u jkzhao -p Wisedu123 -e 01115004@wisedu.com 172.16.206.32
sudo``: sorry, you must have a ``tty
to run ``sudo
在172.16.206.32機(jī)器上配置:
# visudo
#
#Defaults requiretty
Defaults:root !requiretty
否則在機(jī)器172.16.206.32機(jī)器上執(zhí)行腳本時(shí)會(huì)報(bào)錯(cuò):
[SSH] executing...
sudo``: sorry, you must have a ``tty
to run ``sudo
docker: invalid reference ``format``.
|
4. 安裝插件
登錄Jenkins回窘,點(diǎn)擊“系統(tǒng)管理”,點(diǎn)擊“管理插件”市袖,搜索插件“SSH plugin”啡直,進(jìn)行安裝。
登錄Jenkins苍碟,點(diǎn)擊“Credentials”酒觅,點(diǎn)擊“Add domain”。
點(diǎn)擊“系統(tǒng)管理”微峰,“系統(tǒng)配置”舷丹,找到“SSH remote hosts”。
5. 配置Post Steps
項(xiàng)目其他的配置不變蜓肆,見上面的章節(jié)颜凯。
【注意】:腳本中用到的倉庫和認(rèn)證的賬號(hào)需要先在harbor新建好。
# Jenkins機(jī)器:編譯完成后仗扬,build生成一個(gè)新版本的鏡像症概,push到遠(yuǎn)程docker倉庫
# Variables
JENKINS_WAR_HOME=``'/home/jenkins/.jenkins/workspace/godseyeBranchForNov/godseye-container/target'
DOCKERFILE_HOME=``'/home/jenkins/docker-file/godseye_war'
HARBOR_IP=``'172.16.206.32'
REPOSITORIES=``'godseye_war/godseye'
HARBOR_USER=``'jkzhao'
HARBOR_USER_PASSWD=``'Wisedu123'
HARBOR_USER_EMAIL=``'01115004@wisedu.com'
# Copy the newest war to docker-file directory.
\``cp
-f ${JENKINS_WAR_HOME}``/godseye-container-wisedu``.war ${DOCKERFILE_HOME}``/godseye``.war
# Delete image early version.
sudo
docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} -e ${HARBOR_USER_EMAIL} ${HARBOR_IP}
IMAGE_ID=```sudo
docker images | ``grep
${REPOSITORIES} | ``awk
`'{print $3}'````
if
[ -n ``"${IMAGE_ID}"
];``then
sudo
docker rmi ${IMAGE_ID}
fi
# Build image.
cd
${DOCKERFILE_HOME}
TAG=```date
`+%Y%m%d-%H%M%S``
sudo
docker build -t ${HARBOR_IP}/${REPOSITORIES}:${TAG} . &>``/dev/null
# Push to the harbor registry.
sudo
docker push ${HARBOR_IP}/${REPOSITORIES}:${TAG} &>``/dev/null
|
# 拉取鏡像,發(fā)布
HARBOR_IP=``'172.16.206.32'
REPOSITORIES=``'godseye_war/godseye'
HARBOR_USER=``'jkzhao'
HARBOR_USER_PASSWD=``'Wisedu123'
# 登錄harbor
#docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} ${HARBOR_IP}
# Stop container, and delete the container.
CONTAINER_ID=
docker ps` `|
grep"godseye_web"
| ``awk
'{print $1}'````
if
[ -n ``"$CONTAINER_ID"
]; ``then
docker stop $CONTAINER_ID
docker ``rm
$CONTAINER_ID
else
#如果容器啟動(dòng)時(shí)失敗了早芭,就需要docker ps -a才能找到那個(gè)容器
CONTAINER_ID=
docker ps` `-a |
grep"godseye_web"
| ``awk
'{print $1}'````
if
[ -n ``"$CONTAINER_ID"
]; ``then
# 如果是第一次在這臺(tái)機(jī)器上拉取運(yùn)行容器彼城,那么docker ps -a也是找不到這個(gè)容器的
docker ``rm
$CONTAINER_ID
fi
fi
# Delete godseye_web image early version.
IMAGE_ID=```sudo
docker images | ``grep
${REPOSITORIES} | ``awk
`'{print $3}'````
if
[ -n ``"${IMAGE_ID}"
];``then
docker rmi ${IMAGE_ID}
fi
# Pull image.
TAG=
curl -s http://
{HARBOR_IP}``/api/repositories/``{REPOSITORIES}/tags` `| jq
'.[-1]'|
sed` `'s/\"http://g'```
#最后的sed是為了去掉tag前后的雙引號(hào)`
docker pull ${HARBOR_IP}/${REPOSITORIES}:${TAG} &>``/dev/null
# Run.
docker run -d --name godseye_web -p 8080:8080 ${HARBOR_IP}/${REPOSITORIES}:${TAG}
|