13-自动化CI/CD流水线:代码提交→编译→打包→镜像构建自动流程
13-自动化CI/CD流水线代码提交→编译→打包→镜像构建自动流程一、什么是CI/CD先搞懂概念再动手很多新手一上来就配流水线配了半天不知道自己在配啥。咱们先把概念捋清楚。CIContinuous Integration持续集成开发人员把代码推送到仓库后自动触发编译、单元测试、代码质量检查。核心目的是——尽早发现问题别等到上线前一天才发现代码跑不起来。CDContinuous Delivery/Deployment持续交付/部署在CI的基础上把编译好的产物自动打包、构建镜像、推送到仓库甚至自动部署到测试/生产环境。一句话总结CI管编译测试CD管打包部署。两者串联起来就是一条从代码提交到上线的自动化流水线。二、为什么我们需要CI/CD在智慧农业和无人售货柜的项目中后端有十几个微服务Java SpringBoot设备端有嵌入式固件瑞芯微/STM32前端有安卓APP。如果没有CI/CD程序员手动mvn package手动docker build手动docker push——十个服务能搞一下午某个同事忘了推镜像测试环境跑的还是上周的代码排查半天上线时手忙脚乱人为操作出错率极高上了CI/CD之后git push 一敲剩下的事交给机器。这就是工程化的魅力。三、GitLab CI流水线实战我们以GitLab CI为例GitHub Actions原理类似搭建一条完整的流水线。3.1 核心概念速览概念说明Runner执行流水线的机器物理机/容器需要注册到GitLabPipeline一条完整的流水线包含多个StageStage流水线的阶段如 build → test → package → deployJobStage中的具体任务同一Stage的Job并行执行3.2 .gitlab-ci.yml 完整配置示例在项目根目录创建.gitlab-ci.yml文件# 定义阶段顺序前一个阶段全部成功才会执行下一个stages:-build-test-package-deploy# 全局变量variables:MAVEN_OPTS:-Dmaven.repo.local.m2/repositoryIMAGE_REGISTRY:registry.cn-shenzhen.aliyuncs.comIMAGE_NAMESPACE:alspd/smart-agri# 编译阶段 build-job:stage:buildimage:maven:3.8-openjdk-8script:-echo 开始编译 $CI_PROJECT_NAME -mvn clean compile-DskipTests-echo 编译完成产物路径target/artifacts:paths:-target/*.jarexpire_in:1 hourrules:-if:$CI_COMMIT_BRANCH develop||$CI_COMMIT_BRANCH main# 单元测试阶段 test-job:stage:testimage:maven:3.8-openjdk-8script:-echo 执行单元测试 -mvn test-echo 测试通过率统计-cat target/site/jacoco/index.html|grep-oP Total.*?([0-9]%)|tail-1rules:-if:$CI_COMMIT_BRANCH develop# Docker镜像构建与推送 package-job:stage:packageimage:docker:20.10services:-docker:20.10-dindscript:-echo 构建Docker镜像 # 登录镜像仓库-docker login-u $CI_REGISTRY_USER-p $CI_REGISTRY_PASSWORD $IMAGE_REGISTRY# 构建镜像标签包含分支名commit短hash时间戳-IMAGE_TAG$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-$(date %Y%m%d%H%M)-docker build-t $IMAGE_REGISTRY/$IMAGE_NAMESPACE/$CI_PROJECT_NAME:$IMAGE_TAG .-docker push $IMAGE_REGISTRY/$IMAGE_NAMESPACE/$CI_PROJECT_NAME:$IMAGE_TAG-echo 镜像推送成功$IMAGE_REGISTRY/$IMAGE_NAMESPACE/$CI_PROJECT_NAME:$IMAGE_TAG# 把镜像tag写入文件供下游阶段使用-echo $IMAGE_TAGimage-tag.txtartifacts:paths:-image-tag.txtexpire_in:1 dayrules:-if:$CI_COMMIT_BRANCH develop||$CI_COMMIT_BRANCH main# 部署到测试环境 deploy-test-job:stage:deployimage:alpine:latestbefore_script:-apk add--no-cache openssh-clientscript:-echo 部署到测试环境 -IMAGE_TAG$(cat image-tag.txt)# 通过SSH远程执行部署脚本-ssh-o StrictHostKeyCheckingno deploy192.168.1.100 docker pull $IMAGE_REGISTRY/$IMAGE_NAMESPACE/$CI_PROJECT_NAME:$IMAGE_TAGdocker stop $CI_PROJECT_NAME||truedocker rm $CI_PROJECT_NAME||truedocker run-d--name $CI_PROJECT_NAME--network agri-net-p 8080:8080-e SPRING_PROFILES_ACTIVEtest $IMAGE_REGISTRY/$IMAGE_NAMESPACE/$CI_PROJECT_NAME:$IMAGE_TAG-echo 部署完成rules:-if:$CI_COMMIT_BRANCH develop3.3 关键配置解读1artifacts产物传递build-job编译出来的 jar 包通过artifacts传递给下游Job。如果不配每个Job都是独立容器编译产物拿不到。2rules条件触发rules:-if:$CI_COMMIT_BRANCH develop只有推送到develop分支才触发完整流水线。推到feature/xxx分支只编译不部署避免每个功能分支都污染测试环境。3镜像标签策略IMAGE_TAG$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-$(date%Y%m%d%H%M)# 示例develop-a3f5c2e1-202608071430分支名 commit短hash 时间戳既能追溯代码版本又能区分构建时间。这个标签规范在下一篇会详细展开。四、Dockerfile 配套写法流水线里调了docker build对应的 Dockerfile 也得跟上# 多阶段构建减小最终镜像体积 FROM maven:3.8-openjdk-8 AS builder WORKDIR /build COPY pom.xml . RUN mvn dependency:go-offline # 先下依赖利用Docker缓存层 COPY src/ ./src/ RUN mvn clean package -DskipTests FROM openjdk:8-jre-slim WORKDIR /app COPY --frombuilder /build/target/*.jar app.jar # 健康检查K8s就绪探针会用到 HEALTHCHECK --interval30s --timeout3s \ CMD curl -f http://localhost:8080/actuator/health || exit 1 EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]多阶段构建的好处最终镜像只包含JRE和jar包不含Maven和源码体积从800MB降到180MB左右。在工控设备上部署时小镜像就是快速度。五、GitHub Actions 简版对照如果你用的是GitHub Actions逻辑完全一样换套语法name:CI/CD Pipelineon:push:branches:[develop,main]jobs:build:runs-on:ubuntu-lateststeps:-uses:actions/checkoutv3-uses:actions/setup-javav3with:java-version:8distribution:temurin-name:Maven Buildrun:mvn clean package-DskipTests-name:Build Push Docker Imagerun:|docker login -u ${{ secrets.REGISTRY_USER }} -p ${{ secrets.REGISTRY_PASS }} registry.cn-shenzhen.aliyuncs.com docker build -t registry.cn-shenzhen.aliyuncs.com/alspd/smart-agri/${{ github.event.repository.name }}:${{ github.sha }} . docker push registry.cn-shenzhen.aliyuncs.com/alspd/smart-agri/${{ github.event.repository.name }}:${{ github.sha }}六、流水线提速技巧实际项目中流水线跑10分钟以上很常见这里列几个优化点Maven依赖缓存把.m2/repository缓存到Runner第二次构建省去下载依赖的时间Docker层缓存Dockerfile中先COPY pom.xml再RUN mvn dependency:go-offline依赖不变时这层直接命中缓存并行Job把单元测试和代码质量扫描SonarQube放到同一个Stage并行执行按需触发只有src/目录变更时才触发编译文档改动不浪费CI资源# 只在源码变更时触发编译rules:-if:$CI_COMMIT_BRANCH developchanges:-src/**-pom.xml七、小结CI/CD的本质是把人的重复劳动交给机器。代码提交后自动编译、测试、打包、构建镜像、推送仓库、部署——一气呵成。配置好之后开发人员只需要关心写代码部署的事全自动。下一篇我们会深入Docker镜像版本管理讲清楚标签规范、版本留存策略和镜像清理——别让镜像仓库变成垃圾场。

