还在手动部署?用Jenkins+Docker+Git实现自动化CI/CD

发布于:2025-06-28 ⋅ 阅读:(21) ⋅ 点赞:(0)

“每次发版都要手动打包上传,部署宕机了才发现出错?”
你还在重复“开发提测-打包部署-验证回归”的流水线操作?明明可以一键搞定的流程,为何还在亲力亲为?是时候了解并掌握 自动化 CI/CD 的真正威力了!

手动部署就像骑自行车在高速公路上赛跑——费力又低效!每次代码更新,您是否还在手动构建、测试、部署,担心出错导致系统崩溃?用户体验下降、业务受损的后果让人不寒而栗!持续集成与持续部署(CI/CD)的自动化技术彻底改变了这一局面,而 Jenkins、Docker 和 Git 的黄金组合更是让部署如行云流水。今天,我们为您献上一份 Jenkins + Docker + Git 自动化 CI/CD 指南,从环境搭建到管道运行,带您一步步实现高效部署!无论您是开发新手还是 DevOps 老兵,这篇指南都将点燃您的自动化热情,助您迈向高效开发新时代!

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

什么是 CI/CD?Jenkins、Docker 和 Git 如何协同打造自动化管道?自动化部署能带来哪些实际好处?如何通过这三者实现快速迭代?在 2025 年的微服务和云原生趋势中,自动化 CI/CD 为何如此重要?通过本文,我们将深入解答这些问题,带您从理论到实践,全面掌握自动化 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 git

passwd git

创建库:

mkdir tomcat-java-demo.git

cd tomcat-java-demo.git/

git --bare init

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

ls

branches  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.git

Cloning 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)? yes

Warning: 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 ~]# ls

anaconda-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 = 0

    filemode = true

    bare = false

    logallrefupdates = 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 = origin

    merge = refs/heads/master

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

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

# On branch master

nothing to commit, working directory clean

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

# On branch master

nothingto commit, working directory clean

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

git@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/profile

JAVA_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 -version

java 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]# ls

apache-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.sh

Using CATALINA_BASE:   /usr/local/tomcat-jenkins

UsingCATALINA_HOME:   /usr/local/tomcat-jenkins

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

Using JRE_HOME:        /usr/local/jdk1.8

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

Tomcat started.

[root@docker-jenkins bin]#

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

图片

观点与案例结合

观点:CI/CD 通过自动化流程提升代码质量和部署效率,Jenkins 负责管道编排,Docker 确保环境一致性,Git 管理代码版本。三者结合,构建了高效、可靠的自动化部署体系,适合现代微服务和云原生架构。

CI/CD 流程与核心步骤

步骤

描述

工具/操作

案例

安装环境

在服务器上安装 Git、Jenkins 和 Docker,配置环境变量。

Ubuntu: sudo apt install git openjdk-11-jdk docker.io
Jenkins: 下载 Jenkins WAR

小李在 Ubuntu 服务器上 10 分钟完成环境搭建,开始 CI/CD 配置。

配置 Jenkins

安装 Git 和 Docker 插件,设置 Git Webhook。

Jenkins 插件管理:安装 “Git” 和 “Docker Pipeline”
Webhook: 在 Git 仓库添加 Jenkins URL

小张配置 Webhook,代码提交后自动触发管道。

编写 Jenkinsfile

定义管道,包括拉取代码、构建镜像、测试和部署。

groovy<br>pipeline {<br> agent any<br> stages {<br> stage('Checkout') {<br> steps {<br> git 'https://github.com/user/repo.git'<br> }<br> }<br> stage('Build') {<br> steps {<br> sh 'docker build -t myapp .'<br> }<br> }<br> stage('Test') {<br> steps {<br> sh 'docker run myapp pytest'<br> }<br> }<br> stage('Deploy') {<br> steps {<br> sh 'docker push myapp'<br> sh 'docker run -d -p 80:80 myapp'<br> }<br> }<br> }<br>}<br>

某团队用 Jenkinsfile 实现自动化部署,效率提升 50%。

运行与监控

运行管道,监控构建、测试和部署结果。

jenkins > Build History > Console Output

小王通过 Jenkins 仪表板监控,优化部署时间 30%。

