Workspace 구성

Tier: Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

Workspaces를 사용하여 GitLab 프로젝트의 격리된 개발 환경을 생성하고 관리할 수 있습니다. 각 Workspace에는 해당 프로젝트의 특정한 요구 사항을 충족하기 위해 사용자 정의할 수 있는 종속성, 라이브러리 및 도구 세트가 포함되어 있습니다.

Workspace 설정

사전 요구 사항

  • GitLab 에이전트가 지원하는 Kubernetes 클러스터를 설정합니다. 지원되는 Kubernetes 버전을 참조하세요.
  • Kubernetes 클러스터의 자동 확장을 활성화합니다.
  • Kubernetes 클러스터에서:
    • 각 Workspace에 동적으로 볼륨을 할당할 수 있도록 기본 저장소 클래스가 정의되어 있는지 확인합니다.
    • 선택한 Ingress 컨트롤러(예: ingress-nginx)를 설치하고 해당 컨트롤러를 도메인을 통해 접근 가능하게 만듭니다.
      • 개발 환경에서는 /etc/hosts 파일에 항목을 추가하거나 DNS 레코드를 업데이트합니다.
      • 프로덕션 환경에서는 *.<workspaces.example.dev><workspaces.example.dev>를 Ingress 컨트롤러에 의해 노출된 로드 밸런서로 지정합니다.
    • gitlab-workspaces-proxy 설치.
    • GitLab 에이전트를 설치하고 구성합니다.
  • 루트 그룹에서 적어도 Developer 역할이 있어야 합니다.
  • 이 기능을 사용하려면 해당 프로젝트마다 devfile을 만들어야 합니다:
    1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
    2. 프로젝트의 루트 디렉터리에 .devfile.yaml라는 파일을 만듭니다. 예제 구성 중 하나를 사용할 수 있습니다.
  • devfile에서 사용되는 컨테이너 이미지가 임의 사용자 ID를 지원하는지 확인합니다.

Workspace 생성

Workspace를 생성하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택합니다.
  2. 작업을 선택합니다.
  3. Workspaces를 선택합니다.
  4. 새로운 Workspace를 선택합니다.
  5. 프로젝트 드롭다운 목록에서 .devfile.yaml 파일이 있는 프로젝트를 선택합니다.
  6. 클러스터 에이전트 드롭다운 목록에서 프로젝트가 속한 그룹이 소유한 클러스터 에이전트를 선택합니다.
  7. Git 참조 드롭다운 목록에서 Workspace를 생성하는 데 GitLab이 사용하는 브랜치, 태그 또는 커밋 해시를 선택합니다.
  8. Devfile 위치에 Workspace를 구성하는 데 사용하는 devfile의 경로를 입력합니다. devfile이 프로젝트의 루트 디렉터리에 없는 경우 상대 경로를 지정합니다.
  9. Workspace가 자동으로 종료됨에, Workspace가 자동으로 종료되기까지의 시간(시간 단위)을 입력합니다. 이 시간 초과는 Workspace이 과도한 자원을 사용하거나 무기한 실행되는 것을 방지하는 안전 장치입니다.
  10. Workspace 만들기를 선택합니다.

Workspace를 시작하는 데 몇 분이 소요될 수 있습니다. Workspace를 열려면 미리 보기에서 Workspace을 선택합니다. 터미널에도 액세스할 수 있으며 필요한 종속성을 설치할 수 있습니다.

SSH로 Workspace에 연결

사전 요구 사항:

  • Workspace에서 SSH가 활성화되어 있어야 합니다.
  • gitlab-workspaces-proxy로 향하는 TCP 로드 밸런서가 있어야 합니다.

SSH 클라이언트로 Workspace에 연결하려면:

  1. 다음 명령을 실행합니다:

    ssh <workspace_name>@<ssh_proxy>
    
  2. 패스워드로 개인 액세스 토큰을 입력하고 적어도 read_api 스코프를 가지고 있어야 합니다.

TCP 로드 밸런서를 통해 gitlab-workspaces-proxy에 연결하는 경우, gitlab-workspaces-proxy는 사용자 이름(Workspace 이름)을 확인하고 다음을 검증하기 위해 GitLab과 상호 작용합니다:

  • 개인 액세스 토큰
  • Workspace에 대한 사용자 액세스

gitlab-workspaces-proxy를 SSH 연결을 위해 설정합니다

사전 준비 작업:

  • 클라이언트 확인을 위한 SSH 호스트 키가 있어야 합니다.

이제 gitlab-workspaces-proxy에서 SSH가 기본으로 활성화되어 있습니다. GitLab Helm 차트를 사용하여 gitlab-workspaces-proxy를 설정하려면 다음을 수행하세요:

  1. 다음 명령을 실행하세요:

    ssh-keygen -f ssh-host-key -N '' -t rsa
    export SSH_HOST_KEY=$(pwd)/ssh-host-key
    
  2. 생성된 SSH 호스트 키로 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

# `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

관련 주제

문제 해결

작업 공간을 생성할 때 리스 갱신 실패 오류

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 모듈을 포함한 리더 전용 모듈이 종료됩니다. 이 문제를 해결하려면 에이전트 인스턴스를 다시 시작하세요.