GitHub Actions 自动 CI 测试 WorkFlow工作流搭建

大家好,我是此林。

代码托管平台 Github 我们应该比较熟悉。每次我们提交代码到 GitHub 仓库时,特别是开源项目,一般都会自动触发测试脚本运行,帮你验证代码没有引入新的错误。

这个其实就是 GitHub Actions,一般我们把 YAML 脚本定义在 .github/workflows 目录下。

1. 什么是 GitHub Actions 自动 CI 测试?

GitHub Actions 是 GitHub 官方提供的一套自动化工作流服务,可以用来自动化代码构建、测试、部署等流程。CI(持续集成,Continuous Integration)测试 是指在代码每次提交或者合并请求时,自动运行项目的测试代码,保证代码的正确性和稳定性。

那为什么要用 GitHub Actions 自动 CI 测试?原因也很简单:

  • 自动化:减少人工手动测试的工作,省时省力。

  • 快速反馈:提交代码后马上知道测试结果,发现问题及时修复。

  • 保障质量:避免有问题的代码被合并进主分支,提升代码质量。

  • 多平台支持:可以在不同操作系统和环境下自动测试,比如 Windows、Linux、macOS。

  • 免费且无缝集成:直接集成在 GitHub 仓库,无需额外配置第三方服务。

常见的 CI 测试比如:Node.js 项目跑 npm test、Python 项目跑 pytest、Java 项目跑 mvn test,还有Docker 镜像构建和测试等等。

我们以 Seata 开源项目的 workflow s为例,作为讲解。 

2. 整体结构

会看这个目录结构:

1. build.yml

Seata 是个 Java 项目,这是 CI 主流程,主要的话包括:

  • 监听分支和PR:当代码被推送到 2.x, develop, master 分支,或者针对这几个分支发起 Pull Request 时,会自动触发这套构建和测试流程。

  • 自动运行多版本 Java 测试:针对 Java 8、17、21 三个版本分别跑测试,保证代码兼容多个 JDK 版本。

  • 做代码质量检查:在 Java 8 环境下执行 Checkstyle、PMD、License 检查。

  • 上传代码覆盖率数据:通过 Codecov 上传测试覆盖率报告。

  • 支持 ARM 架构构建:额外有一个任务在 ARM64 架构的 Ubuntu 容器里构建项目(跳过测试),用于生成 ARM 平台的二进制或包。

2. rerun-build.yml

这个配置是用来 自动重跑失败的 workflow 构建 的,只有当 build workflow 失败,并且重试次数还没达到 2 次时才执行。

3. publish-docker.yml

自动构建并发布 Docker 镜像到 DockerHub,针对三个不同版本的 Java(8、17、21)分别构建 Docker 镜像。

4. publish-ossrh.yml

将构建好的 Maven 包自动发布到 Maven Central(OSSRH 仓库)。

5. codeql-analysis.yml

CodeQL 是 GitHub 提供的代码静态分析工具,能够扫描代码中的安全漏洞、潜在缺陷和代码质量问题。它在每周六的 19:36(UTC 时间)定时触发一次全量扫描。

6. license-checker.yaml

简单点说,这个脚本配置是用来检查依赖 License 许可的,每个文件头部都必须加上这段注释。

5. test.yml、test-druid.yml、test-ubuntu.yml 

这个就不多说,只有在真正 Seata 发版的时候才会触发,主要为多版本 Spring Boot 、多版本 Druid 测试专用,用于版本兼容性测试。

3. build.yml 详解

下面,我们来细看 build.yml。

3.1 触发条件

name: "build"

整个工作流的名称,在 GitHub Actions 的界面上显示。

on:push:branches: [ 2.x, develop, master ]

配置触发条件,当 push2.xdevelopmaster 分支时触发。

  pull_request:branches: [ 2.x, develop, master ]types: [opened, reopened, synchronize]

