管理群组

使用群组同时管理一个或多个相关项目。

查看群组

要查看群组,请在顶部栏上选择 主菜单 > 群组 > 查看所有群组

群组页面显示按上次更新日期排序的群组列表。

  • 要浏览所有公开群组,请选择 浏览群组
  • 要查看您拥有直接或间接成员资格的群组,请选择 您的群组。此选项卡也显示以下您所属的群组:
    • 通过子组获取的父组的成员资格。
    • 通过群组或子组中项目的直接或继承成员资格。

创建一个群组

要创建一个群组:

  1. 在顶部导航栏,有两种方式可选:
    • 选择 主菜单 > 群组 > 查看所有群组,然后在右侧选择 新建群组
    • 在搜索框的左侧,选择加号,然后选择 新建群组
  2. 选择 创建群组
  3. 群组名称 中输入群组的名称。有关不能用作群组名的单词列表,请参阅保留名称
  4. 群组 URL 中输入群组的路径,用于命名空间
  5. 选择可见性级别
  6. 通过回答以下问题来个性化您的体验:
    • 您的角色是什么?
    • 谁将使用这个群组?
    • 您会用这个群组做什么?
  7. 邀请极狐GitLab 成员或其他用户加入群组。

删除群组

要删除群组及其内容:

  1. 在顶部栏上,选择 主菜单 > 群组 并找到您的群组。
  2. 在左侧边栏中,选择 设置 > 通用
  3. 展开 高级 部分。
  4. 删除群组 部分,选择 删除群组
  5. 输入群组名。
  6. 选择 确认

群组也可以从群组仪表盘中删除:

  1. 在顶部栏上,选择 主菜单 > 群组 > 查看所有群组
  2. 选择 您的群组
  3. 选择要删除的群组对应的 ()。
  4. 选择 删除
  5. 在删除群组部分,选择 删除群组
  6. 输入群组名。
  7. 选择 确认

此操作将删除该群组。它还添加了一个后台作业来删除组中的所有项目。

特别注意:

  • 在 12.8 及更高版本的专业版或更高级别,此操作添加了一个后台作业来标记要删除的群组。默认情况下,作业将删除安排在未来 7 天。您可以通过实例设置修改这个等待时间。
  • 在 13.6 及更高版本,如果设置删除的用户在删除之前从群组中删除,则作业将被取消,该群组不再被安排删除。

立即删除群组

引入于 14.2 版本。

如果您不想等待,可以立即删除一个群组。

先决条件:

立即删除标记为删除的群组:

  1. 在顶部栏上,选择 主菜单 > 群组 并找到您的群组。
  2. 在左侧边栏上,选择 设置 > 通用
  3. 展开 高级
  4. 在 “永久删除群组” 部分,选择 删除群组
  5. 根据要求确认操作。

您的群组、其子组、项目和所有相关资源(包括议题和合并请求)都将被删除。

恢复群组

要恢复标记为删除的组:

  1. 在顶部栏上,选择 主菜单 > 群组,并找到您的群组。
  2. 选择 设置 > 通用
  3. 展开 路径, 转移, 删除 部分。
  4. 在恢复群组部分,选择 恢复群组

请求访问群组

作为用户,如果管理员允许,您可以请求成为群组的成员。

  1. 在顶部栏上,选择 主菜单 > 群组
  2. 选择 您的群组
  3. 找到群组并选择它。
  4. 在群组名下,选择 请求访问

多达 10 个最近活跃的群组所有者会收到一封包含您的请求的电子邮件。任何群组所有者都可以批准或拒绝请求。

如果您在请求获得批准之前改变主意,请选择 撤销访问请求

过滤和排序群组中的成员

要查找群组中的成员,您可以排序、过滤或搜索。

过滤群组

过滤群组以查找成员。默认情况下,显示群组和子组中的所有成员。

  1. 在顶部栏上,选择 主菜单 > 群组 并找到您的群组。
  2. 在成员列表上方,在 筛选成员 框中,输入筛选条件。
    • 要仅查看群组中的成员,请选择 成员 = 直接
    • 要查看群组及其子组的成员,请选择 成员 = 继承
    • 要查看启用或禁用双重身份验证的成员,请选择 2FA = 启用已禁用
    • 在 14.0 及更高版本,要查看由 SAML SSO 或 SCIM provisioning 创建的用户,选择 Enterprise = true

