1. 程式人生 > >基於docker搭建jenkins+maven程式碼構建部署平臺

基於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安裝如下圖所示
    set01

set_02

set_03

  • 安裝“Deploy to container Plugin”外掛用於部署war程式
    在”系統設定—> 管理外掛—>可選外掛”中安裝

  • 新建任務構建部署
    新增svn原始碼地址、tomcat部署地址
    set_04

set_07

tomcat 部署配置,配置登入tomcat的賬號
set_06

set_08

通過ssh指令碼部署maven專案到指定Tomcat中

用以上方法在tomcat自帶的deployment實現部署對於伺服器效能消耗較大,經常會出現如記憶體溢位等問題,導致部署失敗。採用ssh指令碼部署的方式則方便快捷很多,對於記憶體消耗也沒有那麼多。

配置Publish Over SSH外掛

在”系統設定—> 管理外掛—>可選外掛”中安裝(Publish Over SSH)外掛,然後在“系統管理—>系統設定—>Publish over SSH”設定要釋出的linux伺服器的登入資訊,各項配置與具體含義如下圖所示。配置完成後,點選【Test Configuration】按鈕可測試是否連線上,如顯示“Success”則表示配置成功。

ssh登入

編寫部署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部署專案。
專案構建配置