(git2)IBMi(AS400)でのgitコード管理の流れ

# ■概略
オープンソースエンジニア歴30年超の筆者が2023年からIBMiを学びだした学習記録です
筆者が行っているFFRPGのgitコード管理の流れをまとめました

### ◯ブランチの役割
<table border="1" style="border-collapse:collapse;width:800px">
<tr bgcolor=silver><th>目的</th><th>ライブラリ</th><th>ブランチ名</th></tr>
<tr><td>本番</td><td>本番機のCGILIB</td>
    <td>master<BR> ※feature/fixからmasterに<BR>　開発者がマージリクエストし、管理者がマージする</td></tr>
<tr><td>開発</td><td>開発機のCGILIB</td><td>develop<BR> ※feature/fixからdevelopに<BR>　開発者がマージリクエストし、開発者がマージする</td></tr>
<tr><td>バグ修正</td><td>個人ライブラリ</td>
    <td>fix/#イシュー番号<BR> ※developからブランチを作成する</td></tr>
<tr><td>機能追加</td><td>個人ライブラリ</td>
    <td>feature/#イシュー番号<BR> ※developからブランチを作成する</td></tr>
</table>

## <u>◯修正・反映の流れ</u>
修正・反映にはgitの機能だけではなく、
gitlabのイシュー・マージリクエスト・マージ機能を使う  
<table border="1" style="border-collapse:collapse;width:800px">
<tr bgcolor=silver><th>連番</th><th>担当者</th><th>ブランチ</th><th>ツール</th><th>作業</th></tr>
<tr><td>0</td><td>開発者</td><td>全て</td>
    <td>VSCode</td><td>ホームディレクトリに<BR>ローカルレポジトリ取得</td></tr>
<tr><td>1</td><td>管理者<BR>開発者</td><td>-</td>
    <td>gitlab</td><td>イシュー作成</td></tr>
<tr><td>2</td><td>開発者</td><td>developから<BR>作業ブランチ</td>
    <td>tig</td><td>developから作業ブランチを<BR>作成し切替える</td></tr>
<tr><td>3</td><td>開発者</td><td>作業ブランチ</td>
    <td>VSCode</td>
    <td>ソース修正を行う<BR>個人ライブラリで<BR>コンパイルとテスト</td></tr>
<tr><td>4</td><td>開発者</td><td>作業ブランチ</td><td>tig</td>
    <td>commit & push</td></tr>

<tr><td>5</td><td>開発者</td><td>作業ブランチ</td><td>gitlab</td>
    <td>developへのマージリクエスト</td></tr>
<tr><td>6</td><td>開発者</td><td>develop</td><td>gitlab</td>
    <td>developへのマージ</td></tr>
<tr><td>7</td><td>開発者</td><td>develop</td><td>VSCode</td>
    <td>開発機のCGILIBで<BR>コンパイルとテスト</td></tr>
<tr><td>8</td><td>テスト担当</td><td>develop</td><td>アプリ</td>
    <td>developの動作確認を行う</td></tr>
<tr><td>9</td><td>テスト担当</td><td>develop</td><td>gitlab</td>
    <td>masterへのマージリクエスト</td></tr>
<tr><td>10</td><td>管理者</td><td>master</td><td>gitlab</td>
    <td>masterへのマージ</td></tr>
<tr><td>11</td><td>管理者</td><td>master</td><td>VSCode</td>
    <td>本番機のCGILIBで<BR>コンパイルとテスト</td></tr>
<tr><td>12</td><td>テスト担当</td><td>master</td><td>アプリ</td>
    <td>本番で動作確認を行う</td></tr>
</table>

## <u>■修正・反映の詳細手順(開発者分の1-7)</u>
### 0) ホームディレクトリにローカルレポジトリ取得
…gitに慣れていない人向けの説明なので環境を整えるところから書くべきでした

最初にgitlabからgit cloneで自分のホームディレクトリにローカルレポジトリを
展開し開発準備を整える
gitlabのプロジェクトのトップ画面の[クローン]の[sshでクローン]でURLをコピーする
![git_clone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/59744467-64cb-e14d-826c-d07d86638f12.png)

VSCodeのterminalかsshクライアントでコピーしたURLをgit cloneする
git cloneしたディレクトリにcdで移動し、tigを起動しrでブランチ一覧を表示すると
「2)tigでイシューに対応するブランチを作成する」 の画面になる

