(git1)IBMi(AS400)のコード管理をgitlabで

# ■概略
オープンソースエンジニア歴30年超の筆者が2023年からIBMiを学びだした学習記録です
gitはオープンソースではあたりまえになっていますが、

＊gitとは何で
＊gitはどうして必要
＊gitをどうすれば使えるのか

をgitに馴染みが薄いであろうIBMiユーザ向きにまとめました
…今回は概略以降もですます調で、図が1つもありません…

### ◯gitとは何か?
gitはLinuxカーネルの開発者がLinuxカーネルを開発するために作りました
gitはソース管理ツールのデファクトと言っていいのではないでしょうか

筆者はgitをテキストの差分管理ツールと捉えています
テキストの差分を管理できるのでどの言語のソース、HTMLでも管理できます
ExcelやWordは画像と同じバイナリファイルとしてアップはできますが、
差分管理はできません

### ◯gitはどうして必要か?
**1)FFRPGやオープンソースでは同じソースコードが物理的に別になっている**
IBMi上のソースコードをSEUで編集する場合物理的に同じソースコードを編集しています
SEUでソースコード編集中はロックがかかっていて別の人が編集できません

一方FFRPGソースはIFSで各人のホームディレクトリ配下にあるので、
同じファイル名であっても物理的に別のソースコードです
オープンソースでは分散開発が一般的なので、同じファイル名の物理的に別ファイルを
複数人が同時に編集を行います

各開発者の修正が他の開発者に影響を及ぼさないメリットがありますが、
変更管理が必要になってきます

**2)ソースコードを本番用・検証用・開発用単位で管理できる**
gitでは「ブランチ」で本番用・検証用・開発用を単位にできます
開発機では「develop」ブランチ、
検証機では「stage」ブランチで、
本番機では「master」ブランチにします
develop, stage, masterのブランチ切替はgit checkoutコマンド一発で行います
developの変更内容を別ブランチへの反映はgit mergeコマンドで行います

大規模なシステム運用でこの機能は有用だと思います

**3)ソースコードを機能追加・変更・バグ対応単位で管理できる**
gitでは「ブランチ」を機能追加・機能変更・バグ対応単位にもできます
開発者はdevelopから機能追加用にfeature/#1ブランチを作成します
feature/#1ブランチは開発者個人のディレクトリ内だけの変更です
他の開発に影響を与えません
開発が終わったらfeature/#1をdevelopにgit mergeして反映します
(詳細ははしょってます)
反映した変更をgit resetで戻すことも可能です

変更単位で管理でき、コマンド一発で戻せるのは有用です

オープンソースで開発する場合gitは必須になっています
FFRPGで開発する場合も同様にgitが必須になると思います

# ■gitの種類
### ◯サーバ
gitでソースを管理するサーバ側(厳密には違いますが…)も複数の選択肢があります

**1)ベアリポジトリ**
ソースをまとめて管理する単位をレポジトリといいます
クライアントでも使うgitコマンドでレポジトリを作成できます
IFSにgitコマンドをyumインストールすればリポジトリが作れます
メリットはgitをIBMiだけで完結して運用できる点です
デメリットは後述の追加機能が使えない点です

**2)gitのSaaSサービス**
GitHubが代表例で、gitlab-eeなど複数あります
IBMクラウド上でもgitlabが使えるようです
＊無償プランもありますが仕事で使うなら有償プランになるでしょう

**_※git SaaSにあるがベアリポジトリにない追加機能_**
　**＊WebでアクセスしGUIがついている**
　**＊チケット機能(イシュー)**
　　変更内容を指示する人と開発者は違うことが通常です
　　変更内容をexcel等で管理せず、git SaaS上のGUIで管理できます
　　自動的に連番で採番され、ブランチの名前に使えば対応がわかりやすいです
　**＊プルリクエスト・マージリクエスト機能**
　　master(本番)ブランチへのmergeは通常 開発者と別の人が反映します
　　反映依頼をメールなど他のツールによらずgit SaaS上のGUIで対応できます
　**＊CI/CD機能**
　　ブランチに変更をmergeしたら自動的にコンパイルを実行できます
　　Javaのようなコンパイル言語ではCI/CDが使われている例が多いようです
　　コンパイル言語のRPGでもCI/CDは有用でしょう

gitのSaaSサービスのメリットはサーバの運用に手間がかからないこと
デメリットはソースコードをクラウド上に置くので、IBMiからインターネットに
アクセスできない環境では使えないことです

 **3)gitlab-ce**
 gitlab-eeはSaaSサービスですが、gitlab-ceはオープンソースなので自分でVMを
 用意すればクローズドな環境にgitレポジトリを作ることができます

 弊社ではIBMiと同じIPセグメントにLinux VMを用意して
 gitlab-ceをインストール しています
 AWSとVPNでつながっているなら、EC2にgitlab-ceをインストールすることも可能です

 メリットはインターネットにアクセスできないIBMiでもgitレポジトリが使え、
 ソースコードをクラウドに出さなくてもよいところでしょう
 デメリットはLinux VMとgitlab-ceのバージョン管理の手間が必要になるところです

**4)結論**
 ベアリポジトリはあまりお勧めしません
 自社の環境にあったgitレポジトリを導入してはいかがでしょうか？

### ◯クライアント
**1)gitコマンド**
IBMiのIFSにyumでgitコマンドをインストールすれば、gitコマンドが利用可能です
ただ初心者にはとっつきにくいのではないでしょうか？
開発者が頻繁に行う作業は後述のgitツールがあると操作が 容易だと思います

＊開発者が頻繁に行う作業
　ブランチ切替(checkout)
　ブランチ作成(branch)
　変更対応(add & commit & push)
　△ブランチ反映(merge)

**2)gitツール**
gitツールにはたくさんの種類があります

　**＊VSCode上でのgit操作**
　　IFS上のソースコードをCode for IBMiでアクセスしています
　　ローカルにソースコードがあればVSCode上でgit操作できますが
　　IFS上のソースをgit操作する方法を見つけていません
 
　**＊Window上のgit操作**
　　ローカルにソースコードがあれば、VSCodeのgit以外に、
　　git for windowsやtortoiseなどありますが、これもできていません
 
　**＊IFS上でText User Interfaceのgitツール**
　　lazygit(Go言語)、gitui(Rust言語)、tig(C言語)がメジャーのようです
　　IBMiで必要なPowerPCのバイナリはどこも配布されていないようです
　　IBMiのyumパッケージにもないようです
　　なので筆者はC言語のtigをIBMi上でコンパイルして使っています

**3)結論**
管理対応やイレギュラー対応はgitコマンドを実行すればよいと思います
 
IFS上にソースコードを置くのでgitツールに筆者はtigを考えました
ソースコードはPC上に置きVSCodeのsftpプラグインでIFSと自動同期し、
gitツールはPC上の各種gitツールの中から選ぶことも考えられます

よい方法あればぜひ教えてください！