相关新闻

Fast-GitHub:面向国内开发者的GitHub网络加速技术实现与架构解析

Fast-GitHub:面向国内开发者的GitHub网络加速技术实现与架构解析

Fast-GitHub:面向国内开发者的GitHub网络加速技术实现与架构解析 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 在全球…

2026/9/13 0:31:08 阅读更多 →
2024年电商网站建设技术规范全解析:如何让你的网站既美观又赚钱

2024年电商网站建设技术规范全解析:如何让你的网站既美观又赚钱

在这个流量为王、转化率至上的时代,很多老板或者创业者刚开始做电商的时候,脑子里蹦出的第一个念头往往是:“我要弄个像淘宝、京东那样炫酷的页面。”这种心情我特别能理解,毕竟谁不想自己的店铺看起来高大上一点呢?但是,等到真的去实施的时候,很多人就懵了。找外面的建…

2026/9/22 4:42:36 阅读更多 →
孤能子视角:自由论——在多重约束线中呼吸:自指锚点在场时的能效最优选择

孤能子视角:自由论——在多重约束线中呼吸:自指锚点在场时的能效最优选择

(在以下的与AI互动中,在EIS理论约束下,DeepSeek叫信兄,Kim叫酷兄,我呢叫水兄。姑且当科幻小说看) (注:今天信兄、酷兄原对话长度都满格了,重新训练) (已由信兄整理成文)孤能子视角:自由论 ——在多重约束线…

