docker與jenkins的自動化CI/CD流水線實戰(git)

docker與jenkins的自動化CI/CD流水線實戰

在互聯網時代,對於每一家公司,軟件開發和發佈的重要性不言而喻,目前已經造成一套標準的流程,最重要的組成部分就是持續集成(CI)及持續部署、交付(CD)。本文基於Jenkins+Docker+Git實現一套CI自動化發佈流程。java

docker與jenkins的自動化CI/CD流水線實戰(git)

高效的CI/CD環境能夠得到:node

  • • 及時發現問題
  • • 大幅度減小故障率
  • • 加快迭代速度
  • • 減小時間成本

1、發佈流程設計

docker與jenkins的自動化CI/CD流水線實戰(git)
總結:開發===》提交代碼到Git/Svn===>推送到Jenkins====>經過代碼編譯、構建鏡像、推送===》Docker Registry(harbor)===>docker環境拉去倉庫信息==》發佈linux

docker與jenkins的自動化CI/CD流水線實戰(git)

工做流程:git

  1. 開發人員提交代碼到Git版本倉庫;
  2. Jenkins人工/定時觸發項目構建;
  3. Jenkins拉取代碼、代碼編碼、打包鏡像、推送到鏡像倉庫;
  4. Jenkins在Docker主機建立容器併發布。

環境規劃以下:
角色 IP
Jenkins/Docker 192.168.1.24
Docker 192.168.1.23
Git/Registry 192.168.1.25
github

2、部署Git倉庫

一、登陸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提交的地址
docker與jenkins的自動化CI/CD流水線實戰(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

3、準備Jenkins環境

官網下載地址:https://jenkins.io/download/
如圖點擊下載最後一個Generic Java package(war):
docker與jenkins的自動化CI/CD流水線實戰(git)

免密拉取代碼(從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

訪問:
http://192.168.1.24:8080/

docker與jenkins的自動化CI/CD流水線實戰(git)

安裝插件:
docker與jenkins的自動化CI/CD流水線實戰(git)

將https更改成http
docker與jenkins的自動化CI/CD流水線實戰(git)

更改完成後再重啓tomcat

安裝插件:
Pipeline:
docker與jenkins的自動化CI/CD流水線實戰(git)

SSH Slaves插件:
docker與jenkins的自動化CI/CD流水線實戰(git)

安裝Git插件:
docker與jenkins的自動化CI/CD流水線實戰(git)

安裝SCM API 插件

安裝Git Parameter 插件 --》爲了構建時顯示git 提交信息

插件下載失敗:
http://updates.jenkins-ci.org/download/plugins/ 這裏下載
而後再上傳插件
http://www.javashuo.com/article/p-hfhooove-gy.html

jenkins 安裝docker slave節點

master 只是調度,slave運行,這樣matser壓力就小不少

一、安裝jdk環境 ---192.168.1.23

1.1 安裝git
yum install git -y

二、新建節點
docker與jenkins的自動化CI/CD流水線實戰(git)

三、
docker與jenkins的自動化CI/CD流水線實戰(git)

四、添加192.168.1.23 root帳號
docker與jenkins的自動化CI/CD流水線實戰(git)

五、添加java路徑
docker與jenkins的自動化CI/CD流水線實戰(git)

六、保存
七、保存就啓動了:
docker與jenkins的自動化CI/CD流水線實戰(git)

八、在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項目
docker與jenkins的自動化CI/CD流水線實戰(git)

二、Branch 這個變量是在pipeline中定義的
docker與jenkins的自動化CI/CD流水線實戰(git)

推薦使用git版本號信息:

docker與jenkins的自動化CI/CD流水線實戰(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
        '''
   }
}

驗證:
一、構建:
docker與jenkins的自動化CI/CD流水線實戰(git)

docker與jenkins的自動化CI/CD流水線實戰(git)

如下是git 版本號信息:
docker與jenkins的自動化CI/CD流水線實戰(git)

二、若是有報錯就解決

三、訪問:http://192.168.1.23:88/

pipeline 總結:
一、不管發佈多少的版本,在docker的主機中只有一個鏡像,與其對應的一個容器。
二、在harbor中有不少個版本

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,恭喜

相關文章
相關標籤/搜索