Jenkins+Docker持續集成
本節內容:
- Jenkins介紹
- 安裝部署Jenkins
- Jenkins構建maven風格的job
- Jenkins郵件通知設置
- Sonar
- Jenkins與Docker結合
一、Jenkins介紹
Jenkins是一個開源軟件項目,是基於Java開發的一種持續集成工具,用於監控持續重複的工作,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。
二、安裝部署Jenkins
下載地址:https://jenkins.io/download/
我這裏下載war包安裝,版本:1.642.3 LTS .war
1. 環境信息
主機名 | 操作系統版本 | IP地址 | 安裝軟件 |
osb30 | Redhat 6.5 | 172.16.206.30 | jenkins |
2. 新建Jenkins用戶
1 2 3 4 5 |
|
3. Jenkins安裝方式
安裝jenkins有兩種方式,tomcat方式部署和java部署啓動。本次實驗我以tomcat下部署啓動爲例。
(1)tomcat方式部署
a.首先安裝tomcat和JAVA,配置環境變量(此步驟不再講述,java配置不可缺少)
我這裏安裝的是jdk 1.8.0_65。
b.將從官網下載下來的jenkins.war文件放入tomcat下的webapps目錄下,進入tomcat的/bin目錄下,啓動tomcat即啓動jenkins。
我這裏用的是tomcat8。
c.啓動jenkins時,會自動在webapps目錄下建立jenkins目錄,訪問地址爲:http://localhost:8080/jenkins
1 2 3 4 5 |
|
如果啓動時報錯:
1 |
|
解決:
1 2 3 |
|
d.訪問jenkins
http://172.16.206.30:8080/jenkins
(2)java部署啓動jenkins
切換到jenkins.war存放的目錄,輸入如下命令:
1 |
|
可以修改啓動端口
1 |
|
然後在瀏覽器中(推薦用火狐、chrom)輸入http://localhost:8080,localhost可以是本機的ip,也可以是計算機名。就可以打開jenkins;修改端口後,訪問地址的端口需同步變更。
4. Jenkins授權和訪問控制
默認地Jenkins不包含任何的安全檢查,任何人可以修改Jenkins設置,job和啓動build等。顯然地在大規模的公司需要多個部門一起協調工作的時候,沒有任何安全檢查會帶來很多的問題。 我們可以通過下面的方式來增強Jenkins的安全:
訪問jenkins:http://172.16.206.30:8080/jenkins
點擊系統管理—> Configure Global Security,點擊”啓用安全”,可以看到可以使用多種方式來增強Jenkins的授權和訪問控制:
查看策略:
如上圖所示,默認是”任何用戶可以做任何事情(沒有任何限制)”。
我們在”安全域”選擇”Jenkins專有用戶數據庫”,”允許用戶註冊”;並先在“授權策略”點擊“任何用戶可以做任何事情(沒有任何限制)”, 防止註冊之後無法再管理jenkins。此時就可以刷新一下jenkins的頁面看到右上角有登錄、註冊的按鈕。
(1)註冊管理員賬號
a.點擊註冊,首先註冊一個管理員賬號。
b.點擊系統管理—> Configure Global Security,在“授權策略”選擇”安全矩陣”,添加用戶/組——添加admin賬戶——爲admin賬戶添加所有權限,爲匿名用戶勾選你希望對方瞭解的功能。
【注意】:匿名用戶一定要開啓此處的可讀權限,若不開啓,後面github或者bitbucket的webhook自動構建會沒有權限。
並且勾選上該項,點擊保存。
做完此部操作之後,即可用admin帳號登錄,取消登錄用戶可以做任何事的權限。
以上操作,即可完成jenkins的授權和訪問控制。
5. Jenkins系統配置
登錄jenkins——系統管理——系統設置,爲jenkins添加上需要的功能配置,有如下幾個方面:
(1)JDK配置
在jdk的選項,點擊”新增JDK”,取消自動安裝,輸入jdk別名(名稱隨意),JAVA_HOME大家應該都很瞭解,在此處填寫jenkins所在服務器安裝的java程序的HOME位置即可,根據不同操作系統填寫不同路徑,如win7 D:\Java\jdk1.8 linux /usr/lib/jvm/jdk1.7.0_51。
設置完了請記得保存。
(2)git/svn版本控制添加
根據使用的版本選擇控制版本的應用程序的路徑,如jdk配置即可。
【注意】:如果使用Git作爲版本控制庫,Jenkins默認情況下是沒有安裝Git的。我們需要到插件管理界面中選中Git,然後點擊直接安裝。
點擊系統管理—>管理插件—>可選插件,在右上角”過濾”處輸入git進行搜索:
找到Git client plugin和Git plugin,在前面打上√,點擊直接安裝。
安裝插件中。。。
安裝成功後,重啓jenkins。
1 2 3 |
|
(3)Jenkins添加maven配置
先判斷jenkins所在主機是否安裝了maven:
1 2 |
|
如果沒有安裝,請先安裝maven。
a.CentOS 安裝maven
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
b.Jenkins配置maven
安裝完成後,登錄jenkins。點擊系統管理—>系統設置。
三、Jenkins構建maven風格的job
1. 新建maven任務
登錄jenkins,點擊新建。輸入Item名稱,選擇“構建一個maven項目”,點擊OK。
2. 構建任務配置
3. 源碼管理配置
進入配置頁面,找到”源碼管理”。我這裏是svn,輸入項目所在版本庫的地址。
4. 構建觸發器配置
在”源碼管理”下面是”構建觸發器”。
”構建觸發器”是一個持續集成的觸發器插件,可以根據已經完成構建的結果,觸發新Job或者傳遞參數。默認的選項是Build whenever a SNAPSHOT dependency is built,意思是依賴於快照的構建,意思是依賴於快照的構建,當代碼有更新時就構建項目。
Build periodically和Poll SCM可以設置定時自動構建。兩者區別如下:
- Poll SCM:定時檢查源碼變更(根據SCM軟件的版本號),如果有更新就checkout最新code下來,然後執行構建動作。
- Build periodically:定時進行項目構建(它不care源碼是否發生變化)。
我這裏設置爲每12小時構建一次。
5. Maven構建設置
(1)Pre Step
Pre Steps選項用來配置構建前的工作,這裏不作更改。
(2)配置Root POM和Goals and options
因爲是Maven項目,所以Build選項有Root POM和Goals and options的設置。Root POM:填寫你項目的pom.xml文件的位置,注意:是相對位置,如果該文件不存在,會有紅色字提示。
比如我這裏是:
(3)Post Steps
在maven項目創建完成後,我們還需要實現每次構建完成,將war發佈到阿里雲主機上,以實現自動發佈。我們通過添加shell實現自動發佈。
找到Post steps下有個Execute shell:
【注意】:Jenkins在執行該shell腳本的時候是以jenkins這個用戶身份去執行。某些場景下請注意環境變量PATH。
將構建完成後,所要採取的動作,shell腳本腳本內容如下:
#!/bin/bash #阿里雲主機 # Stop tomcat. ssh [email protected] '/usr/local/apache-tomcat-7.0.65/bin/shutdown.sh' &>/dev/null sleep 15 # Check the stop is successful or not. If until not, kill the tomcat process. if ssh [email protected] 'ps -ef|grep tomcat |grep -v "grep"' &>/dev/null; then tomcat_pid=`ps -ef | grep tomcat | grep -v "grep" | awk '{print $2}'` kill -9 ${tomcat_pid} fi # Check the stop is successful or not. if ssh [email protected] 'ps -ef|grep tomcat |grep -v "grep"' &>/dev/null; then echo "Tomcat stop failed.Please check the problem." exit 5 fi # Backup previous version and delete the war in the path /usr/local/apache-tomcat-7.0.65/webapps/. ssh [email protected] '/usr/bin/cp -f /usr/local/apache-tomcat-7.0.65/webapps/*.war /backups/*war' ssh [email protected] 'rm -rf /usr/local/apache-tomcat-7.0.65/webapps/*' # Copy the newest war to aliyun ECS. scp /home/jenkins/.jenkins/workspace/godseye/godseye-parent/godseye-container/target/godseye-container-aliyun.war [email protected]:/usr/local/apache-tomcat-7.0.65/webapps/godseye.war &>/dev/null # Start the tomcat. ssh [email protected] '/usr/local/apache-tomcat-7.0.65/bin/startup.sh' &>/dev/null
配置阿里雲主機信任內網的這臺jenkins主機:
由於是war包在內網服務器上,發佈的環境是在阿里雲主機上,所以要配置主機互信,防止scp war包時還需要輸入密碼。我這裏內網服務器ip是172.16.206.30,外網是114.55.29.246。
1 2 |
|
四、Jenkins郵件通知設置
1. 配置jenkins自帶的郵件功能
(1)找到系統設置
(2)填寫系統管理員郵箱
【注意】:這個系統管理員郵件地址一定要填寫,否則郵件發不出去,連下面的測試郵件都發不出去。
(3)找到郵件通知,輸入SMTP服務器地址,點擊高級,輸入發件人帳號和密碼
(4)勾選上”通過發送測試郵件測試配置”,然後輸入收件人帳號
此時我們已經可以發送郵件了。在具體job配置處,找到”構建設置”,輸入收件人信箱,但是你會發現只能在構建失敗時發郵件。可以安裝插件Email Extension Plugin來自定義。
2. 安裝使用插件Email Extension Plugin
(1)安裝插件Email Extension Plugin
該插件支持jenkins 1.5以上的版本。
在系統管理-插件管理-安裝Email Extension Plugin。它可根據構建的結果,發送構建報告。該插件支持jenkins 1.5以上的版本。
【注意】:安裝完如果使用Email Extension Plugin,就可以棄用自帶的那個郵件功能了。
(2)配置使用插件Email Extension Plugin
點擊”系統配置”—>”系統設置”。
找到Extended E-mail Notification處,輸入如下的配置:
【注意】:上面的User Name和Password需要點開“高級設置”後才能看到,必須輸入用戶名和密碼,否則郵件發不出去。
Email Extension Plugin配置內容
點擊下面的保存。
然後去job配置頁面激活這個插件。找到需要發郵件的項目,點擊進去。
點擊配置,點擊”增加構建後操作步驟”,選擇Editable Email Notification。
附上構建日誌,點擊高級設置。
配置Triggers:
更詳細的介紹:http://www.cnblogs.com/zz0412/p/jenkins_jj_01.html
五、Sonar
官方文檔:http://docs.sonarqube.org/display/SONARQUBE45/Documentation
1. sonar簡介
Sonar是一個用於代碼質量管理的開源平臺,用於管理Java源代碼的質量。通過插件機制,Sonar 可以集成不同的測試工具,代碼分析工具,以及持續集成工具,比如pmd-cpd、checkstyle、findbugs、Jenkins。通過不同的插件對這些結果進行再加工處理,通過量化的方式度量代碼質量的變化,從而可以方便地對不同規模和種類的工程進行代碼質量管理。
與持續集成工具(例如 Hudson/Jenkins 等)不同,Sonar 並不是簡單地把不同的代碼檢查工具結果(例如 FindBugs,PMD 等)直接顯示在 Web 頁面上,而是通過不同的插件對這些結果進行再加工處理,通過量化的方式度量代碼質量的變化,從而可以方便地對不同規模和種類的工程進行代碼質量管理。
在對其他工具的支持方面,Sonar 不僅提供了對 IDE 的支持,可以在 Eclipse 和 IntelliJ IDEA 這些工具裏聯機查看結果;同時 Sonar 還對大量的持續集成工具提供了接口支持,可以很方便地在持續集成中使用 Sonar。
此外,Sonar 的插件還可以對 Java 以外的其他編程語言提供支持,對國際化以及報告文檔化也有良好的支持。
2. 環境要求
http://docs.sonarqube.org/display/SONAR/Requirements
3. 新建用戶
1 2 3 4 5 |
|
4. 安裝jdk
1 2 3 4 |
|
5. 安裝配置數據庫
1 2 3 4 5 6 |
|
6. 安裝sonar
我這裏用的版本是SonarQube 4.5.7 (LTS *),上傳該軟件到sonar用戶的家目錄下。
1 2 |
|
修改如下字段(就是配置數據庫信息,其他不用動):
1 2 3 4 5 6 |
|
7. 啓動sonar
Sonar默認集成了jetty容器,可以直接啓動提供服務,也可以通過腳本構建爲war包,部署在tomcat容器中。
Sonar默認的端口是”9000”、默認的上下文路徑是”/”、默認的網絡接口是”0.0.0.0”,默認的管理員帳號和密碼爲:admin/admin,這些參數都可以在配置文件sonar.properties中修改。我這裏修改下port,因爲本機的9000端口被其他程序佔用了。
1 2 3 |
|
查看日誌:
1 |
|
可以看到第一次啓動時,初始化語句:
8. 關閉sonar
1 |
|
9. 訪問sonar
瀏覽器輸入http://172.16.206.30:9003/
默認的管理員帳號和密碼爲:admin/admin。
10. sonar插件
Sonar支持多種插件,插件的下載地址爲:http://docs.codehaus.org/display/SONAR/Plugin+Library
將下載後的插件上傳到${SONAR_HOME}extensions\plugins目錄下,重新啓動sonar。
sonar默認集成了Java Ecosystem插件,該插件是一組插件的合集:
- Java [sonar-java-plugin]:java源代碼解析,計算指標等
- Squid [sonar-squid-java-plugin]:檢查違反Sonar定義規則的代碼
- Checkstyle [sonar-checkstyle-plugin]:使用CheckStyle檢查違反統一代碼編寫風格的代碼
- FindBugs [sonar-findbugs-plugin]:使用FindBugs檢查違反規則的缺陷代碼
- PMD [sonar-pmd-plugin]:使用pmd檢查違反規則的代碼
- Surefire [sonar-surefire-plugin]:使用Surefire執行單元測試
- 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數據庫及Sonar服務地址,添加如下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
這部分內容具體可參照網上http://www.cnblogs.com/gao241/p/3190701.html
(2)在jenkins的插件管理中選擇安裝sonar jenkins plugin,該插件可以使項目每次構建都調用sonar進行代碼度量。
a.安裝插件
b.系統配置添加sonar的配置
進入系統配置頁面對sonar插件進行配置,如下圖:
然後點擊下面的保存。
c.配置構建項目,增加Post Build Action
點擊要構建的項目,在點擊左側的配置。
在頁面的最下面找到”構建後操作”,選擇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構建項目,構建完查看sonar控制檯:
12. 常見問題
Jenkins構建完成後,sonar掃描代碼報錯:
解決: 卸載sonar的JavaScript插件。
六、Jenkins與Docker結合
我這裏沒有使用Docker Pipeline,直接在構建完成後,執行shell腳本,這樣更靈活。
1. 部署流程
- 研發push到svn代碼庫
- Jenkins 構建,pull svn代碼 使用maven進行編譯打包
- 打包生成的代碼,生成一個新版本的鏡像,push到本地docker倉庫harbor
- 發佈,測試機器 pull 新版本的鏡像,並刪除原來的容器,重新運行新版本鏡像。
2. 環境說明
主機名 | 操作系統版本 | 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倉庫、業務部署測試環境 | harbor、Docker 17.06.1-ce |
3. 配置
由於在Jenkins機器上docker是使用root用戶運行的,而Jenkins是使用普通用戶jenkins運行的,所以要先配置下jenkins用戶可以使用docker命令。
1 2 |
|
另外在Jenkins機器上配置:
1 2 3 4 5 |
|
如果不配置這個,在執行下面腳本時,會報錯誤:
1 2 3 |
|
在172.16.206.32機器上配置:
1 2 3 4 |
|
否則在機器172.16.206.32機器上執行腳本時會報錯:
1 2 3 |
|
4. 安裝插件
登錄Jenkins,點擊“系統管理”,點擊“管理插件”,搜索插件“SSH plugin”,進行安裝。
登錄Jenkins,點擊“Credentials”,點擊“Add domain”。
點擊“系統管理”,“系統配置”,找到“SSH remote hosts”。
5. 配置Post Steps
項目其他的配置不變,見上面的章節。
【注意】:腳本中用到的倉庫和認證的賬號需要先在harbor新建好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
4
0
« 上一篇:企業級Docker Registry —— Harbor搭建和使用
» 下一篇:二進制方式部署Kubernetes 1.6.0集羣(開啓TLS)
posted @ 2017-11-15 09:02 暴走小騷年 閱讀(28160) 評論(6) 編輯 收藏
評論列表
#1樓 2018-07-29 10:41 科興科學園首席科學家
這是我寫的關於自動化部署企業jenkins實戰集成部署視頻教程,可以參考下https://blog.csdn.net/u012201811/article/details/81266370
#2樓[樓主] 2018-08-02 09:22 暴走小騷年
@ 科興科學園首席科學家
可以可以
用到了你寫的腳本!感謝
#4樓[樓主] 2018-08-30 14:56 暴走小騷年
@ 農夫山泉有點鹹
不客氣,互相學習!
#5樓 2018-09-12 20:33 憤怒的大鳥2016
cd ${DOCKERFILE_HOME} ;dockerfile麻煩能給出一下嗎?
#6樓[樓主] 2018-09-18 15:34 暴走小騷年
@ 憤怒的大鳥2016
# This dockerfile is for godseye app.
# Version 1.0
# Base images.
FROM tomcat:8.0.36-alpine
# Author.
MAINTAINER jkzhao <[email protected]>
# Add war.
ADD godseye.war /usr/local/tomcat/webapps/
# Define working directory.
#WORKDIR /usr/local/tomcat/bin/
# Define environment variables.
#ENV PATH /usr/local/tomcat/bin:$PATH
# Define default command.
CMD ["catalina.sh", "run"]
# Expose ports.
EXPOSE 8080