当前位置: 首页 > news >正文

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

你是否还在手动构建、测试、部署过程中频繁等待?或者担心“我本地没问题,部署却报错”?在敏捷开发和 DevOps 时代,**持续集成与持续交付(CI/CD)**变得至关重要。将 Jenkins、Docker、Git 三者结合,能够帮助你实现“提交即验证,构建即发布”的极速自动化体验。

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

持续集成和持续部署(CI/CD)是现代软件开发的核心实践,能够显著提高开发效率和代码质量。通过结合 Jenkins(自动化服务器)、Docker(容器化平台)和 Git(版本控制系统),可以构建一个高效的 CI/CD 管道,自动完成代码的构建、测试和部署。本指南详细介绍了如何使用这些工具实现自动化 CI/CD,基于多个可靠来源整理,适合从初学者到高级用户。

那么,怎么利用 Jenkins、Docker 和 Git 搭建一条高效、稳定的 CI/CD 流水线?涉及哪些核心步骤?哪些坑需要提前避开?本文将带你零基础上手,一步步实现自动化部署。

背景

CI/CD 旨在通过自动化流程减少手动操作,确保代码更改能够快速、可靠地集成和部署到生产环境。Jenkins 提供了一个灵活的平台来协调这些流程,Docker 确保环境一致性,而 Git 则用于管理代码版本。本指南以一个简单的 Node.js 应用程序为例,展示如何搭建一个完整的 CI/CD 管道。

CI 流程设计图:

图片

图片

 

工作流程:

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

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

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

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

主机环境规划:

  • docker-jenkins:    10.0.0.98

  • docker-git-harbor:10.0.0.99

部署Git代码版本仓库

安装:

yum install git -y

配置git用户:

useradd gitpasswd git

创建库:

[git@docker-git-harbor ~]$ mkdir tomcat-java-demo.git[git@docker-git-harbor ~]$ cd tomcat-java-demo.git/[git@docker-git-harbor tomcat-java-demo.git]$ git --bare initInitialized empty Git repository in /home/git/tomcat-java-demo.git/[git@docker-git-harbor tomcat-java-demo.git]$ lsbranches  config  description  HEAD  hooks  info  objects  refs[git@docker-git-harbor tomcat-java-demo.git]$

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

[root@docker-jenkins ~]# git clone git@10.0.0.99:/home/git/tomcat-java-demo.gitCloning into 'solo'...The authenticity of host '10.0.0.99 (10.0.0.99)' can't beestablished.ECDSA key fingerprintis SHA256:XNWQhGsAsqd84k/6OYV3xl1+mPGjtASsxeV1YVLZVas.ECDSA keyfingerprint is MD5:b4:bd:16:2b:de:e7:7c:fd:c5:dd:91:75:20:ff:3e:0a.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '10.0.0.99' (ECDSA) to the list of known hosts.git@10.0.0.99'spassword:warning: You appear to have cloned an empty repository.[root@docker-jenkins ~]# lsanaconda-ks.cfg  tomcat-java-demo.git[root@docker-jenkins ~]# ls tomcat-java-demo.git[root@docker-jenkins ~]#

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

[root@docker-jenkins ~]# mv tomcat-java-demo tomcat-java-demo.bak[root@docker-jenkins ~]# git clone https://github.com/dingkai163/tomcat-java-demo.git[root@docker-jenkins tomcat-java-demo]# cat .git/config[core]repositoryformatversion = 0filemode = truebare = falselogallrefupdates = true[remote "origin"]url = git@10.0.0.99:/home/git/tomcat-java-demo.git  # 修改为本地的git库地址fetch = +refs/heads/*:refs/remotes/origin/*[branch "master"]remote = originmerge = refs/heads/master[root@docker-jenkins tomcat-java-demo]# git add .[root@docker-jenkins tomcat-java-demo]# git status# On branch masternothing to commit, working directory clean[root@docker-jenkins tomcat-java-demo]# git commit -m "all"# On branch masternothingto commit, working directory clean[root@docker-jenkins tomcat-java-demo]# git push origin mastergit@10.0.0.99'spassword:Counting objects: 229, done.Compressing objects: 100% (185/185), done.Writing objects: 100% (229/229), 4.52 MiB | 0 bytes/s, done.Total 229 (delta 25), reused 229 (delta 25)To git@10.0.0.99:/home/git/tomcat-java-demo.git* [new branch]      master -> master[root@docker-jenkins tomcat-java-demo]#

jenkins环境部署

部署jdk环境及maven

