你是否还在手动构建、测试、部署过程中频繁等待?或者担心“我本地没问题,部署却报错”?在敏捷开发和 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 git
passwd 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 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访问该仓库:
[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/,按提示输入密码,登录即可。
部署私有镜像仓库
构建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},其他模块内容自行编写。
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 流水线。实践的关键是三个核心原则:
环境一致(Docker 容器)
流程自动(Jenkins Pipeline)
触发准确(Git Push)
只要掌握以上三点,你的发布流程就能从“手工繁琐”变成“智能流水线”。
随着 DevOps 和微服务趋势深入,CI/CD 已成为团队标配工具链。然而,“自动化”不只是命令式执行,更是一种规范。正确配置 Jenkins + Docker + Git,不仅释放人力,还强化质量管理。不少企业采用该方案后,发布频率从“每月一次”提升至“每天甚至每小时一次”。
通过 Jenkins、Docker 和 Git,可以构建一个高效的 CI/CD 管道,自动化完成代码的构建、测试和部署。Freestyle Project 适合快速上手,而 Jenkins Pipeline 提供更高的灵活性。根据项目需求选择合适的配置,并结合 Webhook 实现全自动化流程。上述步骤和示例代码基于实际案例,确保了可操作性。