在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经造成一套标准的流程,最重要的组成部分就是持续集成(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,恭喜