Jenkins+Docker持續(xù)集成

教程: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)和訪問控制:

image

查看策略:

image

如上圖所示毁涉,默認(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)偎行。

image

b.點(diǎn)擊系統(tǒng)管理—> Configure Global Security川背,在“授權(quán)策略”選擇”安全矩陣”贰拿,添加用戶/組——添加admin賬戶——為admin賬戶添加所有權(quán)限,為匿名用戶勾選你希望對(duì)方了解的功能熄云。

image

【注意】:匿名用戶一定要開啟此處的可讀權(quán)限膨更,若不開啟,后面github或者bitbucket的webhook自動(dòng)構(gòu)建會(huì)沒有權(quán)限缴允。

并且勾選上該項(xiàng)荚守,點(diǎn)擊保存。

image

做完此部操作之后练般,即可用admin帳號(hào)登錄矗漾,取消登錄用戶可以做任何事的權(quán)限。

以上操作薄料,即可完成jenkins的授權(quán)和訪問控制敞贡。

5. Jenkins系統(tǒng)配置

登錄jenkins——系統(tǒng)管理——系統(tǒng)設(shè)置,為jenkins添加上需要的功能配置摄职,有如下幾個(gè)方面:

image

(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溯壶。

image

設(shè)置完了請(qǐng)記得保存及皂。

(2)git/svn版本控制添加

根據(jù)使用的版本選擇控制版本的應(yīng)用程序的路徑,如jdk配置即可且改。

image

【注意】:如果使用Git作為版本控制庫验烧,Jenkins默認(rèn)情況下是沒有安裝Git的。我們需要到插件管理界面中選中Git又跛,然后點(diǎn)擊直接安裝碍拆。

點(diǎn)擊系統(tǒng)管理—>管理插件—>可選插件,在右上角”過濾”處輸入git進(jìn)行搜索:

image

找到Git client plugin和Git plugin慨蓝,在前面打上√感混,點(diǎn)擊直接安裝。

image

安裝插件中礼烈。弧满。。

image

安裝成功后此熬,重啟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è)置。

image

三近哟、Jenkins構(gòu)建maven風(fēng)格的job

1. 新建maven任務(wù)

登錄jenkins驮审,點(diǎn)擊新建。輸入Item名稱吉执,選擇“構(gòu)建一個(gè)maven項(xiàng)目”疯淫,點(diǎn)擊OK。

image

2. 構(gòu)建任務(wù)配置

image

3. 源碼管理配置

進(jìn)入配置頁面戳玫,找到”源碼管理”熙掺。我這里是svn,輸入項(xiàng)目所在版本庫的地址咕宿。

image

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)建一次。

image

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ì)有紅色字提示沈堡。

比如我這里是:

image

**(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)容如下:

image

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è)置

image

(2)填寫系統(tǒng)管理員郵箱

image

【注意】:這個(gè)系統(tǒng)管理員郵件地址一定要填寫枷餐,否則郵件發(fā)不出去,連下面的測(cè)試郵件都發(fā)不出去苫亦。

(3)找到郵件通知毛肋,輸入SMTP服務(wù)器地址,點(diǎn)擊高級(jí)屋剑,輸入發(fā)件人帳號(hào)和密碼

image

(4)勾選上”通過發(fā)送測(cè)試郵件測(cè)試配置”润匙,然后輸入收件人帳號(hào)

image

此時(shí)我們已經(jīng)可以發(fā)送郵件了。在具體job配置處唉匾,找到”構(gòu)建設(shè)置”孕讳,輸入收件人信箱,但是你會(huì)發(fā)現(xiàn)只能在構(gòu)建失敗時(shí)發(fā)郵件肄鸽∥啦。可以安裝插件Email Extension Plugin來自定義油啤。

image

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以上的版本。

image

【注意】:安裝完如果使用Email Extension Plugin幽告,就可以棄用自帶的那個(gè)郵件功能了梅鹦。

(2)配置使用插件Email Extension Plugin

點(diǎn)擊”系統(tǒng)配置”—>”系統(tǒng)設(shè)置”。

image

找到Extended E-mail Notification處冗锁,輸入如下的配置:

image

【注意】:上面的User Name和Password需要點(diǎn)開“高級(jí)設(shè)置”后才能看到齐唆,必須輸入用戶名和密碼,否則郵件發(fā)不出去冻河。

image
image

Email Extension Plugin配置內(nèi)容

點(diǎn)擊下面的保存箍邮。

然后去job配置頁面激活這個(gè)插件茉帅。找到需要發(fā)郵件的項(xiàng)目,點(diǎn)擊進(jìn)去锭弊。

image

點(diǎn)擊配置堪澎,點(diǎn)擊”增加構(gòu)建后操作步驟”,選擇Editable Email Notification味滞。

image

附上構(gòu)建日志樱蛤,點(diǎn)擊高級(jí)設(shè)置。

image

配置Triggers:

image

更詳細(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í),初始化語句:

image

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是掰。

image
image
image

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.安裝插件

image

b.系統(tǒng)配置添加sonar的配置

進(jìn)入系統(tǒng)配置頁面對(duì)sonar插件進(jìn)行配置叔磷,如下圖:

image
image

然后點(diǎn)擊下面的保存。

c.配置構(gòu)建項(xiàng)目奖磁,增加Post Build Action

點(diǎn)擊要構(gòu)建的項(xiàng)目改基,在點(diǎn)擊左側(cè)的配置。

image

在頁面的最下面找到”構(gòu)建后操作”署穗,選擇SonarQube寥裂。

image
image

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處:

image

最后去jenkins構(gòu)建項(xiàng)目嵌洼,構(gòu)建完查看sonar控制臺(tái):

image

12. 常見問題

Jenkins構(gòu)建完成后案疲,sonar掃描代碼報(bào)錯(cuò):

image

解決: 卸載sonar的JavaScript插件。

六麻养、Jenkins與Docker結(jié)合

我這里沒有使用Docker Pipeline褐啡,直接在構(gòu)建完成后,執(zhí)行shell腳本鳖昌,這樣更靈活备畦。

1. 部署流程

  1. 研發(fā)push到svn代碼庫
  2. Jenkins 構(gòu)建低飒,pull svn代碼 使用maven進(jìn)行編譯打包
  3. 打包生成的代碼,生成一個(gè)新版本的鏡像懂盐,push到本地docker倉庫harbor
  4. 發(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”。

image
image
image

點(diǎn)擊“系統(tǒng)管理”微峰,“系統(tǒng)配置”舷丹,找到“SSH remote hosts”。

image

5. 配置Post Steps

項(xiàng)目其他的配置不變蜓肆,見上面的章節(jié)颜凯。

【注意】:腳本中用到的倉庫和認(rèn)證的賬號(hào)需要先在harbor新建好。

image

# 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

|

image

# 拉取鏡像,發(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}

|

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子募壕,更是在濱河造成了極大的恐慌调炬,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舱馅,死亡現(xiàn)場離奇詭異缰泡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)代嗤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門匀谣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人资溃,你說我怎么就攤上這事武翎。” “怎么了溶锭?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵宝恶,是天一觀的道長。 經(jīng)常有香客問我趴捅,道長垫毙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任拱绑,我火速辦了婚禮综芥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猎拨。我一直安慰自己膀藐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布红省。 她就那樣靜靜地躺著额各,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吧恃。 梳的紋絲不亂的頭發(fā)上虾啦,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音痕寓,去河邊找鬼傲醉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呻率,可吹牛的內(nèi)容都是我干的硬毕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼筷凤,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼昭殉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起藐守,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤挪丢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后卢厂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乾蓬,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年慎恒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了任内。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡融柬,死狀恐怖死嗦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粒氧,我是刑警寧澤越除,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站外盯,受9級(jí)特大地震影響摘盆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饱苟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一孩擂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箱熬,春花似錦类垦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至酿傍,卻和暖如春烙懦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赤炒。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工氯析, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人莺褒。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓掩缓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親遵岩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子你辣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容