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

如圖演示了以下的場景:
- 開發者向自己的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項目

創建了一個空項目后,然后根據github上的提示,將本地的git項目推送到gitlab

上傳完后Gitlab項目如下:

搭建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項目選項

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

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



每隔5檢查是否有新代碼發布,如果有則自動執行構建


點開項目,點擊左側菜單build now
則立馬開始一次構建,點開當前構建信息,左側Console Output
中,可查看構建的明細

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