Docker環境下Jenkins+Gitlab+Harbor的持續集成和自動發佈(CI/CD)的部署流程和問題記錄

前言:

本文只包含部署單節點的後端應用或接口api,不含鏈接數據庫,不包含鏈接web服務器中間件(nginx),需自行根據實際需求,在運行容器的時候添加其他功能節點的鏈接,如--link mysql_test:mysql.test.com,如需部署完整web服務項目,可以考慮使用docker-compose等工具統一部署。

一,安裝Harbor:

1.步驟和流程可以參考該文章https://blog.csdn.net/liuyunshengsir/article/details/79976520

2.其餘需要補充的是,在docker版本19.03.4中,假如安裝的harbor沒有配置HTTPS安全訪問,而使用HTTP訪問協議的話,需要給docker添加非安全倉庫,以便進行訪問,否則會提示證書和不安全的問題,拒絕訪問,具體步驟如下

編輯配置文件/etc/docker/daemon.json並重啓docker服務systemctl restart docker.service

{
  "registry-mirrors":["http://hub-mirror.c.163.com","https://registry.docker-cn.com"],
  "insecure-registries":["10.0.7.229"],
  "max-concurrent-downloads":10
}

其中"insecure-registries":["10.0.7.229"],數據段即爲添加的非安全倉庫,而harbor也是部署在10.0.7.229這臺服務器上,而"registry-mirrors"代表安全倉庫,可添加就近的鏡像源地址以供下載或者上傳其他docker鏡像時候獲取加速

3.默認docker pull [IMAGE_NAME] 或者push 鏡像的時候使用的是安全倉庫,要使用剛部署的私有倉庫harbor則需要

docker login -u 用戶名 -p 密碼 10.0.7.229

登錄到私有倉庫後再進行後續鏡像的上傳docker push和下載docker pull操作

二,安裝Gitlab:

1.拉取gitlab鏡像,這裏選取了社區中文翻譯版

docker pull twang2218/gitlab-ce-zh:latest

2.啓動gitlab容器,分別映射服務端口和數據目錄,以及系統時區

docker run -d --hostname tgitlab.bond520.com -p 8443:443 -p 48080:80 -p 8022:22  --name gitlab_test --restart always
-v /docker_test/docker_volume/gitlab/config:/etc/gitlab -v /docker_test/docker_volume/gitlab/logs:/var/log/gitlab -v /docker_test/docker_volume/gitlab/data:/var/opt/gitlab -v  /etc/localtime:/etc/localtime twang2218/gitlab-ce-zh:latest

命令說明:

--hostname tgitlab.bond520.com   //設置容器主機名爲tgitlab.bond520.com

-p 8443:443   //映射使用HTTPS協議訪問gitlab時的443端口到宿主機的8443

-p 48080:80   //映射使用HTTP協議訪問gitlab時的80端口到宿主機的48080

-p 8022:22    //映射SSH到容器內的端口22到宿主機的8022

--name gitlab_test   //容器名設置爲gitlab_test

--restart always  //設置容器自動重啓

-v /docker_test/docker_volume/gitlab/config:/etc/gitlab   //映射宿主機的目錄到容器對應目錄中,作爲gitlab的配置文件目錄

-v /docker_test/docker_volume/gitlab/logs:/var/log/gitlab   //映射宿主機的目錄到容器對應目錄中,作爲gitlab的日誌輸出目錄

-v /docker_test/docker_volume/gitlab/data:/var/opt/gitlab   //映射宿主機的目錄到容器對應目錄中,作爲gitlab的數據目錄

-v  /etc/localtime:/etc/localtime    //映射宿主機的系統時間配置文件到容器中,同步系統時間

 

3.在gitlab客戶端的host文件配置10.0.7.227 tgitlab.bond520.com,即可使用tgitlab.bond520.com:48080進行訪問

4.登陸gitlab創建用戶,新建項目倉庫,上傳代碼,打標籤tag,git上傳代碼可參考

https://blog.csdn.net/BearStarX/article/details/84785468

https://www.cnblogs.com/chenhuichao/p/9631754.html

三,安裝Jenkins:

1.由於國內環境在使用官方鏡像部署的時候下載插件使用的倉庫地址的下載速度十分的緩慢,所以使用已更換爲國內源的jenkins鏡像,項目地址如下