搜索群组

您可以按姓名、用户名或电子邮件搜索成员。

  1. 在顶部栏上,选择 主菜单 > 群组 并找到您的群组。
  2. 在左侧导航栏,选择 群组信息 > 成员
  3. 在成员列表上方,在 筛选成员 框中,输入搜索条件。
  4. 筛选成员 框的右侧,选择放大镜 ()。

对群组中的成员进行排序

您可以按 帐户已授予访问最大角色上次登录 对成员进行排序。

  1. 在顶部栏上,选择 主菜单 > 群组 并找到您的群组。
  2. 在左侧导航栏,选择 群组信息 > 成员
  3. 在成员列表上方的右上角,从 帐户 列表中,选择筛选条件。
  4. 要在升序和降序之间切换排序,在 帐户 列表的右侧,选择箭头()。

添加用户到群组

先决条件:

  • 您必须具有所有者角色。

您可以授予用户访问群组中所有项目的权限。

  1. 在顶部栏上,选择 主菜单 > 群组
  2. 选择 您的群组
  3. 从左侧边栏中,选择 群组信息 > 成员
  4. 选择 邀请成员
  5. 填写字段。
    • 该角色适用于群组中的所有项目。
    • 访问过期时间,用户无法再访问组中的项目。
  6. 选择 邀请

未自动添加的成员显示在 已邀请 选项卡上。 在此选项卡上的用户:

从群组中删除成员

先决条件:

  • 您必须具有所有者角色。
  • 该成员必须是该群组的直接成员。如果成员资格是从父组继承的,则只能从父组中删除该成员。

要从群组中删除成员:

  1. 进入群组。
  2. 从左侧菜单中,选择 群组信息 > 成员
  3. 在您要删除的成员旁边,选择 删除
  4. 可选。在 删除成员 确认框中:
    • 要从子组和项目中删除直接用户成员资格,请选中 同时从子组和项目中删除直接用户成员资格 复选框。
    • 要从关联的议题和合并请求中取消指派用户,请选中 同时从相关的议题和合并请求中取消指派此用户 复选框。
  5. 选择 移除成员

添加项目到群组

将新项目添加到群组有两种不同的方法:

  • 选择一个群组,然后单击 新键项目。然后您可以继续创建您的项目创建您的项目
  • 在创建项目时,从下拉菜单中选择一个群组。

    Select group

指定谁可以将项目添加到群组

默认情况下,至少具有开发者角色的用户可以在一个群组下创建项目。

要为特定群组更改此设置:

  1. 在顶部栏上,选择 主菜单 > 群组 > 查看所有群组
  2. 选择 您的群组
  3. 找到群组并选择它。
  4. 从左侧菜单中,选择 设置 > 通用
  5. 展开 权限和群组功能 部分。
  6. 允许创建项目的角色 下拉列表中选择所需的选项。
  7. 单击 保存更改

要全局更改此设置,请参阅默认项目创建保护

更改群组的所有者

您可以更改群组的所有者。每个群组必须始终至少有一个具有所有者角色的成员。

  • 作为管理员:
    1. 在顶部栏上,选择 主菜单 > 群组 并找到您的群组。
    2. 在左侧导航栏,选择 群组信息 > 成员
    3. 给不同的成员 所有者 角色。
    4. 刷新页面。您现在可以删除原来的 所有者 角色。
  • 作为当前组的所有者:
    1. 在顶部栏上,选择 主菜单 > 群组 并找到您的群组。
    2. 在左侧导航栏,选择 群组信息 > 成员
    3. 给不同的成员 所有者 角色。
    4. 让新所有者登录并删除您的 所有者 角色。

更改群组路径

更改群组的路径(群组 URL)可能会产生意想不到的副作用。在继续之前阅读重定向文档

如果您正在更改路径以便其他组或用户可以声明它,您必须重命名该组。名称和路径都必须是唯一的。

