お金をかけずにサーバーの勉強をしよう

GitBucketインストール

2024年5月2日

メニューへ戻る

Ubuntu Serverに GitBucketをインストールしてみましょう。

GitBucketは takezoeさん(日本人)が Scalaで作った Gitサーバーです。
なので先に takezoeさんのブログをご紹介しておきます。

たけぞう瀕死ブログ

ご本人にリンクの許可を取りたかったけど、はてなブログってメールっぽい連絡手段が無いんですよねぇ…。
(なので無許可リンクです。済みません。)

私と GitBucketとの出会いは、GitBucketが『Software Design』誌の Git特集で紹介されていたからでした。

当時はまだ GitHubがプライベートリポジトリを無料で解放しておらず、Gitしようにも世間に晒すにはハズいソースをパブリックでアップロードしなければならなかったはず。

また、私の職場が社内データ(プログラムのソースもそう)をインターネットに持ち出すのはNGだったので、GitBucketがローカルで動かせる Gitサーバーなんだって知って、早速構築してみたことを覚えています。

私はサーバー運用エンジニアでプログラマではありませんので、Gitのようなソース管理ツールを使って管理する程のソースを持ち合わせていませんでしたが、SubVersionを使っていたプログラマ達もそろそろ流行りの Gitを使いたがるだろうと思って、いつでも対応できるように Gitの基礎は押さえておこうとしたのでした。


ここでは Ubuntu Serverにインストールし、クライアントには Lubuntuを使い、グループでのプログラムソース管理の真似事をしてみます。


1.環境

サーバーには Ubuntu Server 24.04を使います。

GitBucketは Javaで動くサーバープログラムですので、以下を参考にして OpenJDK 21をインストールしておきます。
Java SE Development Kit (JDK) 21 インストール

クライアントには Lubuntu 24.04を使いますが、gitが使えるクライアントなら何でも良いでしょう。


2.GitBucketダウンロード

GitBucketをダウンロードしましょう。GitHubからです。

gitbucket / gitbucket

こちらの 「Installation」の段落に「the releases pageからダウンロードしなさい」と書かれていますので、そこに行きましょう。

[gitbucket.war]というファイルをクリックするとダウンロードが始まります。

[.war]拡張子は Web Application Archiveの略で、JavaEEアプリケーションの複数ファイルを 1つに纏める形式のファイルを表しています。

サーブレットエンジンの Tomcatにデプロイ(配備)するのがこの形式のファイルですね。
なので GitBucketは Tomcatでも動くと書いてありました。

2024年5月2日時点では、4.40.0でした。
2023年10月22日リリースのバージョンなので、ちょっとしたら新しくなってしまうかもです。

私は Lubuntuの Firefoxでダウンロードしましたので、Ubuntu Serverには scpコマンドで持っていきました。


3.GitBucket実行環境準備

ダウンロードができたら早速実行…というのがあわてん坊のお約束ですが、 GitBucketがソースファイルを管理する以上どこぞのディレクトリに何かしらのデータを貯め込むのでしょうから、その場所を確保しないといけないとか、いくつか決めないといけないことがあり、環境設計が必要です。

ちょっと整理しましょう。

実行ユーザーは誰にするか
GitBucketは常駐して不特定多数の相手にサービス提供するサーバーアプリケーションということを考慮します。

[root]ユーザーで動かすのは分かりやすいのですが、GitBucketが提供する機能に関係ないところまで GitBucketを通して操作される危険性を孕むことになります。
実行ユーザーはなるべく権限が限定されるべきです。

ですのでここでは新規に [gitbucket]グループに所属する [gitbucket]ユーザーを作って、それに実行させるようにします。

GitBucketのプログラムの配置場所
パッケージでのインストールするプログラムと違い [gitbucket.war] という単体ファイルで提供されていますので、どこに置いておくかを考慮する必要があります。

GitBucketを本気で運用する場合は MySQLなどのデータベース利用が推奨されていますが、ここではデフォルトのファイルシステムのデータベースを使います。

このデータベースですが、デフォルトでは実行ユーザーのホームディレクトリの下に [.gitbucket]ディレクトリとして作成されます。

ですので [gitbucket.war]ファイルも [gitbucket]ユーザーのホームディレクトリ直下に置いておくようにしようと思います。
-----

一つ一つやっていきましょう。

OSに新規ユーザー [gitbucket] を作ります。
一緒に [gitbucket]グループも作られます。

