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

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.xdnf.cn/news/15785.html

相关文章:

  • 谈进程间通信
  • Python 模块化编程全解析:模块、包与第三方库管理指南
  • [Raspberry Pi]如何將無頭虛擬顯示器服務(headless display)建置在樹莓派的Ubuntu桌面作業系統中?
  • SGMD辛几何模态分解 直接替换Excel运行包含频谱图相关系数图 Matlab语言!
  • 微信小程序列表数据上拉加载,下拉刷新
  • 7.事务操作
  • 手机兼容测试服务提供商对比分析:如何选择最合适的测试平台
  • 分层图最短路径算法详解
  • Spring整合MyBatis详解
  • 通过轮询方式使用LoRa DTU有什么缺点?
  • Trae IDE:打造完美Java开发环境的实战指南
  • JUnit5 实操
  • 系统设计时平衡超时时间与多因素认证(MFA)带来的用户体验下降
  • istio如何自定义重试状态码
  • 【Jmeter】报错:An error occured:Unknown arg
  • FreeRTOS—中断管理
  • 基于pytorch深度学习笔记:2.VGGNet介绍
  • 腾讯会议本地录屏转存失败解决办法
  • 支付宝小程序 MAU(月活跃用户数)是衡量用户粘性与生态影响力的核心指标
  • 【深度学习新浪潮】AI在finTech领域有哪些值得关注的进展?
  • 专业职业评估工具,多维度数据分析
  • 【人工智能agent】--dify版本更新(通用)
  • 无线调制的几种方式
  • Oracle数据泵详解——让数据迁移像“点外卖”一样简单​
  • ESLint 完整功能介绍和完整使用示例演示
  • QT 交叉编译环境下,嵌入式设备显示字体大小和QT Creator 桌面显示不一致问题解决
  • 【赵渝强老师】Redis的主从复制集群
  • AAC音频格式
  • 新安装的ubuntu 20.04缺少wifi图标 [已解决]
  • Python类型转换,深浅拷贝