【SAP】NW AS ABAP Developer Editionで開発環境を作る（5）abapGitをインストール

##はじめに
この記事では、NW AS ABAP Developer EditionにabapGitをインストールして使ってみます。
社内環境だとこういったものを自由に試せない場合もあると思いますが、こういうときこそ個人の環境の使いどころですね。

＜関連記事＞
[【SAP】NW AS ABAP Developer Editionで開発環境を作る（1）](https://qiita.com/tami/items/031c8c8e12e24b467e75)

###abapGitとは
abapGitとは、ABAPで書かれたABAPのためのGitクライアントです（[abapGit – so easy](https://blogs.sap.com/2017/06/21/abapgit-so-easy/)より）。abapGitはオープンソースの[プロジェクト](https://github.com/abapGit/abapGit)で、有志によってメンテナンスされています。すでに6年も続いているそうです（[Devtoberfest Finalist Judging Webinar](https://www.youtube.com/watch?v=SxHD2P6kbLk&feature=youtu.be)より）。

###abapGitを使うと何ができるのか
**①ソースコードの管理**
Gitによるソースコードの管理ができます。1つのパッケージがabaiGitの1つのリポジトリになるので、業務領域ごとに１つの大きいパッケージを作るような運用は向きません。もっと細かい単位でパッケージを作成する必要があります。

**②オープンソースのABAPコードを自分の環境にコピー**
[ABAP Open Source Projects](https://dotabap.org/)というサイトにオープンソースのABAPプロジェクトが集まっています。「こんなツールあったらいいのに」という要望を、すでにかなえているプロジェクトがあるかもしれません。従来のコピー&ペーストだと、複数の開発オブジェクトを使用したツールを移植するのはなかなか大変ですが、abapGitを使えば一括でできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/317ef24a-1e64-4db8-0c17-d8becb267211.png)


**③オープンソースのプロジェクトに貢献する**
abapGitをはじめとするオープンソースのプロジェクトに改善点を見つけたら、プルリクエストを送ってマージしてもらうことができます。ちょっとハードルが高いですが。。。
手順は[こちら](https://docs.abapgit.org/guide-contributing.html)に書かれています。

以下ではabapGitが使えるように設定をしたのち、実際にabapGitを使用してみます。

##設定編
まずはabapGitが使えるように設定を行います。

＜ステップ＞
1. abapGit用のレポートプログラムを作成
2. SSLの設定

###1. abapGit用のレポートプログラムを作成
**1.1. [ソースコード](https://raw.githubusercontent.com/abapGit/build/master/zabapgit.abap)を以下のサイトからダウンロードし、`.abap`の拡張子で保存**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/680ae247-bb4f-4287-bf00-3c6acd7f81c9.png)

**1.2. レポートプログラムを作成**

- プログラム名:`ZABAPGIT_STANDALONE`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9e228dd0-b61c-1798-d704-4011b94b29eb.png)
- Utilities>More Utilities>Upload/Download>Upload...をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/e901de17-bb7c-0dda-7736-50ab672bfa26.png)
- ダウンロードしておいたabapファイルを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/2acd8e20-0853-f44c-21a0-86fa042ec846.png)
- ソースが取り込まれたことを確認し、保存、有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/a87622a7-f214-7c2f-067b-15c2df6014d1.png)
- プログラムを実行すると以下の画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/784f55c5-4113-a5da-dff6-827a5c16ae1f.png)

###2. SSLの設定
インターネット上にあるGitリポジトリとやりとりするためにSSLの設定が必要になります。

**2.1. 証明書をダウンロード**
以下はChromeの場合の手順です。それ以外のブラウザの場合は[こちら](https://docs.abapgit.org/guide-ssl-setup.html)を参照してください。

- ブラウザで`https://github.com/`を開く
- アドレスバーの鍵マークをクリックし、"Certificate"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/0729a44b-f7c8-f5c9-c478-13c2799e6c2d.png)
- 証明書の詳細タブを開き、「ファイルにコピー」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/7f0aa06a-f11a-634b-d493-8cf994806ab3.png)
- ウィザードに従って証明書をダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/f3e5113e-2089-4ca7-b9c0-87b8492c2a44.png)
- 証明書の種類は[手順](https://docs.abapgit.org/guide-ssl-setup.html)に特に指定されていなかったのでデフォルトのものを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/f3c077a6-444a-4d37-722e-79f2cf7add9a.png)
- ダウンロード先のフォルダとファイル名を指定（ファイルの拡張子は`.cer`とする）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/838d4a50-8d87-aa74-9166-72d9a9dd7d51.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/04f3c914-36be-014f-41f4-49d9e9f49fda.png)
- 証明書のポップアップに戻り、「証明のパス」タブを開く
- github.comの1階層上の証明書を選択し、「証明書の表示」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9f88ff26-10cf-c5a8-ede5-0daac58b669f.png)
- 上記と同様の手順で、ルート階層までの証明書をダウンロードする。結果、3つの証明書がダウンロードされる

**2.2. 証明書をABAPシステムにインポート**

- トランザクション：`STRUST`を実行
- 変更モードに切り替え（①）
- "SSL client SSL Client (Anonymous)フォルダをクリック（②）
- 証明書をインポート（③）
- "Add to Certificate List"をクリック（④）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/faa7fb89-993e-731a-19e4-8df14d974fb5.png)
- すべての証明書をインポートした結果は以下のようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/5021d401-946d-2f13-4a32-e8d4773480a4.png)

**2.3. 接続のテスト**
以下は任意のステップですが、GitHubへのSSL接続がうまくいっているかどうかテストすることができます。