要保留原始命名空间的所有权并保护 URL 重定向,请创建一个新群组并将项目转移到该群组。

要更改您的群组路径(群组 URL):

  1. 在顶部栏上,选择 主菜单 > 群组,并找到您的群组。
  2. 选择 设置 > 通用
  3. 展开 高级 部分。
  4. 更改群组 URL 下,输入一个新名称。
  5. 选择 更改群组 URL
caution如果命名空间包含带有 Container Registry 标签的项目,则无法重命名命名空间,因为该项目无法移动。

更改群组的默认分支保护

默认情况下,每个群组都会继承在全局级别设置的分支保护。

要更改特定群组的设置,请参阅群组级别默认分支保护

要全局更改此设置,请参阅初始默认分支保护

为初始分支使用自定义名称

创建新项目时,会在第一次推送时创建一个默认分支。群组所有者可以为群组的项目自定义初始分支,满足您群组的需求。

与另一个群组共享群组

  • 窗口在私有化部署实例上启用,引入于 14.8 版本。
  • 一般可用于 14.9 版本。功能标志 invite_members_group_modal 删除。

与群组共享项目的方式类似,您可以与另一个群组共享一个群组。要邀请某个群组,您必须是该群组的成员。成员可以直接访问共享群组,包括从父组继承群组成员身份的成员。

要与另一个组共享给定的组,例如 Frontend,例如,Engineering

  1. 进入 Frontend 群组。
  2. 从左侧菜单中,选择 群组信息 > 成员
  3. 选择 邀请群组
  4. 选择要邀请的群组 列表中,选择 Engineering
  5. 选择角色作为最大访问级别。
  6. 选择 邀请

在与 Engineering 群组共享 Frontend 群组后:

  • 群组 选项卡列出了 Engineering 群组。
  • 群组 选项卡列出群组,无论它是公开群组还是私有群组。
  • Engineering 群组的所有成员都可以访问 Frontend 群组。成员的相同访问级别适用于共享群组时选择的最大访问级别。

转移群组

您可以通过以下方式转移群组:

  • 将子组转移到新的父组。
  • 通过将顶级组转移到所需组,将其转移为子组。
  • 通过将子组从当前组中移出,将子组转移为顶级组。

转移群组时,请注意:

  • 更改群组的父级可能会产生意想不到的副作用。请参阅仓库路径更改时会发生什么
  • 您只能将群组转移到您管理的群组。
  • 您必须更新本地仓库以指向新位置。
  • 如果直接父组的可见性低于该组的当前可见性,子组和项目的可见性级别会更改以匹配新父组的可见性。
  • 仅转移明确的群组成员资格,而不是继承的成员资格。如果群组的所有者仅继承了成员资格,则该群组将没有所有者。在这种情况下,转移群组的用户将成为组的所有者。
  • 如果软件包存在于群组中的任何项目或其任何子组中,则转换失败。

转移群组:

  1. 在顶部栏上,选择 主菜单 > 群组 并找到您的群组。
  2. 在左侧边栏中,选择 设置 > 通用
  3. 展开 高级 部分。
  4. 删除群组 部分,选择 转移群组
  5. 在下拉菜单中选择群组名称。
  6. 选择 转移群组

启用延迟项目删除

  • 引入于 13.2 版本。
  • 于 13.11 版本添加了继承和执行。
  • 于 14.2 版本添加了默认启用的实例设置。
  • 从 15.1 版本开始,在禁用时,实例设置被继承和强制执行。
  • 用户界面变更于 15.1 版本。

除非为仅群组,或群组和项目启用删除保护的实例级设置,否则延迟项目删除将被锁定和禁用。 在群组上启用时,群组中的项目会在延迟一段时间后被删除。在此期间,项目处于只读状态,可以恢复。 默认期限为 7 天,但可在实例级别配置。

在私有化部署版上,默认情况下会立即删除项目。 在 14.2 及更高版本中,管理员可以为新创建的群组中的项目更改默认设置。

