基於docker搭建jenkins+maven程式碼構建部署平臺
由於專案開發,經常需要在本地搭一些環境進行開發或測試,大家知道搭環境、裝軟體、裝中介軟體是件非常麻煩的事情,有些軟體的安裝可能需要依賴其它環境的安裝,如安裝rabbitmq首先需要Erlang語言環境,一整套安裝下來不僅浪費時間而且還各種問題出現,嚴重影響開發進度。對於開發者來講,life is short, 盡一切可能提高開發效率。
Docker的出現對於技術界無疑是一件劃時代的事件,Docker由於具體豐富的應用映象倉庫、使用方便及可移植性而深受廣大IT從業人員喜愛。用Docker部署或安裝相應的應用不用花太多時間在安裝過程及細節、依賴上,真正做到開箱即用。本文以jenkins的搭建為例,說明Docker的基本操作過程:拉取映象、執行容器、檔案掛載、跟蹤執行、關閉容器等,希望對剛入門Docker的技術愛好者能有所幫助。
Docker基本概念
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上。其實Docker最經典的是那張“背有集裝箱的海豚”圖,這張圖充分說明了docker引擎與容器之間的關係。
掌握映象、容器、倉庫基本就對Docker瞭解得差不多了,就能正確的使用Docker.
- 映象:可以理解為應用的“原始碼”或
.exe
安裝檔案; - 容器:就是映象執行後的例項,與映象的關係其實就如“物件”與“類”的關係;
- 倉庫:釋出映象的倉庫,在倉庫中可以下載或拉取各種映象(應用)
而Docker則是一個容器執行所需要的引擎,所有的容器均執行在引擎之中。
Docker安裝過程(Centos6.9)
升級核心
Centos6.9需要升級核心版本才可以安裝Docker,升級過程如下
1.引入key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
2.yum安裝
yum --enablerepo=elrepo-kernel -y install kernel-lt
3.引導檔案修改(grub.conf
)
vim /etc/grub.conf
將 default 設定為 0 ,default=0
4.重啟安裝docker-io
1.安裝EPEL源
yum install http://mirrors.yun-idc.com/epel/6/x86_64/epel-release-6-8.noarch.rpm
2.安裝docker-io
yum -y install docker-io
3.啟動docker服務
service docker start
基於Docker的jenkins安裝
- 拉取應用
執行容器/例項之前,需要從docker hub倉庫中拉取相應的映象,可檢視官網關於jenkins映象上的一些介紹,其中對於安裝命令、配置資訊及檔案目錄都有於詳細的說明。
從倉庫中拉取最新的jenkins,docker pull jenkins
,拉取其它版本的可通過命令docker pull jenkins:<version>
- 執行容器
執行容器/例項,需要考慮到本地埠與docker容器的對映,以便通過本地主機可以訪問。由於容器本身並不會持久化檔案,其實docker不建議在容器中進行任何檔案有關的寫入操作,僅僅當作一個“容器”使用。如果容器應用執行過程中會產生許多重要的資料需要儲存或配置,如mysql的db檔案,jenkins的外掛、配置檔案等,則建議將容器的檔案掛載到本地,也即volume對映。
docker run -p 8080:8080 -p 50000:50000 -v /usr/local/docker_volume/jenkins:/var/jenkins_home -v /usr/local/apps/maven-3.3.9:/var/maven_home -v /usr/local/apps/maven-3.3.9/repo:/usr/local/apps/maven-3.3.9/repo --name my_jenkins -d jenkins
其中-p表示埠對映,即將本機上的埠對映到容器上的埠;
-v表示檔案對映,即本機與容器共享對映,掛載檔案
注意:由於jenkins構建maven專案需要依賴maven專案,因此在執行容器的時候將本機的maven_home共享給容器。由於容器執行時需要在本機共享檔案中寫入,需要寫許可權,sudo chown -R 1000:1000 /usr/local/docker_volume/jenkins
sudo chown -R 1000:1000 sudo chown -R 1000:1000
執行以上命令,視窗會列印容器id,通過docker ps
可檢視執行的容器狀態及相關資訊。
跟蹤應用log
輸入docker logs <CONTAINER ID>
即可跟蹤容器列印日誌,初次啟動jenkins會在日誌中列印密碼,複製後用於登陸jenkins.關閉開啟容器
關閉:docker stop <CONTAINER ID>
開啟:docker start <CONTAINER ID>
tomcat賬戶配置
本例將maven編譯後的war部署到遠端tomcat,因此需要在tomcat中設定部署許可權,編輯/con/tomcat-users.xml
配置檔案,加入賬戶
<role rolename="tomcat"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="admin" roles="admin,manager,tomcat,manager-gui,manager-script,manager-jmx,manager-status"/>
<user username="root" password="admin" roles="admin,manager,tomcat,manager-gui,manager-script,manager-jmx,manager-status,admin-gui"/>
配置jenkins,構建部署war應用
至此,通過訪問http://本機ip:8080
即可訪問到jenkins平臺,選擇預設安裝外掛,安裝成功後選擇設定賬號等.
- 配置JDK、Maven等引數
在 “系統設定—> Global Tool Configuration”中新增JDK安裝如下圖所示
安裝“Deploy to container Plugin”外掛用於部署war程式
在”系統設定—> 管理外掛—>可選外掛”中安裝新建任務構建部署
新增svn原始碼地址、tomcat部署地址
tomcat 部署配置,配置登入tomcat的賬號
通過ssh指令碼部署maven專案到指定Tomcat中
用以上方法在tomcat自帶的deployment實現部署對於伺服器效能消耗較大,經常會出現如記憶體溢位等問題,導致部署失敗。採用ssh指令碼部署的方式則方便快捷很多,對於記憶體消耗也沒有那麼多。
配置Publish Over SSH外掛
在”系統設定—> 管理外掛—>可選外掛”中安裝(Publish Over SSH)外掛,然後在“系統管理—>系統設定—>Publish over SSH”設定要釋出的linux伺服器的登入資訊,各項配置與具體含義如下圖所示。配置完成後,點選【Test Configuration】按鈕可測試是否連線上,如顯示“Success”則表示配置成功。
編寫部署ssh指令碼
將以下shell指令碼deploy.sh
存放在伺服器的/home/admin/data
目錄下並給予執行許可權chomd +x deploy.sh
,即上圖ssh登入配置圖中的Remote Directory
目錄下。這樣配置表示jenkins登入到tomcat所在的linux伺服器後可用./deploy.sh
執行部署操作。如果demploy.sh
放在其它目錄,則用絕對路徑/..dir../..dir../deploy.sh
來執行即可。
#!/bin/bash
# 檔案:set ff=unix
#defined
export JAVA_HOME=/usr/local/java
# tomcat部署位置
TOMCAT_HOME="/home/admin/data/tomcat-jenkins"
# 登入後的伺服器使用者目錄,與上圖配置的Remote Directory設定相同
LOGIN_HOME="/home/admin/data"
TOMCAT_PORT=10092
PROJECT="$1"
#param validate
if [ $# -lt 1 ]; then
echo "you must use like this : ./deploy.sh <projectname> [tomcat port] [tomcat home dir]"
exit
fi
if [ "$2" != "" ]; then
TOMCAT_PORT=$2
fi
if [ "$3" != "" ]; then
TOMCAT_HOME="$3"
fi
#shutdown tomcat
#"$TOMCAT_HOME"/bin/shutdown.sh
#echo "tomcat shutdown"
#check tomcat process
#tomcat_pid=`/usr/sbin/lsof -n -P -t -i :$TOMCAT_PORT`
tomcat_pid=`ps -ef | grep $TOMCAT_HOME | grep -v 'grep\|tail\|more\|bash\|less'| awk '{print $2}'`
echo "current :" $tomcat_pid
while [ -n "$tomcat_pid" ]
do
sleep 5
tomcat_pid=`ps -ef | grep $TOMCAT_HOME | grep -v 'grep\|tail\|more\|bash\|less'| awk '{print $2}'`
echo "scan tomcat pid :" $tomcat_pid
if [ -n "$tomcat_pid" ]; then
echo "kill tomcat :" $tomcat_pid
kill -9 $tomcat_pid
fi
done
#publish project
echo "scan no tomcat pid,$PROJECT publishing"
rm -rf "$TOMCAT_HOME"/webapps/$PROJECT
cp "$LOGIN_HOME"/war/$PROJECT.war "$TOMCAT_HOME"/webapps/$PROJECT.war
#bak project
#BAK_DIR=/home/web_as/war/bak/$PROJECT/`date +%Y%m%d`
#mkdir -p "$BAK_DIR"
#cp "$TOMCAT_HOME"/webapps/$PROJECT.war "$BAK_DIR"/"$PROJECT"_`date +%H%M%S`.war
#remove tmp
rm -rf "$LOGIN_HOME"/war/$PROJECT.war
#start tomcat
"$TOMCAT_HOME"/bin/startup.sh
echo "tomcat is starting,please try to access $PROJECT conslone url"
專案構建配置
參照下圖儲存配置後,即可構建maven專案,jenkins會複製編譯後的war專案到192.168.1.12
伺服器對應的tomcat路徑下,然後啟動Tomcat部署專案。