
流程:
開發人員提交代碼到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項目。
開始構建:

構建成功
控制台輸出
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即可看到頁面
