Workspace 구성

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

GitLab 프로젝트용 격리된 개발 환경을 생성하고 관리하기 위해 작업공간을 사용할 수 있습니다. 각 작업공간에는 해당 프로젝트의 특정 요구 사항을 충족하기 위해 사용자 정의할 수 있는 의존성, 라이브러리 및 도구가 포함됩니다.

작업공간 설정

필수 컴포넌트

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

작업공간 생성

작업공간을 생성하려면:

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

작업공간을 시작하는 데 몇 분 정도 걸릴 수 있습니다. 미리보기 아래에서 작업공간을 선택하여 열 수 있습니다. 또한 터미널에 액세스하여 필요한 의존성을 설치할 수 있습니다.

SSH로 작업공간에 연결

필수 컴포넌트:

  • 작업공간에 SSH가 활성화되어 있어야 합니다.
  • gitlab-workspaces-proxy를 가리키는 TCP 로드 밸런서가 있어야 합니다.

SSH 클라이언트로 작업공간에 연결하려면:

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

    ssh <workspace_name>@<ssh_proxy>
    
  2. 패스워드로 개인 액세스 토큰을 입력하세요. 최소한 read_api 범위를 갖춘 토큰이어야 합니다.

TCP 로드 밸런서를 통해 gitlab-workspaces-proxy에 연결하는 경우 gitlab-workspaces-proxy는 작업공간 이름과 관련하여 다음을 확인하기 위해 GitLab과 상호 작용합니다:

  • 개인 액세스 토큰
  • 작업공간에 대한 사용자 액세스

SSH 연결을 위한 gitlab-workspaces-proxy 설정

필수 컴포넌트:

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

이제 SSH가 기본적으로 활성화되어 있습니다 gitlab-workspaces-proxy. 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 모듈을 포함한 리더 전용 모듈이 종료됩니다. 이 문제를 해결하려면 에이전트 인스턴스를 다시 시작하세요.