原文:https://www.toutiao.com/a6602...html
1、發佈流程設計node
工做流程:linux
開發人員提交代碼到Git版本倉庫;
Jenkins人工/定時觸發項目構建;
Jenkins拉取代碼、代碼編碼、打包鏡像、推送到鏡像倉庫;
Jenkins在Docker主機建立容器併發布。
2、環境規劃:git
3、 部署過程 github
1,部署gitweb
若是公司內部有直接克隆就能夠docker
git clone git@192.168.0.31:/home/git/solo.git
2,部署Jenkins環境apache
部署傳送門:Jenkins+Maven+Svn實現代碼自動打包與發佈vim
3,部署私有鏡像倉庫centos
注意: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
4、構建基礎鏡像
【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 . #最後這個點。表明當前路徑,在製做鏡像時,會記錄上下文內容
4,上傳到docker 鏡像倉庫
[root@node02 scripts]# docker push 192.168.56.11:5000/tomcat-85:latest
5,啓動鏡像 測試
[root@node02 scripts]# docker run -it -d -p 8080:8080 -v /usr/local/jdk1.8:/usr/local/jdk 192.168.56.11:5000/tomcat-8:latest [root@3addff07c464 ROOT]# echo "123" >index.jsp
5、Jenkins 配置
1.主頁面 -> 系統管理 -> 全局工具配置
指定JDK、Maven路徑,Git保持默認:
2.jenkins安裝必要插件
主頁面 -> 系統管理 ->管理插件:
安裝SSH與Git Parameter插件。
插件說明:
》SSH:用於SSH遠程Docker主機執行Shell命令
》Git Parameter:動態獲取Git倉庫Branch、Tag
3,配置SSH插件
第一步:先建立一個用於鏈接Docker主機的憑證 (有權限的用戶)
主頁面 -> 憑據 -> 系統 -> 右擊全局憑據 -> 添加憑據:
輸入鏈接Docker主機的用戶名和密碼:
第二步:添加SSH遠程主機
主頁面 -> 系統管理 -> 系統設置 -> SSH remote hosts:
問題:當以普通用戶身份去使用docker images時,出現如下錯誤:
6、將從github上下載的JAVA項目,上傳到本身的gitlab倉庫
# git clone https://github.com/b3log/solo # cd solo 移除舊的推送地址,添加新的: # git remote remove origin # git remote add origin git@gitlab.example.com: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項目:
7、Jenkins建立項目併發布測試
1.主頁面 -> 新建任務 -> 輸入任務名稱,構建一個Maven項目:
注意:若是沒有顯示「構建一個Maven項目」選項,須要在管理插件裏安裝「Maven Integration plugin」插件。
配置Git參數化構建:
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測試自動化發佈流程。
8、問題總結:
查看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 組信息,必定要輸入這條命令,不然沒法加載最新組內容,由於有緩存