Jenkins與Docker的自動化CI-CD實戰

一、發佈流程設計

Jenkins與Docker的自動化CI-CD實戰


Jenkins與Docker的自動化CI-CD實戰


工作流程:

開發人員提交代碼到Git版本倉庫;

Jenkins人工/定時觸發項目構建;

Jenkins拉取代碼、代碼編碼、打包鏡像、推送到鏡像倉庫;

Jenkins在Docker主機創建容器併發布。

二、環境規劃:

角色
IPGit/Registry192.168.56.11

Docker192.168.56.12

Jenkins/Docker192.168.56.13

三、 部署過程

1,部署git

如果公司內部有直接克隆就可以

git clone [email protected]:/home/git/solo.git

2,部署Jenkins環境(請關注我下次再寫)

Jenkins與Docker的自動化CI-CD實戰


3,部署私有鏡像倉庫

注意:docker 倉庫 由於https 認證,所有需要pull的客戶端,需要修改配置文件

[root@linux-node1 ~]# vim /etc/sysconfig/docker

# Modify these options if you want to change the way the docker daemon runs

OPTIONS='--selinux-enabled --insecure-registry 192.168.56.11:5000'

4,所有主機安裝docker

1)安裝依賴包

yum install -y yum-utils device-mapper-persistent-data lvm2

2)添加Docker軟件包源:

yum-config-manager

--add-repo

https://download.docker.com/linux/centos/docker-ce.repo

3)安裝Docker CE

yum install docker-ce -y

4)配置加速器

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://bc437cce.m.daocloud.io

#因為默認源會去國外獲取數據,所以會慢可以超時,這是我們就需要配置加速器指向國內源https://www.daocloud.io/

5)啟動並開機啟動

# systemctl start docker

# systemctl enable docker

四、構建基礎鏡像【Apache、Nginx、Tomcat、LNMP、LAMP、LNTP】

JAVA程序必須有JDK環境才可以運行,為了減少鏡像大小及提高性能,這裡直接把JDK放到宿主機上,容器以掛載形式使用。

1,安裝jdk

#rz 把tar包上傳,解壓後放到指定目錄

rz.......

tar -zxvf jdk-8u60-linux-x64.tar.gz

mv jdk1.8.0_60 /usr/local/jdk1.8


2,擬寫Dockerfile

# cat Dockerfile

FROM centos:7

#

MAINTAINER www.aliangedu.com

#

ENV VERSION=8.5.33

#tomcat版本

ENV JAVA_HOME /usr/local/jdk

#jdk 絕對路徑

RUN yum install wget -y

#運行的命令

RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz &&

tar zxf apache-tomcat-${VERSION}.tar.gz &&

mv apache-tomcat-${VERSION} /usr/local/tomcat &&

rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* &&

mkdir /usr/local/tomcat/webapps/ROOT

EXPOSE 8080


#程序使用的端口

CMD /usr/local/tomcat/bin/catalina.sh run

#執行tomcat目錄下的啟動腳本,這裡面遇到坑,就是-v 將宿主機jdk目錄掛在到容器/usr/local/jdk 時候,因為鏡像按照dockerfile去打,那麼在執行命令的時候就會找不到路徑,所以我臨時刪除了,EXPOSE與CMD 2行,然後重新打包,使用 -p 指定端口,然後進入容器,手工啟動tomcat的方式,進行

3,構建鏡像

docker build -t 192.168.56.11:5000/tomcat-85:latest -f dockerfile .

#最後這個點。代表當前路徑,在製作鏡像時,會記錄上下文內容


Jenkins與Docker的自動化CI-CD實戰


4,上傳到docker 鏡像倉庫

root@node02>

5,啟動鏡像 測試