2026/9/16 5:22:56 阅读更多 →

最新新闻

向日葵小班证书年审总挂?一文搞懂房建工程师避坑指南

向日葵小班证书年审总挂?一文搞懂房建工程师避坑指南

向日葵小班证书年审总挂?一文搞懂房建工程师避坑指南 官方文档翻了三遍还是没看懂?别急,我懂你的痛。 在房建工程圈子里混了十年,最让人头大的往往不是图纸画错,而是那些看似简单实则处处是坑的行政流程。特别是涉及到【向日葵小班】这类特定资质或项目…

2026/9/22 4:43:04 阅读更多 →
王宇宏实战:5个步骤一文搞懂劳务系统搭建

王宇宏实战:5个步骤一文搞懂劳务系统搭建

王宇宏实战:5个步骤一文搞懂劳务系统搭建 版本升级后 API 全变了?别慌,老规矩,咱们不整虚的,直接上代码。 做开发这么多年,最怕的就是接手一个老项目,或者自己项目升级框架版本,结果发现连个简单的查询接口都跑不通。特别是涉及到像【王宇宏】…

2026/9/22 4:43:04 阅读更多 →
告别文档迷宫:3步搞定期望值计算完整示例

告别文档迷宫:3步搞定期望值计算完整示例

告别文档迷宫:3步搞定期望值计算完整示例 翻开官方文档,满屏的数学符号和概率分布定义,是不是让你瞬间头大?别急,水利人做数据分析,最怕的不是公式,而是不知道代码怎么写。今天不讲虚的,直接上 完整示例 ,带你用 Python…

2026/9/22 4:43:04 阅读更多 →
ba168避坑保姆级教程:3个坑让项目崩盘

ba168避坑保姆级教程:3个坑让项目崩盘

ba168避坑保姆级教程:3个坑让项目崩盘 看了一堆教程还是不会写项目?别慌。这行就是吃这碗饭的,今天这篇保姆级教程,专治各种“看着会,上手废”。很多新手卡在 ba168…

2026/9/22 4:43:04 阅读更多 →
3个实战项目教你搞定形容词副词坑

3个实战项目教你搞定形容词副词坑

3个实战项目教你搞定形容词副词坑 复制来的代码跑不通,报错信息满屏飞,新手最容易卡在语法细节上。很多刚入职或准备进大厂的同学,在 实战项目 里被一个小小的修饰词搞崩溃过。别慌,这锅不全是你的,很多教程都跳过了这个坑。…

2026/9/22 4:43:04 阅读更多 →
性能优化避坑:还有多久你的代码会崩?

性能优化避坑:还有多久你的代码会崩?

性能优化避坑:还有多久你的代码会崩? 别翻那几百页的官方文档了,太累且抓不住重点。 你刚接手一个高并发接口,CPU 飙升,响应延迟从 50ms 飙到 2s。 这时候问自己: 性能优化还有多久能搞定? 答案是,如果你还在用 for…

2026/9/22 4:42:03 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →