工作区配置 (Beta)

  • 在极狐GitLab 15.11 中引入,功能标志名为 remote_development_feature_flag。默认禁用。
  • 在极狐GitLab 16.0 中在 JihuLab.com 和私有化部署版本中启用。
  • 在极狐GitLab 16.7 中正式可用。功能标志 remote_development_feature_flag 已移除。

您可以使用工作区为您的 GitLab 项目创建和管理隔离的开发环境。每个工作区都包含其自己的一组依赖项、库和工具,您可以根据每个项目的特定需求进行自定义。

设置工作区

创建工作区之前,您只需设置一次基础设施。要设置工作区的基础设施:

  1. 设置一个 GitLab 代理支持的 Kubernetes 集群。 请参阅支持的 Kubernetes 版本
  2. 确保 Kubernetes 集群的自动扩展功能已启用。
  3. 在 Kubernetes 集群中:
    1. 验证是否定义了默认存储类,以便可以为每个工作区动态配置卷。
    2. 安装您选择的 Ingress 控制器(例如 ingress-nginx)。
    3. 安装配置 GitLab 代理。
    4. dns_zone*.<dns_zone> 指向 Ingress 控制器暴露的负载均衡器。此负载均衡器必须支持 WebSockets。
    5. 设置 GitLab 工作区代理
  4. 可选。 为工作区配置 sudo 访问权限
  5. 可选。 配置对私有容器注册表的支持

创建工作区

  • 对私有项目的支持在极狐GitLab 16.4 中引入。
  • Git 引用Devfile 位置 在极狐GitLab 16.10 中引入。
  • 自动终止前的时间 在极狐GitLab 16.10 中重命名为 工作区在以下时间后自动终止
  • 变量 在极狐GitLab 17.1 中引入。

前提条件:

  • 您必须设置工作区基础设施
  • 您必须至少具有工作区和代理项目的开发者角色。
  • 在您要创建工作区的每个项目中,创建一个 devfile
    1. 在左侧边栏中,选择搜索或转到并找到您的项目。
    2. 在项目的根目录中,创建一个名为 devfile 的文件。您可以使用示例配置之一。
  • 确保 devfile 中使用的容器镜像支持任意用户 ID

要创建工作区:

  1. 在左侧边栏中,选择搜索或转到并找到您的项目。
  2. 选择编辑 > 新建工作区
  3. 集群代理下拉列表中,选择由项目所属组拥有的集群代理。
  4. Git 引用下拉列表中,选择 GitLab 用于创建工作区的分支、标签或提交哈希。
  5. Devfile 位置中,输入用于配置工作区的 devfile 路径。如果您的 devfile 不在项目的根目录中,请指定相对路径。
  6. 工作区在以下时间后自动终止中,输入工作区自动终止前的小时数。此超时是一项安全措施,以防止工作区消耗过多资源或无限期运行。
  7. 变量中,输入要注入工作区的环境变量的键和值。要添加新变量,请选择添加变量
  8. 选择创建工作区

工作区可能需要几分钟才能启动。要打开工作区,请在预览下选择工作区。您还可以访问终端并安装任何必要的依赖项。

配置对私有容器注册表的支持

  • 在极狐GitLab 17.6 中引入。

要使用来自私有容器注册表的镜像:

  1. 在 Kubernetes 中创建一个镜像拉取密钥
  2. 将此密钥的 namenamespace 添加到 GitLab 代理配置中。

为工作区配置 sudo 访问权限

  • 在极狐GitLab 17.4 中引入。

前提条件:

  • 确保 devfile 中使用的容器镜像支持任意用户 ID。工作区的 sudo 访问权限并不意味着 devfile 中使用的容器镜像可以以用户 ID 0 运行。

开发环境通常需要 sudo 权限来在运行时安装、配置和使用依赖项。您可以通过以下方式为工作区配置安全的 sudo 访问权限:

使用 Sysbox

Sysbox 是一种容器运行时,可增强容器隔离性, 并使容器能够运行与虚拟机相同的工作负载。

要使用 Sysbox 为工作区配置 sudo 访问权限:

  1. 在 Kubernetes 集群中,安装 Sysbox
  2. 在极狐GitLab 工作区代理中:

使用 Kata Containers