- [接続確認用のソース](https://docs.abapgit.org/other-test-ssl.html)をコピーし、レポートプログラム`ZABAPGIT_TEST_SSL`を作成
- プログラムを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9ccd47de-3eff-ec30-0de5-900866324245.png)
- 接続がうまくいくと以下の画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/74ab61c4-940c-251b-e9d5-3e75486f64d9.png)

##使用編
abapGitを使用して以下のことをしてみます。

1. リモートリポジトリからソースをコピー
2. 自分のABAPソースをGitで管理する

###1. リモートリポジトリからソースをコピー
ここでは[abapOpenChecks](https://github.com/larshp/abapOpenChecks)というリポジトリをコピーします。abapOpenChecksはABAP Test Cockpit (ATC)で使用できるチェックのコレクションです。使用方法については別の記事で書きたいと思います。

**1.1. プログラム`ZABAPGIT_STANDALONE`を実行**

- New Onlineのリンクをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/23fd6896-4d70-7f98-781d-5e48bae74cfd.png)

**1.2. リモートリポジトリからソースをコピー**

- GitリポジトリのURLとパッケージ名を入力し、Create packageをクリック（移送対象としないので、$はじまりのパッケージ名にしている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/c5d134d9-cab6-1bb4-bc0a-60c4bffeade2.png)
- Short Descriptionを入力し、続行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/e5f2d509-d4d2-56e2-b7a9-8b5cb40e568f.png)
- Clone online repoをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/851656d4-7d30-ab72-6557-2b111bd6320e.png)
- リポジトリがからソースなどがダウンロードされる。Pullをクリックして取り込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/0b7fc65a-020a-f1a8-c0d1-63c1d9d16ec0.png)
- 数分待つと有効化のダイアログが出てくるので全て有効化する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9e361b7e-7bb5-f4a5-090e-8360fe1c1334.png)
- 以上で取り込みが完了。取り込んだクラスなどが使用できるようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/47c63e94-8142-d908-9f5f-2d193104a200.png)

###2. 自分のABAPソースをGitで管理する
＜流れ＞
2.1. Gitリポジトリを登録
2.2. パッケージを登録
2.3. Gitリポジトリとパッケージをひもづける
2.4. パッケージにオブジェクトを追加する
2.5. 変更をGitリポジトリに送る

**2.1. Gitリポジトリを登録**

- 先にmasterブランチを作成しておく必要があるので、READMEファイルを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/2e2c7fe3-c6c3-551d-0717-e8ec9a4815a1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/7ead0017-af73-65e2-1487-c0ba3034776f.png)


**2.2. パッケージを登録**
なぜかADTで登録できなかったので、トランザクション：`SE21`で登録（ステップ2.3.で登録してもよい）

- $はじまりのパッケージ名を入力し、Create
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/2f51a788-9bbd-e40a-8539-c5a5f2bed158.png)
- Short Descriptionを入力し、続行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/b46be6ef-c93e-4472-edf2-73054d4dc392.png)
- そのまま保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/c9177b51-8a6e-6565-d224-09c1f5c822bc.png)

**2.3. Gitリポジトリとパッケージをひもづける**

- プログラム`ZABAPGIT_STANDALONE`を実行し、ステップ1.2.と同じ要領でGitリポジトリとパッケージをひもづける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/7cb493ab-1eca-8048-9341-7d6048f15989.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/0b8fe5b9-d1ed-fd84-9b6b-7fb9c1da589a.png)

**2.4. パッケージにオブジェクトを追加する**

- ADTを開き、さきほど登録したパッケージにクラスを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/ad53c724-d975-fa6c-0248-bfe0ffff6db5.png)
※最近ADTをアップデートしたところ、登録画面でインターフェースを指定できるようになった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/4e10fb16-7009-50ee-dfc7-e7206b4eaf76.png)
- 以下の簡単なソースを作成し、有効化

```abap
CLASS zcl_abap_git_001 DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.

    INTERFACES if_oo_adt_classrun .
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.



CLASS zcl_abap_git_001 IMPLEMENTATION.
  METHOD if_oo_adt_classrun~main.

    out->write( |Hello abapGit!| ).

  ENDMETHOD.

ENDCLASS.
```

**2.5. 変更をGitリポジトリに送る**

- abapGitに戻ってRefreshボタンを押すと、追加したクラスが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/6b282ad5-5bdb-013a-6c9a-df6c28244422.png)
- Stageをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/8f20846c-ece4-f89e-a80f-428fac5f871e.png)
- Add All and Commitをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/bd67a853-e182-ca39-8a29-f785822ba5d2.png)
- Committerの名前、メールアドレス、コメントを入力してCommitをクリック
（この後GitHubのログイン情報を求められる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/2e1b1425-7290-ae21-fd99-7838dd566218.png)
- Commitが成功したメッセージが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9df57fd0-3a09-ec36-c8d5-0edf8287dafa.png)
- Gitリポジトリを見るとsrcフォルダなどが追加されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/3271221a-b2ba-32f4-f8d1-aa0f25edf32d.png)

通常Gitを使った流れはAdd -> Commit -> リモートリポジトリにPushとなりますが、abapGitではCommitした時点でPushもされました。つまり、ローカルでのコミットという概念はないのだと思われます。

##ここまででできたこと
- abapGitを使ったソースコード管理ができるようになりました。
- オープンソースのABAPプログラムをabapGitからダウンロードできるようになりました。

##参考
- [ドキュメント](https://docs.abapgit.org/)
- [abapGit – so easy](https://blogs.sap.com/2017/06/21/abapgit-so-easy/)
- [CTS is beautiful](https://blogs.sap.com/2020/11/05/cts-is-beautiful/)（abapGitはCTSの代わりではない、移送はCTSでやりましょうという話）