[root@docker-jenkins ~]# mkdir tools[root@docker-jenkins ~]# cd tools[root@docker-jenkins tools]# rz -y[root@docker-jenkins tools]# tar zxvf jdk-8u45-linux-x64.tar.gz[root@docker-jenkins tools]# mv jdk1.8.0_45 /usr/local/jdk[root@docker-jenkins tools]# vim /etc/profileJAVA_HOME=/usr/local/jdk PATH=$PATH:$JAVA_HOME/bin  CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME PATH CLASSPATH[root@docker-jenkins tools]# source /etc/profile[root@docker-jenkins tools]# java -versionjava version "1.8.0_45"Java(TM)SE Runtime Environment (build 1.8.0_45-b14)Java HotSpot(TM)64-Bit Server VM (build 25.45-b02, mixed mode)[root@docker-jenkins tools]# tar zxf apache-maven-3.5.0-bin.tar.gz[root@docker-jenkins tools]# mv apache-maven-3.5.0 /usr/local/maven

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

[root@docker-jenkins tools]# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war[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[root@docker-jenkins tools]# tar zxf apache-tomcat-8.5.38.tar.gz[root@docker-jenkins tools]# lsapache-tomcat-8.5.38  apache-tomcat-8.5.38.tar.gz  jdk-8u45-linux-x64.tar.gz  jenkins.war[root@docker-jenkins tools]# mv apache-tomcat-8.5.38 /usr/local/tomcat-jenkins[root@docker-jenkins tools]# ls /usr/local/tomcat-jenkins/webapps/docs  examples  host-manager  manager  ROOT[root@docker-jenkins tools]# rm -rf /usr/local/tomcat-jenkins/webapps/*[root@docker-jenkins tools]# mv jenkins.war /usr/local/tomcat-jenkins/webapps/ROOT.war[root@docker-jenkins tools]# ll /usr/local/tomcat-jenkins/webapps/total 75520-rw-r--r--. 1 root root 77330344 Mar 15 00:55 ROOT.war[root@docker-jenkins tools]# cd /usr/local/tomcat-jenkins/bin/[root@docker-jenkins bin]# ./startup.shUsing CATALINA_BASE:   /usr/local/tomcat-jenkinsUsingCATALINA_HOME:   /usr/local/tomcat-jenkinsUsing CATALINA_TMPDIR: /usr/local/tomcat-jenkins/tempUsing JRE_HOME:        /usr/local/jdk1.8Using CLASSPATH:       /usr/local/tomcat-jenkins/bin/bootstrap.jar:/usr/local/tomcat-jenkins/bin/tomcat-juli.jarTomcat started.[root@docker-jenkins bin]#

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

图片

部署私有镜像仓库

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

[root@docker-git-harbor ~]# cd tomcat[root@docker-git-harbor tomcat]# cat Dockerfile-tomcatFROM centos:7MAINTAINER www.cnblogs.com/kaye/ENV VERSION=8.5.38RUN yum install java-1.8.0-openjdkwget curl unzip iproute net-tools -y && \yum clean all && \rm -rf /var/cache/yum/*RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apachetomcat-${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/test && \echo "ok" > /usr/local/tomcat/webapps/test/status.html && \sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeENV PATH $PATH:/usr/local/tomcat/binEXPOSE 8080CMD ["catalina.sh", "run"][root@docker-git-harbor tomcat]# docker build -t tomcat:v1 -f Dockerfile-tomcat .[root@docker-git-harbor tomcat]# docker tag tomcat:v1 reg.dingkai.com/library/tomcat:v1[root@docker-git-harbor tomcat]# docker login reg.dingkai.com[root@docker-git-harbor tomcat]# docker push reg.dingkai.com/library/tomcat:v1

Jenkins安装必要插件

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

图片

图片

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

图片

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

图片

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

图片

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

 

项目创建

创建jobs

图片

选择流水线类型

图片

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

图片

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

图片

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

[root@docker-jenkins bin]# ssh-keygenGenerating public/private rsa key pair.Enter file in which tosavethe key (/root/.ssh/id_rsa):Enterpassphrase (empty for no passphrase):Enter same passphrase again:Your identification hasbeen saved in /root/.ssh/id_rsa.Your public keyhas been saved in /root/.ssh/id_rsa.pub.The keyfingerprint is:SHA256:1vD8XM3lDYFmrxgAbwPTLwb0fl+oEx8cFgtykpg4ODI root@docker-jenkinsThe key's randomart image is:+---[RSA 2048]----+|   . o==o.o ...  ||E o o +=++ .+o . || o . . .*o o+.. .||       oo*oo o.=o||       .S.*o+.o =||       . ..B.+   ||          o =    ||           .     ||                 |+----[SHA256]-----+[root@docker-jenkins bin]# cd[root@docker-jenkins ~]#[root@docker-jenkins ~]#[root@docker-jenkins ~]# ls .ssh/id_rsa  id_rsa.pub  known_hosts[root@docker-jenkins ~]# ssh-copy-id git@10.0.0.99/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keysgit@10.0.0.99'spassword:Number of key(s)added: 1Now trylogging into the machine, with:   "ssh 'git@10.0.0.99'"andcheck to make sure that onlythe key(s)you wanted were added.[root@docker-jenkins ~]#

图片

 

图片

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

图片

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

