最近何かと評判になってきているWebIDEサービスであるGitpodを、クラウドサービス版ではなく自前の環境に構築するための手順の記録です。
(Gitpodの概要、なぜself-hostで動かすのかは省略。)
注意: Gitpodは日々更新が行われており、手順が変更になっている可能性があります。ここで記載する手順は、2021/1/20現在、version0.6.0, 以下のコミット時点のソースコードを用いているものです。
https://github.com/gitpod-io/gitpod/tree/1ac8fbeef39da8c40447e1f6fdd6141662075bd8の事前準備が必要なもの
- terraform 今回は[terraform](https://www.terraform.io/)用に書かれたコードを使って構築を行うので、実行するローカルマシンにインストールをしてください。バージョンは、v0.14.2を使いました。 - ホスティングするドメイン ホスティングする上で、DNSへの登録だったりがあるため、使えるドメインがないとダメかもしれません。使うソース
今回はGCP上に、GKEクラスタの作成から何からまとめて一気に行います。 [ソースコード](https://github.com/gitpod-io/gitpod/tree/1ac8fbeef39da8c40447e1f6fdd6141662075bd8)をcloneしてきた上で、今回使うのは [install > gcp-terraform](https://github.com/gitpod-io/gitpod/tree/1ac8fbeef39da8c40447e1f6fdd6141662075bd8/install/gcp-terraform)です。名前からしても明らかだし、READMEにもInstallationの手順があるからこれをやるだけじゃん
...と思いきや、それだけで済まないからこそ、今回の記事を書いています。
修正箇所
READMEに従えそうなところは従っていく
[README](https://github.com/gitpod-io/gitpod/blob/1ac8fbeef39da8c40447e1f6fdd6141662075bd8/install/gcp-terraform/environment/full/README.md)- ドメインをDNSに登録 (Registering a domain)
Gitpodでは、いわゆるメインページだけでなく、実際にソースコードをWebIDEで開く際にも一意なURL, hogehoge.ws.PARENT_DOMAINが発行されます。このあたりをワイルドカードでDNSに登録されるように、親となるPARENT_DOMAINをDNSに登録する必要があります。
ドキュメントには以下のような記載がありますが、私の場合親ドメインは別の用途で既にGCPコンソール上で作っていたので、このコードそれ自体は実行していません。
コンソールの[ネットワークサービス] > [Cloud DNS]で、持っているドメインのゾーンを作成するだけでOKです。
resource "google_dns_record_set" "delegation" {
name = module.dns.zone.dns_name
type = "NS"
ttl = 300
managed_zone = "<PARENT_DOMAIN>"
rrdatas = module.dns.zone.name_servers
project = "<PARENT_PROJECT_ID>"
depends_on = [
module.dns.done
]
}
-
Terraformの設定保存(Terraform backend)
省略 (構築それ自体を行う上では不要です) -
デフォルトパラメータの設定(SetUp)
install > gcp-terrafomr-environment > fullのディレクトリに、project.auto.tfvars
ファイルを作成し、以下の値をそれぞれ自身の環境にあったものに更新します
project = "PROJECT_ID"
region = "europe-west3"
dns_name = "your-domain.com"
container_registry = {
location = "EU"
}
certificate_email = "certificates@your-domain.com"
READMEにない対応
- パラメータの追加 ここまでやった状態で、terraformの初期化およびplanを実行してみましょう。$ terraform init
$ terraform plan
現時点だとコンソールでまず
var.zone_name
Enter a value:
というのが出てきますので、ここは **ドメインをDNSに登録 (Registering a domain)**の手順で登録したゾーンの名前を指定します。
その後おそらく
Error: Invalid value for module argument
エラーが出るかと思います。main.tfでgitpodのバージョンが指定されていないということですので、今回インストールするバージョンの記載を追加します
gitpod = {
chart = "../../../../chart"
image_prefix = "gcr.io/gitpod-io/self-hosted/"
version = "0.6.0" // 追加
}
- バグ(?)の修正
改めて
$ terraform plan
を実行するも、おそらく
Error: "account_id" ("db") doesn't match regexp "^[a-z](?:[-a-z0-9]{4,28}[a-z0-9])$"
が発生します。modules > database > main.tfのgitpod_database
サービスアカウントを定義する際のサービスアカウント名が問題なようです。 実際にここで参照している値自体はおかしくないように見えるのですが(modules > database > variables.tfの"name")、とりあえず直接値を記述して凌ぎます。
resource "google_service_account" "gitpod_database" {
account_id = "gitpod-database" // var.nameから変更
display_name = var.name
description = "Gitpod Database Account ${var.name}"
project = var.project
}
実際に動かす
上記手順を踏めば、$ terraform plan
でのエラーは解消されているかと思います。そのまま
$ terraform apply
で実際に定義通りの環境構築を行いましょう。
エラーが起きる場合あり
terraform実行時に以下のようなエラーに直面しました。 > Error: letsencrypt-issuer failed to create kubernetes rest client for update of resource: resource [cert-manager.io/v1/ClusterIssuer] isn't valid for cluster, check the APIVersion and Kind fields are validError: default/gitpod-certificate failed to create kubernetes rest client for update of resource: resource [cert-manager.io/v1alpha2/Certificate] isn't valid for cluster, check the APIVersion and Kind fields are valid
この場合、再度terraform applyを実行すると、terraform実行結果自体は Apply complete! となるかと思います。その時点ではTLSの問題か、いくつかのpodはContainerCreating
になっており、gitpodのダッシュボードページ (https://gitpod.PARENT_DOMAIN) にアクセスしてもページが開けませんが、5分程度するとpodが全てRunnning
になり、ページへもアクセスできるようになっているかと思われます。
まとめ
Gitpodはバージョンがまだ1.0.0にもなっていませんので、日々大きく変更が加えられています。ドキュメントやソースコードにはいくつかのインストール手順が書かれているものの、実はそれはもう動かないものだったりするなど、トラップが多いのが現状です。トラップにハマりそうになった人が、少しでも早くこの記事にたどり着いて、そして実際にうまく構築ができることを願っています。
参考