GitLabでプロジェクト管理をはじめよう

ソフトウェアを開発するために、ソースコードを適切に管理することは必要不可欠です。

GithubやBitbucket、そしてGitLabをはじめとするソースコードを適切に管理するためのサービスプロダクトが開発されています。

当ブログで紹介するアプリケーション開発に利用するバージョン管理サービスとして、GitLab(ギットラボ)を採用しました。

https://datascientist-toolbox.com/wp-content/uploads/2019/09/man.png
りーぐる

今回は、GitLabの概要と採用理由、利用をはじめるまでの方法について簡単に紹介します。

GitLabとは

GitLabの基本は、分散型バージョン管理システムGitのホスティングサービスです。まずは、バージョン管理システムについて簡単におさらいしましょう。

また、GitLabはDevOpsを実践を設計思想として開発されているという背景があり、バージョン管理以外にも様々な機能があります。それらの機能について紹介します。

最後にGitLabには、GitLab CE、GitLab EE、 GitLab.com、GitHost.ioという4種類のサービスプロダクトがあることをご説明します。

バージョン管理システムとは

バージョン管理システムとは、ファイルに対して行った変更の履歴を追跡管理するためのシステムです。

ソフトウェアが大きくなればなるほど、開発者が増えれば増えるほどソフトウェアに対する変更の履歴を管理するコストは増大します。

ソースコードファイル名に_rev1や、_20190929などのサフィックスを付けて変更を管理するのは、バージョン管理システムが整備されていない環境で誰もが通るお手軽でお馴染みのやり方でしょう。

この管理方法では、ソフトウェアのライフサイクルが長く、ファイルの編集者が複数いる状態ではすぐに問題を起こします。具体的には以下の問題があります。

伝統的な管理方法の問題点

  • 共同作業者との変更内容の競合(コンフリクト)を効率的に検出する仕組みがない。
  • 誰がどのような変更を行ったのかファイル名から想像がつかない。
  • すぐにファイル数が膨大になり、人間の管理できる範囲を超えてしまう。その結果、こまめにバージョン更新を行わなくなる。

様々なファイルを更新していると、自分が昔どのような変更を行ったかはすぐに忘れてしまうものです。チーム開発はもちろんのこと、個人での開発にもバージョン管理は非常に役立ちます

これらの問題に対して、リモートにリポジトリを作成し、開発メンバー全員が1つのリポジトリを参照して作業を行うことで、作業の競合を避けたり、任意のバージョンにすぐにロールバックできるような仕組みが開発されました。

リポジトリとは
リポジトリとは、ファイルを保存するストレージ領域のこと。バージョン管理のリポジトリは単一のディレクトリで実装されるのが基本である。

Subversionは上記の手法をとっており、現在でも多くのプロジェクトで採用されています。このようなバージョン管理システムはしばしば、集中型バージョン管理システムと呼ばれています。

しかし、集中型バージョン管理システムにもまだ問題は残されています。

集中型バージョン管理システムの問題点

  • 同じ時間に同じファイルを複数人で編集することが出来ないので、開発スピードが遅くなる可能性がある
  • 共同のリポジトリのソフトウェアは動作する必要があり、そのため細心の注意を払って変更を反映する必要がある。その結果こまめに変更を記録できない
  • 完全なソフトウェアはリモートのみに存在する。これはメリットでもあるが、同時に適切にバックアップをとる必要があるということである。

そこで登場したのが、分散型バージョン管理システムです。代表的にはGitのことを指します。

Gitでもリモートリポジトリを用意して、リモートリポジトリを中心に開発を行うのは一般的ですが、もはやリポジトリは1つである必要はありません。各作業者はローカルにリポジトリをコピーしてローカルに作業を行うことができます

これにより開発者はローカル環境で素早く変更をコミットすることができます。

ただしこの場合、他の開発者との変更の競合(コンフリクト)が発生するリスクが高まります。Gitは変更の競合を検出し、ユーザーに知らせます。この際、ユーザーは競合を解消する必要があります。

リモートリポジトリをメインリポジトリとする一般的な運用では、ローカルリポジトリをリモートリポジトリに可能な限り近い状態を保つことで、コンフリクトの可能性を減らす必要があります。

Gitと切り離すことのできないものが、Github、Bitbucket、そしてGitLabをはじめとするGitのホスティングサービスです。

これらのホスティングサービスは、Gitを用いて効率的なバージョン管理を行うための様々な機能を提供しています。

GitLabでは、バージョン管理以外にもプロジェクト管理に役立つ様々な機能を提供しています。続いてそれらの機能について確認しましょう。

GitLabの様々な機能

GitLabは、DevOpsの実践に役立つ様々なツールを提供しています。

DevOpsとは
DevOpsとは、ビジネスやプロジェクトを成功させるために、組織文化とツールの両面を改善することで、ビジネスアジリティ(敏捷性)を向上させ、リスクを低減する活動

平たく言うとソフトウェアのバージョン管理だけでなく、プロジェクト全体で役立つ機能を含んでいます。

それらの詳細については、後の記事で書くこととして、ここでは機能の概要のみを紹介します。

マージリクエスト機能

Githubのプルリクエストに相当する機能として、GitLabではマージリクエスト機能を提供します。

マージリクエスト機能は、リモートリポジトリのブランチにプッシュした変更内容のレビューを依頼し、必要に応じて修正・反映を行うための機能です。

チャットツール GitLab MatterMost

GitLab MatterMostは、オンプレミスで動作可能なオープンソースのチャットツールです。

使用感はSlackと似ています。セキュリティ上の問題などで、オンプレミスで展開する必要がある場合に導入できるのが強みの1つです。

GitLabと連携することで、GitLab上のマージリクエスト、テスト・ビルドの失敗、Issueの更新などのイベントを通知することが可能になります。

チケット管理システム Issue Tracker

チケット管理システムというとRedmine、JIRA、Backlogなどが有名ですが、GitLabではIssue Trackerという機能がデフォルトで備わっています。

Issue Trackerではプロジェクトのマイルストーンの作成、課題チケットの作成、Issue Boardを通して課題チケットのステータスや優先順位を管理できます。

継続的インテグレーション(CI)のための機能

継続的インテグレーションは、日々継続的にビルドやテストを実施し品質を維持するためのプラクティスです。

継続的インテグレーションツールとしては、Jenkins、Circle CI、Travis CIなどが有名ですが、GitLabではGitLab CI/CDのジョブ機能により、インテグレーションの自動化が可能になります。

継続的デプロイメント(CD)のための機能

ビルドやテストと同様にアプリケーションのデプロイを自動化することも、サービスを安定してリリースするために重要です。

GitLabでは、GitLab CI/CDのPipelineによりジョブをステージごとにグループ化してデプロイメントパイプラインを実現します。

4つのGitLab

これまでGitLabと一言で説明してきましたが、GitLabには4種類のサービスがあります。

GitLab CE

オープンソースの無償プロダクトであり、ユーザーがサーバーにインストールすることで利用します。オンプレミスで構築することが出来るので、セキュリティ要件をクリアできることが主な強みです。

導入の際はOmnibusパッケージを使うことで、比較的簡単にインストールすることができ公式からも利用が推奨されています。

GitLab EE

GitLab CEに大規模プロジェクト向けに機能が追加され、GitLab Inc.のサポートを受けられる有償プロダクトです。

EEの中でも複数のエディションが存在し、Gitlabページから確認できます。

GitLab.com

SaaSで提供されるオンライン上のサービスで、無償と有償のプランが存在します。

インストール不要のため、すぐにでも利用しはじめることが可能で、サーバーを用意する必要がないため無料で利用できます。

ただし無料プランでは1ユーザーあたり2000分の制限があることには注意が必要です。

GitHost.io

専有型のプライベートのGitLabを利用できるホスティング型の有償プロダクトです。

自社専用のGitLabがほしいが、オンプレミスでの環境構築はできないといったユースケースに対応しています。

とりあえず使いたいならGitLab.com、セキュリティが気になったり、環境構築してがっつり使いたいならGitLab CEからはじめると良いでしょう

なぜGitLabを使うのか?

開発ツールの選定を行う上では、さまざまな基準があると思います。

ここではGitLabのメリット・デメリットについて簡単にまとめ、当ブログでGitLabを採用した理由についておはなしします。

GitLabのメリット

GitLabのメリットの1つは、GitLab単体でソフトウェア開発のライフサイクルで必要なツールが揃っていることにあります。GitLab公式ページに他サービスとの比較が掲載されています。

