当前位置: 首页 > article >正文

GitHub Actions 使用需谨慎:深度剖析其痛点与替代方案

在持续集成与持续部署(CI/CD)领域,GitHub Actions 曾是众多开发者的热门选择,但如今,其弊端逐渐显现,让不少人在使用前不得不深思熟虑。

团队由大约 15 名工程师组成,采用基于主干的开发方式,每天多次向主分支推送代码。团队代码存储在按模块划分的单一代码库(monorepo)中,结构如下:

monorepo/├─ api1/├─ api2/├─ web-app1/├─ web-app2/

每个文件夹都相互独立,可单独进行测试、构建和部署,各自拥有独立的流水线。团队原本期望利用 GitHub Actions 的路径触发功能,仅在对应文件夹代码变更时启动相应流水线,以提高效率。

在实际操作中,却遭遇了严重问题。按照良好的开发实践,通常只有在所有检查通过后才允许合并拉取请求。但在上述 monorepo 架构下,这一常规操作变得异常艰难。在 GitHub 中,虽可指定 “必需检查”,如设置 “web-app1 - 单元测试” 必须通过才能合并拉取请求,但问题在于,该检查仅在 “web-app1” 文件夹有代码变动时才会运行。这就导致如果拉取请求仅修改了 “api1” 文件夹的代码,即便其他所有相关检查都已通过,也无法合并请求。为解决此问题,团队不得不运行额外的流水线来确定拉取请求是否可合并,这种方式不仅操作繁琐(类似 “hack” 手段),而且维护困难、成本高昂。令人遗憾的是,此问题提出近 3 年,GitHub 却未采取有效措施改进。理想情况下,GitHub 不应依赖特定名称的必需检查,而应规定所有由拉取请求触发的检查都通过后才能合并,这样才能从根本上解决问题。

随着项目发展,流水线日益复杂,GitHub Actions 的管理难度也急剧上升。以一个示例工作流为例:

name: CD - api1on:push:paths:- 'api1/**'branches:- masterworkflow_dispatch:inputs:target_environment:type: environmentdefault: 'staging'required: trueworkflow_call:inputs:target_environment:type: stringrequired: true
jobs:deploy-api1:environment:name: ${{ github.event_name == 'push' && 'production' || inputs.target_environment }}smoke-tests:if: ${{ github.event_name == 'push' || inputs.target_environment == 'production' }}name: Smoke Testsuses:./.github/workflows/smoke-tests.ymlwith:target_environment: 'production'secrets: inherit

在这个工作流中,为了实现不同的触发条件和逻辑判断,不得不添加大量类似if: ${ { github.event_name == 'push' || inputs.target_environment == 'production' }}的语句。虽然可以将其拆分为多个具有不同触发条件的工作流,但这样会导致需要维护的文件数量大幅增加。原本工作流的复用应简洁高效,但实际情况却是需要编写更多代码行,且存在大量重复语句,如工作流名称、secrets: inherit等。目前团队的.github文件夹中已经包含 30 多个文件,管理负担日益沉重。

此外,needs子句也常常引发问题。在进行代码重构和删除某些任务时,很容易忘记更新needs子句以及后续相关步骤。虽然有一些代码检查工具(linters)可用,但它们并不完美,无法完全避免此类错误。最糟糕的是,往往只有在推送工作流之后才能发现错误,这使得问题的发现和修复变得滞后,增加了开发成本和风险。

另一个严重的缺陷是 GitHub Actions 缺乏本地开发支持。虽然有 act 工具可尝试在本地模拟运行,但在实际使用中,其效果并不理想,无法满足开发者在本地快速验证和调试工作流的需求。这使得开发者在开发过程中遇到问题时,难以迅速定位和解决,严重影响了开发效率。

在所有这些问题中,最令人失望的是 GitHub 对这些问题的态度。尽管用户反馈强烈,一些问题的讨论帖已经开放多年,但 GitHub 却未采取实质性行动来修复这些问题或改进产品。近期,GitHub 甚至关闭了许多相关问题的讨论,这引发了社区的强烈不满。从其公开的路线图来看,也没有迹象表明这些关键问题将得到妥善解决,这让用户对 GitHub Actions 的未来发展充满担忧。

鉴于以上诸多问题,以及 GitHub 缺乏改进的动力,在选择 CI/CD 工具时,确实需要重新审视 GitHub Actions 的适用性。目前,CI/CD 市场提供了众多替代方案,如 Gitlab、Jenkins、TeamCity 等。笔者团队在实际使用中发现,这些工具在某些方面能够提供更优质的服务,性价比更高。此外,像 Dagger 这样的新兴工具也值得关注和评估,它们为 CI/CD 领域带来了新的思路和功能,可能更适合一些特定的项目需求。

总之,在技术选型过程中,我们不能盲目跟风,而应根据项目的实际需求、团队的技术能力和工具的实际表现进行综合考虑。对于 GitHub Actions,虽然它在某些场景下仍有一定的应用价值,但在使用前务必充分了解其局限性,并结合自身情况谨慎决策。希望通过本文的分享,能够帮助开发者在 CI/CD 工具的选择上做出更明智的选择,提高项目的开发效率和质量。

你在使用 GitHub Actions 或其他 CI/CD 工具时,是否也遇到过类似的问题呢?欢迎在评论区留言分享你的经验和看法,让我们一起共同探讨如何优化 CI/CD 流程,提升项目开发的效率和质量。

科技脉搏,每日跳动。

与敖行客 Allthinker一起,创造属于开发者的多彩世界。

图片

- 智慧链接 思想协作 -

相关文章:

GitHub Actions 使用需谨慎:深度剖析其痛点与替代方案

在持续集成与持续部署(CI/CD)领域,GitHub Actions 曾是众多开发者的热门选择,但如今,其弊端逐渐显现,让不少人在使用前不得不深思熟虑。 团队由大约 15 名工程师组成,采用基于主干的开发方式&am…...

<iframe>标签和定时调用函数setInterval

iframe 标签和定时调用函数 setInterval 问题描述:解决方法: 问题描述: 今天遇到一个前端问题,在浏览器页面上传Excel文件后,然后点击导入按钮,经后端Java类读取文件内容校验后,将校验结果返回…...

MYSQL学习笔记(六):聚合函数、sql语句执行原理简要分析

前言: 学习和使用数据库可以说是程序员必须具备能力,这里将更新关于MYSQL的使用讲解,大概应该会更新30篇,涵盖入门、进阶、高级(一些原理分析);这一篇是内容较少,主要讲解:聚合函数和简要介绍sql语句执行过…...

Qt——界面优化

一.QSS 1.背景 在网页前端开发领域中, CSS 是⼀个至关重要的部分。 描述了⼀个网页的 "样式"。 从而起到对网页美化的作用。 所谓样式,包括不限于大小,位置,颜色,背景,间距,字体等等…...

MySQL 数据库常见字段类型大全及详细解析

在工作期间会遇到数据库建表的业务,经常会使用复制粘帖等操作,而不清楚数据库的字段类型。本文记录了 MySQL 数据库常见字段类型,根据不同的数据需求,可以选择不同的字段类型来存储数据。 文章目录 一、整数类型1、TINYINT&#x…...

MATLAB 工具库的使用说明和案例示例

以下是一些常见的 MATLAB 工具库的使用说明和案例示例: 信号处理工具箱(Signal Processing Toolbox): 使用说明:提供了用于生成、测量、变换、过滤和可视化信号的函数和应用程序。包括重新采样、平滑、同步信号、设计…...

对于Docker的初步了解

简介与概述 1.不需要安装环境,工具包包含了环境(jdk等) 2.打包好,“一次封装,到处运行” 3.跨平台,docker容器在任何操作系统上都是一致的,这就是实现跨平台跨服务器。只需要一次配置好环境&…...

java基础学习——jdbc基础知识详细介绍

引言 数据的存储 我们在开发 java 程序时,数据都是存储在内存中的,属于临时存储,当程序停止或重启时,内存中的数据就会丢失,我们为了解决数据的长期存储问题,有以下解决方案: 通过 IO流书记&…...

第20篇:Python 开发进阶:使用Django进行Web开发详解

第20篇:使用Django进行Web开发 内容简介 在上一篇文章中,我们深入探讨了Flask框架的高级功能,并通过构建一个博客系统展示了其实际应用。本篇文章将转向Django,另一个功能强大且广泛使用的Python Web框架。我们将介绍Django的核…...

CukeTest使用 | 1 CukeTest是什么?如何下载安装?

CukeTest使用 | 1 CukeTest是什么?如何下载安装? 1 CukeTest是什么?2 关于开发者3 CukeTest有哪些特性?4 都支持哪些自动化技术类型?5 版本区别6 下载安装 特殊说明:学习内容主要来自官网的教程、以及网上公…...

An OpenGL Toolbox

3.An OpenGL Toolbox 声明:该代码来自:Computer Graphics Through OpenGL From Theory to Experiments,仅用作学习参考 3.1 Vertex Arrays and Their Drawing Commands 顶点数组及其绘制命令:将几何数据存储在一个位置&#xff0c…...

R语言学习笔记之高效数据操作

一、概要 数据操作是R语言的一大优势,用户可以利用基本包或者拓展包在R语言中进行复杂的数据操作,包括排序、更新、分组汇总等。R数据操作包:data.table和tidyfst两个扩展包。 data.table是当前R中处理数据最快的工具,可以实现快…...

构造函数及实例化的过程:实例成员

构造函数:是一种特殊的函数,主要用来初始化对象 使用场景:比如我们创建了佩奇的对象,继续创建乔治的对象还需要重新写一遍,此时可以通过构造函数来快速创建多个类似的对象。 构造函数语法:大写字母开头的函数 function Pig(name,age,gender)…...

Linux的权限和一些shell原理

目录 shell的原理 Linux权限 sudo命令提权 权限 文件的属性 ⽂件类型: 基本权限: chmod改权限 umask chown 该拥有者 chgrp 改所属组 最后: 目录权限 粘滞位 shell的原理 我们广义上的Linux系统 Linux内核Linux外壳 Linux严格…...

LearnOpenGL——光照

教程地址:简介 - LearnOpenGL CN 前言 这篇开始光照的学习。 颜色 原文链接: 颜色 - LearnOpenGL CN总结: 重新搭建了一个简单场景,为后面的学习做准备。 现实世界中有无数种颜色,每一个物体都有它们自己的颜色。我…...

落地 ORB角点检测与sift检测

ORB角点检测 可以说ORB是由FAST、灰度质心和BRIEF等技术组合优化形成的,不过更准确地说,ORB是在FAST特征检测算法基础上,结合了灰度质心确定方向以及改进后的BRIEF描述子等技术形成的,以下是具体分析: • FAST特征检…...

步入响应式编程篇(二)之Reactor API

步入响应式编程篇(二)之Reactor API 前言回顾响应式编程Reactor API的使用Stream引入依赖Reactor API的使用流源头的创建 reactor api的背压模式发布者与订阅者使用的线程查看弹珠图查看形成新流的日志 前言 对于响应式编程的基于概念,以及J…...

利用Redis实现数据缓存

目录 1 为啥要缓存捏? 2 基本流程(以查询商铺信息为例) 3 实现数据库与缓存双写一致 3.1 内存淘汰 3.2 超时剔除(半自动) 3.3 主动更新(手动) 3.3.1 双写方案 3.3.2 读写穿透方案 3.3.…...

如何使用 pytest-html 创建自定义 HTML 测试报告

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 测试 Python 代码对于提高代码质量、检测漏洞或意外行为至关重要。 但测试结果又该…...

服务器中的流量主要是指什么?

