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 작업 영역 프록시를 설정합니다. 작업 영역 프록시 설치합니다.
    • GitLab 에이전트를 설치하고 구성합니다.
  • 루트 그룹에서 적어도 Developer 역할이 있어야 합니다.
  • 이 기능을 사용하려면 해당 프로젝트마다 devfile을 생성하세요.
    1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
    2. 프로젝트의 루트 디렉터리에 .devfile.yaml라는 파일을 생성합니다. 예시 구성 중 하나를 사용할 수 있습니다.
  • devfile에서 사용된 컨테이너 이미지가 임의의 사용자 ID를 지원하는지 확인하세요.

작업 영역 생성

작업 영역을 생성하려면:

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

작업 영역을 시작하는 데 몇 분 정도 걸릴 수 있습니다. 작업 영역을 열려면 미리보기에서 작업 영역을 선택합니다. 터미널에 액세스해서 필요한 의존성을 설치할 수도 있습니다.

SSH로 작업 영역에 연결

전제 조건:

  • 작업 영역에 대해 SSH가 활성화되어 있어야 합니다.
  • GitLab 작업 영역 프록시로 들어가는 TCP 로드 밸런서가 있어야 합니다.

SSH 클라이언트를 사용하여 작업 영역에 연결하려면:

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

    ssh <workspace_name>@<ssh_proxy>
    
  2. 비밀번호란에는 read_api 스코프를 갖는 개인 액세스 토큰을 입력하세요.

TCP 로드 밸런서를 통해 gitlab-workspaces-proxy에 연결할 때, gitlab-workspaces-proxy는 사용자 이름(작업 영역 이름)을 검사하고 다음을 확인합니다:

  • 개인 액세스 토큰
  • 작업 영역에 대한 사용자의 액세스 권한

SSH 연결을 위한 GitLab 작업 영역 프록시 설정

전제 조건:

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

이제 SSH가 GitLab Helm 차트를 사용하여 기본적으로 활성화되었습니다.

  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":"리스 gitlab-agent-remote-dev-dev/agent-123XX-lock 갱신 실패: 조건을 기다리는 동안 시간 초과됨\n","agent_id":XXXX}

이 문제는 에이전트 인스턴스가 리더십 리스를 갱신하지 못하여 remote_development 모듈을 포함한 리더 전용 모듈이 종료되는 경우 발생합니다. 이 문제를 해결하려면 에이전트 인스턴스를 다시 시작하십시오.