操作環(huán)境
OS centos7.3
JDK jdk1.8
maven maven3
當(dāng)然這篇文章的前提是你已經(jīng)在服務(wù)器上安裝部署了jenkins,如果沒有可以看我的另一篇文章
http://www.itdecent.cn/p/ebeebcb8aafb
首先列出所用到的所有命令,并予以解釋
#jenkins 啟動
systemctl start jenkins
#jenkins 停止
systemctl stop jenkins
#jenkins 重啟
systemctl restart jenkins
#更改相關(guān)jenkins服務(wù)文件后 需要執(zhí)行重新加載服務(wù)的命令
systemctl daemon-reload
#創(chuàng)建系統(tǒng)用戶命令
useradd username
#更改文件夾組權(quán)限
chown -R username:username xxx
進(jìn)入正文
步驟: 安裝必要的插件 => 設(shè)置jenkins全局變量 => 更改運行用戶 => 創(chuàng)建任務(wù) => 配置任務(wù) => 編寫shell腳本 =>Run
1、 安裝必要插件
直接運行jenkins后,打開http:/你的IP:設(shè)置的端口/pluginManager/ 即 系統(tǒng)管理 => 管理插件

在搜索框分別輸入,有如下作用的插件進(jìn)行安裝
#maven編譯插件
Maven Integration
#構(gòu)建后腳本執(zhí)行插件
PostBuildScript Plugin
#subversion插件
Subversion Plug-in
2、 設(shè)置jenkins全局變量
jenkins在創(chuàng)建任務(wù)時需要一些全局變量 對應(yīng)svn地址的svn賬號密碼 JDK路徑 maven路徑
此項可以留到配置任務(wù)環(huán)節(jié)再進(jìn)行
3、更改jenkins在操作系統(tǒng)運行的用戶
這一步是為了為后面編寫shell腳本,提供足夠的權(quán)限;提高系統(tǒng)安全性。
#使用useradd命令創(chuàng)建一個系統(tǒng)用戶
useradd userjs
#停止jenkins服務(wù)
systemctl stop jenkins
# 打開配置文件
$ vi /etc/sysconfig/jenkins
# 修改$JENKINS_USER變量為userjs
JENKINS_USER="userjs"
#修改Jenkins相關(guān)文件夾用戶權(quán)限(必須修改)
$ chown -R userjs:userjs /var/lib/jenkins
$ chown -R userjs:userjs /var/log/jenkins
$ chown -R userjs:userjs /var/cache/jenkins
#更改相關(guān)jenkins服務(wù)文件后 需要執(zhí)行重新加載服務(wù)的命令(這一步非必須得視情況而定)
systemctl daemon-reload
#jenkins 啟動
systemctl start jenkins
4、 創(chuàng)建任務(wù)
在瀏覽器打開你的jenkins界面,點擊左側(cè)的 新建任務(wù) 進(jìn)入新建任務(wù)頁

輸入任務(wù)名稱(最好英文)
點擊 構(gòu)建一個maven項目
點擊確定按鈕
創(chuàng)建任務(wù)完成
5、配置任務(wù)
在配置任務(wù)界面可以看到一排tab切頁

這里紅色箭頭的都是重點關(guān)注的,其他先可以不用關(guān)注
下面就開始一步步配置
①General

②源碼管理

這個地方需要注意了,如果你是第一次配置的話,需要在c步驟點擊按鈕去另外的界面添加,你要拉取的項目的svn賬號密碼信息

然后,在b步驟里面選擇你剛剛添加的那個條目
③Build
構(gòu)建這個環(huán)節(jié)是比較重要的,這里我們分兩種類型的示例
a:單模塊項目 b多模塊聚合項目
b:整個項目就一個pom.xml文件
b:整個項目有多個pom.xml文件 通常的文件構(gòu)造如下

分情況配置
a

b

這里只需要配置 聚合項目的父級pom即可,因為父級項目里面指定了其他模塊,所以maven會按照pom指定的順序去編譯
④構(gòu)建后操作



現(xiàn)在我們還沒寫腳本,所以,可以先寫一個路徑例如/opt/script/test.sh
6、編寫shell腳本*****重點
現(xiàn)在相當(dāng)于準(zhǔn)備好了前4步,滴5步只有一半
準(zhǔn)備好了前4步,就相當(dāng)于 我們在利用jenkins 在服務(wù)器/var/lib/jenkins/workspace/你的項目名
拉取了一個svn項目 ,并且,利用maven編譯 先后執(zhí)行了 mvn clean 和mvn install 生成了xxx.war文件
需求點
在這一步我們要做的事情是,將這個新生成的war文件放到服務(wù)器上指定的tomcat下面,然后啟動tomcat服務(wù)器,完成自動部署
首先我們來用文字分解一下這個步驟,再進(jìn)行腳本的編寫
①停止正在運行中的tomcat
停止tomcat相信大家都會,但是由于各種原因tomcat原生的shutdown.sh可能經(jīng)常不能關(guān)閉掉tomcat自己本身,所以需要我們?nèi)ゼ狱c料,詳細(xì)見我的另一篇文章http://www.itdecent.cn/p/39a2da8db269
②將jenkins工具幫我們生成的war放到指定的tomcat下
這一步又可以分解一下,因為tomcat下是會有舊war的存在,這就需要我們?nèi)浞葸@個,然后再刪除,最后換新:
a.將原有war移動到指定的目錄下備份,一般存一份即可
b.刪除舊war
c.將新生成的war移動到tomcat webapps下
③啟動tomcat
執(zhí)行tomcat的startup.sh
好的,正常情況下就是這些步驟了,但是按照這個寫的腳本可不一定能夠正常實現(xiàn)我們的訴求
重要 可能會出現(xiàn)的情況
以我們現(xiàn)在配置的userjs用戶的權(quán)限,可能不能去執(zhí)行我們寫的腳本,理由很簡單 這個用戶沒有權(quán)限,當(dāng)然給他放大一些權(quán)限也是可以的,但是我們生產(chǎn)環(huán)境肯定不能這么做的,我們需要一個解決方案,讓我們這個用戶暫時對某些文件擁有超級權(quán)限
說的有點多了,接下來開始放上我的腳本
#!/bin/sh
sh /usr/local/tomcat8/bin/shutdown.sh
echo "執(zhí)行完tomcat8關(guān)閉?。?!"
cp /var/lib/jenkins/workspace/xxx/target/xxx.war /usr/local/tomcat8/webapps/
if [ -f "/usr/local/tomcat8/webapps/xxx.war" ];then
echo "xxx.war到/var/tomcat8_bak/"
\cp /usr/local/tomcat8/webapps/xxx.war /opt/tomcat8_bak/
if [ -d "/usr/local/tomcat8/webapps/xxx/" ];then
rm -rf /usr/local/tomcat8/webapps/xxx/
rm -rf xxx.war
echo "已刪除tomcat下xxx相關(guān)"
else
echo "tomcat下沒有xxx相關(guān)"
fi
else
echo "xxx.war文件不存在不能正常備份"
if [ -d "/usr/local/tomcat8/webapps/xxx/" ];then
rm -rf /usr/local/tomcat8/webapps/xxx/
echo "已刪除tomcat下xxx相關(guān)"
else
echo "tomcat下沒有xxx相關(guān)"
fi
fi
sh /usr/local/tomcat8/bin/startup.sh && tail -f /usr/local/tomcat8/logs/catalina.out
這個文件就可以實現(xiàn)將新生成的war放到指定tomcat下,備份舊war
接下來還有最后一件很重要的事情
為jenkins的宿主用戶userjs指定可以運行我們這個腳本的超級權(quán)限
#給予我們這個userjs 運行我們腳本的所有權(quán)限
#進(jìn)入sudo編輯文件
visudo
#添加如下內(nèi)容 寫上你腳本的路徑,兩個腳本的話用逗號隔開注意中英文切換,一個腳本的話只取第一個逗號之前的內(nèi)容
##jenkins
userjs ALL=NOPASSWD: /opt/tomcat1.sh,NOPASSWD: tomcat2.sh,
OK,還有最后一步 將我們寫好的sh配置到第5步的構(gòu)建后腳本路徑那里,內(nèi)容為
sudo /opt/tomcat1.sh
7、Run
點擊立即構(gòu)建 左下角就會出現(xiàn)進(jìn)度條 點擊進(jìn)度條旁邊的查看控制臺信息,就能看到腳本輸出的信息
