はじめに
ここではRocket Git for z/OSを利用する上での基本的な構成について見ていきます。
関連記事
z/OSにおけるGitの活用(1) - 概要
z/OSにおけるGitの活用(2) - Rocket Git構成
z/OSにおけるGitの活用(3) - Git活用例
Rocket Git構成例
インストール
参考: Program Directory for Rocket Git for z/OS 1.1.1 (GI13-4387-05)
ここではインストール手順の詳細は割愛しますが、他のプロダクトと同様SMP/Eでのインストールが可能です。実体としてはUSS上のファイルシステム上に各種ライブラリーが展開されることになります。
環境変数設定
参考:
Rocket Software Forum - Using git for z/OS with GitHub
DBB - Setting up Git on USS
Gitを使用するシェルで以下の環境変数を有効化します。
GIT_ROOT=/usr/lpp/Rocket/rsusr/ported
export GIT_SHELL=$GIT_ROOT/bin/bash
export GIT_EXEC_PATH=$GIT_ROOT/libexec/git-core
export GIT_TEMPLATE_DIR=$GIT_ROOT/share/git-core/templates
export PATH=$GIT_ROOT/bin:$PATH
export MANPATH=$MANPATH:$GIT_ROOT/man
export PERL5LIB=$PERL5LIB:$GIT_ROOT/lib/perl5
# These enable enhanced ASCII support
export _BPXK_AUTOCVT=ALL
export _CEE_RUNOPTS="FILETAG(AUTOCVT,AUTOTAG) POSIX(ON)"
export _TAG_REDIR_ERR=txt
export _TAG_REDIR_IN=txt
export _TAG_REDIR_OUT=txt
補足:
- GIT_ROOT: Rocket Gitがインストールされたディレクトリを指定します。
-
_BPXK_AUTOCVT: ガイドだと
ON
を指定している例がありますが、ALL
を指定することをおすすめします(ALL
だとUnicodeもサポートされるため)。
参考:
_BPXK environment variables
Configファイル作成
Gitを使用するユーザーのホームディレクトリ下にGit利用に関する設定を行っておきます。
※.gitconfigファイルはUTF-8で作成し、タグ付けしておくことをおすすめします(Jenkins連携の際に必要)。
.gitconfig設定例:
[user]
name = USER01
email = USER01@example.com
[http]
sslverify = false
[credential]
helper = cache --timeout=3600
補足:
- http.sslverify=false: SSL通信時の証明書検査を行わないよう設定
- credential.helper = chace --timeout=3600: パスワードを一定時間(3600sec)キャッシュする
参考: git reference - git-config
.gitattributes
GitHubなどのリモート・リポジトリでは基本的には各テキスト・データはUTF-8で保持することが一般的だと思われます。一方でz/OS上のローカル・リポジトリ(USS上)では、EBCDICコードページ(ibm-1047など)で保持したい場合が多いと思います。
テキスト・ファイルのエンコーディングは.gitattributes
ファイルで制御することができます。一般的にはプロジェクトのルートにこのファイルを配置し、そのプロジェクト配下にあるファイルの文字コード属性などを指定します。
取り扱う拡張子ごとに、ローカル・リポジトリ(z/OS USS上)とリモート・リポジトリ(Git Server上)の間でcodepageのマッピングを行う例を以下に示します。
# line endings
* text eol=lf
# file encodings
.gitattributes zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.cpy zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.cbl zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.txt zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.sh zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.jcl zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.log zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
参考: git reference - gitattributes
※注意!
.gitattributesに指定があるファイルの場合、変更/追加したファイルをgit add
(ステージング)する際は、そのファイルのタグ付け、文字コード指定は.gitattributesの指定に合わせる必要があります(不一致の場合git add でエラーになります)。
例えば、上のような.gitattributesの設定の場合、拡張子がtxt
のファイルはIBM-1047の指定をしておく必要があります。
NG例1: テキストとしてタグ付けされていないファイルをgit add
しようとした場合
TAGUCHI : /u/TAGUCHI/ISEConf2023_MySample01 : > ls -laT build/ | grep prop.txt
- untagged T=off -rw-r--r-- 1 TAGUCHI SYS1 115 Apr 22 07:49 prop.txt
TAGUCHI : /u/TAGUCHI/ISEConf2023_MySample01 : > git add build/prop.txt
fatal: can't add "build/prop.txt": file is untagged, set correct file tag
NG例2: .gitattributesとファイルの文字コードが違っているファイルをgit add
しようとした場合
TAGUCHI : /u/TAGUCHI/ISEConf2023_MySample01 : > ls -laT build/ | grep prop.txt
t IBM-1399 T=on -rw-r--r-- 1 TAGUCHI SYS1 115 Apr 22 07:49 prop.txt
TAGUCHI : /u/TAGUCHI/ISEConf2023_MySample01 : > git add build/prop.txt
fatal: can't add "build/prop.txt": file tag (IBM-1399) does not match its attributes (IBM-1047)
OK例: .gitattributesとファイルの文字コードを合わせてgit add
を実行
TAGUCHI : /u/TAGUCHI/ISEConf2023_MySample01 : > chtag -tc IBM-1047 build/prop.txt
TAGUCHI : /u/TAGUCHI/ISEConf2023_MySample01 : > ls -laT build/ | grep prop.txt
t IBM-1047 T=on -rw-r--r-- 1 TAGUCHI SYS1 115 Apr 22 07:49 prop.txt
TAGUCHI : /u/TAGUCHI/ISEConf2023_MySample01 : > git add build/prop.txt
TAGUCHI : /u/TAGUCHI/ISEConf2023_MySample01 : > git status
On branch wazi_test01
Your branch is up to date with 'origin/wazi_test01'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: build/prop.txt
CA証明書の設定
GitHubのリポジトリをクローンしようとすると、以下のようなエラーが出る場合があります。
$ git clone https://github.com/xxx/xxx.git
Cloning into 'Lightweight_Command_Utility_on_USS'...
fatal: unable to access 'https://github.com/xxx/xxx.git/': error setting certificate verify locations: CAfile: /opt/anaconda1anaconda2anaconda3/bin/ca-bundle.crt CApath: none
これは、HTTPS通信を行う際のGitHub側のサーバー証明書のチェックで信頼できるCA証明書が設定されていないことに起因するものです。先の設定例のように .gitconfig
にて http.sslverify
をfalseにするとチェックがされないのでエラーは回避できます。ただし、証明書の信頼性を真っ当にチェックしたいのであれば、ルート証明書を信頼できるものとして登録しておく必要があります。
例えば以下のような設定を行うことで証明書のチェックを正しく行わせることができます。
(1) 証明書チェーンの入手
手っ取り早いのはブラウザなどから入手する方法です。以下FireFoxでの例です。
Gitサーバー(以下の例ではGitHub)にブラウザからアクセスし、鍵マークをクリックします。
保存したファイルをテキスト・モードでUSS上の適当なディレクトリに配置します。
(2) CA証明書ファイルの指定
.gitconfigにて、http.sslverify = false
の代わりに以下のようにhttp.sslCAInfo
パラメーターで上で取得したpemファイルを指定します。
...
[http]
proxy = socks5h://127.0.0.1:9901
sslCAInfo = /u/cics004/Git/github-com-chain.pem
...
これで証明書のチェックが正しく行われてエラーが回避されるはずです。
Proxy構成例
z/OSは開発環境であってもセキュアなネットワーク上に配置されていることもあり、ネットワーク構成上外部との接続が難しい場合もあります。例えば特定のポートのみ外部からの接続は受付けるが、z/OSから外部へのコネクションは制限されている、というようなケースはあるかと思います。
GitServerに接続可能なLinuxマシンをSSHトンネリングと合わせ技でProxyとして設定する例を紹介します。
Gitクライアントを使用したいz/OSと、インターネット上のGitHubの両方に接続可能なLinuxマシンがある想定です。また、z/OS上にはSSHDが構成されておりLinuxマシンからSSH接続かつポートフォワードが可能な状態を想定します。このような環境でLinuxマシンをProxyとしてz/OS上のGitクライアントから外部のGitHubにアクセスする構成をしてみます。
イメージとしては以下の通りです。
Proxyとして使用するLinux上ではSSHクライアントが使えればOKです。他に追加で必要なコンポーネントは特にありません。
Linuxからz/OSに対して以下のsshコマンドを発行してポートフォワードの設定を行います。
#!/bin/bash
export proxyPort=9901
export sshUser=user01
export sshAddress=zos01
ssh -f -N -R ${proxyPort} -o "StrictHostKeyChecking no" -o "ServerAliveInterval=60" -o "ServerAliveCountMax=3" ${sshUser}@${sshAddress}
補足:
- proxyPort: z/OS側でListenするポート番号(任意)
- sshUser: SSH接続する際に使用するユーザー
- sshAddress: SSH接続する際の宛先(z/OS側)アドレス
このスクリプトを実行することで、Linuxからz/OSにSSH接続が行われ、9901番ポートがz/OS側でListenされます(9901番ポートへのリクエストがProxy経由で外部アクセスできるようになります)。
z/OS上のGitの構成として、.gitconfigで以下のようにProxyを設定します。ポート番号は上で指定したポート番号(proxyPort)に合わせる必要があります。
...
[http]
proxy = socks5h://127.0.0.1:9901
...
これでgitの操作を行うとProxy経由でGit Serverにアクセスできるようになります。
※技術的にはこのような構成もできます、ということですが、セキュリティー・ポリシーとして許されるかどうかは環境によりますのでご注意ください。
Gitコマンドメモ
Local Repository初期化
git init
Local Repositoryステータス確認
git status
Remote Repositoryの情報追加
git remote add origin https://github.com/xxxx/xxx.git
Remote Repositoryの情報確認
git remote -v
ブランチ名をmainに変更
git branch -M main
ブランチ作成&切り替え
git checkout -b new_branch
ブランチ情報確認
git branch
クローン作製 (Remote Repository => Local Repository)
git clone https://github.com/xxxx/xxx.git
リモート・リポジトリの変更情報取り込み
git pull origin main
全変更をステージング
git add .
ステージングされた変更をコミット
git commit -m "comment"
変更内容をRemote Repositoryに反映
git push origin main