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代码版本仓库

安装:

bash 复制代码
yum install git -y

配置git用户:

cs 复制代码
useradd git

passwd git

创建库:

cs 复制代码
[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 init

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

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

branches  config  description  HEAD  hooks  info  objects  refs

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

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

cs 复制代码
[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库

cs 复制代码
[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

cs 复制代码
[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下即可:

cs 复制代码
[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/,按提示输入密码,登录即可。

部署私有镜像仓库

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

cs 复制代码
[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仓库中的代码了。

cs 复制代码
[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},其他模块内容自行编写。

python 复制代码
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
EOF

EOF

docker build -t $REPOSITORY .

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

docker push $REPOSITORY'''
   }
   // 部署到Docker主机
   

'''
   }
   // 部署到Docker主机
   stage('Deploy to Docker') {
        sh '''
        REPOSITORY=reg.dingkai.com/library/tomcat-java-demo:${branch}
        docker rm -f tomcat-java-demo |true
        docker pull $REPOSITORY
        docker 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 实现全自动化流程。上述步骤和示例代码基于实际案例,确保了可操作性。

相关推荐
余很多之很多4 小时前
借助AI学习开源代码git0.7之三git-init-db
git·学习
是魔王哒6 小时前
【终极指南】解决 Windows 11 更新后 Docker 连接 localhost 奇慢(卡顿、超时十几秒)的通用方案
后端·docker
wydxry6 小时前
在断网情况下,网线直接连接 Windows 笔记本和 Ubuntu 服务器进行数据传输
运维·docker·容器
小周学学学7 小时前
docker安装与简单项目上手
运维·docker·容器
MrLi01048 小时前
在git中同时配置gitcode和github访问权限
git·github·gitcode
越来越无动于衷8 小时前
Git 团队协作完全指南:从基础到高级应用
git
小怪兽会微笑8 小时前
如何上传github(解决git的时候输入正确的账号密码,但提示认证失败)
git·github
小刘|9 小时前
腾讯云服务上下载docker以及使用Rabbitmq的流程
docker·rabbitmq·腾讯云
云途行者9 小时前
使用 docker 安装 openldap
运维·docker·容器