基於Docker+Jenkins+Gitlab搭建持續集成環境

隨着DevOps理念和敏捷理念的發展,咱們但願經過自動化技術,加快項目的迭代。尤爲是當使用微服務方案後,面臨在大量的項目構建和部署工做,藉助於jenkins的持續集成,能夠快速把應用打包成docker鏡像,實現自動部署。javascript

 
持續集成.png

如圖演示瞭如下的場景:css

  • 開發者向本身的gitlab網站提交了代碼
  • jenkins經過定時任務檢測到了代碼有變成,執行自動化構建過程
  • jenkins在自動化構建腳本中調用docker命令將構建好的鏡像push 私有鏡像註冊中心
  • 同時,jenkins也能夠直接執行remote shell啓動構建好的容器
  • 構建失敗或者成功,能夠及時將結果推送給相關人員,好比測試人員,安排測試
  • 服務端能夠手動經過docker命令,從鏡像倉庫中心拉取鏡像,進行手動部署

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

搭建docker私有倉庫

使用docker拉取registry鏡像,而後啓動容器linux

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

這樣就能夠在本地運行一個私有鏡像註冊中心,經過鏡像名稱前綴127.0.0.1:5000能夠將鏡像推送到這個地址git

搭建gitlab

拉取gitlab鏡像,並啓動github

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。docker

127.0.0.1 gitlab.bill.com 

初次登陸能夠修改密碼,或者從新註冊一個用戶,我註冊了一新用戶,並在gitlab中建立了一個demo項目shell

 
demo.png

建立了一個空項目後,而後根據github上的提示,將本地的git項目推送到gitlabruby


 
Gitlab_http.png

上傳完後Gitlab項目以下:bash


 
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 /opt/data/jenkins:/var/jenkins_home \
-v /opt/data/jenkins/wars:/usr/share/jenkins \
-v /opt/data/jenkins/ref:/usr/share/jenkins/ref \
-v /usr/share/maven:/usr/local/maven \
-v /usr/lib/jvm/jdk1.8:/usr/local/jdk \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \

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的變量

相關文章
相關標籤/搜索