node { // 拉取代码   stage('Git Checkout') { 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']]])}   // 代码编译   stage('Maven Build') {sh '''        export JAVA_HOME=/usr/local/jdk/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true        '''   }   // 项目打包到镜像并推送到镜像仓库   /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}cat > Dockerfile << EOFFROM reg.dingkai.com/library/tomcat:v1 MAINTAINER kaiRUN rm -rf /usr/local/tomcat/webapps/*ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
EOFEOFdocker build -t $REPOSITORY .docker login reg.dingkai.com -u admin -p 123456docker push $REPOSITORY'''}// 部署到Docker主机'''}// 部署到Docker主机stage('Deploy to Docker') {sh '''REPOSITORY=reg.dingkai.com/library/tomcat-java-demo:${branch}docker rm -f tomcat-java-demo |truedocker pull $REPOSITORYdocker container run -d --name tomcat-java-demo -p 88:8080 $REPOSITORY'''}
}

图片

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

图片

然后保存配置。

开始构建任务

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

图片

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

图片

成功构建会提示: SUCCESS

图片

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

图片

方法比较

方法

优点

缺点

适用场景

Freestyle Project

配置简单,适合初学者

灵活性较低,难以管理复杂流程

简单应用,快速上手

Jenkins Pipeline

高度可定制,支持复杂流程

需要学习 Groovy 语法

复杂项目,需多阶段管理

Docker 集成

环境一致,易于部署

需要熟悉 Docker 命令

容器化应用

GitHub Webhook

实现自动化触发

需要正确配置 Webhook 和网络

任何需要自动化的项目

注意事项

  • 安全性

    • 使用 HTTPS 访问 Jenkins,避免暴露敏感信息。

    • 限制 Jenkins 和 Docker 的访问权限。

  • 扩展性

    • 添加测试阶段(如单元测试、集成测试)以提高代码质量。

    • 使用 Docker Hub 或私有仓库存储镜像,便于版本管理和分发。

  • 法律与道德

    • 确保 CI/CD 管道的自动化操作符合目标环境的条款和法律法规。

    • 避免对服务器或服务造成过大负载。

结论

Jenkins + Docker + Git 共同构建的是一条高度自动化、可监控、灵活扩展的 CI/CD 流水线。实践的关键是三个核心原则:

  1. 环境一致(Docker 容器)

  2. 流程自动(Jenkins Pipeline)

  3. 触发准确(Git Push)

只要掌握以上三点,你的发布流程就能从“手工繁琐”变成“智能流水线”。

随着 DevOps 和微服务趋势深入,CI/CD 已成为团队标配工具链。然而,“自动化”不只是命令式执行,更是一种规范。正确配置 Jenkins + Docker + Git,不仅释放人力,还强化质量管理。不少企业采用该方案后,发布频率从“每月一次”提升至“每天甚至每小时一次”。

通过 Jenkins、Docker 和 Git,可以构建一个高效的 CI/CD 管道,自动化完成代码的构建、测试和部署。Freestyle Project 适合快速上手,而 Jenkins Pipeline 提供更高的灵活性。根据项目需求选择合适的配置,并结合 Webhook 实现全自动化流程。上述步骤和示例代码基于实际案例,确保了可操作性。

http://www.lryc.cn/news/592632.html

相关文章:

  • [2025CVPR-目标检测方向]FSHNet:一种用于3D物体检测的全稀疏混合网络。
  • vue2 面试题及详细答案150道(41 - 60)
  • Linux系统安装Docker及部署Node.js 20.15.0(含pnpm、pm2)完整指南
  • 武汉江滩某码头变形及应力自动化监测
  • 由于热爱,我选PGCE专家学习
  • 小红书采集工具:无水印图片一键获取,同步采集笔记与评论
  • 接口测试时如何上传文件(图片、安装包等)
  • MyBatis缓存实战指南:一级与二级缓存的深度解析与性能优化
  • Tomcat及Nginx部署使用
  • 淘宝高级详情接口接入指南与Python代码实战
  • 如何搭建systemverilog/UVM验证环境开发vip(腾讯元宝)
  • C专题5:函数进阶和递归
  • InnoDB 多版本控制 慢sql排查(基于MySQL 5.7)
  • CentOS7 内网服务器yum修改
  • 谈进程间通信
  • NVIDIA 驱动安装失败问题排查与解决(含离线 GCC 工具链安装全过程)
  • python爬虫获取PDF
  • 去中心化交易所(DEX)深度解析:解码行业头部项目
  • WEB安全架构
  • WEB弹性设计
  • MyBatis之关联查询
  • leetcode:冗余连接 II[并查集检查环][节点入度]
  • 【机器人】HOV-SG 开放词汇 | 分层3D场景图 | 语言引导机器人导航
  • vue3+vite 使用scss、sass 全局定义的变量以及使用
  • 【Linux】进程间通信(三)——共享内存和消息队列
  • 特种作业操作证(制冷空调)的考试科目有哪些?
  • Spring AI开发智能客服(Tool calling)
  • 第七章 愿景09 海波龙的坑
  • 链表算法之【链表的中间节点】
  • MSTP+VRRP+DHCP配置实验(ensp)