在互聯網時代,對於每一家公司,軟件開發和發佈的重要性不言而喻,目前已經造成一套標準的流程,最重要的組成部分就是持續集成(CI)及持續部署、交付(CD)。本文基於Jenkins+Docker+Git實現一套CI自動化發佈流程。java
高效的CI/CD環境能夠得到:node
總結:開發===》提交代碼到Git/Svn===>推送到Jenkins====>經過代碼編譯、構建鏡像、推送===》Docker Registry(harbor)===>docker環境拉去倉庫信息==》發佈linux
工做流程:git
環境規劃以下:
角色 IP
Jenkins/Docker 192.168.1.24
Docker 192.168.1.23
Git/Registry 192.168.1.25github
一、登陸192.168.1.25
[root@docker harbor]# yum install git -yweb
二、建立Git用戶並設置密碼
[root@docker harbor]# useradd git
[root@docker harbor]# passwd gitdocker
三、建立倉庫
[git@docker ~]$ mkdir java-demo.git
初始化:
[git@docker ~]$ cd java-demo.git/
[git@docker java-demo.git]$ git --bare initapache
四、登陸jenkins 虛擬機-192.168.1.24
[root@docker ~]# git clone git@192.168.1.25:/home/git/java-demo.gitjson
五、拉去代碼(試驗):
[root@docker ~]# git clone https://github.com/lizhenliang/tomcat-java-demo.gittomcat
六、更改git提交的地址
七、再提交到git倉庫
[root@docker tomcat-java-demo]# git add .
[root@docker tomcat-java-demo]# git commit -m 'java-demo'
運行如下2個命令:
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
[root@docker tomcat-java-demo]# git push origin master
origin:是名字--在.git/config配置文件中
master:是主分支
八、再拉去代碼:
[root@docker tomcat-java-demo]# cd ../java-demo/
[root@docker java-demo]# git pull
官網下載地址:https://jenkins.io/download/
如圖點擊下載最後一個Generic Java package(war):
免密拉取代碼(從docker (192.168.1.23那臺機,由於是docker那臺機發布的) 免密ssh 登陸到git那臺機)
[root@docker ~]# ssh-keygen
[root@docker ~]# ssh-copy-id git@192.168.1.25
由於須要docker(192.168.1.23)發佈,是獲取192.168.1.25(harbor)上的鏡像,須要在192.168.1.23上修改配置,才能拉取
[root@docker java-demo]# vi /etc/docker/daemon.json
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"],"insecure-registries":["192.168.1.25"]}
重啓docker
驗證:
[root@docker ~]# ssh git@192.168.1.25
準備java環境
[root@docker tools]# tar xf jdk-8u65-linux-x64.gz -C /usr/local/
[root@docker local]# mv jdk1.8.0_65/ jdk1.8
[root@docker local]# vi /etc/profile --新增以下
JAVA_HOME=/usr/local/jdk1.8
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH
[root@docker local]# source /etc/profile
[root@docker local]# java -version
jenkins部署:
[root@docker tools]# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
[root@docker tools]# tar xf apache-tomcat-8.5.32.tar.gz -C /usr/local/
[root@docker tools]# cd /usr/local/
[root@docker local]# mv apache-tomcat-8.5.32/ tomcat-jenkins
刪除網站根目錄
[root@docker tomcat-jenkins]# cd webapps/
[root@docker webapps]# ls
docs examples host-manager manager ROOT
[root@docker webapps]# rm -rf *
將jenkins解壓到網站根目錄,就是ROOT目錄下
[root@docker webapps]# unzip /data/tools/jenkins.war -d ROOT
啓動:
[root@docker webapps]# sh ../bin/startup.sh
安裝插件:
將https更改成http
更改完成後再重啓tomcat
安裝插件:
Pipeline:
SSH Slaves插件:
安裝Git插件:
安裝SCM API 插件
安裝Git Parameter 插件 --》爲了構建時顯示git 提交信息
插件下載失敗:
http://updates.jenkins-ci.org/download/plugins/ 這裏下載
而後再上傳插件
http://www.javashuo.com/article/p-hfhooove-gy.html
master 只是調度,slave運行,這樣matser壓力就小不少
一、安裝jdk環境 ---192.168.1.23
1.1 安裝git
yum install git -y
二、新建節點
三、
四、添加192.168.1.23 root帳號
五、添加java路徑
六、保存
七、保存就啓動了:
八、在192.168.1.23-docker上安裝maven
[root@docker tools]# tar xf apache-maven-3.5.0-bin.tar.gz -C /usr/local/
[root@docker local]# mv apache-maven-3.5.0/ maven-3.5.0
一、建立pipeline項目
二、Branch 這個變量是在pipeline中定義的
推薦使用git版本號信息:
三、編輯pipeline
只保留正在使用一個鏡像
node ("192.168.1.23-docker") { // 指定Slave標籤 // 拉取代碼 stage('Git Checkout') { checkout([$class: 'GitSCM', branches: [[name: '$Branch']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'git@192.168.1.25:/home/git/java-demo.git']]]) } // 代碼編譯 stage('Maven Build') { sh ''' export JAVA_HOME=/usr/local/jdk1.8 /usr/local/maven-3.5.0/bin/mvn clean package -Dmaven.test.skip=true ''' } // 項目打包到鏡像並推送到鏡像倉庫 stage('Build and Push Image') { sh ''' REPOSITORY=192.168.1.25/java/java-demo:${Branch} echo ' FROM 192.168.1.25/library/tomcat:v8.5.32 COPY target/*.war /usr/local/tomcat/webapps/ROOT.war ' > Dockerfile docker build -t $REPOSITORY . docker login -u jack -p 123Abc456 192.168.1.25 docker push $REPOSITORY ''' } // 部署到Docker主機 stage('Deploy to Docker') { sh ''' REPOSITORY=192.168.1.25/java/java-demo:${Branch} docker rm -f java-demo |true docker image rm $(docker images| grep "192.168.1.25/java/java-demo"| grep 'none'|awk '{print $3}')|true docker image rm $REPOSITORY |true docker login -u jack -p 123Abc456 192.168.1.25 docker run -d --name java-demo -p 88:8080 $REPOSITORY new_image=`docker images |grep "192.168.1.25/java/java-demo"| head -n 1|awk '{print $3}'` for i in `docker images|grep "192.168.1.25/java/java-demo"|awk '{print $3}'`;do [ "$i" != "${new_image}" ] && docker image rm -f $i;done|true ''' } }
驗證:
一、構建:
如下是git 版本號信息:
二、若是有報錯就解決
pipeline 總結:
一、不管發佈多少的版本,在docker的主機中只有一個鏡像,與其對應的一個容器。
二、在harbor中有不少個版本
參考文檔:https://blog.csdn.net/kong2030/article/details/81331142?tdsourcetag=s_pcqq_aiomsg
Harbor私有倉庫運行一段時間後,倉庫中存有大量鏡像,會佔用太多的存儲空間。直接經過Harbor界面刪除相關鏡像,並不會自動刪除存儲中的文件和鏡像。須要中止Harbor服務,執行垃圾回收命令,進行存儲空間清理和回收。
一、首先,刪除Harbor的UI中的存儲庫。這是軟刪除。您能夠刪除整個存儲庫或僅刪除它的標籤。軟刪除後,Harbour中再也不管理存儲庫,可是存儲庫的文件仍然保留在Harbour的存儲中。
二、接下來,使用註冊表的垃圾回收(GC)刪除存儲庫的實際文件。在執行GC以前,確保沒有人推送圖像或Harbour根本沒有運行。若是有人在GC運行時推送鏡像,則存在鏡像層被錯誤刪除的風險,從而致使鏡像損壞。因此在運行GC以前,首選的方法是先中止Harbour。
cd /usr/local/harbor
docker-compose stop
三、在部署Harbour的主機上運行如下命令以預覽會影響哪些文件/鏡像
注:上述選項」–dry-run」將打印進度而不刪除任何數據。
docker run -it --name gc --rm --volumes-from registry vmware/registry-photon:v2.6.2-v1.5.0 garbage-collect --dry-run /etc/registry/config.yml
四、使用如下命令執行垃圾回收並從新啓動Harbour。
docker run -it --name gc --rm --volumes-from registry vmware/registry-photon:v2.6.2-v1.5.0 garbage-collect /etc/registry/config.yml
五、docker-compose start
六、最後驗證: a:du -sh /data/registry/docker/registry/v2/blobs&repositories和以前該目錄文件大小作對比 b:從新上傳以前刪除的鏡像,如沒成功刪除會報鏡像已存在,能成功上傳則一切ok,恭喜