z/OSにおけるGitの活用(1) - 概要

# はじめに
z/OSでの開発、運用など様々な場面でオープン系と同じような仕組みが使えるようになってきています。このシリーズではz/OS上のリソースをGitで管理する方法について見ていきたいと思います。

## 関連記事

[z/OSにおけるGitの活用(1) - 概要](https://qiita.com/tomotagwork/items/ea5b1ec89dd8d32c655d)
[z/OSにおけるGitの活用(2) - Rocket Git構成](https://qiita.com/tomotagwork/items/a13c0969f88fe804ebc6)
[z/OSにおけるGitの活用(3) - Git活用例](https://qiita.com/tomotagwork/items/4770b8ba9052463e8a68)



# 一般的なGitについて

## Git概要
Gitについての情報は世の中に出回っているのでここで今更記述することでもないのですが、馴染みのないメインフレーム担当者向けに一応最低限抑えておいた方がよい概要について触れておきます。
Gitとは、オープン系のプロジェクトでよく用いられる、プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理の仕組みです。並行開発、複数バージョン管理、変更履歴の共有などが容易に行える仕組みを提供してくれます。ソースはRemote Repositoryで一元管理され、編集時はLocal Repositoryにコピーして作業するという流れが特徴的です("分散型")。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9c7d5059-82ec-6992-c896-62d0a34d0c94.png)

分散型ということで主にサーバー側(Remote Repository側)の機能を提供するコンポーネントと、クライアント側(Local Repository側)の機能を提供するコンポーネントに分かれます。
Gitのサーバー機能を提供するものとしてはGitHub、GitLabなどがあります。Gitサーバーの機能としては、Web上で提供されるサービスを利用することもできますし、あるいはオンプレ環境にサーバーを構築することもできます。
開発作業などを行うPC側(Windows, Mac, Linuxなど)ではGitクライアント機能を使用してソース管理を行うことになります。GitクライアントではLocal Repositoryの管理やRemote Repositoryとのやり取りを行うためのコマンドなどが提供されます。Gitクライアント機能はVS CodeやEclipseなどIDEのプラグインとしてしても提供されています。

IDEだけでなくJenkinsやAnsibleなど多様なツールでGitと連携するプラグインが提供されているので自動化の仕組みに利用しやすく、GitはDevOpsの中心的な位置づけとなっています。

## Gitの基本操作

Git上に管理されているファイルを編集する際によく利用されるオペレーションを図示してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ba0185cc-9273-9b3d-0946-48c4922fb6e7.png)



# z/OSにおけるGitの位置づけ

## z/OS版Git

z/OS版のGitクライアントとして以下のものが提供されていますので、これを利用することで外部のGitサーバー上に管理されているリソースをz/OSから扱うことができます。

**(1) Rocket Software社提供 Git on z/OS (Rocket Git)**
Rocket Software社はRocket Open AppDev for Zというツール群を提供しています。
z/OS上で利用できるGitクライアント機能をOSSとして提供してくれています。
参考: [Rocket Open AppDev for Z](https://www.rocketsoftware.com/products/rocket-open-source/rocket-open-appdev-z)
これはメインフレームのアプリケーション開発をサポートする各種ツールをまとめて提供しており、ここにz/OS版のGitクライアント機能が含まれています。

このRocket Gitは、IBMの有償製品であるDBB(Dependency Based Build)にもバンドルされて提供されています。また、z/OSをエミュレートする製品であるZD&TやWazi as a Serviceなどで提供されるz/OS環境には、このRocket Git(+DBB)が既にインストールされた状態で提供されます。

参考: [IBM Elite Support for Rocket Software Git for z/OS helps optimize value of mainframe development with modern source code management](https://www.ibm.com/common/ssi/ShowDoc.wss?docURL=/common/ssi/rep_ca/2/897/ENUS219-032/index.html&request_locale=en)

**(2) z/OS Open Tools - Git on z/OS**
z/OS Open Tools Communityが進めている、z/OS上で稼働するOSSを提供するプロジェクトがあります。この中でGitクライアント機能を提供するGit on z/OSが提供されています。
参考: 
[z/OS Open Tools](https://zosopentools.link/docs)
[Git on z/OS](https://github.com/ZOSOpenTools/gitport)

※当シリーズ記事はRocket Gitを使用して試した結果を元に記載していきます。

## USSの利用

これらz/OS版のGitクライアントは、USS(Unix System Service)上で稼働することになります。Local RepositoryはUSS上のディレクトリ/ファイルとして管理され、Remote Repository(GitHub/GitLabなど)とのやり取りを行うことになります。

z/OS版Gitを利用する場合のイメージは以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ef10bccd-6e19-e96d-309e-d0f83a61f6ef.png)

このようにz/OS上で直接的にGitを使う形態では、PCからはUSSに接続してUSSのシェルでGitのコマンド操作(clone, commit, pushなど)を行うことになります。z/OS上のファイルの"編集"という意味ではVS CodeやEclipseのエディターを使用する方法が色々と提供されてきていますが、Git操作についてはシェルでのコマンドを使用する必要があるのが現状です。

その辺りはPC上で既に提供されているVS CodeやEclipseなどのGitのプラグインが使えるとよいですが、そうするとLocal Repositoryは各ユーザーのPC上で管理されるということになります。
オープン系アプリケーションの開発であれば、言語がJava、Node.js、Pythonなどで、開発するPCと実行環境(Linuxなど)との間でCPUアーキテクチャーによる差異が少なく、単体テストレベルではPCだけでできてしまうので、PCだけである程度の開発が完結します。
一方でz/OSアプリケーションの開発では、言語としてはCOBOL、PL/I、アセンブラーなどが主であり、コンパイル/リンク、単体テストなどはPC上で行うことができません。ここがオープン系の開発とz/OSアプリの開発で大きく異なるポイントです。
そこで、Gitの管理やソース編集はPC上で行い、ビルド(コンパイル/リンク)や単体テストの部分だけはz/OS環境を利用する、という形態も考えられます。以下のようなイメージになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/09403593-737a-2cf0-e3e3-309f0d70d115.png)

つまり、z/OSでGitを利用する形態としては大きく分けると以下の2つのパターンが考えられます(あとはこれらの応用ということになるかと思います)。

- Rocket Gitのようなz/OS上で稼働するGitクライアントを直接使用する形態
- PCなど他プラットフォームのGitクライアントを使って間接的にGitを活用する形態

上の図のイメージはアプリケーション開発を意識した図になっていますが、運用系のJCLをGitで共有したり、JenkinsやAnsibleなど自動化の仕組みと連携したり、様々な活用の場面が考えられます。いずれの形態においてもUSSが利用されるというのが重要なポイントとなります。つまり、アプリケーション開発者や運用管理者がGitを活用できるようなインフラを整える場合は、USSの運用管理というのが必須となってきます。

USSの利用については以下の記事もご参照ください。
[z/OS技術者が学ぶべきオープンな技術～USSの活用～](https://qiita.com/tomotagwork/private/1d9c693352d6f0ee3c88)

以降の記事では具体的にGitを利用する方法を見ていきたいと思います。