https://github.com/jenkins-zh/jenkins-formulas

裏面也有使用說明和用法介紹。這裏我個人是在該中文鏡像的基礎下,編寫一個Dockerfile來構建所需的鏡像,Dockerfile內容如下

FROM jenkins/jenkins:lts
LABEL maintainer="[email protected]"
USER root
#替換jenkins更新中心和插件下載源
ENV JENKINS_UC https://updates.jenkins-zh.cn
ENV JENKINS_UC_DOWNLOAD https://mirrors.tuna.tsinghua.edu.cn/jenkins

ENV JENKINS_OPTS="-Dhudson.model.UpdateCenter.updateCenterUrl=https://updates.jenkins-zh.cn/update-center.json"
#關閉安裝引導
ENV JENKINS_OPTS="-Djenkins.install.runSetupWizard=false"

#替換jenkins初始化腳本,內含重新設置證書目錄
COPY init.groovy /usr/share/jenkins/ref/init.groovy.d/init.groovy
#替換jenkins更新中心地址,即插件選項裏的高級選項設置
COPY hudson.model.UpdateCenter.xml /usr/share/jenkins/ref/hudson.model.UpdateCenter.xml
#替換SSL證書以便使用新的插件下載鏡像源
COPY mirror-adapter.crt /usr/share/jenkins/ref/mirror-adapter.crt

#替換系統的軟件下載源爲阿里雲鏡像源
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
#調整系統時區
RUN echo "Asia/Shanghai" > /etc/timezone

#新增docker用戶組並修改組id,之後把用戶jenkins添加爲docker組成員,容器啓動默認使用jenkins用戶建立服務進程,要使用docker工具則必須在同一個用戶組下
ARG dockerGid=999
RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group
USER jenkins

接着在前面提到的github項目地址中把init.groovy   hudson.model.UpdateCenter.xml   mirror-adapter.crt下載下來,和剛纔新建的Dockfile放在同一個目錄下,切換到該目錄,然後開始構建jenkins鏡像

docker build -t jenkins:configured .

鏡像構建完成後,啓動一個容器實例,完成部署,啓動命令如下

docker run -d --name jenkins_test --restart always --link gitlab_test:tgitlab.bond520.com -v \ &&
/docker_test/docker_volume/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime \ &&
-v /docker_test/docker_volume/jdk/jdk1.8.0_162:/var/jdk1.8.0_162 -v /docker_test/docker_volume/maven/apache-maven-3.6.3:/var/apache-maven-3.6.3 \ &&
-v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -p 38080:8080 -p 50001:50000 \ && jenkins:configured

命令說明如下:

--name jenkins_test   //容器名

--restart always   //容器自動重啓

--link gitlab_test:tgitlab.bond520.com //表示鏈接到剛纔啓動的命名爲gitlab_test的容器實例,在jenkins實例中別名用tgitlab.bond520.com代替,之後jenkins和gitlab相通之後才能下載和拉取gitlab上的代碼

-v /docker_test/docker_volume/jenkins_home:/var/jenkins_home   //表示持久化jenkins的數據目錄

-v /docker_test/docker_volume/jdk/jdk1.8.0_162:/var/jdk1.8.0_162  //添加不同的jdk版本到容器中,可以根據需要操作

-v /docker_test/docker_volume/maven/apache-maven-3.6.3:/var/apache-maven-3.6.3   //添加maven工具到容器中,根據需要操作

-v /var/run/docker.sock:/var/run/docker.sock   和   -v $(which docker):/usr/bin/docker

//以上兩項,是讓jenkins容器也可以使用宿主機的docker工具,讓jenkins可以把應用構建成docker鏡像推送到私庫並運行,此處是運用了docker-in-docker的相關技術,可以參考以下英文文檔https://tutorials.releaseworksacademy.com/learn/the-simple-way-to-run-docker-in-docker-for-ci

-p 38080:8080     //映射jenkins的訪問端口8080爲宿主機的38080

-p  50001:50000    //映射jenkins的主從集羣的slave默認通信端口50000爲宿主機的50001

 

啓動期間可以通過docker logs -f [容器id]  查看容器日誌是否出現異常,並獲取jenkins的默認登陸密碼,也可以通過jenkins容器所映射的宿主機目錄/docker_test/docker_volume/jenkins_home/secrets下的initialAdminPassword文件查看初始密碼。之後系統會提示新建管理員用戶和設置用戶密碼,便可使用管理員用戶進行登錄和操作。

2.接着進行jenkins的配置和所需插件的安裝,此次需要通過gitlab作爲代碼倉庫,構建maven項目,並由jenkins所在主機執行腳本和構建docker鏡像,因此所需安裝的插件和說明如下:

SSH plugin    //讓jenkins所在主機能夠使用ssh命令遠程連接到其他主機上執行命令等操作

Maven Integration plugin  //項目配置裏添加maven構建的相關功能

Git plugin     //項目配置裏添加git獲取代碼庫的相關功能

Git Parameter Plug-In   //使git插件能夠獲取代碼的指定版本並進行構建,也可以把版本號作爲變量供構建過程調取和使用,前提需要在代碼倉庫gitlab裏打過標籤tag

Docker plugin       //使jenkins在構建過程中能夠使用docker相關功能

Localization: Chinese (Simplified)      //簡體中文漢化,可選

插件安裝完畢後,重啓jenkins容器docker restart [容器id],也可使用jenkins系統內的插件安裝完畢後重啓功能

然後是配置maven,docker,git,jdk的可執行文件所在位置,依次打開系統管理--全局工具配置,如下圖:

注意此處JDK也可使用默認設置,即根據jenkins容器內系統的環境變量JAVA_HOME決定所使用的JDK。

之後保存設置,接着打開系統管理--系統配置,設置遠程主機連接,此處需要安裝上文提到的SSH插件纔會出現該配置項,如下圖:

筆者在配置該項的時候,點擊添加憑據按鈕出現無響應的問題,重啓jenkins容器情況依舊,所以採用預先在系統配置菜單處添加憑據,再回到這裏進行選用。管理員用戶登錄後,在主菜單處依次點擊憑據--系統--全局憑據--添加憑據,如下圖:

四,新建Jenkins任務,構建並試運行:

(此處以Java項目爲例,其他語言的項目可根據實際調整)

1.準備工作,新建tomcat8:base鏡像作爲後臺應用運行的基礎鏡像:

FROM centos6-base
LABEL maintainer="[email protected]"
# 調整容器內時區爲上海時區
RUN echo "Asia/Shanghai" > /etc/timezone
# 安裝JDK環境,設置其環境變量
ADD jdk1.8.0_162 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JAVA_BIN $JAVA_HOME/bin
ENV JRE_HOME $JAVA_HOME/jre
ENV PATH $PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
# 添加tomcat到容器內
ADD apache-tomcat-8.5.28 /usr/local/tomcat8
# 開放tomcat的web服務默認訪問端口8080
EXPOSE 8080
# 容器啓動時執行啓動tomcat服務
ENTRYPOINT ["/usr/local/tomcat8/bin/catalina.sh","run"]

此處的centos6-base爲dockerhub上centos6的64位系統基礎鏡像,可以根據實際選用,其次需要注意添加到容器內的apache-tomcat-8.5.28和jdk1.8.0_162需和Dockerfile處於同一目錄下。

然後在Dockerfile的目錄下運行

docker build -t 10.0.7.229/test_project/tomcat8:base .       //構建鏡像

docker login -u root -p Chen@1989 10.0.7.229          //登錄10.0.7.229上的harbor私庫

docker push 10.0.7.229/test_project/tomcat8:base    //推送鏡像到私庫上,以便後續使用

 

2.在安裝了maven插件Maven Integration plugin的前提下,添加maven項目,否則不會出現該項,如下圖:

3.配置項目構建選項和參數,docker-vod-test爲新建任務時候指定的項目名稱,如下:

注意此時新建的Dockerfile是生成在jenkins的項目根目錄下,其他配置項需要注意相對路徑問題,最後保存設置。

4.最後,確保遠程主機和jenkins容器網絡連通,jenkins點擊構建該項目即可部署到上文指定的遠程主機10.0.7.227上。

 

 

五,遇到的問題:

