1. 程式人生 > >用jenkins+gitlab+docker完成容器化工程自動化部署整合

用jenkins+gitlab+docker完成容器化工程自動化部署整合

整個流程:

工程修改後push到gitlab >> gitlab通過webhook通知jenkins工程有改變 >>jenkins到gitlab取最新工程 >> jenkins完成容器構建 docker images >> push到docker hub >> 讓單臺或多臺伺服器同時拉下這個映象並執行

還可以使用完整的如下CI, CD 流程

由於筆者伺服器資源有限 這裡不做多臺伺服器的部署構建演示 思路是一樣的 push到docker hub後 讀者可以用jenkins中的構建命令通過ssh連線多臺機器 讓其pull下映象並執行即可 如有kubernetes 則以jenkins構建的伺服器作為kubernetes的master去控制整個叢集即可 可以避免ssh多臺機器 。

通過如下工程到gitlab 現在我們要將他與jenkins的工程做webhook 實現一鍵push部署

筆者工程的結構是如下的 如果是java工程的小夥伴們 可以按照如下的流程做配置

search |-----api |-----service |----build.sh |---- src |-----main |-----docker |-----Dockerfile

一個比較典型的微服務應用 這裡只強調應用中的兩個比較重要的檔案 一個是Dockerfile 另外一個是build.sh

pom.xml檔案加入以下內容

<build>    <plugins>      <plugin>        <groupId>com.spotify</groupId>         <artifactId>docker-maven-plugin</artifactId>         <version>0.4.3</version>         <configuration>          <imageName>${docker.image.prefix}/${company.name}:${project.parent.artifactId}.${project.port}</imageName>           <dockerDirectory>src/main/docker</dockerDirectory>           <exposes>${project.port}</exposes>           <resources>            <resource>              <targetPath>/</targetPath>               <directory>${project.build.directory}</directory>               <include>${project.build.finalName}.jar</include>            </resource>          </resources>        </configuration>      </plugin>    </plugins>  </build> <properties>    <docker.image.prefix>huaihkiss</docker.image.prefix>     <company.name>companyname</company.name>     <project.port>9875</project.port>  </properties>  

在該服務的service工程下邊 建立一個目錄到src/main下邊 目錄名為docker 在該目錄下建立一個Dockerfile檔案 內容如下

FROM huaihkiss/centos7-base:jdk-1.8 #將jdk映象作為基礎映象 MAINTAINER huaihkiss <[email protected]> #作者資訊 VOLUME /tmp VOLUME ~/ #VOLUME是掛載 將/tmp掛載到宿主機 ~/目錄也就是使用者目錄 這個目錄筆者用來放工程日誌 ADD service-1.0-SNAPSHOT.jar /search-app.jar #將mvn 構建後的jar包放在容器根目錄下 RUN sh -c 'touch /search-app.jar' ENV JAVA_OPTS="" ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /search-app.jar"] CMD /usr/sbin/sshd -D  

然後在該服務的service工程下邊 建立一個檔案 名為build.sh 內容如下 帶中文註釋的可以按照自身配置修改 下邊的除非是專案結構不同 否則不要修改

#!/bin/bash source /etc/profile   #project build variable #you can change this code for your project ###START### #docker hub 倉庫名 DOCKERRESPOSITORYUSERNAME=huaihkiss #docker hub使用者名稱 DOCKERLOGINUSERNAME=huaihkiss #dockerhub密碼 DOCKERLOGINPASSWORD=password #dockerhub 倉庫tag名 RESPOSITORYNAME=xhgoo #應用名稱 APPNAME=search #應用埠 APPPORT=9875 #容器埠 INPORT=9875 #宿主機對映埠 OUTPORT=9875 #掛載宿主機目錄 HOSTPATH=~/ #被掛載的容器目錄 CONTAINNERPATH=/root #容器名稱 CONTAINNERNAME=${APPNAME}-${APPPORT} #映象名稱 MYIMAGE=${DOCKERRESPOSITORYUSERNAME}/${RESPOSITORYNAME}:${APPNAME}.${APPPORT} ###END###   #don't change this code ###START### cd ../ mvn clean mvn install cd - # uncomment if you need push docker login -u ${DOCKERLOGINUSERNAME} -p ${DOCKERLOGINPASSWORD} # stop all container docker stop ${CONTAINNERNAME} # remove all container docker rm ${CONTAINNERNAME} # remove old images docker rmi ${MYIMAGE} # build jar and image #mvn package -e -X docker:build -DskipTest mvn package docker:build # push image #docker push ${MYIMAGE} # running containerdocker run -it -dp ${OUTPORT}:${INPORT} -v ${HOSTPATH}:${CONTAINNERPATH} --name ${CONTAINNERNAME} ${MYIMAGE} /bin/bash ###END###  

之後push到gitlab上邊

開啟jenkins 建立一個新任務

如下圖操作、

選git 填入gitlab上邊需要持續整合的工程地址 之後點Credentials旁邊的add

輸入gitlab上邊的賬號密碼 點add

選擇剛剛錄入的賬號密碼

構建觸發器在Build when a change is pushed to GitLab. GitLab CI Service 前打勾並複製那個url然後點選Generate按鈕 生成一串secret token 儲存起來

構建那裡選擇Execute shell

填入剛剛我們編寫的構建程式build.sh

chmod 777 service/build.sh cd service ./build.sh

點選儲存

注意一點:jenkins在安裝的時候會建立一個jenkins賬戶 jenkins完成大部分的操作都是通過這個賬戶來完成的 所以有可能會遇到構建的時候沒有許可權的情況出現 這個時候 我們需要給jenkins賬戶賦予一個合適的許可權 

筆者這裡給jenkins使用者改了使用者組為root使用者組 作為演示 讀者可以根據需要修改自己的使用者組

vim /etc/passwd  

jenkins:x:990:0:Jenkins Automation Server:/var/lib/jenkins:/bin/false  

儲存 然後返回到gitlab的工程當中 選settings下邊的Integrations

將剛剛複製的jenkins ci地址與secret token貼上上來 按照如圖打勾 儲存

還是那個頁面 test一下剛剛的webhook是否可用 如圖所示

如圖所示 200的話 那麼已經ok了

這時候到jenkins看看 已經開始構建了 點選它

點選console output 可以檢視日誌

這個就是構建過程的日誌

現在測試webhook已經測試成功了 我們再來測試一下在ide中push程式碼 jenkins會不會自動構建 這裡筆者把埠號改成了9876

提交程式碼

看看jenkins 已經開始構建了 

點選進去看日誌

檢視jenkins首頁 可以看到工程狀態資訊

在伺服器上通過docker命令檢視映象 可以發現已經構建成映象了

docker images

 

檢視映象

docker ps -a

已經成功執行 現在只要在ide上邊push一下 就可以實現自動化構建容器應用了

如果想讓多臺伺服器執行該容器的話 則可以在build.sh裡邊用遠端ssh執行命令的方式 或者k8s去構建