天天看點

Docker+Jenkins+Git+GitLab實作DevOps

先了解一下Jenkins

Jenkins是一個開源的、提供友好操作界面的持續內建(CI)工具,提供了數百個插件來支援建構,部署和自動化任何項目。我們可以使用

Jenkins

結合常用的

版本控制工具(git、svn等)

來實作自動部署項目,比如說我們從本地上傳代碼到Gitlab代碼倉庫,Jenkins就會幫我們自動同步代碼,然後經編譯打包之後推送至遠端Docker倉庫,再之後我們通過伺服器從遠端Docker倉庫拉取鏡像、建立及啟動容器,然後就可以通過浏覽器通路了,整個過程幾乎都是自動完成的,而我們隻需要上傳代碼就可以了,接下來我們一起來看看整個搭建過程吧。

本文環境

Docker Version 19.03.11:https://www.cnblogs.com/niceyoo/p/13096181.html

Maven Version 3.3.9:https://www.cnblogs.com/niceyoo/p/13068935.html

JDK Version 1.8.0_181:https://www.cnblogs.com/niceyoo/p/11483139.html

GitLab:https://www.cnblogs.com/niceyoo/p/13057533.html

Jenkins Version 2.222.4:參考本文

通過本文可以了解哪些

  • 通過Docker部署Jenkins
  • 使用Jenkins一鍵部署Springboot項目
  • 整合GitLab實作上傳代碼自動部署項目

如下Jenkins安裝及配置過程

1、拉取代碼

docker pull jenkins/jenkins:lts
           
Docker+Jenkins+Git+GitLab實作DevOps

2、建立并啟動容器:

在建構的過程,由于我本身CentOS已經安裝JDK、Maven了「可以參考上方的安裝連結」,是以在這我就直接指定本地環境變量了,當然,如果你不指定的話,安裝完Jenkins後還是可以在

全局工具配置

中修改的:

docker run --name=jenkins --privileged=true \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v $(which docker):/usr/bin/docker \
-v /etc/sysconfig/docker:/etc/sysconfig/docker \
-v /usr/java/jdk1.8.0_181:/usr/java/jdk1.8.0_181 \
-v /home/maven/apache-maven-3.3.9:/usr/local/maven \
-v /home/maven/repo:/usr/local/maven_repository \
-v /home/jenkins-data:/var/jenkins_home \
jenkins/jenkins:lts
           

啟動後在浏覽器輸入:http://容器ip:8080 通路。

Docker+Jenkins+Git+GitLab實作DevOps

管理者密碼需要我們在

log

中查詢:

docker logs jenkins
           
Docker+Jenkins+Git+GitLab實作DevOps

3、安裝推薦的插件

輸入密碼登陸後,會彈出插件安裝提示,我們在這選擇安裝推薦的插件:

Docker+Jenkins+Git+GitLab實作DevOps

接下來就進入漫長的等待狀态~

Docker+Jenkins+Git+GitLab實作DevOps

4、建立管理者賬号

安裝之後,接下來建立一個賬号:

Docker+Jenkins+Git+GitLab實作DevOps

進行執行個體位址配置,該位址将作為将來

Jenkins

的通路位址:

Docker+Jenkins+Git+GitLab實作DevOps

至此,儲存并完成,會重新開機

Jenkins

,然後我們可以通過剛剛建立的賬戶登入「使用管理者root也可以」:

Docker+Jenkins+Git+GitLab實作DevOps

5、Maven配置修改

之前我們建立容器時複用了本地主控端的

Maven環境變量

,但是安裝完

Jenkins

後還是要指定一下

Maven

目錄的,依次進入:

系統管理

>

全局工具配置

首先是頂部的

Maven

,我們選擇

檔案系統中的setting

檔案,

檔案路徑

使用建立容器時指定的

Maven

路徑

usr/local/maven

/usr/local/maven/conf/settings.xml
           
Docker+Jenkins+Git+GitLab實作DevOps

然後拉到最下邊

Maven

節點,點選

新增Maven

,起一個名字,然後指定

maven路徑

,去掉

自動安裝

的選項,然後

應用>儲存

6、建立一個任務

然後我們建立一個任務,選擇建構一個

自由風格的軟體項目

Docker+Jenkins+Git+GitLab實作DevOps

點選确定之後會跳入配置界面,接下來就是配置我們的自動化操作,首先是配置項目的拉取位址,在這我是基于Gitlab的,關于Gitlab的搭建可以參考這篇:https://www.cnblogs.com/niceyoo/p/13057533.html