```
$ git clone git@gitlab.local:test/readme.git
Cloning into 'readme'...
remote: Enumerating objects: 1221, done.
remote: Counting objects: 100% (179/179), done.
remote: Compressing objects: 100% (179/179), done.
remote: Total 1221 (delta 106), reused 0 (delta 0), pack-reused 1042
Receiving objects: 100% (1221/1221), 6.92 MiB | 7.15 MiB/s, done.
Resolving deltas: 100% (699/699), done.
$ cd readme
$ tig
```

### <u id=issue>1) イシューを作成する</u>
<table border="1" style="border-collapse:collapse;width:800px">
<tr><td bgcolor=silver>担当</td><td>管理者 or 開発者(開発者が気づいた際もイシューを作成する)</td></tr>
<tr><td bgcolor=silver>ブランチ</td><td>なし</td></tr> 
<tr><td bgcolor=silver>ツール</td><td>gitlab</td></tr> 
</table>

**＊作業内容**  
1.gitlabの {プロジェクト名}-[イシュー]-[新しいイシュー] でイシューを作成する
![git_openissue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/4037585f-0ed4-1f4a-8e17-4849379b2733.png)
![git_newissue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/3cc293b9-10b5-9b4d-4582-2666fd106d73.png)

<table border="1" style="border-collapse:collapse;width:800px">
<tr><td bgcolor=silver>タイトル</td>      <td>変更内容がわかるように簡潔に記載</td></tr>
<tr><td bgcolor=silver>タイプ</td>        <td>イシュー か インシデント</td></tr>
<tr><td bgcolor=silver>説明  </td>        <td>変更内容を詳細に記載</td></tr>
<tr><td bgcolor=silver>担当者</td>        <td>gitlabのアカウントに割り当てる</td></tr>
<tr><td bgcolor=silver>期日  </td>        <td>期限を入力</td></tr>
<tr><td bgcolor=silver>マイルストーン</td><td>別途管理するマイルストーンを入力する(今は空)</td></tr>
<tr><td bgcolor=silver>ラベル</td>        <td>ax_分類,bx_ステータス,cx_優先度など用意されたラベルを割り当てる</td></tr>
</table>

[作成イシュー]を押す  

### <u id=newbranch>2)tigでイシューに対応するブランチを作成する</u>
<table border="1" style="border-collapse:collapse;width:800px">
<tr><td bgcolor=silver>対象</td><td>開発者</td></tr>
<tr><td bgcolor=silver>ブランチ</td><td>develop→作業ブランチ</td></tr> 
<tr><td bgcolor=silver>ツール</td><td>tig</td></tr> 
</table>

**＊作業内容(画面はdevelopブランチでBを押し作業ブランチ名を指定するところ)**  
![git_newbranch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/b1a9f95a-f329-f533-36ef-8f85d3d7b241.png)