要启用群组中项目的延迟删除:

  1. 在顶部栏上,选择 主菜单 > 群组,并找到您的群组。
  2. 选择 设置 > 通用
  3. 展开 权限和群组功能 部分。
  4. 滚动到:
    • (15.1 及更高版本)删除保护 并选择 保留已删除的项目
    • (15.0 及更早版本)启用延迟项目删除 并勾选复选框。
  5. 可选。要防止子组更改此设置,请选择:
    • (15.1 及更高版本)对所有子组实施删除保护
    • (15.0 及更早版本)对所有子组强制执行
  6. 选择 保存修改
note在 13.11 及更高版本中,延迟项目删除的群组设置由子组继承。继承可以被覆盖,除非由父组强制执行。

合规框架

  • 引入于 13.9 版本。
  • 功能标志删除于 13.12 版本。

您可以创建一个作为标记的合规框架,标识您的项目具有某些合规要求或需要额外的监督。标签可以选择性地对应用它的项目强制执行合规流水线配置。

群组所有者可以创建、编辑和删除合规框架:

  1. 在顶部栏上,选择 主菜单 > 群组 > 查看所有群组 并找到您的群组。
  2. 在左侧边栏中,选择 设置 > 通用
  3. 展开 合规框架 部分。
  4. 创建、编辑或删除合规框架。

配置合规流水线

群组所有者可以在项目中配置与其他项目分开的合规流水线。默认情况下,运行合规流水线配置(.gitlab-ci.yml 文件)而不是标记项目的流水线配置。

但是,合规流水线配置可以引用标记项目的 .gitlab-ci.yml 文件,以便:

  • 合规流水线可以运行标记项目流水线的作业,允许集中控制流水线配置。
  • 合规流水线中定义的作业和变量不能被标记项目的 .gitlab-ci.yml 文件中的变量更改。

要配置合规流水线:

  1. 在顶部栏上,选择 主菜单 > 群组 > 查看所有群组 并找到您的群组。
  2. 在左侧边栏中,选择 设置 > 通用
  3. 展开 合规框架 部分。
  4. 合规流水线配置(可选) 中,添加合规框架配置的路径。使用 path/file.y[a]ml@group-name/project-name 格式。例如:

    • .compliance-ci.yml@gitlab-org/gitlab.
    • .compliance-ci.yaml@gitlab-org/gitlab.

此配置由应用了合规框架标记的项目继承。在应用了合规框架标记的项目中,运行合规流水线配置而不是标记项目自己的流水线配置。

在标记项目中运行流水线的用户必须至少具有合规项目的报告者角色。

当用于强制执行扫描时,此功能与扫描执行策略有一些重叠。我们还没有统一这两个功能的用户体验。

示例配置

以下示例 .compliance-gitlab-ci.yml 包含 include 关键字,以确保标记的项目流水线配置也被执行。

# Allows compliance team to control the ordering and interweaving of stages/jobs.
# Stages without jobs defined will remain hidden.
stages:
  - pre-compliance
  - build
  - test
  - pre-deploy-compliance
  - deploy
  - post-compliance

variables:  # Can be overridden by setting a job-specific variable in project's local .gitlab-ci.yml
  FOO: sast

sast:  # None of these attributes can be overridden by a project's local .gitlab-ci.yml
  variables:
    FOO: sast
  image: ruby:2.6
  stage: pre-compliance
  rules:
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
      when: never
    - when: always  # or when: on_success
  allow_failure: false
  before_script:
    - "# No before scripts."
  script:
    - echo "running $FOO"
  after_script:
    - "# No after scripts."

sanity check:
  image: ruby:2.6
  stage: pre-deploy-compliance
  rules:
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
      when: never
    - when: always  # or when: on_success
  allow_failure: false
  before_script:
    - "# No before scripts."
  script:
    - echo "running $FOO"
  after_script:
    - "# No after scripts."

audit trail:
  image: ruby:2.7
  stage: post-compliance
  rules:
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
      when: never
    - when: always  # or when: on_success
  allow_failure: false
  before_script:
    - "# No before scripts."
  script:
    - echo "running $FOO"
  after_script:
    - "# No after scripts."

include:  # Execute individual project's configuration (if project contains .gitlab-ci.yml)
  project: '$CI_PROJECT_PATH'
  file: '$CI_CONFIG_PATH'
  ref: '$CI_COMMIT_REF_NAME' # Must be defined or MR pipelines always use the use default branch