また社内で利用するにあたってはセキュリティ上の要件も存在するので、GitLab CE等のオンプレミスでインストール可能なサービスが存在していることも強みです。

SaaS版のGitLab.comでは、プライベートリポジトリの個数制限がないことがメリットとして挙げられます。

GitLabのデメリット

GitLabのデメリットの1つとしては、学習コストが挙げられます。GitLabは数多くの機能を含みますが、日本語のリソースがまだ少ないものもあります。組織やプロジェクトの必要に即した機能を選ぶことが重要です。

GitLabの採用理由

DS HackでGitLabを採用したのは主に1番目のメリットによるところが大きいです。

DS Hackでは主に少人数でのWebアプリケーション開発ナレッジシェアを目的としてGitLabを活用しようと考えています。

GitLabではプロジェクト毎にwikiやIssue Tracker、GitLab CI/CD、フィードバックの計測など、素早いデプロイプロジェクトメンバーの学びに必要な機能が数多く揃っており、それらの導入や学習に必要なコストが一元化されている点が良い点です。

開発ツールの選定では、「どのツールを使用するか」よりも「目的に合わせてツールを正しく使用できるか」が重要になってきます

クイックスタートGitLab

今回は手短にGitLabをはじめたいので、SaaS版であるGitLab.comを利用することにします。

GitLabのSign in画面からサインイン

Google、Twitter、Github等のアカウントを使ってサインインすることが可能です。Gitlabページより、各種購入プランに含まれる機能や制限か確認できます。

新規プロジェクトを作成する

ログインに成功すると、上のような画面が表示されます。GitLabではユーザーグループを作成し、その中で管理のプロジェクトを作成することが出来るのですが、何はともあれまずは「Create a project」をクリックし、新規プロジェクトを作成してみましょう。

空のプロジェクトを作成する

ここでは空のプライベートリポジトリを作成します。プライベートリポジトリではアクセス権を付与したユーザーのみがアクセス可能になります。

またプロジェクト名を入力すると、スラッグ(URLに使用される名前)は自動的に入力されます。特にこだわりがなければそのままで良いでしょう。

Gitリポジトリを作成する

プロジェクトを作成した時点では、Gitリポジトリは空の状態です。コマンドラインまたはGitLab Web Editorの2種類の方法でリポジトリ上にファイルを作成することができます。

基本的にはコマンドラインの活用を推奨します。プロジェクト作成後の画面には、コマンドラインでGitリポジトリを作成し、フォルダや既存のGitリポジトリをPushする方法が記載されています。

ここでは、ローカル環境にgitのインストールが完了していることを前提として話を進めます。

ここからはローカルのGit Bash(Windows)またはターミナル(Mac/Linux)から作業を行いましょう。

Gitアカウントの設定

GitLabアカウントに登録したユーザー名および、Eメールアドレスの設定を行います。すでに実施済みの場合はスキップ可能です。

$ git config --global user.name "dshack"
$ git config --global user.email "dshack@gmail.com"

新規リポジトリの作成

プロジェクトの空のリポジトリをローカルにクローンします。ファイルを追加することで、新規リポジトリの作成を行います。

$ git clone https://gitlab.com/DSHackAdmin/sampleproject.git
$ cd sampleproject
$ touch README.md
$ git add README.md
$ git commit -m "add README"
$ git push -u origin master

既存のローカルフォルダをPushする

ローカルのフォルダをリモートリポジトリにPushすることも考えられます。

$ cd existing_folder
$ git init
$ git remote add origin https://gitlab.com/DSHackAdmin/sampleproject.git
$ git add .
$ git commit -m "Initial commit"
$ git push -u origin master

既存のローカルリポジトリをPushする

同様にローカルのリポジトリをリモートリポジトリにPushすることも考えられます。

$ cd existing_repo
$ git remote rename origin old-origin
$ git remote add origin https://gitlab.com/DSHackAdmin/sampleproject.git
$ git push -u origin --all
$ git push -u origin --tags
GitLab CEや具体的な機能の活用方法については、随時関連記事を追加していく予定なので、よろしければ合わせてご参照ください

本格的に学びたい人のためのリソース

この記事で紹介したように、GitLabは単なるバージョン管理サービスではなくDevOpsの実践を促進するためのさまざまな機能を含んでいます。

当ブログでも、そのいくつかを取りあげたいと考えていますが、より深く学びたい方には以下の書籍が筆者のおすすめです。