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]をクリックします。
初期ユーザーは [root]、初期パスワードも [root] です。
Sign Inを押します。
ログインできました。
これで GitBucketはもう使うことができますが、この状態でちょっと置いておきます。
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] を選択します。
New Userを押します。
Subroのユーザーを作ります。
[Username]: subro
[Password]: 新規パスワードを入れる (OSのものとは別)
[Full Name]:Subro (入力は任意)
[Mail Address]: subro@subrohouse.internal
[User Type]: Administrator
Create Userを押します。
Jonathanのユーザーを作ります。
[Username]: jonathan
[Password]: 新規パスワードを入れる (OSのものとは別)
[Full Name]:Jonathan Joestar (入力は任意)
[Mail Address]: jonathan@subrohouse.internal
[User Type]: Normal
Create Userを押します。
同じ要領で、Josephのユーザーも作った後はこうなりました。
上の画面の左ペインにある [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] を選択しサインアウトします。
7.リポジトリ作成
ここからいよいよ Gitでのソース管理となります。
そのためのリポジトリを作成します。
GitBucketにプロマネの [subro]ユーザーでログインします。
+をクリックすると出てくるメニューで [New repository] を選択します。
[Repository name]: TestProjectd
[Public]を選択しました。
[Initialize this repository with a README]を選択しました。
Create repositoryを押します。
共通リポジトリができました。
Jonathanと Josephを共同開発者に登録します。
左ペインのメニューより [Settings] をクリックします。
[Collaborators]タブの [Collaborator] の入力域に jonathan の j と入れますと対象のユーザーがリストに出てきますので、[jonathan]を選択してAddを押します。
同様に [joseph] も追加します。
2人とも「Developer」権限にするためDeveloperを押しておきます。
Apply changesを押します。
これでのリポジトリ設定は完了です。
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+X → Y → Enterキーでセーブして終了できます。
こういうメッセージが出てコミット完了です。
[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の画面はこうなりました。
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
こちらはこんな感じにコメントを書きました。
[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の画面はこうなりました。
上の絵の赤い枠をクリックしてみてください。
こんな風に GUIで差分をみることができたりします。
==========
GitBucketを使って Gitでのソース管理のようなものをやってみました。
単純にするためにプログラムソースじゃなく単なるテキストファイルを対象にしていますが、プログラムソースでも同じことです。
ここの実権では gitコマンドでやっていますが、実際の現場では、Visual Studio Codeや Eclipseのような統合開発環境から GUIを通して行うのが普通かと思います。
GitBucketの GUIでもソースの参照など綺麗な画面で見ることができるなど高機能な Gitサーバーだと思います。
インターネットが使えないけど Gitでソース管理をしたいという場合には検討してみると良いかもです。
なおこのページを書くにあたって、1人3役は辛かったです。
途中で単純ミスを何度もやってしまいました…。
大変な力作だけど、余り読まれてないネタなのは悲しいっス。
Gitの本は一杯出ています。