源自项目派生的合并请求中的 CF 流水线

当一个 MR 起源于一个派生项目时,被合并的分支通常只存在于派生项目中。在针对具有 CF 流水线的项目创建此类 MR 时,上述代码段将失败,并显示 Project <project-name> reference <branch-name> does not exist! 错误消息。 这是因为在目标项目的上下文中,$CI_COMMIT_REF_NAME 被认为不存在的分支名称。

要获得正确的上下文,请使用 $CI_MERGE_REQUEST_SOURCE_PROJECT_PATH 而不是 $CI_PROJECT_PATH。此变量仅在合并请求流水线中可用。

例如,对于同时支持分支流水线以及源自项目分支的合并请求流水线的配置,您需要include 指令与 rules:if 结合起来

include:  # Execute individual project's configuration (if project contains .gitlab-ci.yml)
  - project: '$CI_MERGE_REQUEST_SOURCE_PROJECT_PATH'
    file: '$CI_CONFIG_PATH'
    ref: '$CI_COMMIT_REF_NAME'
    rules:
      - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
  - project: '$CI_PROJECT_PATH'
    file: '$CI_CONFIG_PATH'
    ref: '$CI_COMMIT_REF_NAME'
    rules:
      - if: $CI_PIPELINE_SOURCE != 'merge_request_event'

确保始终运行合规作业

合规流水线使用极狐GitLab CI/CD,为您提供了难以置信的灵活性,来定义您喜欢的任何类型的合规作业。根据您的目标,这些作业可以配置为:

  • 由用户修改。
  • 不可修改。

通常,如果合规作业中的值:

  • 已设置,它不能被项目级配置更改或覆盖。
  • 未设置,可以设置项目级配置。

根据您的用例,可能需要或不需要。

有一些最佳实践可确保这些作业始终完全按照您定义的方式运行,并且下游的项目级流水线配置无法更改它们:

  • rules:when:always添加到您的每个合规作业中,确保它们是不可修改的并且始终运行。
  • 明确设置作业引用的任何变量
    • 确保项目级流水线配置不会设置它们并改变它们的行为。
    • 包括任何推动作业逻辑的作业。
  • 显式设置容器镜像,在其中运行作业。这可确保您的脚本步骤在正确的环境中执行。
  • 显式设置任何相关的极狐GitLab 预定义的作业关键字。这可确保您的作业使用您想要的设置,并且它们不会被项目级流水线覆盖。

禁用电子邮件通知

您可以禁用与群组相关的所有电子邮件通知,其中包括其子组和项目。

要禁用电子邮件通知:

  1. 在顶部栏上,选择 主菜单 > 群组 > 查看所有群组 并找到您的群组。
  2. 在左侧边栏中,选择 设置 > 通用
  3. 展开 权限和群组功能 部分。
  4. 选择 电子邮件通知已禁用
  5. 选择 保存修改

禁用群组提及

您可以防止将用户添加到对话中,并在有人提及这些用户所属的群组时收到通知。

禁用提及的群组在自动完成下拉菜单中相应地可视化。

这对于拥有大量用户的群组特别有用。

要禁用群组提及:

  1. 在顶部栏上,选择 主菜单 > 群组 > 查看所有群组 并找到您的群组。
  2. 在左侧边栏中,选择 设置 > 通用
  3. 展开 权限和群组功能 部分。
  4. 选择 群组提及已禁用
  5. 选择 保存修改

将成员导出为 CSV

  • 引入于 14.2 版本。
  • 功能标志移除于 14.5 版本。

您可以将群组或子组中的成员列表导出为 CSV。

  1. 在顶部栏上,选择 主菜单 > 群组 并找到您的群组或子组。
  2. 在左侧边栏,选择 群组信息 > 成员子组信息 > 成员
  3. 选择 导出为 CSV
  4. 生成 CSV 文件后,它会作为附件通过电子邮件发送给请求它的用户。

群组文件模板

使用群组文件模板与群组中的每个项目共享一组常见文件类型的模板。它类似于实例模板仓库。所选项目应遵循该页面上记录的相同命名约定。