Docker+Jenkins+Git+GitLab實作DevOps

點選添加GitLab的賬戶密碼,不添加時會報紅,是沒法在GitLab中拉取代碼的:

Docker+Jenkins+Git+GitLab實作DevOps

接着我們選擇一下建構指令

執行shell

Docker+Jenkins+Git+GitLab實作DevOps
#!/bin/bash 
result=$(docker ps | grep "10.211.55.4:5000/niceyoo-demo") 
if [[ "$result" != "" ]] 
then 
echo "stop niceyoo-demo" 
docker stop niceyoo-demo 
fi
result1=$(docker ps -a | grep "10.211.55.4:5000/niceyoo-demo") 
if [[ "$result1" != "" ]] 
then 
echo "rm niceyoo-demo" 
docker rm niceyoo-demo
fi
result2=$(docker images | grep "10.211.55.4:5000/niceyoo-demo") 
if [[ "$result2" != "" ]] 
then 
echo "10.211.55.4:5000/niceyoo-demo:latest" 
docker rmi 10.211.55.4:5000/niceyoo-demo:latest
fi
           

這個地方解釋一下為啥要用到shel腳本,這個腳本有兩個操作,首先是通過

docker ps | grep "10.211.55.4:5000/niceyoo-demo"

查詢是否存在容器,如果存在的話則

stop

停止容器,然後再

rm

删除容器,第二步是通過

docker ps -a | grep "10.211.55.4:5000/niceyoo-demo"

檢視是否存在該鏡像,如果存在則

rmi

删除該鏡像,為啥要删除鏡像+容器?其實這樣是幫助我們把每次自動化建構鏡像、容器之前都把舊的給删除掉。

"10.211.55.4:5000/niceyoo-demo" 是我項目打包後的鏡像名稱,組成規則為:鏡像位址/項目名稱
Docker+Jenkins+Git+GitLab實作DevOps

然後添加Maven指令,用于建構項目,簡單說一下這個地方,我在項目的

pom.xml

,檔案中使用了

docker-maven-plugin

插件,同時替換了

mvn pavkage

指令,當每次執行該指令時就會自動送出至Docker遠端私有倉庫中「如果在本地執行測試的話需要開啟Docker遠端通路前提,具體配置可參考該連結:https://www.cnblogs.com/niceyoo/p/13270224.html」,私有倉庫是基于Docker+Registry搭建的,關于Registry的搭建可以參考這篇:https://www.cnblogs.com/niceyoo/p/13058238.html

Docker+Jenkins+Git+GitLab實作DevOps
clean package
           

如下是SpringBoot項目

pom.xml

檔案中的插件編寫,已經把注釋寫的很清楚了:

<build>
    <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>1.0.0</version>
            <configuration>
                <!--鏡像名稱-->
                <imageName>10.211.55.4:5000/${project.artifactId}</imageName>
                <!--指定dockerfile路徑-->
                <!--<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>-->
                <!--指定标簽-->
                <imageTags>
                    <imageTag>latest</imageTag>
                </imageTags>
                <!--遠端倉庫位址-->
                <registryUrl>10.211.55.4:5000</registryUrl>
                <pushImage>true</pushImage>
                <!--基礎鏡像jdk1.8-->
                <baseImage>java</baseImage>
                <!--制作者提供本人資訊-->
                <maintainer>niceyoo [email protected]</maintainer>
                <!--切換到ROOT目錄-->
                <workdir>/ROOT</workdir>
                <cmd>["java","-version"]</cmd>
                <entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint>
                <!--指定遠端docker位址-->
                <dockerHost>http://10.211.55.4:2375</dockerHost>
                <!--這裡是複制jar包到docker容器指定目錄配置-->
                <resources>
                    <resource>
                        <targetPath>/ROOT</targetPath>
                        <!--指定需要複制的根目錄,${project.build.directory}表示target目錄-->
                        <directory>${project.build.directory}</directory>
                        <!--用于指定需要複制的檔案,${project.build.finalName}.jar表示打包後的jar封包件-->
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
            <!--執行mvn package時,替換為執行mvn package docker:build-->
            <executions>
                <execution>
                    <id>build-image</id>
                    <phase>package</phase>
                    <goals>
                        <goal>build</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
           

接下來再添加一個

執行shell

,用來執行建構容器:

Docker+Jenkins+Git+GitLab實作DevOps
docker run --rm  -d -p 9999:9999 --name niceyoo-demo  10.211.55.4:5000/niceyoo-demo
           

部分參數解釋:在這我用的

-p 9999

