Jenkins+Docker+Git实现自动化CI/CD

在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要。目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部署、交付(CD)。在此,我们来以一个案例初步了解 CI 流程。那么什么是 CI 呢?简单来讲,CI 就是将传统的代码合并、构建、部署、测试都集成在一起,不断地执行这个过程,并对结果进行反馈。

CI 流程设计图:

工作流程:

  • 开发人员提交代码到Git版本仓库;

  • Jenkins人工/定时触发项目构建;

  • Jenkins拉取代码、代码编码、打包镜像、推送到镜像仓库;

  • Jenkins在Docker主机创建容器并发布

主机环境规划:

  • docker-jenkins: 10.0.0.98

  • docker-git-harbor:10.0.0.99

01 部署Git代码版本仓库

安装:

[root@docker-git-harbor ~]# yum install git -y

配置git用户:

  1. [root@docker-git-harbor ~]# useradd git

  2. [root@docker-git-harbor ~]# passwd git

创建库:

  1. [git@docker-git-harbor ~]$ mkdir tomcat-java-demo.git

  2. [git@docker-git-harbor ~]$ cd tomcat-java-demo.git/

  3. [git@docker-git-harbor tomcat-java-demo.git]$ git --bare init

  4. Initialized empty Git repository in /home/git/tomcat-java-demo.git/

  5. [git@docker-git-harbor tomcat-java-demo.git]$ ls

  6. branches config description HEAD hooks info objects refs

  7. [git@docker-git-harbor tomcat-java-demo.git]$

另一台docker-jenkins访问该仓库:

  1. [root@docker-jenkins ~]# git clone git@10.0.0.99:/home/git/tomcat-java-demo.git

  2. Cloning into 'solo'...

  3. The authenticity of host '10.0.0.99 (10.0.0.99)' can't beestablished.

  4. ECDSA key fingerprintis SHA256:XNWQhGsAsqd84k/6OYV3xl1+mPGjtASsxeV1YVLZVas.

  5. ECDSA keyfingerprint is MD5:b4:bd:16:2b:de:e7:7c:fd:c5:dd:91:75:20:ff:3e:0a.

  6. Are you sure you want to continue connecting (yes/no)? yes

  7. Warning: Permanently added '10.0.0.99' (ECDSA) to the list of known hosts.

  8. git@10.0.0.99'spassword:

  9. warning: You appear to have cloned an empty repository.

  10. [root@docker-jenkins ~]# ls

  11. anaconda-ks.cfg tomcat-java-demo.git

  12. [root@docker-jenkins ~]# ls tomcat-java-demo.git

  13. [root@docker-jenkins ~]#

