これは GitLab Advent Calendar 2019 - Qiita の18日目です。
大事なことなので最初に
僕がGitLab特集で書いた「自前でGitLabを管理するために知っておかなければならないこと」が掲載されているSoftware Design 2020年1月号の発売日なのでみんな買ってくれよな!!!
紙面の都合で当初のアウトラインや原稿から削った箇所があるのでアドベントカレンダーとして供養しようと思います。*1
付録A:GitLab.comを使いつつ自前のGitLab Runnerを使う
これはコラムで載ってはいるのですが、紙面の都合でだいぶ削ったので完全版を書きます。
以下、原稿での完全版
GitLabの面白い特徴として、GitLab Runnerを自由に登録できるというのがあります。
GitLab全体に登録するShared Runner以外にもグループ単位とプロジェクト単位で登録できるSpecific Runnerがあるため、 後者のSpecific RunnerであればSaaSであるGitLab.comであっても自前のGitLab Runnerを利用してCIを行うことができます。
SaaSであるGitLab.comだと全体で共有のShared Runnerが用意されているため通常は自分でRunnerを用意する必要はないのですが、下記のような理由でGitLab.comでもRunnerを自分で用意するメリットがあります。
1つ目の理由はShared Runnerの順番待ち回避のためです。前述の通りShared RunnerはGitLab.com全体で共有のため時間帯によっては待たされることもあります。 そのため自分でRunnerを用意することでこの順番待ちを回避できます。この自前のRunnerはShared Runnerとの併用もできます。
2つ目の理由はデプロイ用途です。CIは社外の環境で実行してもいいけど、デプロイだけはイントラネット内からの方が都合がいいことも多いでしょう。 外部からイントラネットにアクセスするための踏み台サーバを用意してもいいのですが、イントラネット内にデプロイ専用のRunnerを用意した方がセキュアで踏み台サーバ自体のメンテナンスコストも不要になるというメリットがあります。
下図のようにRunnerで指定したタグをジョブにも付与することで、指定したRunnerでのみそのジョブを実行することができます。
Runnerにdeployタグを設定する例
.gitlab-ci.yml
でdeployタグを設定する例
deploy: script: - ./deploy.sh tags: - deploy
3つ目の理由はCIでの非Docker環境の利用のためです。GitLab.comのShared Runnerは全てDockerコンテナ内での実行が前提です。 通常のCIであればこれで問題ないのですが、WindowsやMacなどのマシンのハードウェアの機能をCIで利用したいということもあるでしょう。 iOSアプリのビルドをXCodeがインストールされたMac上で行いたいというのが最たる例でしょう。 このような場合はMacのマシンにGitLab RunnerをインストールすることでGitLab CIで実現可能になります。
以上はGitLab.comで自前のGitLab Runnerを用意する理由になりますが、これらは自前のGitLabにおいても用途によってRunnerを使い分ける指針になると思います。
付録B:公式Dockerイメージを使う
こちらはアウトラインには書いたものの、原稿を書く前段階で分量が多くて紙面に入らない可能性が高かったため削った内容です。
公式ではOmnibus GitLabを推奨していますが、Dockerに慣れていて自分でKubernetesやDocker Swarmでクラスタが組める場合には個人的には公式のDockerイメージを使うのもありだと思います。
ただしGitLabを動かしているホストマシンのgitユーザのみのsshをDockerコンテナに通す方法があまり資料がないのですが、下記を参考に設定してみてください。
- https://github.com/sameersbn/docker-gitlab/blob/12.5.2/docs/exposing-ssh-port.md
- https://github.com/sameersbn/docker-gitlab/blob/12.5.2/contrib/expose-gitlab-ssh-port.sh
オンプレミスでいく場合KubernetesかDocker Swarmが候補として挙げられます。
GitLab公式でHelm Chartが公開されているのでKubernetes派の人はこれを使うといいでしょう。
https://docs.gitlab.com/charts/
ただしLimitationsにもあるように制限事項がいくつかあって、一番大きいと思われるのはGitLab Pagesが使えないことです。
クラウドであればEKSやGKSなどのマネージドサービスが候補として挙げられます。
しかし注意点が1つあります。
EKSを使う場合同じAWSのマネージドということでデータベースでRDSを使いたくなるかもしれませんが、RDSだとデッドロックが発生する事象があるためそこだけ注意してください。*2
3rd partyのDockerイメージですが https://github.com/sameersbn/docker-gitlab というのもあります。
こちらは実際にピクシブ社内で使っていてその運用事例を下記にまとめているので興味がある人はどうぞ。
*1:付録公開にあたって編集者の方からはOKを貰っています
*2: https://gitlab.com/gitlab-org/gitlab/issues/30528#note_215845940