=== update 20160915,今天一晚上耗在了這上面,原本是在新的台式機上插件安裝明顯是有問題(插件查詢頁面全都沒有反應),后來在虛擬機上安裝 docker 鏡像直接顯示“This Jenkins instance appears to be offline. ”,以為是虛擬機聯網有問題(但 ping 百度是正常的),在 aliyun 的主機上安裝也是同樣的錯誤,然后在本地卸載后重新安裝竟然也顯示 offline 了。然后才驚覺也許是聯網有問題??打開 vpn 后發現真的是可以安裝插件了,這種問題耗費時間確實不該啊。(上次在筆記本上配置時很正常,也許是當初開着 vpn 的,要么就是這一段時間之內 GFW 把 Jenkins 的插件網站給封了??)
另按照建議安裝插件后,請單獨再安裝 “Deploy to container Plugin” 以及 “Maven Integration plugin”。
項目環境搭建 -- 后端
主要內容:Intellij+SpringMVC+Docker_tomcat+Jenkins_CI
聲明
這節博客有些“碎碎念”,主要是今晚不准備寫新的程序,如果想要節省時間,請直接參考下面的三/四篇文章:
使用IntelliJ IDEA開發SpringMVC網站(一)開發環境
Docker自動部署Apache Tomcat,文末有原文鏈接。
jenkins+maven+svn構建項目,及遠程部署war包到tomcat上
比第三篇更詳細一些的:
「Jenkins+Git+Maven+Shell+Tomcat持續集成」經典教程
非常感謝原作者們。
緣由
本項目(可看做原要求的一種形式,即以小組形式完成),簡單地說,以小組方式完成一個“小學生四則運算程序”,題目來源於鄒欣的構建之法 中 1.1 節程序員阿超與學校老師的故事(莫名地想到了漁夫與金魚),使用 Java Web 來做乍看起來可以說是有些“太重了”,但要做到整個小組都參與進來,並沒有其他特別好的方法(如果有的話,請告訴我 :>)。
當然,因為需求有變化的可能,所以使用較為成熟的技術還是有更多保障的。
另外,組員們都沒有正式做過類似的項目,而今年另一門課程“軟件開發基礎”也會講到 Java 開發(Design Patterns 等),可以說使用 Java 開發算是一舉多得。
如此可以將整個項目分為前端與后端兩部分,本文記錄一下后端的環境搭建。
真正的緣由
本科學 Java 時因為受到類似於 Java “執行慢”、“笨重”、“有重大設計缺陷”等等說法的誤導以及在課上沒有跟上老師飛快的講授節奏還有自己的懶惰,所以學得很不好。可是后來發現其實現實中 Java 能做的東西是非常多的,所謂執行效率,就目前的硬件來說,除非在特定領域(圖像、視頻處理,硬件控制,高時序要求等)並不會那么明顯。其他的諸多好處就不再贅述。
開發環境
Intellij 是目前最好的 Java 開發環境(如有異議,請把它當作“PHP 是最好的編程語言”)
The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.
算是目前業界正在廣泛使用的框架,當然,還是應該有數據持久化框架的,不過這個先不介紹(Hibernate 與 Mybatis 還沒確定使用哪個)。
請移步 使用 IntelliJ IDEA 開發 SpringMVC 網站(一)開發環境,建議一步步看下去,非常好。
... ... ... >>> <<< >>>
大概需要半個多小時對應着搞完。
其實開發環境的配置就結束了 ~
當然,在后面你可能需要一台機器上啟動多個 Tomcat,由於原博客有遷移的跡象,現復制如下。
如果需要在一台機子上啟動多個Tomcat服務器,在默認設置下肯定會發生端口沖突。為實現這個效果,只需修改conf子目錄中的server.xml文件即可。共需修改三處:
(1).修改http訪問端口(默認為8080端口):
(2).修改Shutdown端口(默認為8005端口):
(3).修改JVM啟動端口(默認為8009端口):
然后,也許還需要看一下 intellij 熱部署的方式,這里不再給出鏈接。
部署
從很久之前就非常、非常、非常討厭重裝系統,進行各種配置沒有太大問題,但時隔一年半載再次配置就無法忍受了。所以,對虛擬化一直很感興趣,裝過無數虛擬機。在看到 docker 后無比興奮,目前的想法是如何把每個 windows 程序做成類似於此,不再為重裝或遷移系統而費腦筋(打包軟件 Cameyo 並不好用)。
與上面類似,還是推薦一篇文章:
寫的非常好,不過我還是要進行一些更新。
本人使用的是 tomcat8.
1.tomcat-users.xml 中
<role rolename="manager-gui"/>
<role rolename="manager-gui"/>
很明顯是重復的,根據原文件(tomcat 解壓后的 tomcat-users.xml)的說明以及在不進行配置嘗試在網頁頁面進入“Manager App”按鈕,並選擇取消,會發現有建議的更改方式,具體如下:
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="yourusername" password="yourpassword" roles="manager-gui,manager-script,manager-jmx,manager-status"/>
</tomcat-users>
2.原 Dockerfile 中 ADD settings.xml /usr/local/tomcat/conf/
並不太清楚是為何,所以,不再添加。
3.想要遠程部署,需要添加 manager.xml 到指定目錄,反映到 Dockerfile 就是添加:
ADD manager.xml /usr/local/tomcat/conf/Catalina/localhost/
具體的,可以參見我寫好的一個 dockerfile。
遠程部署與持續集成
Tomcat 按前面 docker 容器構建即可。
想要持續集成與遠程部署,這里選擇 Jenkins,因為 VPS 有限,所以部署在本地(官方提供了 docker)。
參見教程:
jenkins+maven+svn構建項目,及遠程部署war包到tomcat上
以及
「Jenkins+Git+Maven+Shell+Tomcat持續集成」經典教程。
事實證明很爽,畢竟是只需將代碼提交到 github 便可以自動編譯部署。我的一個 demo。
使用 jenkins docker 鏡像的一些說明 [Update 20160916]
對於 docker 鏡像(這里特指 jenkins:2.7.4-alpine,其余的應該都是差不多,畢竟諸多構建工具的版本那么多,不會給定死的),還需要選擇安裝 maven(官方的鏡像中安裝了 git 以及 openjdk,但是 Maven、Gradle、Ant 均未安裝),其實“安裝”很簡單,我們只是提供一個“名字”罷了,以安裝 Maven 為例:
(主頁面)系統管理 -> Global Tool Configuration -> Maven 安裝 -> 新增 Maven
會看到 “Name” 欄為空,我們只需給出一個名字即可,比如說 “mvn3.3.9”(此時 Apache 提供的是 3.3.9 版本),下面的自動安裝的來源看着選即可。
但是,這樣還不行,會發現源代碼更新后出現:
ERROR: Failed to parse POMs
java.io.IOException: Cannot run program "/bin/java" (in directory "/var/jenkins_home/workspace/***"): error=2, No such file or directory
直接 sudo docker run -it jenkins:2.7.4-alpine /bin/sh
進去后執行 /bin/java
出現 /bin/sh: /bin/java: not found
,所以還需要對 java 進行配置。仍舊是上面修改 maven 的頁面,把 JDK 對應的 JAVA_HOME
改為 /usr/lib/jvm/java-1.8-openjdk
(見 openjdk:8-jdk-alpine)內的設置。
總結一下,使用 Jenkins 總歸是要配置 JDK,Maven,Git 等的,不管是在本地還是 Docker 上。
Deploy war/ear to a container 的小技巧
其中有一個要填的內容 Context path
,假如說在本地運行時(Intellij)的 url 為 http://localhost:9000/youareawesome
那么在 Context path
填任何非空的東西,比如說 aa
或者 \aa
那么在調用時只能是 http://yourRemoteIp:9000/aa/youareawesome
會注意到在 url 中生硬的多出了 aa
,那么什么都不填呢?會發現 aa
得換成你的工程名才能訪問,比如說你和我一樣使用的上面說到的 webapp 的模板,那么得訪問 http://yourRemoteIp:9000/webapp/youareawesome
才好。這些我們都不喜歡,其實只要填入 \
即可,想必這也容易理解。