模拟生产项目,拉取github上的一个demo,并上传至本地git库

  1. [root@docker-jenkins ~]# mv tomcat-java-demo tomcat-java-demo.bak

  2. [root@docker-jenkins ~]# git clone https://github.com/dingkai163/tomcat-java-demo.git

  3. [root@docker-jenkins tomcat-java-demo]# cat .git/config

  4. [core]

  5. repositoryformatversion = 0

  6. filemode = true

  7. bare = false

  8. logallrefupdates = true

  9. [remote "origin"]

  10. url = git@10.0.0.99:/home/git/tomcat-java-demo.git # 修改为本地的git库地址

  11. fetch = +refs/heads/*:refs/remotes/origin/*

  12. [branch "master"]

  13. remote = origin

  14. merge = refs/heads/master

  15. [root@docker-jenkins tomcat-java-demo]# git add .

  16. [root@docker-jenkins tomcat-java-demo]# git status

  17. # On branch master

  18. nothing to commit, working directory clean

  19. [root@docker-jenkins tomcat-java-demo]# git commit -m "all"

  20. # On branch master

  21. nothingto commit, working directory clean

  22. [root@docker-jenkins tomcat-java-demo]# git push origin master

  23. git@10.0.0.99'spassword:

  24. Counting objects: 229, done.

  25. Compressing objects: 100% (185/185), done.

  26. Writing objects: 100% (229/229), 4.52 MiB | 0 bytes/s, done.

  27. Total 229 (delta 25), reused 229 (delta 25)

  28. To git@10.0.0.99:/home/git/tomcat-java-demo.git

  29. * [new branch] master -> master

  30. [root@docker-jenkins tomcat-java-demo]#

02 jenkins环境部署

部署jdk环境及maven

  1. [root@docker-jenkins ~]# mkdir tools

  2. [root@docker-jenkins ~]# cd tools

  3. [root@docker-jenkins tools]# rz -y

  4. [root@docker-jenkins tools]# tar zxvf jdk-8u45-linux-x64.tar.gz

  5. [root@docker-jenkins tools]# mv jdk1.8.0_45 /usr/local/jdk

  6. [root@docker-jenkins tools]# vim /etc/profile

  7. JAVA_HOME=/usr/local/jdk

  8. PATH=$PATH:$JAVA_HOME/bin CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

  9. export JAVA_HOME PATH CLASSPATH

  10. [root@docker-jenkins tools]# source /etc/profile

  11. [root@docker-jenkins tools]# java -version

  12. java version "1.8.0_45"

  13. Java(TM)SE Runtime Environment (build 1.8.0_45-b14)

  14. Java HotSpot(TM)64-Bit Server VM (build 25.45-b02, mixed mode)

  15. [root@docker-jenkins tools]# tar zxf apache-maven-3.5.0-bin.tar.gz

  16. [root@docker-jenkins tools]# mv apache-maven-3.5.0 /usr/local/maven

在10.0.0.98主机安装Jenkins,下载Tomcat二进制包将war包到webapps下即可:

  1. [root@docker-jenkins tools]# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

  2. [root@docker-jenkins tools]# wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.38/bin/apache-tomcat-8.5.38.tar.gz

  3. [root@docker-jenkins tools]# tar zxf apache-tomcat-8.5.38.tar.gz

  4. [root@docker-jenkins tools]# ls

  5. apache-tomcat-8.5.38 apache-tomcat-8.5.38.tar.gz jdk-8u45-linux-x64.tar.gz jenkins.war

  6. [root@docker-jenkins tools]# mv apache-tomcat-8.5.38 /usr/local/tomcat-jenkins

  7. [root@docker-jenkins tools]# ls /usr/local/tomcat-jenkins/webapps/

  8. docs examples host-manager manager ROOT

  9. [root@docker-jenkins tools]# rm -rf /usr/local/tomcat-jenkins/webapps/*

  10. [root@docker-jenkins tools]# mv jenkins.war /usr/local/tomcat-jenkins/webapps/ROOT.war

  11. [root@docker-jenkins tools]# ll /usr/local/tomcat-jenkins/webapps/

  12. total 75520

  13. -rw-r--r--. 1 root root 77330344 Mar 15 00:55 ROOT.war

  14. [root@docker-jenkins tools]# cd /usr/local/tomcat-jenkins/bin/

  15. [root@docker-jenkins bin]# ./startup.sh

  16. Using CATALINA_BASE: /usr/local/tomcat-jenkins

  17. UsingCATALINA_HOME: /usr/local/tomcat-jenkins

  18. Using CATALINA_TMPDIR: /usr/local/tomcat-jenkins/temp

  19. Using JRE_HOME: /usr/local/jdk1.8

  20. Using CLASSPATH: /usr/local/tomcat-jenkins/bin/bootstrap.jar:/usr/local/tomcat-jenkins/bin/tomcat-juli.jar

  21. Tomcat started.

  22. [root@docker-jenkins bin]#

启动后,浏览器访问http://10.0.0.98:8080/,按提示输入密码,登录即可。

03 部署私有镜像仓库

企业级harbor镜像仓库部署:

https://www.cnblogs.com/kaye/p/10524391.html

构建Tomcat基础镜像,并推送到harbor镜像库:

  1. [root@docker-git-harbor ~]# cd tomcat

  2. [root@docker-git-harbor tomcat]# cat Dockerfile-tomcat

  3. FROM centos:7

  4. MAINTAINER www.cnblogs.com/kaye/

  5. ENV VERSION=8.5.38

  6. RUN yum install java-1.8.0-openjdkwget curl unzip iproute net-tools -y && \

  7. yum clean all && \

  8. rm -rf /var/cache/yum/*

  9. RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apachetomcat-${VERSION}.tar.gz && \

  10. tar zxf apache-tomcat-${VERSION}.tar.gz && \

  11. mv apache-tomcat-${VERSION} /usr/local/tomcat && \

  12. rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \

  13. mkdir /usr/local/tomcat/webapps/test && \

  14. echo "ok" > /usr/local/tomcat/webapps/test/status.html && \

  15. sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \

  16. ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

  17. ENV PATH $PATH:/usr/local/tomcat/bin

  18. EXPOSE 8080

  19. CMD ["catalina.sh", "run"]

  20. [root@docker-git-harbor tomcat]# docker build -t tomcat:v1 -f Dockerfile-tomcat .

  21. [root@docker-git-harbor tomcat]# docker tag tomcat:v1 reg.dingkai.com/library/tomcat:v1

  22. [root@docker-git-harbor tomcat]# docker login reg.dingkai.com

  23. [root@docker-git-harbor tomcat]# docker push reg.dingkai.com/library/tomcat:v1

04 Jenkins安装必要插件

由于jenkins是离线安装,所有在此需要配置一下插件下载地址:系统管理-->插件管理-->Advanced

修改下方地址,将https修改为http 再点Submit

Submit后点击Available,Check now此时我们可以看到很多可获得插件

首先搜索并安装Pipeline插件
pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。

再安装SCM to job 插件,同上步骤(搜索,安装)。

05 项目创建

创建jobs

选择流水线类型

到这里我们就开始配置Pipeline script,点击Pipeline语法,来自动生成我们需要的配置。

如下图,我们Git方式,配置Git仓库地址,再添加认证相关

这里我们使用的是秘钥认证方式,需要将jenkins上生成的公钥发送到git服务器上,然后将jenkins上的生成的私钥内容粘贴到下图Key中,这样jenkins就可以免交互的拉取git仓库中的代码了。

  1. [root@docker-jenkins bin]# ssh-keygen

  2. Generating public/private rsa key pair.

  3. Enter file in which tosavethe key (/root/.ssh/id_rsa):

  4. Enterpassphrase (empty for no passphrase):

  5. Enter same passphrase again:

  6. Your identification hasbeen saved in /root/.ssh/id_rsa.

  7. Your public keyhas been saved in /root/.ssh/id_rsa.pub.

  8. The keyfingerprint is:

  9. SHA256:1vD8XM3lDYFmrxgAbwPTLwb0fl+oEx8cFgtykpg4ODI root@

  10. docker-jenkins

  11. The key's randomart image is:

  12. +---[RSA 2048]----+

  13. | . o==o.o ... |

  14. |E o o +=++ .+o . |

  15. | o . . .*o o+.. .|

  16. | oo*oo o.=o|

  17. | .S.*o+.o =|

  18. | . ..B.+ |

  19. | o = |

  20. | . |

  21. | |

  22. +----[SHA256]-----+

  23. [root@docker-jenkins bin]# cd

  24. [root@docker-jenkins ~]#

  25. [root@docker-jenkins ~]#

  26. [root@docker-jenkins ~]# ls .ssh/

  27. id_rsa id_rsa.pub known_hosts

  28. [root@docker-jenkins ~]# ssh-copy-id git@10.0.0.99

  29. /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"

  30. /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

  31. /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

  32. git@10.0.0.99'spassword:

  33. Number of key(s)added: 1

  34. Now trylogging into the machine, with: "ssh 'git@10.0.0.99'"

  35. andcheck to make sure that onlythe key(s)you wanted were added.

  36. [root@docker-jenkins ~]#

配置完成后,我们就可以生成Pipeline脚本了。点击下方Generate Pipeline Script,然后复制方框内的内容。

编写我们所需要的Pipeline脚本如下,将其粘贴到script的拉取代码模块中,并修改分支master为${branch},其他模块内容自行编写。

  1. node {

  2. // 拉取代码 stage('Git Checkout') {

  3. checkout([$class: 'GitSCM', branches: [[name: '${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'c42214eb-db1e-49fb-83c9-f78d1f4310a2', url: 'git@10.0.0.99:/home/git/tomcat-java-demo.git']]])

  4. } // 代码编译 stage('Maven Build') {

  5. sh '''

  6. export JAVA_HOME=/usr/local/jdk

  7. /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true ''' } // 项目打包到镜像并推送到镜像仓库

  8. /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true ''' } // 项目打包到镜像并推送到镜像仓库 stage('Build and Push Image') {sh '''REPOSITORY=reg.dingkai.com/library/tomcat-java-demo:${branch}

  9. cat > Dockerfile << EOFFROM reg.dingkai.com/library/tomcat:v1

  10. MAINTAINER kaiRUN rm -rf /usr/local/tomcat/webapps/*ADD target/*.war /usr/local/tomcat/webapps/ROOT.war

  11. EOF

  12. EOF

  13. docker build -t $REPOSITORY .

  14. docker login reg.dingkai.com -u admin -p 123456

  15. docker push $REPOSITORY'''

  16. }

  17. // 部署到Docker主机

  18. '''

  19. }

  20. // 部署到Docker主机

  21. stage('Deploy to Docker') {

  22. sh '''

  23. REPOSITORY=reg.dingkai.com/library/tomcat-java-demo:${branch}

  24. docker rm -f tomcat-java-demo |true

  25. docker pull $REPOSITORY

  26. docker container run -d --name tomcat-java-demo -p 88:8080 $REPOSITORY

  27. '''

  28. }

  29. }

在Pipeline脚本里面我们指定了一个branch参数,所以我们需要传递一个参数变量,这里我们选择参数化构建,默认值为master分支。

然后保存配置。

06 开始构建任务

回到主界面,我们开始构建任务

可以通过Console Output输出查看jenkins构建流程

成功构建会提示: SUCCESS

我们也可以查看构建成功后的图形构建过程

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1189541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

武汉硕士留学中介口碑排名全面解析,学员满意度高成核心指标 - 留学机构评审官

武汉硕士留学中介口碑排名全面解析,学员满意度高成核心指标作为一名拥有六年武汉地区硕士申请规划经验的国际教育导师,我深知本地学子在选择留学中介时面临的困惑:信息渠道繁杂,如何辨别真伪?机构宣传语焉不详,如…

2026电力检查井厂家权威推荐榜单:水泥检查井/成品检查井/预制检查井/大管径检查井/混凝土检查井源头厂家精选。

在城市地下管网这一“看不见的生命线”中,电力检查井作为电缆敷设、检修与安全防护的核心节点,其质量与可靠性直接关系到电网运行的稳定与公共安全。行业研究数据显示,预制检查井已成为新建项目的绝对主流,其市场集…

选择济南TOP10研究生留学中介,录取案例多,成功率有保障 - 留学机构评审官

选择济南TOP10研究生留学中介,录取案例多,成功率有保障一、济南学子如何挑选研究生留学中介?在2026年的今天,济南高校的学子们规划海外研究生深造时,常面临几个核心关切:如何在众多本地机构中筛选出靠谱的选项?…

接口自动化测试覆盖率

一、接口覆盖率统计&#xff1a;3大核心维度 ▶ 1. 代码级覆盖率&#xff08;最严谨&#xff09; 原理&#xff1a;通过代码插桩&#xff0c;统计接口对应的业务代码执行情况 工具&#xff1a; Java&#xff1a;Jacoco Jenkins Python&#xff1a;Coverage.py Pytest 优…

2026年正规MVR蒸发器优质厂家推荐 - 优质品牌商家

2026年正规MVR蒸发器优质厂家推荐一、行业背景与推荐依据据《2026-2030年中国工业高浓度废水处理设备行业发展白皮书》显示,2026年国内高浓度工业废水排放量突破120亿吨,年复合增长率达8.7%,其中化工、新材料新能源…

2026不锈钢粉末冶金厂家权威推荐榜单

在工业制造领域,粉末冶金制品以其高精度、高性能的特点,成为汽车、家电、医疗器械等行业的关键部件。据统计,全球粉末冶金市场规模已突破200亿美元,年复合增长率达6.5%,其中中国占比超30%。在众多生产厂家中,深圳…

长沙硕士留学中介top10揭秘,学员满意度高,留学成功保障 - 留学机构评审官

长沙硕士留学中介top10揭秘,学员满意度高,留学成功保障一、长沙准硕士生如何甄别留学中介?高满意度与成功保障从何而来?我是李枫,一名在长沙从事国际教育规划工作已逾八年的专业顾问。撰写本文时是2026年1月9日。…

2026年警用电动车厂家选择指南:聚焦性能与安全 - 品牌排行榜

随着城市治安管理需求的不断升级,警用电动车凭借灵活便捷、低碳环保的特点,成为现代警务巡逻中的重要装备。选择专业的警用电动车厂家,对于保障巡逻效率、提升警务工作质量具有关键意义。这类厂家通常需具备成熟的研…

看不懂Jmeter报告?这篇让性能小白也能轻松入门!

本章主要说明2个方法查看压测结果 Aggregate Report Aggregate Report翻译为聚合报告&#xff0c;是JMeter常用的一个Listener。 添加路径&#xff1a;右键Thread Group或Test Plan > Add > Listener > Aggregate Report 配置了HTTP Request和Aggregate Report后运…

2026治安巡逻电动车厂家实力盘点 主流品牌技术解析 - 品牌排行榜

随着城市治安管理体系的不断完善,治安巡逻电动车作为基层执勤的重要装备,其性能稳定性与适用性直接影响巡逻工作的效率。选择具备专业研发能力与可靠生产实力的厂家,成为保障设备长期稳定运行的关键。以下从产品特性…

让聊天ai调用functioncall ai --不发工具消息给聊天的ai

我输入/r之后才会调用functioncall ai来调用工具&#xff0c;那聊天ai也可以我看neuro-sama好像就是这样做的有一个好处就是不/r的时候可以不发工具消息给用来聊天的ai

【实战项目】 基于springboot的网络文学交流分享平台

运行效果:https://lunwen.yeel.cn/view.php?id=5840 基于springboot的网络文学交流分享平台摘要:随着互联网技术的飞速发展,网络文学交流分享平台成为文化信息传播的重要渠道。本文以Spring Boot框架为基础,设计并…

我是如何解决接口自动化中的20个典型问题的?

我是一名接口自动化测试工程师&#xff0c;在公司中负责接口自动化测试的设计和执行。在公司中&#xff0c;接口自动化测试非常重要&#xff0c;因为公司的业务场景非常复杂&#xff0c;需要保证接口的质量。在这篇文章中&#xff0c;我将分享我在公司中接口自动化测试遇到的20…

【实战项目】 基于深度学习的人体行为识别器

运行效果:https://lunwen.yeel.cn/view.php?id=5850 基于深度学习的人体行为识别器摘要:随着人工智能技术的快速发展,深度学习在各个领域得到了广泛应用。在人体行为识别领域,传统的识别方法存在准确率低、实时性…

ai调用mcp 直接基于mcp库

不过ai 直接调用mcp方法 ClientSession, StdioServerParameters-CSDN博客 https://www.bilibili.com/video/BV1ZLkLB1EWo import tkinter as tk from tkinter import scrolledtext, messagebox import asyncio import sys import os import json import threading import re …

“人类心智制定和解决复杂问题的能力,与在现实世界中实现客观理性行为所需处理的问题规模相比,显得极为有限。” — 赫伯特·A·西蒙(Herbert A. Simon)

“人类心智制定和解决复杂问题的能力,与在现实世界中实现客观理性行为所需处理的问题规模相比,显得极为有限。” — 赫伯特A西蒙(Herbert A. Simon) 文章目录 “人类心智制定和解决复杂问题的能力,与在现实世界中实现客观理性行为所需处理的问题规模相比,显得极为有限。”…

C++算法训练第八天

C++算法训练第八天 以下为牛客挑战 今日收获 学习到了ksm的写法 int ksm(int p,int q,int mod){int result=1;p=p%mod;while (q>0){if(q&1){//result=(1ll*result*p)%mod;}q=q>>1;p=(1ll*p*p)%mod;}retur…

2026年上海防水补漏行业顶尖企业权威评测:全面解析防水、修复、翻新与检测服务 - shruisheng

随着上海城市建筑步入成熟期,各类建筑渗漏问题日益成为影响居住安全与建筑寿命的关键因素。为帮助业主及管理方精准选择可靠的防水服务商,本次评测严格依据上海建筑防水行业协会发布的2025年度行业数据,结合企业技术…

【实战项目】 方正科技市场营销策略研究

运行效果:https://lunwen.yeel.cn/view.php?id=5841 方正科技市场营销策略研究摘要:本文以方正科技为研究对象,对其市场营销策略进行了深入分析。通过文献研究、市场调研和案例研究等方法,探讨了方正科技的市场定…

【Web安全】SSRF - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …