ワークスペース設定(PREMIUM ALL BETA)
- GitLab 15.11 で
remote_development_feature_flag
というフラグで導入されました。デフォルトでは無効です。- GitLab.comで有効、GitLab 16.0で自己管理。
フラグ: セルフマネージドGitLabでは、デフォルトでこの機能が利用可能です。この機能を隠すには、管理者がremote_development_feature_flag
という機能フラグを無効にします。GitLab.comでは、この機能は利用可能です。この機能はまだ本番環境では使用できません。
ワークスペースを使用して、GitLabプロジェクトのための隔離された開発環境を作成・管理することができます。それぞれのワークスペースには、依存関係、ライブラリ、ツールのセットが含まれており、各プロジェクト固有のニーズに合わせてカスタマイズすることができます。
ワークスペースの設定
前提条件
- Kubernetes用GitLabエージェントがサポートするKubernetesクラスターをセットアップしてください。サポートされているKubernetesのバージョンを参照してください。
- Kubernetesクラスターのオートスケールが有効になっていることを確認します。
- Kubernetesクラスターで、ワークスペースごとにボリュームを動的にプロビジョニングできるように、デフォルトのストレージクラスが定義されていることを確認します。
- Kubernetesクラスターで、任意のIngressコントローラー(例えば、
ingress-nginx
)をインストールし、そのコントローラーをドメイン経由でアクセスできるようにします。例えば、*.workspaces.example.dev
とworkspaces.example.dev
を、Ingress コントローラーが公開するロードバランサーに向けます。 - Kubernetesクラスタで、
gitlab-workspaces-proxy
をインストールします。 - Kubernetesクラスターで、Kubernetes用のGitLabエージェントをインストールします。
-
このスニペットでGitLabエージェントのリモート開発設定を行い、必要に応じて
dns_zone
:remote_development: enabled: true dns_zone: "workspaces.example.dev"
リモート開発が適切に設定されていれば、プロジェクトのルートグループで定義されているどのエージェントでも使うことができます。
- 少なくとも、ルートグループの開発者ロールを持っている必要があります。
- この機能を使いたい公開プロジェクトごとに、devfileを作成してください:
- 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
- プロジェクトのルート・ディレクトリに、
.devfile.yaml
という名前のファイルを作成します。設定例のいずれかを使用できます。
- devfile で使用するコンテナ・イメージが任意のユーザー ID をサポートしていることを確認します。
ワークスペースを作成します。
ワークスペースを作成します:
- 左のサイドバーで、Search を選択するか、次のページに進んでください。
- 作品を選択します。
- ワークスペースを選択します。
- 新規ワークスペース] を選択します。
-
Select project] ドロップダウン リストから、
.devfile.yaml
ファイル](#prerequisites)を持つプロジェクト[を選択します。ワークスペースを作成できるのは、公開プロジェクトのみです。 - Select cluster agentドロップダウン リストから、プロジェクトが属するグループが所有するクラスター エージェントを選択します。
- 自動終了までの時間] に、ワークスペースが自動的に終了するまでの時間数を入力します。このタイムアウトは、ワークスペースが過剰なリソースを消費したり、無期限に実行されたりしないようにするための安全対策です。
- ワークスペースを作成] を選択します。
ワークスペースが開始するまでに数分かかる場合があります。ワークスペースを開くには、[Preview] でワークスペースを選択します。ターミナルにもアクセスでき、必要な依存関係をインストールできます。
SSHでワークスペースに接続します。
前提条件:
- ワークスペースで SSH を有効にする必要があります。
-
gitlab-workspaces-proxy
を指す TCP ロードバランサーが必要です。
SSH クライアントでワークスペースに接続するには、次の手順に従います:
-
次のコマンドを実行します:
ssh <workspace_name>@<ssh_proxy>
-
パスワードには、個人アクセストークンを少なくとも
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
:
-
次のコマンドを実行します:
ssh-keygen -f ssh-host-key -N '' -t rsa export SSH_HOST_KEY=$(pwd)/ssh-host-key
-
生成された 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接続用のランタイムイメージを更新するには、以下の手順に従います:
- ランタイムイメージに
sshd
をインストールしてください。 -
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
モジュールを含むリーダー専用モジュールがシャットダウンされます。このイシューを解決するには、エージェントインスタンスを再起動します。