1. 程式人生 > >微服務之一鍵部署git+maven+jenkins+docker

微服務之一鍵部署git+maven+jenkins+docker

第一章 流程及原理

流程梳理:

    微服務一鍵部署實現後只需要將測試好的程式碼提交至版本管理工具(如:git、SVN),程式會自動實現更新程式碼並打包釋出等後面的流程,省心省力。

第二章 實現過程

前置環境:

預設已經裝好Jenkins、maven、docker和git,我的Jenkins也在docker容器中執行的,由於在Jenkins容器中預設無法使用docker命令,所以在Jenkins啟動時需要加入以下引數:

-v /var/run/docker.sock:/var/run/docker.sock

-v $(which docker):/usr/bin/docker

如果還是無法使用,為了省時,推薦使用下面整合好的Jenkins映象,Dockerfile:

FROM jenkins

USER root

#清除了基礎映象設定的源,切換成阿里雲的jessie

RUN echo'' > /etc/apt/sources.list.d/jessie-backports.list \

&& echo"deb http://mirrors.aliyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \

&& echo"deb http://mirrors.aliyun.com/debian jessie-updates main contrib non-free"

>> /etc/apt/sources.list \

&& echo"deb http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list

#更新源並安裝缺少的包

RUN apt-get update && apt-get install -y libltdl7

ARG dockerGid=999

RUN echo"docker:x:${dockerGid}:jenkins" >> /etc/group \

USER jenkins

同時啟動時還是得加上面提到的引數,啟動命令如下:

$ docker run --name jenkins -p 7080:8080 -p 50000:50000 -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -v /var/docker_data/jenkins/jenkins_home:/var/jenkins_home -v /var/docker_data/jenkins/settings:/var/settings -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -d my-jenkins

正式開始:

1、 在程式的Pom.xml檔案中加入docker-maven-plugin外掛,如下:

<plugin>
   <groupId>com.spotify</groupId>
   <artifactId>docker-maven-plugin</artifactId>
   <version>1.0.0</version>
   <configuration>
      <dockerHost>http://192.168.100.100:2375</dockerHost>
      <imageName>${project.artifactId}</imageName>
      <dockerDirectory>src/main/docker</dockerDirectory>
      <resources>
         <resource>
            <targetPath>/</targetPath>
            <directory>${project.build.directory}</directory>
            <include>*.jar</include>
         </resource>
      </resources></configuration>
</plugin>

需要說明的是dockerHost指定的是使用哪個主機的docker,如果不填寫,則預設為本機,由於我的Jenkins在docker容器中與宿主機互不相通,所以我指定了宿主機的ip和埠。

dockerDirectory指定了你的Dockerfile所在的位置。

2、 在專案的根目錄下新建一個shell指令碼,我的是build.sh,指令碼內容就是重新啟動docker。

3、 Jenkins中配置maven:點選“系統管理”-->“GlobalTool Configuration”-->“maven安裝”,選擇install from Apavhe版本為3.5.0,勾選自動安裝。

4、 然後新建一個自由風格的專案,完成後點選“配置”,原始碼管理選擇git並填寫專案的git地址。構建觸發器選擇Poll SCM,填寫“*/1 * * * *”,意思是一分鐘去查詢一次git原始碼如果有更新則會自動構建。其他隨意。

5、 構建環節:選擇Invoke top-level Maventargets,選擇第三步中配置的maven3.5.0,Goals填寫package -e -X docker:build -DskipTest -DdockerImageTags=latest,意思是使用maven的外掛構建映象,具體引數可以百度。

6、 構建環節:接著第五步,再增加一個構建步驟放下面,選擇Executeshell,Command填寫:

#!/bin/bash

sh build.sh

就是執行專案根目錄的那個指令碼檔案。如下圖:


7、 最後一點,也是很重要的一點,就是必須給docker配置一個服務監聽埠,找到docker.service檔案,在“ExecStart引數”後面加上“ -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock”,命令如下:

vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

systemctl daemon-reload

systemctl restart docker

第三章 常見錯誤

1、Caused by:com.spotify.docker.client.exceptions.DockerException: java.util.concurrent.ExecutionException:com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException:java.io.IOException: Permission denied

解決:許可權問題,表明Jenkins容器中無法使用docker命令。參考第二章的“前置環境”解決。

2、[ERROR]Failed to execute goal com.spotify:docker-maven-plugin:0.4.11:build(default-cli) on project springboot: Exception caught: Request error: POSTunix://localhost:80/build?t=springboot: 400: HTTP 400 Bad Request

解決:兩個問題,一是docker的監聽埠可能沒配置或配置不成功;而是docker-maven-plugin版本問題,建議升級至1.0.0版本。

第四章 參考資料

另外附上我自己的原始碼,csdn下載地址: https://download.csdn.net/download/qq_36961530/10281306