あのチュートリアルやってみたい...。じゃあ、GitLab & Gitpodでブラウザだけで開発してみよう！

## はじめに

この記事は、[GitLab](https://gitlab.com) & [Gitpod](https://gitpod.io/workspaces/)の組み合わせで、**ブラウザのみで、アプリケーションの開発環境を用意してやってみた**記録になります。

### 利用する題材

こちらの記事を題材に、**空っぽのリポジトリから**少しずつコミットを重ねて、最終的に同じ内容まで完成させています。

- [Vue.js チュートリアル for Rails エンジニア(Vue3 version)](https://qiita.com/t0yohei/items/cd11b15642fbb26f71e2)


### こんな方にぜひどうぞ

- GitLabやGitHubにアカウントをお持ちの方
- いろいろなハンズオンを開催したいけれど、もっと「**気軽に環境構築できたらいいのにな....**」と思っている方[^1]
- お手元のPCにはあまり色々インストールできないため、なかなか一歩が踏み出せない方
- 既存のRailsアプリケーションの一部をVue.jsで置き換えてみたい方

題材にさせていただいた記事は、Rails6の基本に加え、既存のRailsアプリケーションにどうやったらVue.jsを組み込めるか、といったガイドにもなる、とても良いチュートリアル、ハンズオン向けの記事です。
ぜひこのGitLab & Gitpodにこだわらず、お手元で試せる方は、トライしていただけたらと思います！

※パブリックリポジトリを前提としています。また、フリープラン枠では、月50時間の利用制限がありますので、ご注意ください。[^3]

### 結果だけ知りたい方向け

途中経過はいいので、最終的にどうやっていったのかを知りたい方は、[こちら](https://gitlab.com/akiko_pusu/rails-vue3-app/-/issues/1)をご覧ください。

- 空っぽのリポジトリを作成する
- チュートリアルを完走するという[issue](https://gitlab.com/akiko_pusu/rails-vue3-app/-/issues/1)を作成する
- やることを書き出す
- Gitpod上で開発しながらコミットを重ねていく
    - あわせてメモやキャプチャを貼る

この一連の記録は、実際にわたしのGitLab上のissueとして、以下に書き出しています。

- [「Vue.js チュートリアル for Rails エンジニア」のチュートリアルに沿って進めてみる](https://gitlab.com/akiko_pusu/rails-vue3-app/-/issues/1)

こんな感じで1つずつ進めています。
![gitlab-commit-graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/52c95f8b-87af-c683-cc34-0911b333317e.png)

### この記事で扱う範囲

いちばんの敷居は、環境作りです。
環境さえ立ち上がれば、あとはお好きなチュートリアルの記事、上記のわたしの記録、もしくはご自身のプロジェクトとして、好きな内容で開発を進めていただけると思います。

このため、この記事では、**「リポジトリを作ってからGitpodの環境を用意する」までをスコープ**にします。

また、Railsアプリケーションに関しては、ブラウザで動作確認をする際に注意点や設定が必要なので、その点について触れておきます。


## まずはGitpodについて

Gitpodは、クラウドとPC(デスクトップ) 双方で稼働が可能なIDE / 統合開発環境です。

「このリポジトリ試したいな」「issueにのっとってコードを修正したいな」と思った時に、ちょっと待つだけで、**ブラウザを通して、ワークスペースを立ち上げる**ことができます。

ソースコードを修正し、かつ実行もできるように、ターミナルも揃った形で、ブラウザさえあれば自分だけの環境として利用することができます。
よろしければ、下記の記事も合わせてご覧ください！

- [プルリクエストの作成にGitpodを使ってみました！](https://zenn.dev/akiko_pusu/articles/try-gitpod-for-pullrequest)[^2]

## GitLabに空のリポジトリを作ろう

さて、Gitpodの環境を立ち上げるには、「**リポジトリが存在すること**」が前提になります。
このため、まずはGitLab上に空でいいのでプロジェクト、リポジトリを作成してください。

以下、全て**ブラウザのみ**で操作していきます。

※Gitpodのプランとの兼ね合いで、「public」リポジトリを前提としています。[^3]

### リポジトリの作成

細かくは説明しませんが、GitLabにサインアップ / ログインし、どんな名前でも良いので、空のリポジトリを作ります。

設定はpublicとしてください。

![create-gitlab-repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/2386d2e2-b5c7-74a0-e1cc-8d02257941e9.png)

### リポジトリの初期化 / READMEを作ろう

ここから先も、ブラウザのみで進めます。
実は、GitLabもGitHubも、ソースコードはブラウザ上でも編集できます。

リポジトリを作成した段階では、まだ初期化もされていないので、ブラウザから簡単でいいのでREADMEを作成しましょう。

``Add README`` というボタンを押すと、Web上で編集できる画面に切り替わります。

![create-readme-on-browser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/155f2851-0b7f-edc7-2aaf-6c033bf5c9fb.png)

編集画面には、簡単なメッセージでいいので、なにかを追記してコミットしてみてください。

![commit-readme.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/9488b0ee-f1ed-5f8d-cf64-0fd4dcf03703.png)

そうすると、初期化が走り、masterブランチも作成されます。

### Gitpodのボタンが出たらクリックしてみよう！

masterブランチを改めて表示すると、右上の方に ``Gitpod`` というプルダウンメニューが表示されます。
こちらを、このまま``Gitpod``を選んだ状態でクリックします。

![display-gitpod-button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/77d45236-9bf3-49be-554e-4911934653de.png)

そうすると、Gitpodの画面に切り替わります。
初回はアカウント作成を求められます。（GitLabやGitHub連携できます）

アカウントが作成されると、そのあとは黒い画面に切り替わります。
しばらく下記のような画面が表示されます。

この間に、クラウド上に、先ほど作成したリポジトリに紐づいたワークスペースが作成されます。

![pull-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/92da29a7-abfa-dac1-3cde-0388d0e0e0bd.png)

## Gitpodで作業してみよう！

しばらく待つと.....。
VisualStudio Code風のエディタの画面が表示されます。[^4]
リポジトリの内容、READMEをそのままcloneしてこのワークスペース上に展開し、エディタで開いた形になります。

![gitpod-screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/9d32c946-061f-84b7-17e5-b47d832aaf3c.png)

下の方にはターミナルの画面が表示されます。
ここで、書いたプログラムを実行することができます。

![language-version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/9e28ce86-e677-5ea5-5a92-bf1a91c750dc.png)

## Webアプリケーションも起動できます！

コマンドラインのプログラムだけでなく、Webアプリケーションも起動できます。
ここでは、まずphpコマンドを使って、簡単にWebサーバを立ち上げて、Webアプリケーションに見立ててみます。

``php -S ホスト:ポート`` でビルトインサーバを起動してみます。

```bash
gitpod /workspace/vue-rails-sample-repo $ php -S localhost:3000
[Tue Dec 15 13:18:13 2020] PHP 7.4.3 Development Server (http://localhost:3000) started

....
```

httpのサービスが起動していることを検知すると、Gitpodがダイアログを出してくれます。プレビューは、ブラウザ内ブラウザとして表示。Open Browserはお手元のブラウザ上に、新しいウィンドウで表示してくれます。

![run-builtin-php-webserver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/008eb702-4c5a-ee87-c07b-ba9636beb6c8.png)

この時、よくみるとブラウザでアクセスしているURLは、``https``になっています。

![https-request-via-gitpod.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/88e186b1-7a64-a370-68d8-5786585c6e97.png)

アプリケーション自体は、ワークスペース内でlocalhostとして起動しているのですが、Gitpod側がサービスを検出して、自動で動的な名前（URL)を通して、https化してアクセスできるようにしてくれています。

同様に、Node.jsやRailsのアプリケーションも、このワークスペース内で起動すれば、Gitpodのプロキシを通してアクセスできますので、本当にブラウザのみで開発ができる、というわけです。

## Railsの場合の注意点

[このチュートリアル](https://qiita.com/t0yohei/items/cd11b15642fbb26f71e2)は、Railsアプリケーションで、そのままの手順で作成すると、Rails6になります。

Rails6や、その他のアプリケーションでも、起動した際と別の名前（URL) でアクセスするケースでは、プロキシしたURLからのアクセスを許可する設定を加えないと、接続がブロックされる場合があります。[^5]

Rails6の場合は、以下のようなエラー画面になります。

![blocked-request.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/c1e188f8-4899-20cd-9249-2f5922a394a4.png)

こちらに対しては、``config/environments/development.rb`` に以下のような設定を追加すると、リクエストが許可されるようになります。

```ruby
# gitpod.ioドメインを許可
# 完全なURLは動的に変わるので、ワイルドカードで指定します
config.hosts << ".gitpod.io"
```

もしうまくいかなかった時は、試してみてくださいね。

## まとめ

以上、**「リポジトリを作ってからGitpodの環境を用意する」まで**を目標に、GitLab & Gitpodの組み合わせを紹介してみました。

すこしでも、一歩を踏み出すきっかけになればいいな、と思います。

併せて、[GitLab Advent Calendar 2020](https://qiita.com/advent-calendar/2020/gitlab) にも参加とさせていただきました。
非常に便利な開発環境やリソースを提供してくださる皆様に、感謝をこめまして。

Stay safe, stay healthy!

[^1]: 小さな勉強会、ハンズオンを開催したいけれど、参加者の環境構築や機材の用意を考えると難しい。そんな課題をお持ちの方にも、きっと役に立つのではと思います。
[^2]: こちらはGitHub & Gitpodの組み合わせの例で、既存のOSSのリポジトリをフォークしてプルリクエストを作成する手順になります。
[^3]: https://www.gitpod.io/pricing/ 参照。30分間利用がないとサスペンドしてくれるので、ハンズオンや学習目的であれば最初の一歩には十分かと思います。OSS向けや学生向けプランもあります。
[^4]: VisualStudio Codeではなく、Theirというエディタになります。
[^5]: Host Authorizationと言います。