Kata Containers 是一种轻量级虚拟机的标准实现,其性能类似于容器,但提供虚拟机的工作负载隔离和安全性。

要使用 Kata Containers 为工作区配置 sudo 访问权限:

  1. 在 Kubernetes 集群中,安装 Kata Containers
  2. 在极狐GitLab 工作区代理中:

使用用户命名空间

用户命名空间隔离了容器内运行的用户与主机上的用户。

要使用用户命名空间为工作区配置 sudo 访问权限:

  1. 在 Kubernetes 集群中,配置用户命名空间
  2. 在极狐GitLab 工作区代理中,将 use_kubernetes_user_namespacesallow_privilege_escalation 设置为 true

使用SSH连接到工作区

  • 在极狐GitLab 16.3中引入。

必要条件:

要使用SSH客户端连接到工作区,请执行以下操作:

  1. 获取gitlab-proxy-ssh服务的外部IP地址:

    kubectl -n gitlab-workspaces get service gitlab-workspaces-proxy-ssh
    
  2. 获取工作区的名称

    1. 在左侧边栏中,选择“搜索”或转到
    2. 选择你的工作
    3. 选择工作区
    4. 复制要连接到的工作区的名称。
  3. 运行此命令:

   ssh <workspace_name>@<ssh_proxy_IP_address>
  1. 对于密码,请输入至少具有read_API范围的个人访问令牌。

当您通过TCP负载均衡器连接到gitlab-proxy-proxy时, gitlab-configuration-proxy检查用户名(工作区名称)并与GitLab交互以验证:

  • 个人访问令牌
  • 用户访问工作区

更新您的运行时镜像

要更新 SSH 连接的运行时镜像:

  1. 在运行时镜像中安装 sshd
  2. 创建名为 gitlab-workspaces 的用户以允许无密码访问您的容器。
FROM golang:1.20.5-bullseye

# 安装 `openssh-server` 和其他依赖项
RUN apt update \
    && apt upgrade -y \
    && apt install  openssh-server sudo curl git wget software-properties-common apt-transport-https --yes \
    && rm -rf /var/lib/apt/lists/*

# 允许空密码
RUN sed -i 's/nullok_secure/nullok/' /etc/pam.d/common-auth
RUN echo "PermitEmptyPasswords yes" >> /etc/ssh/sshd_config

# 生成工作区主机密钥
RUN ssh-keygen -A
RUN chmod 775 /etc/ssh/ssh_host_rsa_key && \
    chmod 775 /etc/ssh/ssh_host_ecdsa_key && \
    chmod 775 /etc/ssh/ssh_host_ed25519_key

# 创建 `gitlab-workspaces` 用户
RUN useradd -l -u 5001 -G sudo -md /home/gitlab-workspaces -s /bin/bash gitlab-workspaces
RUN passwd -d gitlab-workspaces
ENV HOME=/home/gitlab-workspaces
WORKDIR $HOME
RUN mkdir -p /home/gitlab-workspaces && chgrp -R 0 /home && chmod -R g=u /etc/passwd /etc/group /home

# 允许登录访问 `/etc/shadow`
RUN chmod 775 /etc/shadow

USER gitlab-workspaces

相关主题

故障排除

在使用MySQL时,您可能会遇到以下问题。

错误:续订租约失败

由于Kubernetes的GitLab代理中的已知问题,您可能无法创建工作区。以下错误消息可能会出现在代理的日志中:

{"level":"info","time":"2023-01-01T00:00:00.000Z","msg":"failed to renew lease gitlab-agent-remote-dev-dev/agent-123XX-lock: timed out waiting for the condition\n","agent_id":XXXX}

当代理实例无法续订其领导层租约时会出现此问题,这将导致仅领导层模块(包括remote_development模块)关闭。要解决此问题,请重新启动代理实例。

错误:No agents available to create workspaces

在项目中创建工作区时,可能会出现以下错误:

No agents available to create workspaces. Please consult Workspaces documentation for troubleshooting.

要解决此问题,请执行以下操作:

  • 如果您没有至少工作区和代理项目的开发人员角色,请与管理员联系。
  • 如果项目的祖先组没有允许的代理, 允许任何这些群体的代理人。
  • 如果GitLab代理禁用了remote_development模块,请将enabled设置为true