CI/CD

CI/CD平臺的做用我就再也不囉嗦了。如今又比較流行docker容器化(快速,環境無縫切換等做用),因此世面上尚未一套成型的,固定的套件來拱企業快速搭建本身的CI/CD平臺(花錢買服務的除外),docker雲也更是五花八門,DaoCloud,Swarm等。做者有幸參加了公司的CI/CD平臺搭建,從無到有的作了一套持續集成持續交付平臺,算上大體接近尾聲了。這裏分享一下,閱讀此博文須要如下知識儲備與要求:java

  • Jenkins
  • docker,docker雲(Rancher或者其餘雲)
  • 着手作過CI平臺

文章結構web

  1. 基於Jenkins,Shell腳本的傳統CI平臺
  2. 基於Jenkins,docker雲的容器化CI/CD平臺

1. 基於Jenkins,Shell腳本的傳統CI平臺

做者在上家公司着手作了一套基於Shell腳本的CI平臺,這裏再也不囉嗦,只簡單放一張圖: spring

2. 基於Jenkins,docker雲的容器化CI/CD平臺

重頭戲來了。基於Shell腳本的部署其實仍是能解決通常企業的CI需求,然而,對於微服務架構的多工程快速部署,平臺無關性,就須要容器化部署了。 同理,上一張圖: docker

下面開始一步一步的講解:架構

1. 代碼提交

2. 根據webhook觸發Jenkins構建

說白了,就是代碼提到Gitlab,在Gitlab配置一個webhook像Jenkins發送一個請求,Jenkins收到這個請求後就會開始執行構建。固然了,Jenkins裏是依賴的Gitlab plugin插件來支持這個功能的。參考博文:Gitlab plugin使用app

3. 進行構建

這一步是最繁瑣的,也是要重點講的,這裏涉及到不少配置。首先須要說一下的是,我這裏的Jenkins是物理部署的。這一步Jenkins的配置我會在最後貼出來。Jenkins在這一步裏執行構建(clean install)後打包好工程後自動根據插件curl

<groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
複製代碼

依賴一個事先準備好的Dockerfile構建出docker鏡像並推送到遠程Habor. 這一步須要注意以下配置:maven

  1. docker環境的配置。
  2. docker-maven-plugin配置 這兩個配置都不是那麼好配置的。
  • 先說第一個,docker環境的安裝好後,須要設置Docker的Insecure registries里加上本身的私服Harbor地址,這是由於docker在進行推送鏡像時是https協議,而Harbor是http協議的,因此要設置信任這個地址,不然在進行推送時會報錯的。參考博文:docker配置信任地址,仍是給你們截圖一下個人配置:
    docker配置信任地址
  • 再說第二個,這個插件的配置就更難了,先上我本身的配置。
<build>
        <resources>
            <resource> //必需要轉換一下,由於Dockerfile裏有內置變量須要轉換
                <directory>src/main/docker</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/Dockerfile</include>
                </includes>
                <targetPath>../docker</targetPath>
            </resource>
            <!--注意這裏必定要把resources目錄下的配置文件引進去,而且不要指定targetPath-->
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.yml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
                <executions>
                    <execution>
                        <phase>install</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <serverId>docker-private-registry</serverId>
                    <registryUrl>${docker.repostory}</registryUrl>
                    <pushImage>true</pushImage>
                    <imageName>
                      ${docker.repostory}/${docker.registry.name}/${project.artifactId}
                    </imageName>
                    <dockerDirectory>
                        ${project.build.directory}/docker
                    </dockerDirectory>
                    <resources>
                        <rescource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </rescource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
複製代碼

這裏須要指出的是,docker-private-registry這一行,必定要在本身maven的setting文件裏配置上本身Harbor和帳號密碼。spring-boot

<server>
<id>docker-private-registry</id>
<username>zdy</username>
<password>****</password>
<configuration>
<email>something@qq.com</email>
</configuration>
</server>
複製代碼

給個參考博文(建議你們用個人配置,參考博文真的只能參考,不少錯誤):spotify插件微服務

而後給下本身的srm/main/docker目錄下的Dockerfile

FROM anapsix/alpine-java:8

ENV APP_NAME @project.build.finalName@.@project.packaging@
# 後期更改成日誌目錄,將日誌掛載出來
VOLUME /tmp
#默認工做目錄/
ADD $APP_NAME /app.jar

EXPOSE 8070

ENTRYPOINT ["java","-jar","/app.jar"]
複製代碼

上面的具體配置我就不一一講了,由於很複雜,像dockerfile裏的內置變量轉換不出來什麼的,你們就多參考參考個人配置,配置都是整理了很長時間纔出來的,仍是那句老話,只講思路,具體配置你們多參考其餘文章,思路出來了,慢慢的就能夠摸索出來。

4. 構建完成後發送CURL請求觸發Rancher的WebHook

按照上面的配置後,jenkins構建算是完成了,咱們新構建的docker鏡像也推送到了遠程的HarBor私服鏡像庫。這時就要執行CURL指令來觸發Rancher拉取鏡像部署了。 下面給一下我jenkins的截圖。

Jenkins配置
至於CURL後面如何寫的,Rancher官網webhook,須要事先在Rancher的webhook配置,生成一些參數,而後curl.我就很少講了,你們自行看官網。 Rancher WebHook

5. Rancher根據WebHook觸發後拉取鏡像而且部署。

講的比較草率,可能不少人很矇蔽,其實這篇博文的精華就是開頭那一張圖,按照圖中的思路摸索摸索就大體能夠出來,爲何做者不肯意詳講呢,由於說實在的配置這個東西太麻煩了,不少配置很複雜,都須要本身摸索。我也只能提一提思路。

效果我就不演示,提交完代碼後,在Jenkins構建好鏡像自動推送到Harbor,而後Curl Ranche的WebHook,觸發Rancher拉取最新鏡像並部署。 Over, Have a good day .

相關文章
相關標籤/搜索