用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