你是否還在手動構建、測試、部署過程中頻繁等待?或者擔心“我本地沒問題,部署卻報錯”?在敏捷開發和 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 流水線。實踐的關鍵是三個核心原則:
環境一致(Docker 容器)
流程自動(Jenkins Pipeline)
觸發準確(Git Push)
只要掌握以上三點,你的發布流程就能從“手工繁瑣”變成“智能流水線”。
隨著 DevOps 和微服務趨勢深入,CI/CD 已成為團隊標配工具鏈。然而,“自動化”不只是命令式執行,更是一種規范。正確配置 Jenkins + Docker + Git,不僅釋放人力,還強化質量管理。不少企業采用該方案后,發布頻率從“每月一次”提升至“每天甚至每小時一次”。
通過 Jenkins、Docker 和 Git,可以構建一個高效的 CI/CD 管道,自動化完成代碼的構建、測試和部署。Freestyle Project 適合快速上手,而 Jenkins Pipeline 提供更高的靈活性。根據項目需求選擇合適的配置,并結合 Webhook 實現全自動化流程。上述步驟和示例代碼基于實際案例,確保了可操作性。