当有人向这些分支提交了 PR 时也会触发 workflow,具体来说,比如这个 PR open了,或者close之后又 reopen了,synchronize 表示更新了 PR(如 rebase 后 push)。

    paths-ignore:- '**.md'

如果改动只是 Markdown 文件(例如 README.md)时 不触发 这个工作流。

3.2 Jobs 概览

真正 CI 的逻辑在两个 job 里,job1 是 Java 构建和测试(多个 JDK 版本),job2 是 ARM64 编译构建。我们重点看 job1。

services 里是启动 Redis 和 Nacos 服务容器 ,测试会用到。

然后操作系统为 Ubuntu 最新版。

strategy 里的含义:

  • 使用构建矩阵:分别用 Java 8、17、21 构建。

  • fail-fast: false 表示一个失败不会立即取消其他并行任务。

 3.3. Steps 详解

总共有八个 steps,我们一个一个看。

1. 拉取代码

      - name: "Checkout"uses: actions/checkout@v3

2. 设置 Python 3.12(某些依赖或构建脚本可能用到)

      - name: "Use Python 3.x"uses: actions/setup-python@v2with:python-version: '3.12'

3. 设置 Java,版本用的就是之前 strategy 里定义的 matrx.java。

      - name: "Set up Java JDK"uses: actions/setup-java@v3.12.0with:distribution: 'zulu'java-version: ${{ matrix.java }}

4. 打印 Maven 版本

      - name: "Print maven version"run: ./mvnw -version

5. Maven 缓存,提高构建速度,缓存 .m2 目录。

      - name: "Restore local maven repository cache"uses: actions/cache/restore@v4id: cache-maven-repositorywith:path: ~/.m2/repositorykey: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ env.TODAY }}restore-keys: |${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}${{ runner.os }}-maven-

6.1 Java 8:完整测试 + PMD + License 代码检查

      - name: "Test, Check style, Check PMD, Check license with Maven and Java8"if: matrix.java == '8'run: |./mvnw -T 4C clean test \-Dcheckstyle.skip=false -Dpmd.skip=false -Dlicense.skip=false -DredisCaseEnabled=true \-e -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn;

6.2 Java 17 和 21:仅测试

      - name: "Test with Maven and Java${{ matrix.java }}"if: matrix.java != '8'run: |./mvnw -T 4C clean test \-e -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn;

7. 保存 Maven 缓存(如果前面没命中缓存)

      - name: "Save local maven repository cache"uses: actions/cache/save@v4if: steps.cache-maven-repository.outputs.cache-hit != 'true'with:path: ~/.m2/repositorykey: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ env.TODAY }}

8. 上传覆盖率(只在 Java 8)

      - name: "Codecov"if: matrix.java == '8'uses: codecov/codecov-action@v4.0.1with:token: ${{ secrets.CODECOV_TOKEN }}version: v0.6.0env:CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

4. rerun-build.yml 详解

这个在 build 的 workflow 失败时,自动尝试重新运行一次,最多尝试 1 次。

on:workflow_run:workflows: ["build"]types:- completed

触发条件:当 build 这个 workflow 执行“完成”(completed)后触发,不管成功与否。

问:之前不是说失败的时候才触发吗?

答:别急,后面 jobs 里会有 if 条件判断。

Job 条件:

  • 只有当 build workflow 执行失败(failure) 时才会触发这个 job。

  • run_attempt 是执行次数,如果是第一次失败就触发(< 2,表示最多自动 retry 一次,防止死循环)。

操作系统还是 ubuntu-latest。

 - name: rerun ${{ github.event.workflow_run.id }}

 Step 名称:会显示在 Actions 的执行日志中。

        env:GH_REPO: ${{ github.repository }}GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

 设置环境变量:

  • GH_REPO:当前仓库名

  • GH_TOKEN:自动注入的 GitHub Token,用于调用 GitHub CLI

        run: |gh run watch ${{ github.event.workflow_run.id }} > /dev/null 2>&1gh run rerun ${{ github.event.workflow_run.id }} --failed

执行脚本:

  • gh run watch:  等待 build workflow 的状态稳定

  • gh run rerun: 只重跑失败的 job(节省资源)

今天的分享就到这里了。

我是此林,关注我吧,带你看不一样的世界!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87998.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0-机器学习简介

有监督学习 目标&#xff1a;建立一个模型(函数)&#xff0c;来描述输入(x)和输出(y)之间的映射关系。 价值&#xff1a;模型训练完成后&#xff0c;新的输入&#xff0c;模型会给出预测值输出。 注意点&#xff1a; 1.要有足够的训练样本 2.输入和输出之间有关联关系 3.输入…

前端跨域解决方案(6):Nginx

1 Nginx 核心 Nginx 是一个开源的高性能 HTTP 和反向代理服务器&#xff0c;以轻量级、高并发处理能力和低资源消耗著称。除作为 Web 服务器外&#xff0c;还可充当邮件代理服务器和通用的 TCP/UDP 代理服务器&#xff0c;广泛应用于现代 Web 架构中。 在 Windows 系统中使用…

C++智能指针编程实例

智能指针是C11引入的重要特性&#xff0c;用于自动管理动态分配的内存&#xff0c;防止内存泄漏。下面介绍几种高级智能指针编程实例。 1. 共享所有权模式 (shared_ptr) 循环引用问题及解决方案 #include <memory> #include <iostream>class B; // 前向声明clas…

单元测试总结

一、测试方案: 单元测试方案应包括以下步骤: 1.理解代码结构:仔细阅读代码,理解程序的结构、逻辑和算法。 2.制定测试目标:明确你想要测试的功能和输出结果; 3.撰写测试用例:编写涵盖所有测试目标的测试用例; 4.执行测试:运行测试用例以验证功能的正确性; 5.编写报告:根据测试…

Spring面向切面编程AOP(2)

前置通知&#xff08;Before Advice&#xff09; 前置通知在目标方法执行之前被调用&#xff0c;常用于执行一些预处理逻辑&#xff0c;例如权限验证、参数校验等。在 Spring 配置文件中&#xff0c;前置通知通过<aop:before>标签进行配置&#xff0c;以下是一个典型的示…

设备故障预测与健康管理技术:从数据到决策的工业智能进化之路​

在工业 4.0 与智能制造浪潮的推动下&#xff0c;设备故障预测与健康管理&#xff08;Prognostics and Health Management, PHM&#xff09;技术已成为企业实现数字化转型的核心驱动力。据统计&#xff0c;制造业中设备非计划停机 1 小时的平均损失高达 25 万美元&#xff0c;而…

RabbitMQ从入门到实践:消息队列核心原理与典型应用场景

在现代应用开发中&#xff0c;系统各部分之间的通信至关重要。这就是像RabbitMQ这样的消息代理发挥作用的地方。无论您是在构建微服务架构、实现任务队列&#xff0c;还是开发实时聊天应用程序&#xff0c;RabbitMQ都可能成为改变游戏规则的工具。本文将深入探讨RabbitMQ是什么…

基于Spring Boot和Vue的网上军事论坛设计与实现

目录 一.&#x1f981;前言二.&#x1f981;开源代码与组件使用情况说明三.&#x1f981;核心功能1. ✅算法设计2. ✅Java开发语言3. ✅Redis数据库4. ✅部署项目 四.&#x1f981;演示效果1. 管理员模块1.1 用户管理1.2 内容审核1.3 权限分配1.4 菜单管理1.5 字典管理 2. 用户…

LLMs基础学习(八)强化学习专题(6)

LLMs基础学习&#xff08;八&#xff09;强化学习专题&#xff08;6&#xff09; 文章目录 LLMs基础学习&#xff08;八&#xff09;强化学习专题&#xff08;6&#xff09;深度强化学习&#xff08;DQN&#xff09;DQN 起源&#xff1a;《Playing Atari with Deep Reinforceme…