技术要点详解

  1. Git 版本控制

    • 功能:管理代码变更,触发 Jenkins 管道。

    • 操作:配置 Webhook,URL 如 http://jenkins-server:8080/github-webhook/。

    • 案例:某公司通过 Git Webhook 实现代码提交后自动构建,减少手动操作。

  2. Jenkins 管道

    • 功能:编排 CI/CD 流程,支持多阶段任务。

    • 配置:使用 Jenkinsfile 定义 Checkout、Build、Test 和 Deploy 阶段。

    • 案例:某电商平台通过 Jenkins 管道,部署周期从每周一次缩短到每天多次。

  3. Docker 容器化

    • 功能:构建一致性环境,运行测试和部署。

    • 操作:编写 Dockerfile,构建镜像:docker build -t myapp .。

    • 案例:某团队用 Docker 容器运行测试,解决环境不一致问题,测试成功率提升 40%。

  4. 监控与优化

    • 功能:通过 Jenkins 报告和日志分析瓶颈。

    • 工具:Jenkins Dashboard、Docker 监控命令(如 docker stats)。

    • 案例:某开发者通过日志发现测试阶段内存不足,优化后性能提升 20%。

综合案例

某互联网公司开发电商平台,采用 Jenkins + Docker + Git 实现 CI/CD。开发者提交代码到 Git 仓库,触发 Jenkins 管道,自动拉取代码、构建 Docker 镜像、运行测试并部署到生产环境。部署周期从每周一次缩短到每天多次,bug 修复速度提升 50%,用户满意度显著提高。

部署私有镜像仓库

企业级harbor镜像仓库部署:

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

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


[root@docker-git-harbor ~]# cd tomcat
[root@docker-git-harbor tomcat]# cat Dockerfile-tomcat
FROM centos:7
MAINTAINER www.cnblogs.com/kaye/

ENV VERSION=8.5.38

RUN 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/localtime

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

EXPOSE 8080
CMD ["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-keygen

Generating 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-jenkins

The 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 keys

git@10.0.0.99'spassword:

Number of key(s)added: 1

Now 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},其他模块内容自行编写。

图片

 

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

图片

然后保存配置。

开始构建任务

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

图片

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

图片

 

成功构建会提示: SUCCESS

图片

 

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

图片

社会现象分析

在许多中小企业中,CI/CD 落地依然被认为“太复杂”“运维成本高”。
但事实上,工具链已经趋于成熟,从 Git 提交,到构建打包、镜像部署,甚至通知回调,全程可自动化。这不仅节省人力成本,还大幅提高上线效率与稳定性,是 DevOps 流程中的“基建神器”。

自动化 CI/CD 已成为软件开发的核心趋势。根据 Gartner 2024 报告,90% 的高绩效 IT 组织采用 CI/CD 实践,显著提升交付速度和质量。Jenkins 作为开源 CI/CD 工具的领军者,拥有超过 10 万 GitHub Stars;Docker 的容器化技术解决了环境不一致问题;Git 则以其版本控制能力成为行业标准。随着微服务和云原生架构的普及,自动化 CI/CD 管道需求激增,尤其在电商、金融和游戏行业。然而,Jenkins 的配置复杂性可能让初学者望而却步,需通过社区支持和实践降低学习曲线。相比 GitLab CI,Jenkins 的灵活性和插件生态更适合复杂项目。

总结与升华

Jenkins、Docker 和 Git 的组合为自动化 CI/CD 提供了强大支持。从代码提交到生产部署,每一步都通过自动化流程实现高效、稳定运行。在 2025 年的微服务和云原生时代,掌握这一组合不仅能提升开发效率,还能为业务创新注入动力。无论是缩短部署周期还是提高系统稳定性,自动化 CI/CD 都将成为您的得力助手。让我们从现在开始,拥抱自动化,迈向高效开发的新高度!

部署不应是开发的阻力,而应成为加速的引擎。
通过 Jenkins、Docker 与 Git 三者协作,开发者可以真正专注业务逻辑,而不是陷于重复的发布流程之中。构建一次、部署无忧,让 CI/CD 成为你的默认工作方式!

手动部署是体力活,自动化部署才是生产力!
别再让上线像打仗,用 Jenkins + Docker + Git,把“部署”变成一场优雅的演出吧!

“Jenkins + Docker + Git,自动化 CI/CD,点燃您的开发未来!”

 


网站公告

今日签到

点亮在社区的每一天
去签到