服务器流量就是指服务器在单位时间内所传输的数据量,服务器流量在互联网中起着十分重要的作用,一般会被用来处理网站的访问请求,当用户在网站中浏览网页和视频时,服务器会接收到用户的请求,同时会返回网站的内容。 服务…...

飞牛NAS安装过程中的docker源问题

采用CloudFlare进行飞牛NAS的远程访问 【安全免费】无需公网IP、端口号&#xff0c;NAS外网访问新方法_网络存储_什么值得买 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<EOF {"registry-mirrors": ["https://docker.1panel.dev&quo…...

【动态规划】--- 斐波那契数模型

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey &#x1f3e0; 第N个泰波那契数模型 &#x1f4cc; 题目解析 第N个泰波那契数 题目要求的是泰波那契数&#xff0c;并非斐波那契数。 &…...

php-phar打包避坑指南2025

有很多php脚本工具都是打包成phar形式&#xff0c;使用起来就很方便&#xff0c;那么如何自己做一个呢&#xff1f;也找了很多文档&#xff0c;也遇到很多坑&#xff0c;这里就来总结一下 phar安装 现在直接装yum php-cli包就有phar文件&#xff0c;很方便 可通过phar help查看…...

ChirpIoT技术的优势以及局限性

ChirpIoT是一种由上海磐启微电子开发的国产无线射频通讯技术&#xff0c;ChirpIoT技术基于磐启多年对雷达等线性扩频信号的深入研究&#xff0c;并在此基础上对线性扩频信号的变化进行了改进&#xff0c;实现了远距离传输的一种无线通信技术。相关产品型号有E29-400T22D、E290-…...

java提取系统应用的日志中的sql获取表之间的关系

为了获取到对应的sql数据&#xff0c;分了三步骤 第一步&#xff0c;获取日志文件&#xff0c;解析日志文件中的查询sql&#xff0c;递归解析sql&#xff0c;获取表关系集合 递归解析sql&#xff0c;获取表与表之间的关系 输出得到的对应关联关系数据 第二步&#xff0c;根据获…...

PyQt6医疗多模态大语言模型(MLLM)实用系统框架构建初探(下.代码部分)

医疗 MLLM 框架编程实现 本医疗 MLLM 框架结合 Python 与 PyQt6 构建,旨在实现多模态医疗数据融合分析并提供可视化界面。下面从数据预处理、模型构建与训练、可视化界面开发、模型 - 界面通信与部署这几个关键部分详细介绍编程实现。 6.1 数据预处理 在医疗 MLLM 框架中,多…...

IMX6ull项目环境配置

文件解压缩&#xff1a; .tar.gz 格式解压为 tar -zxvf .tar.bz2 格式解压为 tar -jxvf 2.4版本后的U-boot.bin移植进SD卡后&#xff0c;通过串口启动配置开发板和虚拟机网络。 setenv ipaddr 192.168.2.230 setenv ethaddr 00:04:9f:…...

Linux(Centos 7.6)命令详解:wc

1.命令作用 打印文件的行数、单词数、字节数&#xff0c;如果指定了多个文件&#xff0c;还会打印以上三种数据的总和(Print newline, word, and byte counts for each FILE, and a total line if more than one FILE is specified) 2.命令语法 Usage: wc [OPTION]... [FIL…...

Gradle buildSrc模块详解:集中管理构建逻辑的利器

文章目录 buildSrc模块二 buildSrc的使命三 如何使用buildSrc1. 创建目录结构2. 配置buildSrc的构建脚本3. 编写共享逻辑4. 在模块中引用 四 典型使用场景1. 统一依赖版本管理2. 自定义Gradle任务 3. 封装通用插件4. 扩展Gradle API 五 注意事项六 与复合构建&#xff08;Compo…...

六、深入了解DI

依赖注入是⼀个过程&#xff0c;是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源&#xff0c;⽽资源指的就是对象. 在上⾯程序案例中&#xff0c;我们使⽤了 Autowired 这个注解&#xff0c;完成了依赖注⼊的操作. 简单来说,就是把对象取出来放到某个类的属性中。 关于依赖注…...