JVM(10)——详解Parallel垃圾回收器

Parallel 垃圾回收器&#xff08;也称为 吞吐量优先收集器&#xff09;。它是 Java 早期&#xff08;特别是 JDK 8 及之前&#xff09;在多核处理器上的默认垃圾回收器&#xff0c;其核心设计目标是最大化应用程序的吞吐量。 一、Parallel 回收器的定位与设计目标 核心目标&am…

MySQL(91)什么是分布式数据库?

分布式数据库是一种将数据存储在多个物理位置的数据库系统。这些位置可能分布在不同的服务器、数据中心甚至地理位置。分布式数据库系统允许数据的存储、处理和访问分布在多个节点上&#xff0c;以提高数据的可用性、可靠性、可扩展性和性能。 1. 分布式数据库的特点 1.1 数据…

Java事务失效(面试题)的常见场景

1. 方法非public修饰 原理&#xff1a; Spring AOP代理&#xff08;CGLIB或JDK动态代理&#xff09;默认无法拦截非public方法。 示例&#xff1a; Service public class UserService {Transactionalvoid updateUser() { // 非public方法// 事务不会生效&#xff01;} } 修…

GitHub 趋势日报 (2025年06月20日)

&#x1f4ca; 由 TrendForge 系统生成* | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 1810 data-engineer-handbook 373 n8n 295 anthropic-cookbook 291 automatisch…

qt常用控件--01

文章目录 qt常用控件--01上一篇文章的补充windowTitle属性windowIcon属性windowOpaCity属性cursor属性font属性结语 很高兴和大家见面&#xff0c;给生活加点impetus&#xff01;&#xff01;开启今天的编程之路&#xff01;&#xff01; 今天我们进一步c11中常见的新增表达 作…

C++ 中 string 类的解析及简易自我实现

目录 引言 标准库中的 string 类 功能概述 常见操作示例 自我实现简易 string 类 代码结构概述 1. String11.h 头文件 类的成员变量 迭代器相关 构造函数和析构函数 基本访问和修改方法 赋值运算符重载 内存管理和扩容 以下代码在.cpp文件中解析: 2. String11.…

计算机的性能指标(选择题0~1题无大题)

存储器的性能指标 总容量存储单元个数*存储字长 bit 例&#xff1a;MAR16位&#xff0c;MDR16位 总容量2的16次方*16bit 补充&#xff1a; n个二进制位就有2的n次方不同的状态 一般描述文件大小容量单位 2的10次方&#xff1a;K 2的20次方&#xff1a;M 2的…

React 核心原理与Fiber架构

目录 一、虚拟 DOM 二、Diffing 算法 三、Fiber 架构 四、渲染流程 1. Render 阶段&#xff08;可中断异步过程&#xff09; 2. Commit 阶段&#xff08;同步不可中断&#xff09; 五、时间切片&#xff08;Time Slicing&#xff09; 六、核心流程步骤总结 1. 状态更新…

【破局痛点,赋能未来】领码 SPARK:铸就企业业务永续进化的智慧引擎—— 深度剖析持续演进之道,引领数字化新范式

摘要 在瞬息万变的数字时代&#xff0c;企业对业务连续性、敏捷创新及高效运营的需求日益迫切。领码 SPARK 融合平台&#xff0c;秉持“持续演进”这一核心理念&#xff0c;以 iPaaS 与 aPaaS 为双擎驱动&#xff0c;深度融合元数据驱动、智能端口调度、自动化灰度切换、AI 智…

掌握C++核心特性

目标&#xff1a; 掌握C核心特性&#xff0c;为嵌入式开发打基础 好的&#xff0c;我来为你详细梳理一下 继承与多态、虚函数 相关的知识点&#xff0c;包括单继承、多继承、虚函数表机制、纯虚函数与抽象类、动态绑定。以下内容适合中等难度层次的理解&#xff0c;便于考试复…

python的高校教师资源管理系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…