jenkins+docker+gitlab自動化部署


 

流程:

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

Jenkins觸發項目構建;

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

Jenkins在Docker主機創建容器並發布

 

角色 IP
Jenkins/Docker 192.168.125.224
Docker 192.168.125.227
Gitlab/registry倉庫 192.168.125.222

安裝Docker

安裝依賴包
# yum install -y yum-utils device-mapper-persistent-data lvm2
添加Docker軟件包源:
# yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
安裝Docker CE,安裝最新版
# yum install docker-ce -y

配置加速器
# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s https://i9iblr0h.mirror.aliyuncs.com
啟動並開機啟動
# systemctl start docker
# systemctl enable docker

安裝指定版本docker

查詢可用版本

[root@bogon ~]# yum list docker-ce --showduplicates | sort -r

安裝指定版本

[root@bogon ~]# sudo yum install docker-ce-17.12.0.ce-1.el7.centos

部署私有鏡像倉庫

搭建私有鏡像倉庫,官方提供registry鏡像,搭建私有倉庫非常簡單。
在192.168.125.222部署:

# docker run -it -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry
接下來測試registry可用性。
由於Docker CLI默認以HTTPS訪問,而部署的registry並未提供HTTPS,因此,需要在pull鏡像的Docker主機(192.168.125.224 192.168.125.227)添加HTTP可信任:

# vi /etc/docker/daemon.json
{"insecure-registries":["192.168.0.219:5000"]}
# systemctl restart docker

注意:因為Docker從1.3.X之后,與docker registry交互默認使用的是https,然而此處搭建的私有倉庫只提供http服務,所以當與私有倉庫交互時就會報上面的錯誤。

為了解決這個問題需要在啟動docker server時增加啟動參數為默認使用http訪問。修改docker啟動配置文件:
vim /usr/lib/systemd/system/docker.service
找到 ExecStart
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.125.222:5000

重啟
# systemctl daemon-reload && systemctl restart docker

構建Tomcat基礎鏡像並上傳到倉庫

[root@localhost ~]# vi Dockerfile
FROM centos:7
#作者
MAINTAINER www
#拷貝tomcat jdk 到鏡像並解壓
ADD apache-tomcat-9.0.19.tar.gz /usr/local/tomcat
ADD jdk-8u211-linux-x64.tar.gz /usr/local/jdk
#定義交互時登錄路徑
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置jdk 和tomcat環境變量
ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_211
ENV CATALINA_HOME /usr/local/tomcat/apache-tomcat-9.0.19
ENV CATALINA_BASE /usr/local/tomcat/apache-tomcat-9.0.19
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#設置暴露的端口
EXPOSE 8080
#運行tomcat
CMD /usr/local/tomcat/apache-tomcat-9.0.19/bin/startup.sh && tail -f /usr/local/tomcat/apache-tomcat-9.0.19/logs/catalina.out

創建tomcat鏡像

# docker build -t 192.168.125.222:5000/tomcat -f Dockerfile .

推送鏡像到倉庫

[root@localhost harbor]# docker push 192.168.125.222:5000/tomcat

Jenkins配置全局工具配置及安裝見https://www.cnblogs.com/wengshaohang/p/12272952.html

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

Jenkins安裝必要插件

插件說明:

  • SSH:用於SSH遠程Docker主機執行Shell命令
  • Git Parameter:動態獲取Git倉庫Branch、Tag

上傳JAVA項目代碼到Gitlab倉庫見https://www.cnblogs.com/wengshaohang/p/12269127.html

hang@DESKTOP-06U4C20 MINGW64 ~/Desktop/repo/test-tag (master)
$ ll
total 4
-rw-r--r-- 1 hang 197121 1298 7月 17 2018 pom.xml
drwxr-xr-x 1 hang 197121 0 2月 13 13:46 src/

hang@DESKTOP-06U4C20 MINGW64 ~/Desktop/repo/test-tag (master)
$ git add .

hang@DESKTOP-06U4C20 MINGW64 ~/Desktop/repo/test-tag (master)
$ git commit -m"four"
[master 795f216] four
1 file changed, 20 deletions(-)
delete mode 100644 index.html

hang@DESKTOP-06U4C20 MINGW64 ~/Desktop/repo/test-tag (master)
$ git tag -a 4.0 -m 'version 4.0'

hang@DESKTOP-06U4C20 MINGW64 ~/Desktop/repo/test-tag (master)
$ git push origin 4.0
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 331 bytes | 7.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://gitlab.example.com/root/test-tag.git
* [new tag] 4.0 -> 4.0

