1. 程式人生 > >Jenkins+Docker+gitlab自動化整合環境

Jenkins+Docker+gitlab自動化整合環境

隨著DevOps理念和敏捷理念的發展,我們希望通過自動化技術,加快專案的迭代。尤其是當使用微服務方案後,面臨在大量的專案構建和部署工作,藉助於jenkins的持續整合,可以快速把應用打包成docker映象,實現自動部署。

持續整合.png

如圖演示了以下的場景:

  • 開發者向自己的gitlab網站提交了程式碼
  • jenkins通過定時任務檢測到了程式碼有變成,執行自動化構建過程
  • jenkins在自動化構建指令碼中呼叫docker命令將構建好的映象push 私有映象註冊中心
  • 同時,jenkins也可以直接執行remote shell啟動構建好的容器
  • 構建失敗或者成功,可以及時將結果推送給相關人員,比如測試人員,安排測試
  • 服務端可以手動通過docker命令,從映象倉庫中心拉取映象,進行手動部署

我搭建的環境都是在本地,gitlab、jenkins、docker私有倉庫都部署在本地,以下是操作步驟:

搭建docker私有倉庫

使用docker拉取registry映象,然後啟動容器

docker run -d -p 5000:5000 -v ~/docker-registry:/tmp/registry registry

這樣就可以在本地執行一個私有映象註冊中心,通過映象名稱字首127.0.0.1:5000可以將映象推送到這個地址

搭建gitlab

拉取gitlab映象,並啟動

docker pull gitlab/gitlab-ce
sudo docker run --detach \
--hostname gitlab.bill.com \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume ~/gitlab/config:/etc/gitlab \
--volume ~/gitlab/logs:/var/log/gitlab \
--volume ~/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest

因為部署在本地,又指定了gitlab.bill.com作為域名,所以在/etc/hosts配置下,這樣可以通過域名訪問gitlab。

127.0.0.1 gitlab.bill.com

初次登入可以修改密碼,或者重新註冊一個使用者,我註冊了一新使用者,並在gitlab中建立了一個demo專案

demo.png

建立了一個空專案後,然後根據github上的提示,將本地的git專案推送到gitlab

Gitlab_http.png

上傳完後Gitlab專案如下:

Demo sourcecode.png

搭建jenkins

安裝jenkins
使用docker 下載jenkins映象 jenkinsci/jenkins,並啟動

docker run -d \
-p 8080:8080 \
-p 50000:50000 \
--name jenkins \
--link gitlab:gitlab.bill.com \
-u root \
-v ~/jenkins:/var/jenkins_home  \
-v /usr/share/maven:/usr/local/maven \
-v /usr/lib/jvm/jdk1.8:/usr/local/jdk 
jenkinsci/jenkins:latest

8080埠是jenkins的埠,5000埠是master和slave通訊埠(沒錯,jenkins可以部署叢集,在本次中沒有配置)
並將宿主機maven和jdk對映到對應的容器目錄上,同時通過配置--link連線gitlab,因為要從gitlab下程式碼。

初次啟動的時候,可以通過docker logs -f jenkins檢視控制檯的密碼,通過這個密碼登入系統,執行建立使用者等操作

安裝外掛
啟動專案後,下載所需的外掛(尤其要下載Git Plugin和Maven Intergration Plugin外掛),如果缺少Maven Integration Plugin外掛,在建立job時,不會有新建一個maven專案選項

jenkins plugin.png

注意:在Global Tool Configuration中配置Maven和Jdk,按道理可以配置通過配置JAVA_HOME 和MAVEN_HOME,分別指向/usr/local/jdk,/usr/local/maven,但是通過測試JAVA_HOME生效了,但MAVEN_HOME沒成效,提示說沒有找到maven,所以又通過自動化安裝重新配置了maven

自動安裝maven.png

配置專案
新建一個專案,輸入專案名稱demo,並選擇Maven project,然後在配置中做如下配置:

General Info.png

Source Code Management.png

Build Triggers.png

每隔5檢查是否有新程式碼釋出,如果有則自動執行構建

Pre Steps.png

Build Settings.png

點開專案,點選左側選單build now則立馬開始一次構建,點開當前構建資訊,左側Console Output中,可檢視構建的明細

Console Output.png

整合docker部署

在上述的命令中,基本完成整合,但是還沒有使用docker,構建的jar包也無法推送到測試環境或者生產環境,我們可以通過如下思路解決:

在專案生成jar包之後,呼叫專案中Dockerfile檔案,使用docker構建映象,將映象推送到私有映象中心的同時,使用該映象啟動一個容器(啟動前刪除同名容器)

程式碼如下所示:

# 定義變數
API_NAME="demo"
API_VERSION="0.0.1"
API_PORT=58080
IMAGE_NAME="127.0.0.1:5000/billjiang/$API_NAME:$BUILD_NUMBER"
CONTAINER_NAME=$API_NAME-$API_VERSION

# 進入target 目錄複製Dockerfile 檔案
cd $WORKSPACE/target
cp classes/Dockerfile .

#構建docker 映象
docker build -t $IMAGE_NAME .

#推送docker映象
docker push $IMAGE_NAME

#刪除同名docker容器
cid=$(docker ps | grep "$CONTAINER_NAME" | awk '{print $1}')
if [ "$cid" != "" ]; then
   docker rm -f $cid
fi

#啟動docker 容器
docker run -d -p $API_PORT:8080 --name $CONTAINER_NAME $IMAGE_NAME

#刪除 Dockerfile 檔案
rm -f Dockerfile

以上未宣告的變數$WORKSPACE為jenkins的變數

Post Steps中通過配置以上Execute shell命令,並不能成功執行,發現在Console Output中出現docker not found 的錯誤,是因為jenkins 的容器沒有安裝docker。所以解決這個問題要麼jenkins不使用docker容器安裝,要自己安裝一個帶有docker的jenkins容器,當然還有docker in docker的類似解決方案,本人覺得獨立安裝jenkins也許算的上一種比較好的方案。