GitLab Pagesことはじめ

GitLab Pagesを使ってGatsbyのデモサイトをデプロイしてみようと思います。
なお、このポストはすでにGitHubは利用している前提で書いてあります。


## なぜGitLab? - 帯域利用無制限だから
私は普段GitHubを用いて開発を行っています。
個人で開発したWebアプリをデプロイする場合、大抵はNetlifyかVercelにデプロイしています。

NetlifyとVercelはいずれもフリープランで利用していますが、問題なく運用できています。どちらのサービスもDeveloperフレンドリーだし、大きな不満は特にありません。
というか、無料でここまでやれるというのは正直素晴らしすぎると思っています

では、なぜGitLabをわざわざ選ぶのかというと、GitLab PagesにはNetlifyやVercelの無料プランにはあるbandwidthの制限がないからです。

下記のForumにもあるように、GitLab Pagesにはフリープランでさえ、BandWidthの制限がありません(帯域利用無制限)
[GitLab Forum - What are the restrictions for GitLab Pages sites?](https://forum.gitlab.com/t/what-are-the-restrictions-for-gitlab-pages-sites/15067/6)

一応GitLabの中の人のコメントを翻訳して載せておくと、このようなコメントをしています。

> ページサイトの最大帯域幅は設定していません。何らかの理由で問題が発生した場合は、その旨をお知らせします。

Netlifyでは有料アカウントでも帯域利用無制限状態にはなりません。
(それでも上限は高いですが)
また、Vercelの場合、有料アカウントになると無制限になるのかは、Pricingからは読み取れませんでした。
[Netlify - Pricing](https://www.netlify.com/pricing/)
[Vercel - Pricing](https://vercel.com/pricing)

いずれにせよ、GitLabの帯域利用無制限というのはかなりありがたい内容かと思います。
(帯域利用に制限がかかる事態というのは、それなりに大規模にならなければ遭遇しないこともかもしれませんが、たくさんのユーザを抱えるアプリやWebサイトを作っていきたいと考えている、私含む個人開発者の皆さんにとっては、これはとても大きいことかと思います。おまけに毎月の固定支出もないわけですから)


ちなみにGitLabのアカウントによってできることできないことの一覧はこちら。気になる方は参考までに。
[GitLab.com | 機能比較](https://www.gitlab.jp/pricing/gitlab-com/feature-comparison/)

## GitLabのビルド時間の無料枠
GitLabでのビルド時間の無料枠は**400分**となっています。
以前は2000分あったという記述も他のブログでは見たりしましたが、短縮されたのかもしれません。

Netlifyだと無料枠は **300分**、Vercelは特に明記されていないようでした。
(特にそういう項目自体がない？？)

## GitLabでアカウントを作成する
アカウント作成はおそらく様々な箇所からできると思いますが、私の場合は下記のPricingページからFreeの項目を選択してスタートしました。

[GitLab Pricing](https://about.gitlab.com/pricing/)

アカウント作成時点でGitHubとは異なる箇所があったので、いくつかメモがてら残しておきます。

### GitLab SaaSを利用する
GitLabではアカウント作成時点で、SaaSを利用するか、GitLabを自身で管理しているインフラにインストールするかを選択できます。

今回はSaaSを利用します。

![スクリーンショット 2020-12-03 15.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205976/044404be-75c6-0e70-383d-501f15765993.png)

Roleを尋ねられましたが、主に個人開発用途で使うので `Software Developer` と `Just me` を選択。

![スクリーンショット 2020-12-03 15.16.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205976/a78be068-1d82-089f-146c-b70066ad8230.png)

この後グループを作成する画面になりますが、今回の目的(GitLab Pagesを試す)からは関係のない項目であると思いますし、その場でよく分からなかったので適当にやりました。

QiitaにGitLabのグループに関する記事があったので、こちらを変わりに貼らせていただきます。
[【GitLab】グループを作成する（リポジトリをグループで管理する）](https://qiita.com/CUTBOSS/items/c1678432ce8208a2fba4)

これで、ひとまずアカウント作成は完了しました。


## GitLab Pagesでデモサイトをデプロイしてみる。

ちなみに簡単なデモサイトをデプロイしてみた備忘録をこちらに書こうと思いましたが、GitLab公式、かつ日本語でGitLab PagesのGetting Started的な記事があったので、以降はこちらの記事を参照してみるのが良いかと思います。

[GitLab Pagesで静的ウェブサイトを公開する方法](https://www.gitlab.jp/blog/2020/06/29/how-to-use-gitlab-pages/)

と、ここで書くのをやめようかと思っていましたが、
せっかくなので、上に書かれている手順を参考にデモサイトのデプロイまでを行ってみます。

デプロイする際に利用できるテンプレートが用意されているのは、ちょっと試してみたいときに便利ですね。
(下のキャプチャ参照)

![スクリーンショット 2020-12-03 15.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205976/0986171b-73a2-ef3c-38f4-28486f483c63.png)

しかもテンプレートの種類も豊富。Previewを押すことでテンプレートの内容も確認することができます。
(下のキャプチャ参照)

![スクリーンショット 2020-12-03 15.56.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205976/c64f6b6a-0336-fa49-cd5b-10c8b8498f18.png)

今回は `Pages/Gatsby` を選択してみました。
これでプロジェクトが作成されます。作成したプロジェクトは`git clone`コマンドでローカルに引っ張ってくることも勿論可能です。

### 余談: GatsbyテンプレートのNode.jsのversion

ちなみに余談ですが、作成したプロジェクトには後述するパイプラインの設定を記述した`.gitlab-ci.yml`というファイルがあります。ここにはジョブ実行時に使用するDocker imageなどが記述されていますが、Gatsbyのtemplateではここに記載されたNode.jsのversionが6.10.0でした。
(2020.12.3時点)

GatsbyはスターターによってはNode.jsのversionが新しすぎると動かなかったりしますが、6.10.0というのはなかなかオールドですね。
ローカルで一度デフォルトで試して見る際は、nvmなどを使ってversionを合わせることお忘れなく。
(Node.jsのv12で動かそうとしたらエラーになったので、今回は試しということもあり、素直に同じバージョンをnvm経由でインストールして動かしてみることにしました。)

下記が実際に作成される `.gitlab-ci.yml`。

```yml
image: node:6.10.0

pages:
  script:
  - npm install
  - npm install gatsby-cli
  - node_modules/.bin/gatsby build --prefix-paths
  artifacts:
    paths:
    - public
  cache:
    paths:
      - node_modules
  only:
  - master
```

* `image` - ジョブ実行時に利用されるDocker Image
* `pages` - ジョブの名前。GitLab Pagesで公開する場合は、ジョブの名前が`pages`でないといけない。
* `script` - ジョブで実行するスクリプトを指定。今回の場合、gatsbyでのデプロイに必要なbuildコマンドなどが記述されている。
* `artifacts.paths` - ジョブの成果物を指定。GitLab Pagesで公開する場合は、ここの名称が `public`でないとならない。
* `cache` - キャッシュしたいファイル、またはパスなど。
* `only` - ジョブを実行するブランチを指定している。この場合、masterブランチにプッシュされた場合のみ、ジョブが実行される。


なお、`.gitlab-ci.yml`の内容については、上に貼った公式ポストを参照している他、下記の公式リファレンスも参考にしています。

[GitLab CI/CD pipeline configuration reference](https://docs.gitlab.com/ee/ci/yaml/README.html)

### GitLab Pagesへのデプロイ

さて、GitLab Pagesにデプロイを行うには、GitLabでのCI/CDの別名であるパイプラインという機能を動かす必要がありますが、プロジェクトを作成しただけでは動かないため、手動で実行を行う必要があります。

パイプラインを手動で動かす場合は、プロジェクトの右メニューから`CI/CD` ⇛ `Pipelines`を選択し、
![スクリーンショット 2020-12-03 16.42.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205976/f18753be-a4e7-d269-920b-6db0263400fd.png)

遷移先の画面から`Run Pipeline`という緑色のボタンを押します。
なお、自身のブラウザのセッティングが英語であるため、人によって文言は異なります。
また、GitLabの今後の更新内容によってはUIなどは変わってくると思われます。
`Run Pipeline`を押すと、実行対象のブランチなどを選択する画面が表示されます。
このタイミングでデプロイ時の変数なども設定できるようです。
`Run Pipeline`を押すとデプロイが行われます。

### デプロイしようと思ったら、Failedになった。。。
これでデプロイも完了かと思いきや、エラーになりました。

```shell
> gatsby-cli@2.15.0 postinstall /builds/<username>/<repo name>/node_modules/gatsby-cli
> node scripts/postinstall.js
/builds/<username>/<repo name>/node_modules/gatsby-cli/node_modules/chalk/source/index.js:106
	...styles,
	^^^
SyntaxError: Unexpected token ...
    at Object.exports.runInThisContext (vm.js:76:16)
    at Module._compile (module.js:542:28)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/builds/<username>/<repo name>/node_modules/gatsby-cli/scripts/postinstall.js:1:77)
    at Module._compile (module.js:570:32)
```

どうやら初めから記述されている `.gitlab-ci.yml` の内容ではエラーになるようで、
実際に`.yml`ファイルに書かれている記述でビルドを試みるとローカルでも同様のエラーがでました。

`yarn`を使ったやり方の場合、エラーは出なかったので、下記のように`.gitlab-ci.yml`を書き換えました。
(本当はnodeのversionをもう少し新しくするなど修正箇所はあるかもしれませんが、今回は動作確認のみの用途なので、このような対応としています)


```diff
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6e3bb40..0cf6ec1 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,8 +2,8 @@ image: node:6.10.0

 pages:
   script:
-  - npm install -g yarn
-  - yarn install
+  - npm install yarn
+  - node_modules/.bin/yarn install
   - node_modules/.bin/gatsby build --prefix-paths
   artifacts:
     paths:
```

Pipelineのjobが無事に終わると、GitLabの設定メニュー内にある`Pages`からデプロイされたページのリンクを確認できるので、そちらにアクセスすればページ内容が確認できます。

## 最後に
GitLab Pages、かなり使えそうな感触があるので、機会を見つけて使っていこうと思います。

また、独自ドメインの設定なども書ければと思っていますが、それはまた実際に設定する機会が来たときにでも追記していこうと考えています。