Jenkins創建項目並發布測試

先創建一個用於連接Docker主機的憑據。
主頁面 -> 憑據 -> 系統 -> 右擊全局憑據 -> 添加憑據:輸入連接Docker主機的用戶名和密碼

添加SSH遠程主機
主頁面 -> 系統管理 -> 系統設置 -> SSH remote hosts:

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

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

配置Git參數化構建:

動態獲取Git倉庫tag,與用戶交互選擇Tag發布:

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

指定項目Git倉庫地址

設置maven構建命令選項

利用pom.xml文件構建項目

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

添加執行Shell

 

REPOSITORY=192.168.125.222:5000/solo:${Tag}
# 構建鏡像
cat > Dockerfile << EOF
FROM 192.168.125.222:5000/tomcat:latest
RUN rm -rf /usr/local/tomcat/apache-tomcat-9.0.19/webapps/ROOT
COPY target/*.war /usr/local/tomcat/apache-tomcat-9.0.19/webapps/ROOT.war
CMD /usr/local/tomcat/apache-tomcat-9.0.19/bin/startup.sh && tail -f /usr/local/tomcat/apache-tomcat-9.0.19/logs/catalina.out
EOF
docker build -t $REPOSITORY -f Dockerfile .
# 上傳鏡像
docker push $REPOSITORY

SSH遠程Docker主機執行的Shell命令如下

REPOSITORY=192.168.125.222:5000/solo:${Tag}
# 部署
docker rm -f blog-solo |true
docker image rm $REPOSITORY |true
docker container run -d --name blog-solo -v /usr/local/jdk1.8:/usr/local/jdk/jdk1.8.0_211 -p 88:8080 $REPOSITORY

注:容器名稱blog-solo,暴露宿主機端口88,即使用宿主機IP:88訪問blog-solo項目。
開始構建:

 構建成功 

Success控制台輸出

Started by user admin
Running as SYSTEM
Building in workspace /var/lib/jenkins/workspace/docker-maven-job
using credential 8018da86-0aa8-4ec1-a90b-ea9091668f83
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url https://gitlab.example.com/root/test-tag.git # timeout=10
Fetching upstream changes from https://gitlab.example.com/root/test-tag.git
 > git --version # timeout=10
using GIT_ASKPASS to set credentials 
 > git fetch --tags --progress https://gitlab.example.com/root/test-tag.git +refs/heads/*:refs/remotes/origin/* # timeout=10
 > git rev-parse origin/4.0^{commit} # timeout=10
 > git rev-parse 4.0^{commit} # timeout=10
Checking out Revision 795f216e4c3f264720959c59a0bb850e9b46b956 (4.0)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 795f216e4c3f264720959c59a0bb850e9b46b956 # timeout=10
Commit message: "four"
 > git rev-list --no-walk 795f216e4c3f264720959c59a0bb850e9b46b956 # timeout=10
Parsing POMs
Established TCP socket on 42758
[docker-maven-job] $ /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre/bin/java -cp /var/lib/jenkins/plugins/maven-plugin/WEB-INF/lib/maven35-agent-1.13.jar:/opt/apache-maven-3.6.3/boot/plexus-classworlds-2.6.0.jar:/opt/apache-maven-3.6.3/conf/logging jenkins.maven3.agent.Maven35Main /opt/apache-maven-3.6.3 /var/cache/jenkins/war/WEB-INF/lib/remoting-3.36.1.jar /var/lib/jenkins/plugins/maven-plugin/WEB-INF/lib/maven35-interceptor-1.13.jar /var/lib/jenkins/plugins/maven-plugin/WEB-INF/lib/maven3-interceptor-commons-1.13.jar 42758
<===[JENKINS REMOTING CAPACITY]===>channel started
Executing Maven:  -B -f /var/lib/jenkins/workspace/docker-maven-job/pom.xml clean package -Dmaven.test.skip=true
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------< com.jenkins.demo:Java-war-dev >--------------------
[INFO] Building Java-war-dev Maven Webapp 1.0.15-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ Java-war-dev ---
[INFO] Deleting /var/lib/jenkins/workspace/docker-maven-job/target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ Java-war-dev ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /var/lib/jenkins/workspace/docker-maven-job/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ Java-war-dev --- [INFO] No sources to compile
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ Java-war-dev --- [INFO] Not copying test resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ Java-war-dev --- [INFO] Not compiling test sources
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ Java-war-dev --- [INFO] Tests are skipped.
[INFO] 
[INFO] --- maven-war-plugin:2.2:war (default-war) @ Java-war-dev --- [INFO] Packaging webapp
[INFO] Assembling webapp [Java-war-dev] in [/var/lib/jenkins/workspace/docker-maven-job/target/Java-war-dev]
[INFO] Processing war project
[INFO] Copying webapp resources [/var/lib/jenkins/workspace/docker-maven-job/src/main/webapp]
[INFO] Webapp assembled in [33 msecs]
[INFO] Building war: /var/lib/jenkins/workspace/docker-maven-job/target/Java-war-dev.war
[INFO] WEB-INF/web.xml already added, skipping
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.536 s
[INFO] Finished at: 2020-02-13T15:52:32+08:00
[INFO] ------------------------------------------------------------------------
Waiting for Jenkins to finish collecting data
[JENKINS] Archiving /var/lib/jenkins/workspace/docker-maven-job/pom.xml to com.jenkins.demo/Java-war-dev/1.0.15-SNAPSHOT/Java-war-dev-1.0.15-SNAPSHOT.pom
[JENKINS] Archiving /var/lib/jenkins/workspace/docker-maven-job/target/Java-war-dev.war to com.jenkins.demo/Java-war-dev/1.0.15-SNAPSHOT/Java-war-dev-1.0.15-SNAPSHOT.war
[docker-maven-job] $ /bin/sh -xe /tmp/jenkins1278371825821922360.sh
channel stopped
+ REPOSITORY=192.168.125.222:5000/solo:4.0
+ cat
+ docker build -t 192.168.125.222:5000/solo:4.0 -f Dockerfile .
Sending build context to Docker daemon  142.3kB

Step 1/4 : FROM 192.168.125.222:5000/tomcat:latest
 ---> 9906b0cda9b6
Step 2/4 : RUN rm -rf /usr/local/tomcat/apache-tomcat-9.0.19/webapps/ROOT
 ---> Using cache
 ---> 759949116c4e
Step 3/4 : COPY target/*.war /usr/local/tomcat/apache-tomcat-9.0.19/webapps/ROOT.war
 ---> cf9194d6d3a3
Step 4/4 : CMD /usr/local/tomcat/apache-tomcat-9.0.19/bin/startup.sh && tail -f /usr/local/tomcat/apache-tomcat-9.0.19/logs/catalina.out
 ---> Running in 92cacc7e052f
Removing intermediate container 92cacc7e052f
 ---> edeb721fcf21
Successfully built edeb721fcf21
Successfully tagged 192.168.125.222:5000/solo:4.0
+ docker push 192.168.125.222:5000/solo:4.0
The push refers to repository [192.168.125.222:5000/solo]
28a096baffd0: Preparing
b03a3592622a: Preparing
04f4673a62fb: Preparing
9b939eed2759: Preparing
77b174a6a187: Preparing
9b939eed2759: Layer already exists
04f4673a62fb: Layer already exists
b03a3592622a: Layer already exists
77b174a6a187: Layer already exists
28a096baffd0: Pushed
4.0: digest: sha256:afc06a5e61b0c44b5169654d5cdc66bb2b35de3e8b29ee10610d2cd62069020c size: 1369
[SSH] script:
Tag="4.0"

REPOSITORY=192.168.125.222:5000/solo:${Tag}
# 部署
docker rm -f blog-solo |true
docker image rm $REPOSITORY |true
docker container run -d --name blog-solo -v /usr/local/jdk1.8:/usr/local/jdk/jdk1.8.0_211 -p 88:8080 $REPOSITORY

[SSH] executing...
Unable to find image '192.168.125.222:5000/solo:4.0' locally
4.0: Pulling from solo
ab5ef0e58194: Already exists
3b337890937f: Already exists
3f7f10ca4129: Already exists
6ccbe376db89: Pulling fs layer
70f6c40dd4de: Pulling fs layer
70f6c40dd4de: Verifying Checksum
70f6c40dd4de: Download complete
6ccbe376db89: Verifying Checksum
6ccbe376db89: Download complete
6ccbe376db89: Pull complete
70f6c40dd4de: Pull complete
Digest: sha256:afc06a5e61b0c44b5169654d5cdc66bb2b35de3e8b29ee10610d2cd62069020c
Status: Downloaded newer image for 192.168.125.222:5000/solo:4.0
c2292a2cffd17643c90ef8f581d806f69f5a38b64d349ec0cec5a56e9f0fd707

[SSH] completed
[SSH] exit-status: 0

Finished: SUCCESS
訪問192.168.125.227:88即可看到頁面


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM