背景:
項(xiàng)目采用springboot框架,用gradle構(gòu)建,版本管理使用git
本文目的:
1 使用Jenkins從git服務(wù)器拉取代碼并打war包
2 構(gòu)建后Jenkins通過執(zhí)行腳本,build出tomcat的docker的鏡像并啟動應(yīng)用
步驟:
1 基礎(chǔ)環(huán)境,jdk,gradle安裝省略
2 Docker安裝參考官網(wǎng):?docker安裝文檔
3 Jenkins安裝下載?Jenkins官網(wǎng)下載
?Jenkins其實(shí)是個web應(yīng)用, 建議下載war包版本的Jenkis,其他版本的本質(zhì)上就是war包. war包直接放到宿主機(jī)的tomcat等容器中運(yùn)行即可,如果不想安裝tomcat,可以使用jdk自帶(jdk7以上)的命令來啟動:
java -jar jenkins.war --httpPort=9090 --prefix=/jenkins
以上命令啟動后,訪問Jenkins地址:http://宿主機(jī)IP:9090/jenkins
根據(jù)提示輸入admin密碼,密碼查看位置:/用戶目錄/.jenkins/secrets/initialAdminPassword
輸入admin密碼后,會提示創(chuàng)建新用戶,安裝一些插件,可選擇前面一個選項(xiàng),安裝一些標(biāo)準(zhǔn)插件(這一步進(jìn)入Jenkins后也可以自己增加需要的插件)等,按照提示操作即可
4 項(xiàng)目配置
正常的springboot,gradle的工程結(jié)構(gòu),但是需要在工程根目錄增加Dockerfile 文件(無擴(kuò)展名),提交到git
Dockerfile文件內(nèi)容如下:
FROM tomcat:8 #使用tomcat 8
MAINTAINER whl
ENV REFRESHED_AT 2017-9-18
RUN rm -rf /usr/local/tomcat/webapps/myproj/* #刪除原先部署的文件
COPY build/libs/myproj-0.0.1-SNAPSHOT.war /usr/local/tomcat/webapps/myproj/ #將構(gòu)建出來的war包復(fù)制到部署目錄,這里我放在了tomcat的webapps下面 ,因?yàn)槊钍窃趈enkins中該項(xiàng)目的工作目錄下執(zhí)行,打包后的文件在build/libs下,因此拷貝使用相對路徑即可 ,這里是將宿主機(jī)的文件拷貝到容器中
RUN cd /usr/local/tomcat/webapps/myproj ; unzip myproj-0.0.1-SNAPSHOT.war #進(jìn)入容器的目錄,解壓war包,個人習(xí)慣這種方式
EXPOSE 8080 #暴露8080端口
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh", "run" ] #啟動tomcat
5 Jenkins配置
登錄Jenkins,在上一步安裝了標(biāo)準(zhǔn)插件的基礎(chǔ)上,進(jìn)入系統(tǒng)管理->管理插件,安裝插件 Hudson Post build task
點(diǎn)擊"新建"
選擇自由風(fēng)格項(xiàng)目,輸入名稱后點(diǎn)擊保存
輸入git的地址,點(diǎn)擊add按鈕來添加訪問git需要的用戶密碼信息
在構(gòu)建標(biāo)簽中選擇gralde方式
輸入要執(zhí)行的命令,下圖輸入war,等于執(zhí)行 gradle war 命令進(jìn)行打包
在構(gòu)建后操作標(biāo)簽中,選擇post build task(依賴于上面安裝的插件Hudson Post build task)
Logtext 輸入見下圖,不能輸入別的,因?yàn)樯弦徊綐?gòu)建成功輸出的就是 BUILD SUCCESSFUL
也就是說,這一步依賴于構(gòu)建是否成功,構(gòu)建成功才會執(zhí)行腳本
script中可以直接輸入腳本,也可以運(yùn)行指定的sh腳本,建議將要執(zhí)行的腳本寫到sh文件中,如果將多行腳本直接填寫在這里,會出現(xiàn)一行執(zhí)行失敗,就不再執(zhí)行后續(xù)其他腳本的問題
這里我們再build docker image的時候,設(shè)置一個我們自己的唯一的tag,比如
docker build -t whl:mytag . ?目的是后續(xù)停止容器,刪除image的時候用grep來查找
網(wǎng)上很多教程都是很暴力的把docker中所有的容器都刪除,這個在實(shí)際生產(chǎn)中顯然是不行的
本例中docker.sh執(zhí)行的就是docker的相關(guān)命令,內(nèi)容如下:
docker ps -a|grep mytag | awk '{print $1}'|xargs docker kill # kill掉已經(jīng)啟動的這個工程的容器,根據(jù)tag來查找,防止誤殺其他容器
docker ps -a|grep mytag | awk '{print $1}'|xargs docker rm #刪除掉相關(guān)容器,也根據(jù)tag查找,防止誤刪其他項(xiàng)目的docker
docker images|grep mytag | awk '{print $3}'|xargs docker rmi #刪除已經(jīng)存在的容器,同樣根據(jù)我們的tag來查找
docker build -t whl:mytag . ?#build新的image,設(shè)置為我們自己的唯一tag,注意這行結(jié)尾有個"點(diǎn)",表示讀取當(dāng)前目錄的Dockerfile,也就是前面我們放在項(xiàng)目根目錄的文件
docker run -d -v /resource:/resource? -p 8081:8080 whl:mytag #啟動容器,綁定端口,共享需要的目錄
點(diǎn)擊立即構(gòu)建后,會出現(xiàn)下圖構(gòu)建進(jìn)度,點(diǎn)擊 15 進(jìn)去可以看構(gòu)建過程詳情
點(diǎn)擊 Console Output,可以看到日志輸出
這里輸出的 BULD SUCCESSFUL 就是我們構(gòu)建后執(zhí)行腳本的前置條件
后續(xù)就是執(zhí)行docker相關(guān)的命令輸出
成功后打開瀏覽器訪問 http://127.0.0.1:8081/myporj 可以看到你自己的工程啟動了.
工程啟動過程中有錯誤就不在本文討論范圍了