1. tigでdevelop(親ブランチ)を選択し U(git pull) で最新に更新する  
2. develop(親ブランチ)を選択し B(git branch) で作業ブランチを作成する  
ブランチ名は、{バグ修正ならfix,追加修正ならfeature}{#イシュー番号}  
(説明を加えるなら簡潔な英語でスペースを入れない)
3. 作業ブランチを選択し = で作業ブランチに切替える  

### <u id=programming>3)VSCodeでイシューに対応する変更をブランチで行う</u>
<table border="1" style="border-collapse:collapse;width:800px">
<tr><td bgcolor=silver>対象</td><td>開発者</td></tr>
<tr><td bgcolor=silver>ブランチ</td><td>作業ブランチ</td></tr> 
<tr><td bgcolor=silver>ツール</td><td>VSCode</td></tr> 
</table>
  
＊作業内容  
1. 作業ブランチでソースを修正する  
2. cmd/crtpgm_{PGM名}.bashを実行し、個人ライブラリにコンパイルし単体テストする 

### <u id=commit>4)tigで変更内容をブランチにgit add,commit,pushする</u>
<table border="1" style="border-collapse:collapse;width:800px">
<tr><td bgcolor=silver>対象</td><td>開発者</td></tr>
<tr><td bgcolor=silver>ブランチ</td><td>developブランチ</td></tr> 
<tr><td bgcolor=silver>ツール</td><td>tig</td></tr> 
</table>
  
**＊作業内容(画面はtigでsを押した直後)**  
![git_tigstatus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/c94b50fa-7254-1023-075c-775d8c56268a.png)

1. tigで r を押してブランチ一覧画面にする  
2. 作業ブランチが一番上になっていることを確認する  
なっていなければ作業ブランチを選んで = で作業ブランチに切り替える
(git checkout)  
3. tigで s を押してgit status画面にする  
4. 対象ファイルを選択し a を押してgit addする  
もう一度 a を押すと戻す  
5. C(大文字C) を押してgit commitする  
6. P(大文字P) を押してgit pushする  
commitの際、コミットメッセージを以下のルールに従って記載する  
~/.commit_templateで定義している  

```

# ==== Commit Messages(Template) ====  
# [prefix] #Issue番号 変更内容  
# 例) [fix] #438 コメント追加
# ==== Prefix ====
# [fix] バグ修正  
# [hotfix] クリティカルなバグ修正  
# [add] 新規機能・新規ファイル追加  
# [update] バグではない機能修正  
# [revert] 修正取り消し  
# [refactor] リファクタリング  
# [docs] ドキュメントのみ修正  
```

### <u id=mergerequest>5)gitlabでマージリクエストを行う</u>
<table border="1" style="border-collapse:collapse;width:800px">
<tr><td bgcolor=silver>対象</td><td>開発者</td></tr>
<tr><td bgcolor=silver>ブランチ</td><td>developブランチ</td></tr> 
<tr><td bgcolor=silver>ツール</td><td>gitlab</td></tr> 
</table>
  
　  
**＊作業内容**  
1. gitlabの {プロジェクト名}-[マージリクエスト]-[新しいマージリクエスト] でマージリクエストを作成する  
![git_mergerequest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/f14e8a3c-87f7-7953-0900-2edb948ac8c1.png)


2. ソースブランチに作業ブランチ、ターゲットブランチにdevelopを選択し、[ブランチを比較して続行する]  
![git_mergerequest2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/87044fb4-ebb1-570a-25cf-7ee405fb2d7e.png)


<table border="1" style="border-collapse:collapse;width:800px">
<tr><td bgcolor=silver>タイトル</td>      <td>{feature/fix}/{#イシュー番号} {説明}</td></tr>
<tr><td bgcolor=silver>Draftとしてマーク</td><td>[　](チェックしない)</td></tr>
<tr><td bgcolor=silver>説明  </td>        <td>変更内容を記載</td></tr>
<tr><td bgcolor=silver>担当者</td>        <td>gitlabのアカウントに割り当てる</td></tr>
<tr><td bgcolor=silver>レビュアー</td>    <td>gitlabのアカウントに割り当てる(オプション)</td></tr>
<tr><td bgcolor=silver>マイルストーン</td><td>別途管理するマイルストーンを入力する(今は空)</td></tr>
<tr><td bgcolor=silver>ラベル</td>        <td>ax_分類,bx_ステータス,cx_優先度など用意されたラベルを割り当てる</td></tr>
</table>

[作成マージリクエスト]を押す  

### <u id=merge>6)gitlabで差分を確認しマージを行う</u>
<table border="1" style="border-collapse:collapse;width:800px">
<tr><td bgcolor=silver>対象</td><td>開発者</td></tr>
<tr><td bgcolor=silver>ブランチ</td><td>developブランチ</td></tr> 
<tr><td bgcolor=silver>ツール</td><td>gitlab</td></tr> 
</table>
  
**＊作業内容**  
1. gitlabの {プロジェクト名}-[マージリクエスト]-[オープン] からマージするリクエストを選択する  
2. 画面右上の[コード]-[WebIDEでチェック]するとオンラインVSCodeで左右ペインに差分が表示される  
3. 差分に問題なければ、[マージ]を押すとマージしてくれる  
![git_merge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/97567159-5858-bc66-44fb-e5071ecd8b23.png)


### <u id=merge>7)開発機のCGILIBでコンパイルとテスト</u>
<table border="1" style="border-collapse:collapse;width:800px">
<tr><td bgcolor=silver>対象</td><td>開発者</td></tr>
<tr><td bgcolor=silver>ブランチ</td><td>developブランチ</td></tr> 
<tr><td bgcolor=silver>ツール</td><td>VSCode</td></tr> 
</table>
  
**＊作業内容**  
1. cmd/crtpgm_{PGM名}2DevCGILIB.bashを実行し、開発機のCGILIBにコンパイルしテストする