【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中的路由:路径与组件的映射关系 (根据路由就能知道不同的路径,应…...
智慧校园学期基础数据管理
在智慧校园基础数据管理之一的学期管理功能管理中,学期的有序管理具有重要意义。它不仅是教学活动有序开展的指挥棒,更是连接学校管理者、教师与学生之间沟通的桥梁,承载着规划、跟踪与管理学期内各项事务的重要使命。 学期管理功能的首要任务…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