subro@UbuntuServer2404-1:~$ sudo adduser gitbucket
ユーザー `gitbucket' を追加しています...
新しいグループ `gitbucket' (1001) を追加しています...
新しいユーザー `gitbucket' (1001) をグループ `gitbucket' に追加しています...
ホームディレクトリ `/home/gitbucket' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しい パスワード: 新規パスワードを入れる
新しい パスワードを再入力してください: 同じパスワードをもう一回
passwd: パスワードは正しく更新されました
gitbucket のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
        フルネーム []: GitBucket Administrator
        部屋番号 []: Enterキー
        職場電話番号 []: Enterキー
        自宅電話番号 []: Enterキー
        その他 []: Enterキー
以上で正しいですか? [Y/n] Y
info: Adding new user `gitbucket' to supplemental / extra groups `users' ...
info: ユーザ `gitbucket' をグループ `users' に追加しています...

ユーザー作成され、新規グループも自動で作成されました。
フルネームは付けなくてもよいのですが、好みでこうしました。

ユーザーIDとグループIDが自動採番されています。
これらの番号体系はOS環境設計の一つなのですが、ここでは割愛します。

間違えてしまった場合は「sudo userdel -r ユーザー名」で削除できますので、やり直して下さい。


4.GitBucketインストール & 実行

ダウンロードした [gitbucket.war]ファイルを Ubuntu Serverの [gitbucket]ユーザーのホームディレクトリ [/home/gitbucket] に持ってきて下さい。
SCPでのファイルコピーについては、以下に書いておきました。

Ubuntu ServerへのSSH接続とファイルコピー

コピーができたら Ubuntu Serverに [gitbucket]ユーザーでログインします。
ホームディレクトリに以下のように [gitbucket.war]ファイルがあれば OKです。

gitbucket@UbuntuServer2404-1:~$ ls -l
合計 77836
-rw-rw-r-- 1 gitbucket gitbucket 79701346  5月  2 11:09 gitbucket.war

javaコマンドに -jar オプションを付けて実行します。

gitbucket@UbuntuServer2404-1:~$ java -jar gitbucket.war
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.
02:11:59.672 [main] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
02:11:59.965 [main] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
02:11:59.999 [main] INFO  g.core.servlet.InitializeListener - Check version
02:11:59.999 [main] INFO  g.core.servlet.InitializeListener - Start schema update
5月 02, 2024 2:12:00 午前 liquibase.database
情報: Set default schema name to PUBLIC
02:12:02.338 [main] INFO  g.core.servlet.InitializeListener - Extract bundled plugins...
02:12:02.351 [main] INFO  g.core.servlet.InitializeListener - Extract to /home/gitbucket/.gitbucket/plugins/gitbucket-notifications-plugin-1.11.0.jar
02:12:02.354 [main] INFO  g.core.servlet.InitializeListener - Extract to /home/gitbucket/.gitbucket/plugins/gitbucket-gist-plugin-4.23.0.jar
02:12:02.360 [main] INFO  g.core.servlet.InitializeListener - Extract to /home/gitbucket/.gitbucket/plugins/gitbucket-emoji-plugin-4.6.0.jar
02:12:02.398 [main] INFO  g.core.servlet.InitializeListener - Extract to /home/gitbucket/.gitbucket/plugins/gitbucket-pages-plugin-1.10.0.jar
02:12:02.399 [main] INFO  g.core.servlet.InitializeListener - Initialize plugins
02:12:02.455 [main] INFO  g.core.plugin.PluginRegistry - Initialize gitbucket-gist-plugin-4.23.0.jar
02:12:02.885 [main] INFO  g.core.plugin.PluginRegistry - Initialize gitbucket-emoji-plugin-4.6.0.jar
02:12:02.893 [main] INFO  g.core.plugin.PluginRegistry - Initialize gitbucket-notifications-plugin-1.11.0.jar
02:12:02.970 [main] INFO  g.core.plugin.PluginRegistry - Initialize gitbucket-pages-plugin-1.10.0.jar
02:12:03.049 [Thread-9] INFO  g.core.plugin.PluginWatchThread - Start PluginWatchThread: /home/gitbucket/.gitbucket/plugins
02:12:03.049 [main] INFO  o.scalatra.servlet.ScalatraListener - The cycle class name from the config: ScalatraBootstrap
02:12:03.051 [main] INFO  o.scalatra.servlet.ScalatraListener - Initializing life cycle class: ScalatraBootstrap

実行中になりました。

