工作区配置 (Beta)

在私有化部署的极狐GitLab 上,默认情况下此功能可用。 要隐藏该功能,管理员可以禁用名为 remote_development_feature_flag功能标志。 在 JihuLab.com 上,可以使用此功能。 该功能尚未准备好用于生产使用。
caution此功能处于 Beta 阶段。如有变更,恕不另行通知。

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

设置工作区

对私有项目的支持引入于极狐GitLab 16.4。

先决条件

  • 设置适用于 Kubernetes 的极狐GitLab 代理支持的 Kubernetes 集群。 请参阅支持的 Kubernetes 版本
  • 确保启用 Kubernetes 集群的弹性伸缩。
  • 在 Kubernetes 集群中,验证是否定义了默认存储类,以便可以为每个工作区动态配置卷。
  • 在 Kubernetes 集群中,安装您选择的 Ingress 控制器(例如 ingress-nginx),并使该控制器可以通过域访问。例如,将 *.workspaces.example.devworkspaces.example.dev 指向 Ingress 控制器公开的负载均衡器。
  • 在 Kubernetes 集群中,安装 gitlab-workspaces-proxy
  • 在 Kubernetes 集群中,安装 Kubernetes 的极狐GitLab 代理
  • 使用此代码片段为极狐GitLab 代理配置远程开发设置,并根据需要更新 dns_zone

    remote_development:
      enabled: true
      dns_zone: "workspaces.example.dev"
    

您可以使用项目根群组下定义的任何代理,前提是为该代理正确配置了远程开发。 - 您必须至少在根群组中具有开发人员角色。 - 在您想要使用此功能的每个公共项目中,创建一个 devfile: 1. 在左侧边栏中,选择 搜索或转到 并找到您的项目。 1. 在项目的根目录中,创建一个名为 .devfile.yaml 的文件。 您可以使用示例配置之一。 - 确保 devfile 中使用的容器镜像支持任意用户 ID

创建工作区

创建工作区:

  1. 在左侧边栏中,选择 搜索或转到
  2. 选择 您的工作
  3. 选择 工作区
  4. 选择 新建工作区
  5. 选择项目 下拉列表中,选择带有 .devfile.yaml 文件的项目。您只能为公共项目创建工作区。
  6. 选择集群代理 下拉列表中,选择项目所属群组拥有的集群代理。
  7. 自动终止前的时间 中,输入工作区自动终止之前的小时数。 此超时是一种安全措施,可防止工作区消耗过多资源或无限期运行。
  8. 选择 创建工作区

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

使用 SSH 连接到工作区

引入于极狐GitLab 16.3。

先决条件:

要使用 SSH 客户端连接到工作区:

  1. 运行命令:

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

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

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

设置 gitlab-workspaces-proxy 进行 SSH 连接

先决条件:

  • 您必须拥有用于客户端验证的 SSH 主机 secret。

现在,gitlab-workspaces-proxy 中默认启用 SSH。 要使用极狐GitLab Helm chart 设置 gitlab-workspaces-proxy

  1. 运行命令:

    ssh-keygen -f ssh-host-key -N '' -t rsa
    export SSH_HOST_KEY=$(pwd)/ssh-host-key
    
  2. 使用生成的 SSH 主机 secret 安装 gitlab-workspaces-proxy

    helm upgrade --install gitlab-workspaces-proxy \
          gitlab-workspaces-proxy/gitlab-workspaces-proxy \
          --version 0.1.8 \
          --namespace=gitlab-workspaces \
          --create-namespace \
          --set="auth.client_id=${CLIENT_ID}" \
          --set="auth.client_secret=${CLIENT_SECRET}" \
          --set="auth.host=${GITLAB_URL}" \
          --set="auth.redirect_uri=${REDIRECT_URI}" \
          --set="auth.signing_key=${SIGNING_KEY}" \
          --set="ingress.host.workspaceDomain=${GITLAB_WORKSPACES_PROXY_DOMAIN}" \
          --set="ingress.host.wildcardDomain=${GITLAB_WORKSPACES_WILDCARD_DOMAIN}" \
          --set="ingress.tls.workspaceDomainCert=$(cat ${WORKSPACES_DOMAIN_CERT})" \
          --set="ingress.tls.workspaceDomainKey=$(cat ${WORKSPACES_DOMAIN_KEY})" \
          --set="ingress.tls.wildcardDomainCert=$(cat ${WILDCARD_DOMAIN_CERT})" \
          --set="ingress.tls.wildcardDomainKey=$(cat ${WILDCARD_DOMAIN_KEY})" \
          --set="ssh.host_key=$(cat ${SSH_HOST_KEY})" \
          --set="ingress.className=nginx"
    

更新您的运行时镜像

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

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

# Install `openssh-server` and other dependencies
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/*

# Permit empty passwords
RUN sed -i 's/nullok_secure/nullok/' /etc/pam.d/common-auth
RUN echo "PermitEmptyPasswords yes" >> /etc/ssh/sshd_config

# Generate a workspace host key
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

# Create a `gitlab-workspaces` user
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

# Allow sign-in access to `/etc/shadow`
RUN chmod 775 /etc/shadow

USER gitlab-workspaces

在 Kubernetes 的极狐GitLab 代理中禁用远程开发

您可以阻止 Kubernetes 的极狐GitLab 代理的 remote_development 模块与极狐GitLab 进行通信。 要在极狐GitLab 代理配置中禁用远程开发,请设置此参数:

remote_development:
  enabled: false

如果您已经有正在运行的工作区,管理员必须在 Kubernetes 中手动删除这些工作区。

相关主题

故障排查

创建工作区时出现 Failed to renew lease

由于 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}

当代理实例无法续订其 leadership lease 时会出现此问题,从而导致仅 leader 模块(包括 remote_development 模块)关闭。 要解决此问题,请重新启动代理实例。