[root@node02>

[root@3addff07c464 ROOT]# echo "123" >index.jsp


Jenkins與Docker的自動化CI-CD實戰


五、Jenkins 配置

1.主頁面 -> 系統管理 -> 全局工具配置

指定JDK、Maven路徑,Git保持默認:

Jenkins與Docker的自動化CI-CD實戰


2.jenkins安裝必要插件

主頁面 -> 系統管理 ->管理插件:

安裝SSH與Git Parameter插件。

插件說明:

》SSH:用於SSH遠程Docker主機執行Shell命令

》Git Parameter:動態獲取Git倉庫Branch、Tag

Jenkins與Docker的自動化CI-CD實戰


3,配置SSH插件

第一步:先創建一個用於連接Docker主機的憑證 (有權限的用戶)

主頁面 -> 憑據 -> 系統 -> 右擊全局憑據 -> 添加憑據:

Jenkins與Docker的自動化CI-CD實戰


輸入連接Docker主機的用戶名和密碼:

Jenkins與Docker的自動化CI-CD實戰


第二步:添加SSH遠程主機

主頁面 -> 系統管理 -> 系統設置 -> SSH remote hosts:

Jenkins與Docker的自動化CI-CD實戰


問題:當以普通用戶身份去使用docker images時,出現以下錯誤:

六、將從github上下載的JAVA項目,上傳到自己的gitlab倉庫

# git clone https://github.com/b3log/solo

# cd solo

移除舊的推送地址,添加新的:

# git remote remove origin

# git remote add origin [email protected]:qqq/solo.git

提交代碼到Git倉庫並創建tag:

# touch src/main/webapp/a.html

# git add .

# git commit -m “a”

創建標籤:

# git tag 1.0.0

推送到Git服務器:

# git push origin 1.0.0

登陸gitlab查看solo項目:

Jenkins與Docker的自動化CI-CD實戰


七、Jenkins創建項目併發布測試

1.主頁面 -> 新建任務 -> 輸入任務名稱,構建一個Maven項目:

Jenkins與Docker的自動化CI-CD實戰


注意:如果沒有顯示“構建一個Maven項目”選項,需要在管理插件裡安裝“Maven Integration plugin”插件。

配置Git參數化構建:

Jenkins與Docker的自動化CI-CD實戰


2.動態獲取Git倉庫tag,與用戶交互選擇Tag發佈:【也可以設置分支】

3.指定項目Git倉庫地址:

修改*/master為$Tag,Tag是上面動態獲取的變量名,表示根據用戶選擇打代碼版本。

4.設置maven構建命令選項:

clean package -Dmaven.test.skip=ture

利用pom.xml文件構建項目。

在Jenkins本機鏡像構建與推送到鏡像倉庫,並SSH遠程連接到Docker主機使用推送的鏡像創建容器:

上圖中 命令內容如下:

REPOSITORY=192.168.56.11:5000/solo:${Tag}

# 構建鏡像

cat > Dockerfile << EOF

FROM 192.168.56.11:5000/tomcat-8:latest

RUN rm -rf /usr/local/tomcat/webapps/ROOT

COPY target/*.war /usr/local/tomcat/webapps/ROOT.war

CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]

EOF

docker build -t $REPOSITORY .

# 上傳鏡像

docker push $REPOSITORY

上圖中Command 內容如下:

REPOSITORY=192.168.56.11:5000/solo:${Tag}

# 部署

sudo docker rm -f blog-solo |true

sudo docker image rm $REPOSITORY |true

sudo docker container run -d --name blog-solo -v /usr/local/jdk1.8:/usr/local/jdk -p 8080:8080 $REPOSITORY

# -d 後臺運行 ,-v 掛在目錄,-p 映射端口,後面是鏡像

注:容器名稱blog-solo,暴露宿主機端口8080,即使用宿主機IP 192.168.56.12:8080 訪問blog-solo項目。

blog-solo項目已配置完成,開始構建:

選擇tag,開始構建:


點擊左下角構建歷史裡,右擊第一個查看控制檯輸出:

構建詳細內容

構建成功

訪問:192.168.56.12:8080 查看部署結果

調整項目訪問地址

進入容器,切換到項目目錄

vi WEB-INF/classes/latke.properties

#### Server ####

# Browser visit protocol

serverScheme=http

# Browser visit domain name

serverHost=192.168.56.12

# Browser visit port, 80 as usual, THIS IS NOT SERVER LISTEN PORT!

serverPort=8080

調整後,重啟tomcat,再次驗證,OK,結果如下:

至此,自動化CI環境搭建完成,你可以模擬提交代碼並打tag測試自動化發佈流程。

八、問題總結:

查看docker.sock權限

[root@node03 ~]# ll /var/run/docker.sock

srw-rw---- 1 root docker 0 9月 4 21:55 /var/run/docker.sock

解決方法:【免sudo 使用docker images 】

[root@node03 ~]# sudo groupadd docker

##groupadd:“docker”組已存在

[root@node03 ~]# sudo gpasswd -a jenkins docker

##正在將用戶“jenkins”加入到“docker”組中

[root@node03 ~]# sudo service docker restart

##重啟服務

[root@node03 ~]# newgrp - docker

##重新加載group 組信息,一定要輸入這條命令,否則無法加載最新組內容,因為有緩存


分享到:


相關文章: