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/10/18 16:19:15 阅读更多 →
2024年电商网站建设技术规范全解析:如何让你的网站既美观又赚钱

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

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

2026/10/17 18:34:15 阅读更多 →
孤能子视角:自由论——在多重约束线中呼吸:自指锚点在场时的能效最优选择

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

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

2026/10/17 18:36:06 阅读更多 →

最新新闻

diagram-design:构建可维护图表设计系统的核心方法论

diagram-design:构建可维护图表设计系统的核心方法论

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题第一次看到 diagram-design 这个词,很多人会下意识觉得它只是“画图”的另一种说法。但真正在项目里被图表折磨过的人会明白,画图本身从来不是难点,难的是让图在三个月…

2026/10/19 6:03:37 阅读更多 →
artcraft框架:从创意到实物的完整工作流拆解

artcraft框架:从创意到实物的完整工作流拆解

1. 从“artcraft”这个名字说起:它到底想解决什么问题第一次看到“artcraft”这个标题,我脑子里蹦出来的第一反应是:这大概率不是一个单纯的绘画工具,也不是一个纯粹的手工教程合集。把“art”和“craft”拼在一起,本身…

2026/10/19 6:03:37 阅读更多 →
工业指针仪表识别系统:抗油污低光倾斜的Python全流程方案

工业指针仪表识别系统:抗油污低光倾斜的Python全流程方案

简介:本资源是一份面向工业智能化巡检场景的Python图像识别系统设计论文,适用于自动化、仪器仪表、计算机视觉方向的本科生、研究生及现场工程师,解决指针式模拟仪表人工读数效率低、无人巡检落地难的核心痛点。论文提出基于DeepLabV3语义分割…

2026/10/19 6:03:37 阅读更多 →
从防御规避到加密流量检测:AES-256-GCM下的安全运营实战

从防御规避到加密流量检测:AES-256-GCM下的安全运营实战

之前和一些同行聊“免杀”这个话题,大家的反应往往两极分化:有人觉得它神秘,有人觉得它就是恶意软件对抗杀毒的手段,没什么好聊的。我自己的看法其实不同——在安全运营和检测工程这个视角里,“免杀”并不是一个孤立的…

2026/10/19 6:03:37 阅读更多 →
昆仑通态触摸屏与台达温控器Modbus RTU联调:寄存器映射与报警批量配置

昆仑通态触摸屏与台达温控器Modbus RTU联调:寄存器映射与报警批量配置

1. 联调前必须捋清楚:接线、通信参数与485总线的坑1.1 最小系统怎么搭:从硬件接线开始做项目这些年,最怕的不是工艺逻辑复杂,而是上位机和仪表的“通信语言”对不上。前阵子接手一套加热设备改造,现场是25台台达DT330温…

2026/10/19 6:03:37 阅读更多 →
React 18并发渲染实战:自动批处理、startTransition与Suspense优化搜索筛选页

React 18并发渲染实战:自动批处理、startTransition与Suspense优化搜索筛选页

前段时间我接手一个搜索筛选页的重构,数据量不算夸张,两千多条记录、六七个筛选条件,但旧实现里每敲一个字,键盘都明显发沉。页面后来变流畅,靠的就是React 18的并发渲染能力,重点落在Suspense、Transition…

2026/10/19 6:02:37 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →