【Gitlab】记一次升级 Gitlab 后 API 失效的问题
背景
前段时间,因内部使用的 Gitlab 版本存在漏洞,需要进行升级,于是乎,将 Gitlab 从 16.6.0 升级到 16.11.3。而我们项目有个接口是用于获取 Gitlab 上的开发人员。
然后,今天,突然发现这个接口获取不到 Gitlab 上任何成员(响应空数组),也没有报错信息。如下:

分析
-
首先是查看 Gitlab 是否正常,人员配置信息是否存在,排查之后发现都是正常的。
-
询问其他人最近是否有修改过 Gitlab 相关配置,貌似没有???
-
上网搜索相关信息,无果……
-
是否是因为升级了 Gitlab 导致的?时间恰好能对上!!!那就看下官方文档
文档地址:分组和项目成员 API
官方文档
首先看到的是 List all members of a group or project(列出组或项目的所有成员)
API 如下:
GET /groups/:id/members
GET /projects/:id/members
我们项目用的确实是这个 API,上面也说了是所有成员,那怎么就响应了空数组呢?再细看标题下面的介绍:
Gets a list of group or project members viewable by the authenticated user. Returns only direct members and not inherited members through ancestors groups.
获取已认证的用户并有权限查看的组或项目成员列表,但只返回直接成员,不返回通过祖先组(类似 Java 的父类)继承的成员。
啥?啥意思?啥是直接成员?说好的所有成员,怎么就只返回直接成员?
在 Gitlab 中,可以创建组,组中可以创建多个子组,子组可以创建多个项目。
以下是关于 Gitlab 中成员类型的介绍:
| 成员类型 | 成员描述 |
|---|---|
| 直接成员 | 直接被添加到当前的群组或项目中的用户 |
| 间接成员 | 通过继承父群组的成员或通过邀请加入其他群组或项目的用户 |
| 继承成员 | 如果一个群组是另一个父群组的子群组,父群组的成员也会成为子群组的用户 |
| 共享成员 | 通过邀请的方式加入到当前群组或项目或其祖先组的用户 |
| 继承共享成员 | 被邀请到当前群组或项目的父群组或项目的用户 |
假如你创建了A组,并在A组创建了test项目,然后将小一同学添加到了A组,那么小一同学就是A组的直接成员,而test项目也有小一同学这个成员,只不过他是继承过来的,所以不属于test项目的直接成员。
那么,要如何获取到这个项目真正的所有成员呢?
根据文档往下看,看到 List all members of a group or project including inherited and invited members(列出组或项目的所有成员,包括继承成员和邀请成员),看着是有那么点像我们要的了!!!
API 如下:
GET /groups/:id/members/all
GET /projects/:id/members/all
经过一试,确实可以!!!

