😺

GitLabでアジャイル開発

2021/07/24に公開

はじめに

以前に k8s / Rancher で GitLab を構築しました。
https://qiita.com/t_ume/items/d62506286c047d01d48f

当時は 豊富な機能の中から Docker Registry の機能を検証しました。最近ではアジャイル開発でも使える機能もあると耳にして今回に至ります。
というわけで、今回は GitLab を構築してアジャイル開発で使う機能を少し触ってみようと思います。

GitLab 機能的な一覧は以下公式サイトの下段あたりに記載がありました。
https://www.gitlab.jp/

環境情報

Kubernetes:v1.20.6
helm:v3.5.4
GitLab EE:13.12.8
※EE パッケージをライセンスなしの機能制限で利用します
※PV に Cephを利用しています
https://qiita.com/t_ume/items/4ac37f746bf07146d5f9
※今回デプロイする GitLab リソース(CPU/Memory/Volume)の最低要件は以下の通り(設定次第で下げることも可)

  • CPU Request:2.6 Core
  • Memoroy Request:9 GB
  • Volume(PV):84 Gi

※cert-manager / nginx-ingress は GitLab の Chart に含まれている物を利用しました
⇒以前の記事で導入したものを利用してデプロイしようとしたのですが、パラメータが複雑で挫折しました・・・

GitLab deploy

GitLab 公式から git clone して資材をダウンロードし、values.yaml を書き換えていきます。

# 資材ダウンロード
$ git clone https://gitlab.com/gitlab-org/charts/gitlab.git -b v4.12.8 --depth 1
・・・
$ cd gitlab/

# 依存関係がある Chart をダウンロード
$ helm dep update
Getting updates for unmanaged Helm repositories...
...Successfully got an update from the "https://charts.jetstack.io/" chart repository
...Successfully got an update from the "https://grafana.github.io/helm-charts" chart repository
...Successfully got an update from the "https://prometheus-community.github.io/helm-charts" chart repository
...Successfully got an update from the "https://charts.gitlab.io/" chart repository
...Successfully got an update from the "https://charts.bitnami.com/bitnami" chart repository
...Successfully got an update from the "https://charts.bitnami.com/bitnami" chart repository
Saving 11 charts
Dependency gitlab did not declare a repository. Assuming it exists in the charts directory
Dependency certmanager-issuer did not declare a repository. Assuming it exists in the charts directory
Dependency minio did not declare a repository. Assuming it exists in the charts directory
Dependency registry did not declare a repository. Assuming it exists in the charts directory
Downloading cert-manager from repo https://charts.jetstack.io/
Downloading prometheus from repo https://prometheus-community.github.io/helm-charts
Downloading postgresql from repo https://charts.bitnami.com/bitnami
Downloading gitlab-runner from repo https://charts.gitlab.io/
Downloading grafana from repo https://grafana.github.io/helm-charts
Downloading redis from repo https://charts.bitnami.com/bitnami
Dependency nginx-ingress did not declare a repository. Assuming it exists in the charts directory
Deleting outdated charts

values.yaml を修正していきます。

  • global.hosts.domain:アクセス用のドメイン名。GitLab へのアクセスは gitlab.<domain> でアクセスすることになる
    • 今回はワイルドカードDNSサービスを使って、Node の IP でアクセスできるように指定
    • nip.io
  • global.ingress.configureCertmanager:事前に用意されている証明書を利用するため、ingress での cert-manager を利用しない
  • certmanager.install:cert-manager を利用しないのでインストールしない
  • nginx-ingress.controller.service.~:NodePort を利用したコンテナアクセスの設定
  • gitlab-runner.install:自己署名証明書だと gitlab-runner が利用できないのでインストールしない

参考
https://docs.gitlab.com/14.0/charts/charts/globals.html

https://docs.gitlab.com/charts/installation/tls.html#option-4-use-auto-generated-self-signed-wildcard-certificate

values.yaml
@@ -49,7 +49,7 @@ global:
     allowClusterRoles: true
   ## https://docs.gitlab.com/charts/charts/globals#configure-host-settings
   hosts:
-    domain: example.com
+    domain: 192.168.10.71.nip.io
     hostSuffix:
     https: true
     externalIP:
@@ -64,7 +64,7 @@ global:

   ## https://docs.gitlab.com/charts/charts/globals#configure-ingress-settings
   ingress:
-    configureCertmanager: true
+    configureCertmanager: false
     annotations: {}
     enabled: true
     tls: {}
@@ -693,7 +693,7 @@ certmanager:
   nameOverride: cert-manager
   # Install cert-manager chart. Set to false if you already have cert-manager
   # installed or if you are not using cert-manager.
-  install: true
+  install: false
   # Other cert-manager configurations from upstream
   # See https://github.com/jetstack/cert-manager/blob/master/deploy/charts/cert-manager/README#configuration
   rbac:
@@ -720,6 +720,10 @@ nginx-ingress:
       server-tokens: "false"
     service:
       externalTrafficPolicy: "Local"
+      type: NodePort
+      nodePorts:
+        http: 32080
+        https: 32443
     resources:
       requests:
         cpu: 100m
@@ -959,7 +963,7 @@ shared-secrets:
 ## Installation & configuration of gitlab/gitlab-runner
 ## See requirements.yaml for current version
 gitlab-runner:
-  install: true
+  install: false
   rbac:
     create: true
   runners:

準備ができたので、早速デプロイします。

# namespace 作成
$ kubectl create ns gitlab
namespace/gitlab created

# Deploy GitLab
$ helm install gitlab -n gitlab -f values.yaml .
NAME: gitlab
LAST DEPLOYED: Tue Jul 20 18:11:20 2021
NAMESPACE: gitlab
STATUS: deployed
REVISION: 1
NOTES:
・・・

# 5分~10分程待つ

$ kubectl get po -n gitlab
NAME                                                  READY   STATUS      RESTARTS   AGE
gitlab-gitaly-0                                       1/1     Running     0          5m58s
gitlab-gitlab-exporter-6589fc89bc-6lfcg               1/1     Running     0          5m58s
gitlab-gitlab-shell-6f786656b7-z5swh                  1/1     Running     0          5m58s
gitlab-gitlab-shell-6f786656b7-zh4ln                  1/1     Running     0          5m43s
gitlab-migrations-1-s2rr6                             0/1     Completed   0          5m58s
gitlab-minio-7754b8d9d9-6tnnt                         1/1     Running     0          5m58s
gitlab-minio-create-buckets-1-bljb4                   0/1     Completed   0          5m58s
gitlab-nginx-ingress-controller-675956bc64-nvmt9      1/1     Running     0          5m58s
gitlab-nginx-ingress-controller-675956bc64-sg5jh      1/1     Running     0          5m58s
gitlab-nginx-ingress-default-backend-d66cb657-qsvrg   1/1     Running     0          5m58s
gitlab-postgresql-0                                   2/2     Running     0          5m58s
gitlab-prometheus-server-5b47c879b4-dkbx9             2/2     Running     0          5m58s
gitlab-redis-master-0                                 2/2     Running     0          5m58s
gitlab-registry-7cbcf899b8-lt572                      1/1     Running     0          5m58s
gitlab-registry-7cbcf899b8-p54fs                      1/1     Running     0          5m58s
gitlab-sidekiq-all-in-1-v1-7f689dd89c-dgf8t           1/1     Running     0          5m58s
gitlab-task-runner-5b679bd9f8-dm66n                   1/1     Running     0          5m58s
gitlab-webservice-default-f99bd969d-gl8v4             2/2     Running     0          5m58s
gitlab-webservice-default-f99bd969d-l9w5p             2/2     Running     0          5m58s

$ kubectl get ing
NAME                        CLASS    HOSTS                           ADDRESS         PORTS     AGE
gitlab-minio                <none>   minio.192.168.10.71.nip.io      10.109.247.79   80, 443   13m
gitlab-registry             <none>   registry.192.168.10.71.nip.io   10.109.247.79   80, 443   13m
gitlab-webservice-default   <none>   gitlab.192.168.10.71.nip.io     10.109.247.79   80, 443   13m

$ kubectl get pvc
NAME                               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
data-gitlab-postgresql-0           Bound    pvc-e166e184-32b9-4316-9b86-c2f20947af32   8Gi        RWO            rook-ceph-block   12m
gitlab-minio                       Bound    pvc-6cb59e52-7634-4d1f-ab14-da85633f481b   10Gi       RWO            rook-ceph-block   12m
gitlab-prometheus-server           Bound    pvc-b3e77a93-2f4f-4617-b69c-1ccfb4b40474   8Gi        RWO            rook-ceph-block   12m
redis-data-gitlab-redis-master-0   Bound    pvc-2e317239-758c-441f-bb4f-d4d0c7a963e3   8Gi        RWO            rook-ceph-block   12m
repo-data-gitlab-gitaly-0          Bound    pvc-6fdf4507-c092-45c3-a5f4-ec1ec4d2e5fa   50Gi       RWO            rook-ceph-block   12m

GitLab アクセス

デプロイで来たので早速アクセスしてみます。
その前に root ユーザのパスワードを取得します。

参考
https://docs.gitlab.com/14.0/charts/installation/deployment.html#initial-login