Ubuntu Serverの [8080/tcp]で待ち受けていますので、WEBブラウザでアクセスします。
私の環境では [http://ubuntuserver2404-1:8080] になります。

[sign in]をクリックします。
GitBucket 初期ログイン 1

初期ユーザーは [root]、初期パスワードも [root] です。
Sign Inを押します。
GitBucket 初期ログイン 2

ログインできました。
これで GitBucketはもう使うことができますが、この状態でちょっと置いておきます。
GitBucket 初期ログイン 3


5.開発ストーリー

GitBucketを使ったソース管理を味わうには、開発のストーリーが必要です。

以下の前提でいきます。
・共有リポジトリで 物語のテキストを管理する
・著者(プログラマ)は Jonathanと Joseph
・プロジェクトの管理者が Subro

これに沿って Jonathanと Josephのユーザー環境を作っていきます。

Lubuntuに [jonathan]ユーザーを作ります。
グループは [subro]ユーザーと同じ [subro]グループ(1000番)に所属させます。

subro@Ubuntu2404:~$ sudo adduser jonathan --gid 1000
info: ユーザ `jonathan' を追加しています...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new user `jonathan' (1001) with group `subro (1000)' ...
info: ホームディレクトリ `/home/jonathan' を作成しています...
info: `/etc/skel' からファイルをコピーしています...
新しいパスワード: 新規パスワードを入れる
新しいパスワードを再入力してください: 同じパスワードをもう一回
passwd: パスワードは正しく更新されました
jonathan のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
        フルネーム []: Jonathan Joestar
        部屋番号 []: Enterキー
        職場電話番号 []: Enterキー
        自宅電話番号 []: Enterキー
        その他 []: Overdrive
以上で正しいですか? [Y/n] Y
info: Adding new user `jonathan' to supplemental / extra groups `users' ...
info: ユーザ `jonathan' をグループ `users' に追加しています...

できました。
山吹色って入れるの忘れた。

同様に [joseph]ユーザーも作ります。

subro@Ubuntu2404:~$ sudo adduser joseph --gid 1000
info: ユーザ `joseph' を追加しています...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new user `joseph' (1002) with group `subro (1000)' ...
info: ホームディレクトリ `/home/joseph' を作成しています...
info: `/etc/skel' からファイルをコピーしています...
新しいパスワード: 新規パスワードを入れる
新しいパスワードを再入力してください: 同じパスワードをもう一回
passwd: パスワードは正しく更新されました
joseph のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
        フルネーム []:  Joseph Joestar
        部屋番号 []: Enterキー
        職場電話番号 []: Enterキー
        自宅電話番号 []: Enterキー
        その他 []:   Next You'll Say ...
以上で正しいですか? [Y/n] Y
info: Adding new user `joseph' to supplemental / extra groups `users' ...
info: ユーザ `joseph' をグループ `users' に追加しています...

「お前は『これでユーザーができました』と言うッ!」

これでユーザーができました。(ハッ!!)

私の環境では Jonathanと Josephが使えるようにしました。

このページで伝えたいポイントでもありませんし、GitBucketの運用に必須ではないのですが、どんな通知メールが GitBucketから送信されるのか見たいからです。

こういった検証用にローカルのメールサーバー構築については
ソフトのメール確認用のメールサーバーを立てる」に書いていますので、よろしければどうぞ。

私は別な Ubuntu Serverにメールサーバーを構築しているのでこれを利用することにしますが、他にメール送受信の方法を持っているならそれを使うのでも構いません。

Lubuntuで [jonathan]ユーザーと [joseph]ユーザーそれぞれにログインし、メーラーの Thuderbirdでメールサーバーの設定をして送受信の確認をしました。
これでイチロウとジロウのユーザー環境ができ上がりました。


6.GitBucketのユーザー作成と送信メールサーバー登録

GitBucketは自前のユーザー体系を持っていますので、Subro・Jonathan・Josephのユーザーを作成します。

右上の r をクリックするとメニューが出ますので [System administration] を選択します。
GitBucketユーザー作成 1

New Userを押します。
GitBucketユーザー作成 2

Subroのユーザーを作ります。
[Username]: subro
[Password]: 新規パスワードを入れる (OSのものとは別)
[Full Name]:Subro (入力は任意)
[Mail Address]: subro@subrohouse.internal
[User Type]: Administrator
Create Userを押します。
GitBucketユーザー作成 3


Jonathanのユーザーを作ります。
[Username]: jonathan
[Password]: 新規パスワードを入れる (OSのものとは別)
[Full Name]:Jonathan Joestar (入力は任意)
[Mail Address]: jonathan@subrohouse.internal
[User Type]: Normal
Create Userを押します。
GitBucketユーザー作成 4

同じ要領で、Josephのユーザーも作った後はこうなりました。
GitBucketユーザー作成 5

上の画面の左ペインにある [System settings] をクリックするとこの画面になります。
[Integrations]タブを選択して、送信メールサーバーの設定をします。
(以下設定内容は私の環境にある検証用のメールサーバーのものです)

[SMTP]:チェック
[SMTP host]: mail.subrohouse.internakl
[SMTP port]: 25
[SMTP user]: gitbucket
[SMTP password]:メールサーバーの [gitbucket]ユーザーのパスワード
[FROM address]: gitbucket@subrohouse.internal
[FROM name]: GitBucket
Apply changesを押します。
送信メールサーバー設定

設定が完了しましたので、 r を押すと出てくるメニューで [Sign out] を選択しサインアウトします。
[root]ログアウト


7.リポジトリ作成

ここからいよいよ Gitでのソース管理となります。
そのためのリポジトリを作成します。

GitBucketにプロマネの [subro]ユーザーでログインします。

をクリックすると出てくるメニューで [New repository] を選択します。
GitBucket リポジトリ作成 1

[Repository name]: TestProjectd
[Public]を選択しました。
[Initialize this repository with a README]を選択しました。
Create repositoryを押します。
GitBucket リポジトリ作成 2

共通リポジトリができました。
Jonathanと Josephを共同開発者に登録します。
左ペインのメニューより [Settings] をクリックします。
GitBucket リポジトリ作成 3

[Collaborators]タブの [Collaborator] の入力域に jonathan の j と入れますと対象のユーザーがリストに出てきますので、[jonathan]を選択してAddを押します。 GitBucket リポジトリ作成 4

同様に [joseph] も追加します。

2人とも「Developer」権限にするためDeveloperを押しておきます。
Apply changesを押します。
GitBucket リポジトリ作成 5

これでのリポジトリ設定は完了です。


8.新規ファイルの作成

Lubuntuに [jonathan]ユーザーでログインします。

ワーキングディレクトリを [~/work] として、上で作ったリポジトリをクローンしてローカルに持ってきます。

jonathan@Lubuntu2404:~/work$ git clone http://UbuntuServer2404-1:8080/git/subro/TestProject.git
Cloning into 'TestProject'...
remote: Counting objects: 3, done
remote: Finding sources: 100% (3/3)
remote: Getting sizes: 100% (2/2)
remote: Compressing objects: 100% (102/102)
Receiving objects: 100% (3/3), 266 bytes | 266.00 KiB/s, done.
remote: Total 3 (delta 0), reused 0 (delta 0)

jonathan@Lubuntu2404:~/work$ ls -l
合計 4
drwxr-xr-x 3 jonathan subro 4096  5月  2 18:33 TestProject

[TestProject]ディレクトリができました。
これをローカルリポジトリといいます。

ローカルリポジトリの中に移動します。

jonathan@Lubuntu2404:~/work$ cd TestProject

jonathan@Lubuntu2404:~/work/TestProject$ ls -l
合計 4
-rw-r--r-- 1 jonathan subro 65  5月  2 18:33 README.md

ここに新規に [story.txt]ファイル を以下の内容で作ります。

ズイブン・・・・
"遅(おそ)"かったじゃねーかよ
"マサト"ォ・・・・

フン
[フォオオオオオオン・・・・]
[ギャリ]
て・・てめェ あ・・

”待(ま)"ってたぜェ
この”瞬間(とき)"をよォ
[ギャギャリギャリギャリ]

このように [story.txt]ファイルができれば OKです。

jonathan@Lubuntu2404:~/work/TestProject$ ls -l
合計 8
-rw-r--r-- 1 jonathan subro  65  5月  2 18:00 README.md
-rw-r--r-- 1 jonathan subro 284  5月  2 18:01 story.txt

これは gitコマンドを使う時の初期設定なんですが、[jonathan]ユーザーは初めてなのでやっておきます。

jonathan@Lubuntu2404:~/work/TestProject$ git config --global user.email "jonathan@subrohouse.internal"

jonathan@Lubuntu2404:~/work/TestProject$ git config --global user.name "Jonathan"

この設定は [~/.gitconfig]ファイルに書かれます。

[story.txt]ファイルをステージング状態にします。

jonathan@Lubuntu2404:~/work/TestProject$ git add story.txt

何も出ませんができています。

ステージング状態のファイルをバージョン固定します。

jonathan@Lubuntu2404:~/work/TestProject$ git commit

テキストエディタの nanoが立ちち上がって、コメントの入力を促されますので、適切なものを入れます。
Ctrl+XYEnterキーでセーブして終了できます。 GitBucket コミット 1
こういうメッセージが出てコミット完了です。

[main d31fa1a] MとTの邂逅
 1 file changed, 13 insertions(+)
 create mode 100644 story.txt

GitBucket(これをリモートリポジトリという)にこれを反映させます。

jonathan@Lubuntu2404:~/work/TestProject$ git push
Username for 'http://UbuntuServer2404-1:8080': jonathan ← GitBucketのユーザー名
Password for 'http://jonathan@UbuntuServer2404-1:8080': GitBucketの [jonathan]ユーザーのパスワードを入れる
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 461 bytes | 461.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Updating references: 100% (1/1)
To http://UbuntuServer2404-1:8080/git/subro/TestProject.git
   636ab14..d31fa1a  main -> main

反映できました。

GitBucketの画面はこうなりました。
GitBucket プッシュ 1


9.既存ファイルの更新

次は Josephで [story.txt] を更新してみます。

Lubuntu に [joseph]ユーザーでログインします。

こちらも [~/work] をワーキングディレクトリとして、リモートリポジトリをクローンして、ローカルリポジトリを作ります。

joseph@Lubuntu2404:~/work$ git clone http://ubuntuserver2404-1:8080/git/subro/TestProject.git
Cloning into 'TestProject'...
remote: Counting objects: 6, done
remote: Finding sources: 100% (6/6)
remote: Getting sizes: 100% (4/4)
remote: Compressing objects: 100% (102/102)
remote: Total 6 (delta 1), reused 3 (delta 0)
Receiving objects: 100% (6/6), done.
Resolving deltas: 100% (1/1), done.

クローンできました。

中を見ますとこんな風。

joseph@Lubuntu2404:~/work$ cd TestProject

joseph@Lubuntu2404:~/work/TestProject$ ls -l
合計 8
-rw-r--r-- 1 joseph subro  65  5月  2 18:38 README.md
-rw-r--r-- 1 joseph subro 284  5月  2 18:38 story.txt

[story.txt]ファイルを以下のように編集します。

ズイブン・・・・
"遅(おそ)"かったじゃねーかよ?
"マサト"ォ・・・・

ヒク
!?
[フォオオオオオオン・・・・]
[ギャリ]
て・・てめェ あ・・!!

”待(ま)"ってたぜェ!!
この”瞬間(とき)"をよォ!!
[ギャギャリギャリギャリ]

こちらもリモートリポジトリに反映させます。
[jonathan]ユーザーでやったように gitコマンドの初期設定は済ませてあります。

joseph@Lubuntu2404:~/work/TestProject$ git add story.txt

joseph@Lubuntu2404:~/work/TestProject$ git commit

こちらはこんな感じにコメントを書きました。
GitBucket コミット 2

[main c846921] 緊張感を表すため感嘆符を追加 誤りを修正
 1 file changed, 6 insertions(+), 5 deletions(-)

joseph@Lubuntu2404:~/work/TestProject$ git push
Username for 'http://ubuntuserver2404-1:8080': joseph ← GitBucketのユーザー名
Password for 'http://joseph@ubuntuserver2404-1:8080': GitBucketの [joseph]ユーザーのパスワードを入れる
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 405 bytes | 405.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1)
remote: Updating references: 100% (1/1)
To http://ubuntuserver2404-1:8080/git/subro/TestProject.git
   d31fa1a..c846921  main -> main

反映できました。

その結果 GitBucketの画面はこうなりました。
GitBucket プッシュ 2

上の絵の赤い枠をクリックしてみてください。
こんな風に GUIで差分をみることができたりします。
GitBucket 差分


==========
GitBucketを使って Gitでのソース管理のようなものをやってみました。

単純にするためにプログラムソースじゃなく単なるテキストファイルを対象にしていますが、プログラムソースでも同じことです。

ここの実権では gitコマンドでやっていますが、実際の現場では、Visual Studio Codeや Eclipseのような統合開発環境から GUIを通して行うのが普通かと思います。


GitBucketの GUIでもソースの参照など綺麗な画面で見ることができるなど高機能な Gitサーバーだと思います。
インターネットが使えないけど Gitでソース管理をしたいという場合には検討してみると良いかもです。


なおこのページを書くにあたって、1人3役は辛かったです。
途中で単純ミスを何度もやってしまいました…。

大変な力作だけど、余り読まれてないネタなのは悲しいっス。


Gitの本は一杯出ています。