来具体看下介绍:
Gets a list of group or project members viewable by the authenticated user, including inherited members, invited users, and permissions through ancestor groups.
获取已认证的用户并有权限查看的组或项目成员列表,包括通过祖先组继承的成员、受邀用户以及权限。
If a user is a member of this group or project and also of one or more ancestor groups, only its membership with the highest access_level is returned. This represents the effective permission of the user.
如果用户是这个组或项目的成员,同时也是一个或多个祖先组的成员,那么只会返回其拥有最高 access_level (访问权限),表示该用户的有效权限。
Members from an invited group are returned if either:
- The invited group is public.
- The requester is also a member of the invited group.
- The requester is a member of the shared group or project.
如果满足以下条件之一,则会返回受邀组的成员:
- 受邀组是公开的
- 请求者也是受邀组的成员
- 请求者是共享组或项目的成员
看来确实得用这个 API 才能后真正获取到分组或项目中所有的成员。
查看了其它版本的文档,也有这两个接口,那也许不是因为版本差异导致的?可能是配置?静待后续……
经过回溯原来的测试记录后,发现当时测试的项目的成员是直接加进去,也就是属于直接成员,所以就没有问题!而 Gitlab 中绝大多数成员都是直接添加到 Group 中的,因此通过 /members 就获取不到了!
说到底,还是测试做得不够好!!!
webui_members_inherited_users
webui_members_inherited_users 是一个功能标志,用于控制是否在成员页面中显示被邀请的群组成员。在 GitLab 16.10 中引入此功能,并默认禁用。
之所以引入这个,是因为在 GitLab 13.1 版本中,引入了允许群组与其他群组共享。但是,当使用群组成员 API 时,无法获取那些被邀请的群组成员,可能影响到用户在管理项目和群组成员时的体验和效率。
具体见:https://gitlab.com/gitlab-org/gitlab/-/issues/219230
关于该功能标志的相关配置:
-
登录 Gitlab 所在的服务器
-
启动 Rails 控制台
sudo gitlab-rails console -
在控制台中,查询当前的标志状态或更改
# 查询当前状态 Feature.enabled?(:webui_members_inherited_users)# 启用功能标志 Feature.enable(:webui_members_inherited_users)# 禁用功能标志 Feature.disable(:webui_members_inherited_users) -
退出控制台
exit
相关文章:
【Gitlab】记一次升级 Gitlab 后 API 失效的问题
背景 前段时间,因内部使用的 Gitlab 版本存在漏洞,需要进行升级,于是乎,将 Gitlab 从 16.6.0 升级到 16.11.3。而我们项目有个接口是用于获取 Gitlab 上的开发人员。 然后,今天,突然发现这个接口获取不到…...
2024.7.19 作业
1.链表的排序 int list_sort(NodePtr L) {if(NULLL || L->len<1){printf("排序失败");return -1;}int lenL->len1;NodePtr p;int i,j;for( i1;i<len;i){for( j0,pL;j<len-i;j,pp->next){if( p->data > p->next->data ){datatype tp-&…...
python如何创建SQLite 数据库连接,如何将数据库存储在内存中?
嗨,大家好,我是兰若姐姐。今天给大家说下如何创建SQLite 数据库连接,并将数据库存储在内存中,这是一种临时的、私有的数据存储空间,一般用于以下情形: 什么都不说,先上代码: import sqlite3创建数据库连接…...
机器学习-20-基于交互式web应用框架streamlit的基础使用教程
参考简洁而优雅地展示你的算法和数据——streamlit教程(一) 原理介绍与布局控制 参考Streamlit 讲解专栏(二):搭建第一个应用 Streamlit 讲解专栏(三):两种方案构建多页面 Streamlit 讲解专栏(五):探索强大而灵活的 st.write() 函数 1 streamlit 1.1 运行原理 im…...
基于luckysheet实现在线电子表格和Excel在线预览
概述 本文基于luckysheet实现在线的电子表格,并基于luckyexcel实现excel文件的导入和在线预览。 效果 实现 1. luckysheet介绍 Luckysheet ,一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源。 官方文档在线Demo 2. 实现 …...
【学习笔记】无人机系统(UAS)的连接、识别和跟踪(一)-3GPP TS 23.256 技术规范概述
3GPP TS 23.256 技术规范,主要定义了3GPP系统对无人机(UAV)的连接性、身份识别、跟踪及A2X(Aircraft-to-Everything)服务的支持。 3GPP TS 23.256 技术规范: 以下是文档的核心内容总结: UAV系…...
sqlalchemy_dm
1、参考文档: https://blog.csdn.net/njcwwddcz/article/details/126554118 https://eco.dameng.com/document/dm/zh-cn/pm/dmpython-dialect-package.html 2、生成工具 sqlalchemy2.0.0.zip 3、安装步骤 conda create --name kes --clone kes1 rz unzip sql…...
基于springboot+vue+uniapp的驾校预约平台小程序
开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...
echarts实现3d柱状效果
代码如下,单个的调第一个方法,多个柱状的调第二个方法,具体情况修改参数或者二次开发即可 //3d柱状图 export function getEcharts3DBar (xAxisData:string[][name1,name2,name3], data:number[][1,2,3], colorObj:IBaseObject{topStartColo…...
Flask校验
WTForms 是一个 Python 库,用于处理和验证 Web 表单。它提供了很多功能来简化表单处理,包括字段类型、验证器、错误消息等。在 WTForms 中,validate 机制是用于确保表单数据满足特定条件的关键部分。 1.验证器(Validators&#x…...
web前端 Vue 框架面试120题(一)
面试题 1 . 简述Vue的MVVM 模式? 参考回答: MVVM 是 Model-View-ViewModel的缩写,即将数据模型与数据表现层通过数据驱动进行分离,从而只需要关系数据模型的开发,而不需要考虑页面的表现,具体说来如下:M…...
UniApp__微信小程序项目实战 实现长列表分页,通过 onReachBottom 方法上划分次加载数据
UniApp 实现长列表分页,通过 onReachBottom 方法上划分次加载数据 项目实战中比较常见,方便下次使用 文章目录 一、应用场景? 二、作用 三、使用步骤? 3.1 实现的整体思路? …...
数据结构(功能受限的表-栈队列)
功能受限的表结构 一、栈和队列介绍 栈和队列是两种重要的线性结构,从数据结构角度,他们都是线性表,特殊点在于它们的操作被限制,也就是所谓的功能受限,统称功能受限的线性表 从数据类型角度,它们也可以是…...
高数知识补充----矩阵、行列式、数学符号
矩阵计算 参考链接:矩阵如何运算?——线性代数_矩阵计算-CSDN博客 行列式计算 参考链接:实用的行列式计算方法 —— 线性代数(det)_det线性代数-CSDN博客 参考链接:行列式的计算方法(含四种,…...
《Techporters架构搭建》-Day01 第一个RESTful API接口
微服务架构搭建 搭建微服务架构分析一下项目的build.gradle添加Demo接口 搭建微服务架构 首先搭建系统管理模块,模块结构如下 tps-cloud └── tps-system -- 系统管理模块└── tps-system-api -- 系统管理模块公共api模块└── tps-system-biz -- 系统管理模…...
【C++ —— AVL树】
C —— AVL树 AVL树的概念AVL树节点的定义AVL树的插入向上调整旋转左单旋右单旋左右双旋右左双旋 AVL树的高度AVL树的验证总结:代码 AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素…...
跨平台webSocket模块设计技术解决方案
1. 概述 目标:设计并实现一个能够在多种操作系统上运行的WebSocket通讯模块,支持与前端浏览器和HTTPS服务端进行数据交换。技术栈:C11 ,使用跨平台库如 Boost处理网络IO,使用 JSON 库如 nlohmann/json 解析消息。 2.…...
Drools规则引擎
一、Drools规则引擎 Drools官网: https://www.drools.org/Drools中文网: http://www.drools.org.cn/bilibili学习视频(黑马博学谷2020年最新Java项目Drools业务规则管理系统(BRMS)): https://www.bilibili.com/video/BV1Pa4y1a7u…...
vue学习day11-路由、路由模块的封装、声明式导航-路由的介绍、VueRouter、router-link、自定义高亮类名
32、路由 (1)路由的介绍 1)生活中的路由:设备和ip的映射关系 2)路由:一种映射关系 3)Vue中的路由:路径与组件的映射关系 (根据路由就能知道不同的路径,应…...
智慧校园学期基础数据管理
在智慧校园基础数据管理之一的学期管理功能管理中,学期的有序管理具有重要意义。它不仅是教学活动有序开展的指挥棒,更是连接学校管理者、教师与学生之间沟通的桥梁,承载着规划、跟踪与管理学期内各项事务的重要使命。 学期管理功能的首要任务…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
