GitpodをGKEに構築する(v0.6.0)

最近何かと評判になってきているWebIDEサービスである[Gitpod](https://www.gitpod.io/)を、クラウドサービス版ではなく自前の環境に構築するための手順の記録です。
(Gitpodの概要、なぜself-hostで動かすのかは省略。)

<H3>注意: Gitpodは日々更新が行われており、手順が変更になっている可能性があります。ここで記載する手順は、2021/1/20現在、version0.6.0, 以下のコミット時点のソースコードを用いているものです。</H3>
https://github.com/gitpod-io/gitpod/tree/1ac8fbeef39da8c40447e1f6fdd6141662075bd8の


<h2>事前準備が必要なもの</h2>
 - terraform  
 今回は[terraform](https://www.terraform.io/)用に書かれたコードを使って構築を行うので、実行するローカルマシンにインストールをしてください。バージョンは、v0.14.2を使いました。
 - ホスティングするドメイン  
 ホスティングする上で、DNSへの登録だったりがあるため、使えるドメインがないとダメかもしれません。

<h2>使うソース</h2>
今回は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の手順があるからこれをやるだけじゃん
...と思いきや、それだけで済まないからこそ、今回の記事を書いています。

<h2>修正箇所</h2>
<H3>READMEに従えそうなところは従っていく</H3>
[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](https://github.com/gitpod-io/gitpod/tree/1ac8fbeef39da8c40447e1f6fdd6141662075bd8/install/gcp-terraform/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"
```

<H3>READMEにない対応</H3>
- パラメータの追加  
ここまでやった状態で、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
}
```

<H3>実際に動かす</H3>
上記手順を踏めば、

```
$ terraform plan
```
でのエラーは解消されているかと思います。そのまま

```
$ terraform apply
```
で実際に定義通りの環境構築を行いましょう。


<H3>エラーが起きる場合あり</H3>
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 valid

> Error: 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`になり、ページへもアクセスできるようになっているかと思われます。

<H2>まとめ</H2>
Gitpodはバージョンがまだ1.0.0にもなっていませんので、日々大きく変更が加えられています。ドキュメントやソースコードにはいくつかのインストール手順が書かれているものの、実はそれはもう動かないものだったりするなど、トラップが多いのが現状です。

トラップにハマりそうになった人が、少しでも早くこの記事にたどり着いて、そして実際にうまく構築ができることを願っています。


参考
 - [Gitpodが最強過ぎる件について | Qiita](https://qiita.com/mouse_484/items/394a4984f749cc201422)
 - [Gitpod をローカルのk8sにインストールしてみたらできなかった件 | Qiita](https://qiita.com/kiikura-biz/items/1a89a57012a2beb5a28b)
 - [gitpod | github](https://github.com/gitpod-io/gitpod)