1.安裝jenkins時候遇到國內地區下載和更新插件緩慢的情況,可以根據上文中提到的替換更新中心UpdateCenter的配置項解決,或者直接使用docker中文社區提供的鏡像,裏面已配置好國內下載源並已對系統漢化,具體見上文安裝jenkins篇

2.啓動容器時日誌出現Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?的報錯,是由於在把宿主機的文件目錄映射到容器內時候,文件從屬權限的問題,以jenkins容器爲例,該容器的默認運行用戶是jenkins,用戶id爲1000,則需要把宿主機上的文件目錄權限也更改爲一致,即chown -R 1000:1000 [宿主機目錄],即可正常讀寫數據

3.某些舊版本jenkins在右上角出現提示系統更新時候,點擊更新無法自動安裝和替換原系統的老文件,需要外部上傳新版的jenkins.war包到容器內,再由容器啓動時候通過初始化腳本來解包和運行,容器內舊war包的位置可以通過在容器內執行whereis jenkins查看,默認jenkins鏡像在/usr/share/jenkins/內,把新版war包先拷貝到宿主機上的映射目錄,接着進入容器內執行cp替換即可,也需注意war包的權限問題,參考第2點。

4.忘記jenkins的密碼,修改jenkins根目錄下config.xml中<useSecurity>true</useSecurity>爲false,然後重啓jenkins,之後在系統管理--全局安全配置--安全域 處啓用jenkins專有用戶數據庫,然後點擊管理用戶,即可重新設置密碼

5.docker v19.03.4版本,想通過修改服務配置文件/var/lib/systemd/system/docker.service,添加修改EnvironmentFile=-/etc/default/docker
EnvironmentFile=-/etc/sysconfig/docker

ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS --containerd=/run/containerd/containerd.sock

接着在/etc/default/docker和/etc/sysconfig/docker中添加修改DOCKER_OPTS="xxxx"

然後執行systemctl daemon-reload 和systemctl restart docker  重啓docker服務

發現添加的DOCKER_OPTS參數項都不生效,疑似該版本無效 

6.構建jenkins鏡像的時候可不進行添加jdk到容器內的操作,可以先試運行原鏡像是否自帶jdk

7.儘量不使用docker commit CONTAINERID [REPOSITORY[:TAG]]提交容器內的修改並製作新鏡像,commit一次就會增加新的鏡像修改層,導致鏡像體積變大,根據docker容器是無狀態的核心思想,如非必要,對原鏡像儘量少改動和修改,否則違背docker輕量化,服務(容器)啓動快的特點

 

補充問題:

使用一段時間後發現在使用jenkins構建項目時候報錯,報錯信息爲:

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/auth: dial unix /var/run/docker.sock: connect: permission denied

字面理解是在jenkins容器內使用docker命令的時候出現權限錯誤,於是進入到jenkins容器內(593爲jenkins容器的id號),查看jenkins用戶組:

發現用戶jenkins所屬用戶組在docker用戶組之內,接着又查看系統用戶組配置文件:

發現用戶組id爲995(此處筆者已經把錯誤的用戶組id由995改回到993),相當於用戶jenkins已不在docker用戶組內,接着再查看從docker宿主機掛載過來的套接字docker.sock的文件狀態:

發現/var/run/docker.sock的用戶組也變成了995(此處由於筆者已經把錯誤改正過來,所以用戶組能正確顯示爲docker)。此外docker的執行文件/usr/bin/docker所有用戶都有執行權限“x”,這個沒有問題。

所以下面需要進入到jenkins容器裏,使用groupmod命令把用戶組docker的id修改成993,如下圖:

之後使用newgrp命令更新用戶組屬性即可:

以上容器內的操作如果提示權限不足,可以使用root用戶身份進入容器再執行:

之前一直使用該配置構建鏡像,爲何從宿主機掛載的docker.sock的文件從屬發生變化的問題目前仍不清楚,只能臨時先使用修改用戶組id的方法解決。

 

參考文章:

https://www.jianshu.com/p/8b1241a90d7a

https://www.jianshu.com/p/8103f2a8339b

https://blog.csdn.net/lyfqyr/article/details/84068063

https://www.shangyexinzhi.com/article/523683.html

https://blog.csdn.net/weixin_43840640/article/details/100597073

https://www.cnblogs.com/chenhuichao/p/9631754.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章