百度百科裏給Jenkins的定義是,“持續集成軟件平臺+工具“,沒用Jenkins之前看不懂,用了之後還是看不到看不懂這個說法。
找到了Jenkins官網的解釋“The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project.“——提供上百款插件實現服務器的自動化工作(這裏的自動化指運維),包括構造應用(項目、服務、軟件工程),部署應用,和任何服務器相關功能實現的自動化,Jenkins是開源軟件,而且在這方面是走在領先地位的哦。
目前我用到Jenkins的功能是,集成maven、git,經過一些github、tomcat的配置,一鍵操作一鍵完成項目從github發佈到阿里雲服務器。Jenkins調用git的命令,拉github的項目,項目經過maven打包war文件,用tomcat的manager發佈到服務器。
Jenkins的優點
1. 省時間,每次發佈系統基本都是差不多的操作,對於急着看上線效果的你來說,簡直就是心急吃熱豆腐;
2. 發佈系統是個細緻活,容易出問題,就算你牛逼你仔細可以不出問題,這些精力用在別的地方豈不是更好;
3. Jenkins把構造、部署系統的流程抽象化,做每件事只需要關注當前的工作不必考慮上下游的東西,比如你的項目是從github拉下來的,只要考慮配置github的東西,不用考慮項目構建發佈;
4. Jenkins提供的插件有爲我們做了很多事,比如對接github,使用svn的命令完成項目拉取。我們沒辦法精通所有的構造、部署方法,更沒辦法知道所有冷知識,只需要我們提供一些參數,Jenkins就能爲我們做好應對那些應用(git、maven…)的工作,Jenkins簡直就是服務器界的瑞士軍刀啊。
安裝Jenkins
從Jenkins官網下載Jenkins的war包。
https://jenkins.io/download/
用終端登錄,可以用wget http://mirrors.jenkins.io/war/latest/jenkins.war
下載war包。
把jenkins.war放到tomcat根目錄下的/webapps。啓動tomcat,jenkins項目就算部署成功了,瀏覽器訪問 http://{ip}:{port}/jenkins 就能進入jenkins的初始化界面(初始的時候有個密碼,密碼寫在日誌,很容易找到的),初始化界面可以創建第一個用戶,安裝插件,。
文章的重點不是jenkins的部署,而且這個也挺簡單,就不貼圖了。
Github+Maven+Tomcat的發佈流程配置
Jenkins可以做很多事,下面說的是配置從Github拉去代碼,發佈到服務器的自動化過程。
首先,我們要把“硬件”層面的東西配好,Git、Maven和Tomcat的Manger,然後要準備好Github和Manger的賬戶信息,最後就可以配置整個流程了。
Git & Maven
安裝Jenkins的電腦或服務器上面要裝上Git和Maven,藉助他們可以用來拉Github、Gitlab的代碼,和構建war項目(不僅限於war)。如果是在Centos服務器上,安裝這兩個的工作就很簡單了
yum install git
yum install maven
yum是用來下載rpm文件的,rpm纔是真正Centos的安裝工具,rpm安裝的默認路徑如下
/etc 一些設置文件放置的目錄如/etc/crontab
/usr/bin 一些可執行文件
/usr/lib /usr/lib64 一些程序使用的動態函數庫
/usr/share/doc 一些基本的軟件使用手冊與幫助文檔
/usr/share/man 一些man page文件
查看所有安裝的軟件
[root@iZbp1aiejzadfq9do06acaZ bin]# rpm -qa
iwl6050-firmware-41.28.5.1-49.el7.noarch
iwl2030-firmware-18.168.6.1-49.el7.noarch
iwl105-firmware-18.168.6.1-49.el7.noarch
.......
查看軟件信息
[root@iZbp1aiejzadfq9do06acaZ bin]# rpm -qi yum-metadata-parser-1.1.4-10.el7.x86_64
Name : yum-metadata-parser
Version : 1.1.4
Release : 10.el7
.......
查看軟件安裝路徑
[root@iZbp1aiejzadfq9do06acaZ bin]# rpm -ql yum-metadata-parser-1.1.4-10.el7.x86_64
/usr/lib64/python2.7/site-packages/_sqlitecache.so
/usr/lib64/python2.7/site-packages/sqlitecachec.py
/usr/lib64/python2.7/site-packages/sqlitecachec.pyc
/usr/lib64/python2.7/site-packages/sqlitecachec.pyo
Tomcat Manager
tomcat也是有管理界面和接口的喲!!
通過管理界面和API,可以查看系統狀態信息和項目部署情況,還能發佈項目、刪除項目。
開啓這項功能很簡單,做兩個事就行。首先,開放manager的外網訪問權限,然後解鎖具有這些權限的role和user。
manager默認是開啓的,也有基本的賬號能登錄進去,但是部署在服務器上的tomcat就不能訪問了,在tomcat根目錄conf/Catalina/localhost
文件下創建文件manager.xml
,allow是允許訪問的IP。
<?xml version="1.0" encoding="UTF-8"?>
<Context privileged="true" antiResourceLocking="false" docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>
manager默認的roler和user都被關閉了,修改tomcat根目錄下conf/tomcat-user.xml
文件,如下:
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-status"/>
<user username="tomcat" password="111" roles="tomcat"/>
<user username="both" password="111" roles="tomcat,role1"/>
<user username="role1" password="111" roles="role1"/>
<user username="deploy" password="111" roles="manager-status,manager-gui,manager-script"/>
deploy用戶擁有管理部署項目的界面操作、api操作權限。
Github的Personal Access Token
通過Personal Access Token授權就可以訪問Github的接口。創建一個擁有repo和admin:repo_hook權限的token,Jenkins通過該token,調用Github的接口創建Webhooks。
上面的Token是屬於賬戶級的東西,Webhooks是項目級別的,當項目發生了某個事件,Github會給一個指定的url發Post請求。有了Webhoks,就不需要定時去拉Github的代碼,而讓Github主動通知。GitLab也有類似的機制。
萬事俱備,開始要配置Jenkins了!!!
Git和Maven,要在Global Tool Configuration全局工具配置好。
這裏貼出Git,Maven,JDK的配置,涉及到的name都只是名稱可以隨便填。
一般Home是安裝路徑的根目錄,而執行文件路徑只要該路徑下能訪問執行文件就行
系統管理->系統設置,可以配置一些Jenkins的基礎設置
下面的這個配置就是設置Github接口調用地址和認證方式的地方,
Credentials用secret test,雖然也可以用賬號密碼驗證,secrest test可以只授權部分功能開發,而且更不容易被盜取。secrest test創建如下,只需要把Github的Personal Access Token填入Secret就可以了。
Override Hook URL
是Github回調Jenkins的接口配置。
Shared secret
上面的Credentials是Github給Jenkins的驗證Token,shared secret是Jenkins給Github提供的驗證Token,在Github的Personal Access Token創建那的secret就是填這個。原理差不多,整一個長一點的字符串就行。
上面做的是全局配置,接下來可以開始創建Jenkins工程了!!!
這裏我們創建的是Maven項目,關於其他項目還沒探索過,後續可能會有文章喲。
如果你沒看到下面的界面,那應該是搞錯項目類型了。
maven項目的配置如下:
1. 設置git從哪拉代碼,和拉去的分支(工作區可以查看代碼)
2. “GitHub hook trigger for GITScm polling”以前叫做“Build when a change is pushed to GitHub”,Github Plugin插件改了這個設置的名稱。這Webhooks的設置雖然是在這開啓,但是賬號卻是全局維護的,雖然有點摸不着頭腦,大概設計者考慮到不同項目用的是同一個Github賬號,這樣可以避免Webhooks重複設置。
3. Maven的構建語句
這裏需要額外提下pom.xml文件,即使Maven可以正常跑起來,pom.xml沒配好,還是會出問題的。下面是筆者可以正常發佈的pom.xml。
<project>
<properties>
<tomcat.version>8.5.9</tomcat.version>
<java.version>1.8</java.version>
.....
</properties>
<dependencies>
.....
</dependencies>
<build>
<!-- 生成war文件的文件名 -->
<finalName>unitools</finalName>
<plugins>
<!-- 生成war文件的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<!-- 忽視單元測試錯誤異常 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
<!-- 生成war過程需要整合項目依賴的包 -->
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 打war包是個java文件編譯的過程,當然是要指定jdk信息的-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
<!-- 有些項目用eclipse生成war可以運行,用maven確不可以。eclipse記錄了所有文件的發佈路徑,maven單獨用的時候,需要配置好資源文件的發佈路徑喲 -->
<resources>
<resource>
<directory>src/main/resourse</directory>
<includes>
<include>**/**</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
- 配置tomcat發佈信息
這裏的賬號信息來自Tomcat manager。這裏說兩個要注意的點:WAR/EAR files的路徑是相對路徑,相對的是Jenkins的工作區,maven默認會打在target文件下,如果pom.xml沒配<finalName></finalName>
,要小心哦!;Context path是項目發佈的名稱,也就是url訪問的名稱。