ワークスペース設定(PREMIUM ALL BETA)

フラグ: セルフマネージドGitLabでは、デフォルトでこの機能が利用可能です。この機能を隠すには、管理者がremote_development_feature_flagという機能フラグを無効にします。GitLab.comでは、この機能は利用可能です。この機能はまだ本番環境では使用できません。

caution
この機能はベータ版であり、予告なく変更される場合があります。フィードバックを残すには、フィードバックイシューをご覧ください。

ワークスペースを使用して、GitLabプロジェクトのための隔離された開発環境を作成・管理することができます。それぞれのワークスペースには、依存関係、ライブラリ、ツールのセットが含まれており、各プロジェクト固有のニーズに合わせてカスタマイズすることができます。

ワークスペースの設定

前提条件

  • 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. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
    2. プロジェクトのルート・ディレクトリに、.devfile.yaml という名前のファイルを作成します。設定例のいずれかを使用できます。
  • devfile で使用するコンテナ・イメージが任意のユーザー ID をサポートしていることを確認します。

ワークスペースを作成します。

ワークスペースを作成します:

  1. 左のサイドバーで、Search を選択するか、次のページに進んでください。
  2. 作品を選択します。
  3. ワークスペースを選択します。
  4. 新規ワークスペース] を選択します。
  5. Select project] ドロップダウン リストから、.devfile.yaml ファイル](#prerequisites)を持つプロジェクト[を選択します。ワークスペースを作成できるのは、公開プロジェクトのみです。
  6. Select cluster agentドロップダウン リストから、プロジェクトが属するグループが所有するクラスター エージェントを選択します。
  7. 自動終了までの時間] に、ワークスペースが自動的に終了するまでの時間数を入力します。このタイムアウトは、ワークスペースが過剰なリソースを消費したり、無期限に実行されたりしないようにするための安全対策です。
  8. ワークスペースを作成] を選択します。

ワークスペースが開始するまでに数分かかる場合があります。ワークスペースを開くには、[Preview] でワークスペースを選択します。ターミナルにもアクセスでき、必要な依存関係をインストールできます。

SSHでワークスペースに接続します。

前提条件:

  • ワークスペースで SSH を有効にする必要があります。
  • gitlab-workspaces-proxy を指す TCP ロードバランサーが必要です。

SSH クライアントでワークスペースに接続するには、次の手順に従います:

  1. 次のコマンドを実行します:

    ssh <workspace_name>@<ssh_proxy>
    
  2. パスワードには、個人アクセストークンを少なくともread_api のスコープで入力してください。

gitlab-workspaces-proxy TCP ロードバランサーを通して gitlab-workspaces-proxy接続すると、ユーザー名(ワークスペース名)を調べ、GitLab とやりとりして確認します:

  • 個人アクセストークン
  • ワークスペースへのユーザーアクセス

SSH 接続のためのgitlab-workspaces-proxy の設定

前提条件

  • クライアント認証用のSSHホストキーが必要です。

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 ホストキーで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}

このイシューは、エージェントインスタンスがリーダーシップリースを更新できない場合に発生し、その結果、remote_development モジュールを含むリーダー専用モジュールがシャットダウンされます。このイシューを解決するには、エージェントインスタンスを再起動します。