端口,

--nama

後面指向的是重命名後的容器名稱

niceyoo-demo

+ 鏡像的名稱

10.211.55.4:5000/niceyoo-demo

,接下來就是

應用+儲存

了:

Docker+Jenkins+Git+GitLab實作DevOps

到這,我們就可以運作一下了,點選

立即建構

,然後通過點選

Build History

中的

控制台輸出

Docker+Jenkins+Git+GitLab實作DevOps

等待一會,最後看到下圖所示,

BUILD SUCCESS

就可以了

然後我們在

Registry

私有鏡像倉庫看一下是否推送:

Docker+Jenkins+Git+GitLab實作DevOps

再看看最後一步的shell腳本幫我們建立并啟動容器了沒~

到這我們就可以在浏覽器通路項目了:

Docker+Jenkins+Git+GitLab實作DevOps

7、建立Gitlab鈎子

我們要實作的最終效果是一上傳代碼就幫我們自動執行如上整個過程~,那麼我們需要配合Gitlab的鈎子實作,首先我們先去

系統管理

插件管理

安裝

GitLab

插件。

安裝後我們進入項目配置界面,切換至

建構觸發器

Docker+Jenkins+Git+GitLab實作DevOps

我們複制這個連結,然後進入GitLab項目中的

setting

Webhooks

「注意,這裡是項目中的,非GitLab的setting配置」:

Docker+Jenkins+Git+GitLab實作DevOps

點選

Add webhook

時,如果出現

Url is blocked: Requests to the local network are not allowed

Docker+Jenkins+Git+GitLab實作DevOps

解決方法: 進入GitLab首頁頂部的小扳手

setting

Network

目錄,執行如下4步,不要忘記最後點選

save changes

Docker+Jenkins+Git+GitLab實作DevOps

然後我們再回到之前界面重新添加一下連結,點選

Add webhook

配置之後測試一下:

Docker+Jenkins+Git+GitLab實作DevOps

如果上方提示200代表配置成功:

Docker+Jenkins+Git+GitLab實作DevOps

然後我們回到Jenkins項目面闆就可以看到自動建構了:

Docker+Jenkins+Git+GitLab實作DevOps

到這基本就完成自動化建立了,隻要上傳代碼就能完成建構了,比如我們通過Idea上傳代碼至GitLab,那麼Jenkins就會幫我們實作自動化部署了:

Docker+Jenkins+Git+GitLab實作DevOps

上傳完代碼後Jenkins自動建構的截圖:

Docker+Jenkins+Git+GitLab實作DevOps

可能會出現的問題 - 僅針對本文

1、/usr/bin/docker: 2: .: Can't open /etc/sysconfig/docker

/usr/bin/docker: 2: .: Can't open /etc/sysconfig/docker

出現這個問題說明建立的Jenkins是無法使用主控端裡的docker指令的,我們可以進入jenkins容器執行

docker version

,正常情況是可以列印資訊的,而不正常則如上方錯誤提示。

這個問題可以通過挂載

-v /etc/sysconfig/docker:/etc/sysconfig/docker

完成,再回到第2步看看是不是漏掉了。

2、You don't have either docker-client

You don't have either docker-client or docker-client-latest installed. Please install either one and retry.

Docker+Jenkins+Git+GitLab實作DevOps

這個問題我曾嘗試使用 yum 安裝最新的 docker-client,最後放棄了,然後就在糾結為何别人沒出現這個問題,後來幾經測試,果斷解除安裝重裝!

猜測之前使用 yum 預設安裝的 docker 實在是太老了, 預設安裝的是1.13.x版本,而現在最新版本都 19.x 了...

解除安裝重裝最新版是不會把之前下載下傳的鏡像删掉的,前提是不要完全删除幹淨哈,我測試過了,咳咳.....

yum remove docker \
 docker-client \
 docker-client-latest \
 docker-common \
 docker-latest \
 docker-latest-logrotate \
 docker-logrotate \
 docker-selinux \
 docker-engine-selinux \
 docker-engine
  
rm -rf /etc/systemd/system/docker.service.d

rm -rf /var/lib/docker

rm -rf /var/run/docker  
           

安裝最新Docker可以參考這篇:https://www.cnblogs.com/niceyoo/p/13096181.html

然後再重新拉取Jenkins,重新建立一下容器。

Docker+Jenkins+Git+GitLab實作DevOps

推薦閱讀

CentOS中安裝Docker步驟

基于Docker搭建私有鏡像倉庫

基于Docker搭建Gitlab代碼存儲

繼續閱讀