著者|
小川 誠 氏
ティアンドトラスト株式会社
代表取締役社長 CIO CTO
1989年、エス・イー・ラボ入社。その後、1993年にティアンドトラストに入社。システム/38 から IBM i まで、さまざまな開発プロジェクトに参加。またAS/400 、IBM i の機能拡張に伴い、他プラットフォームとの連携機能開発も手掛ける。IBM i 関連の多彩な教育コンテンツの作成や研修、セミナーなども担当。2021年6月から現職。
それでは、IBM iの5250環境のみで、RPG ⅢのソースコードをGitでバージョン管理する方法を具体的に解説していこう。最初に、図表4を見てほしい。
PASE環境で実行されるGitが処理するソースコードは、IFSディレクトリにあるものを対象とする(図表4・左)。それに対して、RPG Ⅲのソースコードは、ソースファイルのメンバーとして存在している(図表4・右)。5250画面で利用できるSEUエディターは、その編集対象がこのメンバーに限定されており、Gitはこのメンバーを対象とすることができないので、RPG ⅢのソースコードをGitで直接管理することはできない。
それならば、SEUで編集し終わったメンバーをGitが管理するIFSディレクトリにコピーするというのはどうだろうか。Gitの管理下のディレクトリにコピーできれば、Gitの世界で RPG Ⅲのコードもソース管理できるはず。今回はこの方法を試していくことにする。
連携手順
では具体的な連携手順を見ていこう。
・手順1:SEUを使ってメンバーの追加・修正を行い、コマンドやPDM経由でコンパイル等を実施する
・手順2:Gitの現在のブランチを確認する(必要に応じて変更する)
・手順3:必要なタイミングでメンバーをGit管理下のディレクトリにコピーする
・手順4:Gitコマンドを使ってソースコードのバージョン管理を行う
まず、手順1については、現在の開発手順となんら変わらない。通常通り、5250画面でSEUを使用してRPG Ⅲプログラムを作成および修正し、テストを実施する。ある程度修正が終わったら、IFSディレクトリにメンバーをコピーしよう。この時点で注意すべきポイントは、Gitの現在のブランチ(コピーしようとしているワーキング・ツリーに展開されているブランチ)は何か(手順2)ということだ。
通常、作業単位(新機能作成とかバグ修正などのまとまり)で新たにブランチを作成し、そのブランチにソースコードの修正をまとめることで、どこを修正しているかをより明確にできる。今回の方法では、SEUで修正したメンバーをコピーする手順3の段階で、Gitの現在のブランチがなにかということを常に意識していてほしい。
メンバーとIFSディレクトリ間のコピーは以下のコマンドを実行する。
CPYTOSTMF(インポート・ファイルへのコピー)
手順4のGitコマンドはIBM iネイティブのコマンドではないので、通常のインターフェース(コマンド入力画面など)では実行できない。先程も述べた通り、GitはPASE環境で実行されるプログラムだ。PASE環境は AIX(UNIXのIBM版)なので、コマンドもAIXコマンドを利用する。5250画面からは、プログラムQP2TERMを実行することで表示される画面から AIX およびGitのコマンドを指定して実行することができる。
図表5は、
- pwd(現行ディレクトリの確認)
- cd testsrclib(現行ディレクトリ内の testsrclib ディレクトリに移動)
- ls -l(testsrclib ディレクトリ内の一覧をリスト表示)
というコマンドを実行している。どれもAIXの基本コマンドだが、AIXといってもLinuxのコマンドとほとんど同じなので、ネットで調べながら何ができるか試してもらいたい。
実施環境
今回は、以下環境で具体的な手順を解説していく。Gitの用語については、i Magazine 2021 Autumn号の「特集 IBM iユーザーに捧げるGit入門」(Webサイトに掲載中)を参照してほしい(図表6)。
実際の作業は、5250セッション画面を2つ立ち上げ、1つはSEU/PDMで開発等を行う画面、もう1つはQP2TERMプログラムを実行してGitコマンド等を実行する画面とすると効率よく作業できる。これ以降、通常の画面をネイティブ画面、QP2TERM を実行している画面を QP2TERM 画面として解説していく。
最初のコミット
Git環境が整ったので、バージョン管理の対象としたいソースメンバーを、作成した /home/GITUSER/TESTSRCLIB/QRPGSRC ディレクトリにコピーしていこう(図表7)。
今回は、TESTSRCLIB/QRPGSRCファイル内の上記3つのメンバーをコピーする。使用するコマンドは CPYTOSTMF コマンド。BCH010Rをコピーするコマンドは以下の通り。
CPYTOSTMF FROMMBR(‘/QSYS.LIB/TESTSRCLIB.LIB/QRPGSRC.FILE/BCH010R.MBR’)
TOSTMF(‘/HOME/GITUSER/TESTSRCLIB/QRPGSRC/BCH010R.RPG’)
STMFOPT(*REPLACE)
DBFCCSID(*FILE)
STMFCCSID(1208)
ENDLINFMT(*LF)
IFS のルート直下に QSYS.LIB ディレクトリがあり、ネイティブ環境で利用するライブラリおよびオブジェクトはすべてこのディレクトリに入っている。FROMMBR パラメータの指定は
/QSYS.LIB/TESTSRCLIB.LIB/QRPGSRC.FILE/BCH010R.MBR
となっているが、これは
「TESTSRCLIBライブラリ内の、QRPGSRC ファイルのBCH010Rというメンバー」
という意味だ。各オブジェクトの拡張子は .LIB、.FILE および .MBR なので間違えないように記述してほしい。
コピー先の TOSTMF パラメータの指定は
/HOME/GITUSER/TESTSRCLIB/QRPGSRC/BCH010R.RPG
となっており、先程作成したディレクトリにBCH010R.RPGという名前のテキストファイルでコピーするという意味になる。拡張子はメンバー・タイプを指定しておくと、ソースコードの言語の判別ができるので忘れないようにしよう。
もう1つ、STMFCCSID パラメータは必ず 1208 を指定する。これは将来Gitのリポジトリを他のプラットフォームのユーザーと共有していく場合に必ず必要になる設定だ。
正しくコピーされたかは、tailコマンドを使用してコピーしたファイルの下部を画面で表示してみるとよい。
正しくコピーされていたら図表8のように表示されるはずだ。
STMFCCSID の指定を忘れたりすると、tail コマンドで以下のような表示になる場合がある。
> tail QRPGSRC/BCH010R.RPG
@@@@@$
上記の状態になった場合は、いったんQRPGSRC/BCH010R.RPGを削除してもう一度正しいパラメータを指定したCPYTOSTMFを実行する。
> rm QRPGSRC/BCH010R.RPG
では、3つのメンバーを CPYTOSTMF コマンドでコピーしたら、QP2TERM 画面でGitコマンドを使って状態を確認しよう。
>git status
On branch master
No commits yet
Untracked files:
(use “git add <file>…” to include in what will be committed)
QRPGSRC/
nothing added to commit but untracked files present (use “gitadd” to track)
Untracked filesと表示されていると思うが、これは「まだ以下のファイルはGitの追跡対象になっていない」という意味。今回は3つのファイルをコピーしたので、このファイルをまずはステージング・エリアに追加してコミットする必要がある。これを実施するにはgitadd およびgitcommitコマンドを使用する。
>git add .
$
>git status
On branch master
No commits yet
Changes to be committed:
(use “gitrm –cached <file>…” to unstage)
new file: QRPGSRC/BCH010R.RPG
new file: QRPGSRC/PRI04R.RPG
new file: QRPGSRC/TRY01R.RPG
git addの次の .(ドット)は、すべてのファイルを対象にするという意味。gitaddによりコミット準備ができたと表示されているので、次にコミットを実行する。
>git commit -m ‘最初のコミット’
[master (root-commit) 411effe] 最初のコミット
3 files changed, 3 insertions(+)
create mode 100755 QRPGSRC/BCH010R.RPG
create mode 100755 QRPGSRC/PRI04R.RPG
create mode 100755 QRPGSRC/TRY01R.RPG
Gitのコミット時には、必ずコミット・メッセージを記述しないといけない。-m に続いてコミット・メッセージを記述しよう。
実行した結果表示される最初の行の意味は、「masterブランチにコミットされた。コミットのハッシュ値は 411effe」。
コミットが完了したのでgit status で状況を確認する。
>gitstatus
On branch master
nothing to commit, working tree clean
「masterブランチにはコミットするものが何もなく、ワーキング・ツリーはクリーン」と表示されている。gitbranch でブランチの状態も確認しよう。
>git branch -v
* master 411effe 最初のコミット
ログを確認するにはgitlog コマンドを使用する。
>git log
commit 411effeec81eb12a5d2353b8eb8634ac839217b0 (HEAD -> master)
Author: Ogawa, Makoto <makoto@tat.jp>
Date: Sat May 25 16:25:36 2024 +0900
最初のコミット
最初の行に「(HEAD –> master)」とあるが、これは現在ワーキング・ツリー(/home/GITUSER/TESTSRCLIB ディレクトリ)にあるのはmasterブランチのファイルだという意味(現在チェックアウトされているブランチを指し示すのが HEAD)。
メンバーの修正とコミット
では、SEUを使用してメンバーを変更し、その変更をコミットしてみよう。Git環境に新しいブランチ new-world を作成し、このブランチで作業を行うことにする。
QP2TERM 画面でブランチを作成する。
>git branch new-world
$
>git branch -v
* master 52f838e 最初のコミット
new-world 52f838e 最初のコミット
new-worldが作成され、gitbranch -vでも存在していることがわかるが、ワーキング・ツリーに展開されているブランチ(HEAD ブランチ)は * が付いたブランチで、まだ master なので、gitchekuout コマンドでブランチを変更する。
>git checkout new-world
Switched to branch ‘new-world’
$
>git branch -v
master 52f838e 最初のコミット
* new-world 52f838e 最初のコミット
次に、5250画面でSEUを起動し、BCH010R のソースを修正しよう(図表9、図表10)。
BCH010Rに、上記コメント行を追加して変更を保存する。しかし、保存直後はTESTSRCLIB/QRPGSRC(BCH
010R) は変更されているが、Git管理下のディレクトリのBCH010R.RPGは何も変更されていないので、先程のCPYTOSTMF コマンドを実行して変更後のコードを上書きコピーする。
では、QP2TERM 画面でGitの状態を確認してみよう。
>git status
On branch master
Changes not staged for commit:
(use “git add <file>…” to update what will be committed)
(use “git restore <file>…” to discard changes in working directory)
modified: QRPGSRC/BCH010R.RPG
no changes added to commit (use “git add” and/or “git commit -a”)
QRPGSRC/BCH010R.RPG が修正されていることがわかる。どこが変更されたかは、gitdiff コマンドで確認可能だ。
>git diff QRPGSRC/BCH010R.RPG
diff –gita/QRPGSRC/BCH010R.RPG b/QRPGSRC/
BCH010R.RPG
index 9b0022b..ea9e608 100755
— a/QRPGSRC/BCH010R.RPG
+++ b/QRPGSRC/BCH010R.RPG
@@ -1,5 +1,8 @@
H****************************************
H*BCH010R得意先マスター一覧表
+ H*
+ H*コミット用にコメント行を追加
+ H*
H****************************************
H Y
H****************************************
左側の + は、その行が追加された行であることを表す。もし行が削除された場合は、左側には – が表示される。
ではコミットしてみよう。ステージング・エリアに追加するのを忘れずに。
>git add QRPGSRC/BCH010R.RPG
$
>git commit -m ‘コメント行を追加’
[new-world 52f838e] コメント行を追加
1 file changed, 1 insertion(+), 1 deletion(-)
ログも確認しておこう。
>git log
commit 52f838ecb948826178fdd399b8f443e1e8485c48 (HEAD -> new-world)
Author: Ogawa, Makoto <makoto@tat.jp>
Date: Sat May 25 16:35:30 2024 +0900
コメント行を追加
commit 411effeec81eb12a5d2353b8eb8634ac839217b0 (master)
Author: Ogawa, Makoto <makoto@tat.jp>
Date: Sat May 25 16:25:36 2024 +0900
最初のコミット
先ほどのログと見比べてほしい。最初のコミット直後はcommit 411effe…. に「(HEAD -> master)」と表示されていたが、2回目のコミットにより、最新のコミットにHEADが移動しているのがわかる。masterブランチは最初のコミットを指し、最新のコミットはnew-worldブランチという別のブランチで歴史が作られている(コミットのハッシュ値が異なる)。
>git branch -v
master 411effe 最初のコミット
* new-world 52f838e コメント行を追加