$ kubectl get secret gitlab-gitlab-initial-root-password -ojsonpath='{.data.password}' -n gitlab | base64 --decode ; echo

Ingress の設定で確認できた URL と NodePort で指定したポート番号を指定してアクセスします。

https://gitlab.192.168.10.71.nip.io:32443/

自己署名なので SSL の警告は無視すると、ログイン画面が表示されます。先程確認したアカウントを使ってログインします。

ログイン画面

トップ画面

アジャイル開発機能

GitLab がデプロイされたので、早速機能をお試ししていきます。
アジャイル開発での機能的なお話はこちらの方の記事を参考にさせていただきました。簡潔でわかりやすかったです、感謝。

https://zenn.dev/kazuki_kuriyama/articles/6b3662cd1a63b9

また、詳細な機能の紹介は公式のこちらから。
https://docs.gitlab.com/ee/topics/plan_and_track.html

ここでは機能と有料機能についてテーブルにまとめました。機能制限は細かいところであるようです。

アジャイル GitLab License
ロードマップ Roadmap PREMIUM ~
エピック Epics PREMIUM ~
バックログ Issues FREE ※1
スプリント Milestones FREE
バーンダウン/アップチャート Milestones
(Burndown and burnup charts)
PREMIUM ~
ボード Issue Boards FREE ※1
ユーザーストーリー Issue FREE
ストーリーポイント Weights PREMIUM ~
タスク Task Lists FREE

※1:一部機能が PREMIUM

価格はこちらから。
https://www.gitlab.jp/pricing/

ひとまず色々とさわってみました。
※スクリーンショットは設定で日本語に設定しています。

まずはプロジェクトを一つ作成しました。
プロジェクト事態は、見慣れた git レポジトリの画面が表示されます。
ボタンがたくさんあって機能が豊富そう。

左メニューの「イシュー」をクリックすると、イシューの一覧(バックログ)が表示されます。

今度は左メニューから「ボード」をクリックすると、カンバンボードが表示されます。デフォルトでは「オープン」と「Closed」しかなかったので、ラベルで「Doing」を作成し、「Create list」でラベルを指定して列を増やしています。
各イシューはドラッグ&ドロップで移動ができます。また、ボードの追加やラベル・マイルストーンなどでの絞り込みもできます。

以下は各イシューの画面になります。
説明文・コメント内はMarkdownで記載が可能です。
また、細かいタスクの内容はチェックボックス形式で記載できます。記載したタスクはイシューの一覧でも「xx of xx tasks completed」という形で表示されます。
書き方の詳細は以下のリンクから。
https://docs.gitlab.com/ee/user/markdown.html#task-lists

イシュー作成時に担当者や期限などの設定ができますが、作成後もイシュー右側の設定メニューからできます。
Assignee(担当者)やラベル、マイルストーン(スプリント)、期限の設定などができます。
FREE ライセンスでは Weight(ストーリーポイント)の設定ができません、、、残念。
また、イシュー間のリンクもできますが、FREE では 「relates to(関連している)」でのリンクしかできません。各イシュー間のブロック状態などは、PREMIUM 以降で利用出来るようです。

最後にマイルストーン(スプリント)です。
最初、どうしたら「進行中のイシュー」にイシューが移動するのかと思ったのですが、「オープンかつ割り当て済み」とちゃんと記載されていました・・・イシューの「Asignee」の欄を割り当てると移動しました。
本来であれば期限管理だけでなく、タイムトラッキング(時間計測)やリリース情報、マージリクエストなども利用してスプリントの管理に役立てるのではと思います。

まとめ

GitLab を知った当初は git のリモートリポジトリのイメージでしたが、今ではコンテナイメージの格納から、タスク実行、開発のサポートまでできるとは・・・。色々と出来る反面、機能が多すぎてごちゃっとしているのと各コンポーネントの設定やトラブルシューティングが大変そうには見えました。
アジャイル開発の選択肢になればと思います。

補足(Ceph でのトラブルシューティング)

GitLab ではないんですが、一部詰まった箇所を。
values.yaml で StorageClass を設定していなかったので、いつまでも PV が払い出されませんでした(デフォルトだと空だったみたいで・・・)。
Ceph の StorageClass を default に設定すると回避できました。

# StorageClass の annotations に文言追加
$ kubectl get sc rook-ceph-block -o yaml
・・・
metadata:
  annotations:
     storageclass.kubernetes.io/is-default-class: "true"
・・・

# NAME に (default) が付与され、デフォルトに設定される
$ kubectl get sc
NAME                        PROVISIONER                  RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
rook-ceph-block (default)   rook-ceph.rbd.csi.ceph.com   Delete          Immediate           true                   29d

Discussion