您只能选择群组中的项目作为模板源。包括与群组共享的项目,但排除正在配置的群组的子组或父组中的项目。

您可以为子组和直接父组配置此功能。子组中的项目可以访问该子组以及任何直接父组的模板。

要了解如何为议题和合并请求创建模板,请参阅描述模板

通过将群组设置为模板源,在群组级别定义项目模板。

启用群组文件模板

要启用群组文件模板:

  1. 在顶部栏上,选择 主菜单 > 群组 并找到您的群组。
  2. 在左侧边栏中,选择 设置 > 通用
  3. 展开 模板 部分。
  4. 选择一个项目作为模板库。
  5. 选择 保存更改

群组合并请求批准设置

  • 引入于 13.9 版本。部署在 group_merge_request_approval_settings_feature_flag 标记之后,默认禁用。
  • 默认启用于 14.5 版本
  • 功能标志 group_merge_request_approval_settings_feature_flag 移除于 14.9 版本。

群组批准设置在顶级群组级别管理项目合并请求批准设置。这些设置级联到属于该群组的所有项目。

查看群组的合并请求批准设置:

  1. 在顶部栏上,选择 主菜单 > 群组 并找到您的群组。
  2. 在左侧边栏中,选择 设置 > 通用
  3. 展开 合并请求批准 部分。
  4. 选择您想要的设置。
  5. 选择 保存修改

群组动态分析

对于群组,您可以查看在过去 90 天内创建的合并请求、议题和成员的数量。

可以使用 group_activity_analytics 功能标志启用群组动态分析。

Recent Group Activity

群组 wikis 的更改不会出现在群组活动分析中。

查看群组动态

您可以在浏览器或 RSS 提要中查看群组中最近执行的操作:

  1. 在顶部栏上,选择 主菜单 > 群组 > 查看所有群组 并找到您的群组。
  2. 在左侧边栏上,选择 群组信息 > 动态

要以 Atom 格式查看动态提要,请选择 RSS () 图标。

故障排除

命名空间和群组的验证错误

14.4 及更高版本在创建或更新命名空间或组时执行以下检查:

  • 命名空间不能有父级。
  • 父组必须是组而不是命名空间。

如果显示以下错误,您可以禁用验证:

  • A user namespace cannot have a parent
  • A group cannot have a user namespace as its parent

您在安装实例中看到这些错误时,可以尝试联系技术支持。

使用 SQL 查询查找群组

要根据 rails 控制台中的 SQL 查询查找和存储数组:

# Finds groups and subgroups that end with '%oup'
Group.find_by_sql("SELECT * FROM namespaces WHERE name LIKE '%oup'")
=> [#<Group id:3 @test-group>, #<Group id:4 @template-group/template-subgroup>]

使用 Rails 控制台将子组转移到另一个位置

如果无法通过 UI 或 API 转移群组,您可能需要尝试在 Rails 控制台会话

caution如果运行不正确,或在正确的条件下,任何直接更改数据的命令都可能造成破坏。我们强烈建议在测试环境中运行它们,并准备好恢复实例的备份,以防万一。
user = User.find_by_username('<username>')
group = Group.find_by_name("<group_name>")
## Set parent_group = nil to make the subgroup a top-level group
parent_group = Group.find_by(id: "<group_id>")
service = ::Groups::TransferService.new(group, user)
service.execute(parent_group)

使用 Rails 控制台查找待删除的群组

如果需要查找所有待删除的群组,可以在 Rails 控制台会话中使用以下命令:

Group.all.each do |g|
 if g.marked_for_deletion?
    puts "Group ID: #{g.id}"
    puts "Group name: #{g.name}"
    puts "Group path: #{g.full_path}"
 end
end

使用 Rails 控制台删除群组

有时,群组删除可能会卡住。如果需要,在 Rails 控制台会话中,您可以尝试使用以下命令删除群组:

caution如果运行不正确,或在正确的条件下,任何直接更改数据的命令都可能造成破坏。我们强烈建议在测试环境中运行它们,并准备好恢复实例的备份,以防万一。
GroupDestroyWorker.new.perform(group_id, user_id)