[SAP BTP 開発管理・DevOps 入門] 海外チュートリアルをStep by Stepで解説する（デプロイ&CI/CD編）

# はじめに

本記事は｢[[SAP BTP 開発管理・DevOps 入門] 海外チュートリアルをStep by Stepで解説する](https://qiita.com/Yanagawa_Yoshihisa/items/bd8076260aab97fedf28)｣の1項目の説明をなります。全体を把握した方はまずは、こちらをご確認下さい。

また、本記事は概要把握や個人とトライアル利用の参考として、まとめたものなので、プロジェクトでの利用の際は、SAP社への問合せの実施や正式情報である[Help Portal](https://help.sap.com/docs/)を活用して下さい。

# 本記事の対象範囲
- この記事では、チュートリアルに必要なBTP上の開発環境（Sub-account）を作成し、必要なサービスを有効にします。その後、統合開発環境（**SAP Business Application Studio (BAS**)）で｢**SAP Cloud Application Programming Model**（CAP）｣アプリケーションを作成し、それを｢**GitHub**｣に連携します。そして、｢**GitHub**｣への連携を「**Continuous Integration & Delivery**」が検知し、BTPの開発環境に相当するCloud Foundry環境にアプリケーションを自動でデプロイします。

# Step by Step解説
## 動画2: Getting Started

### 概要
この動画では、チュートリアルのベースとなる環境の設定を実施しています。Trial環境を利用する場合は、環境構築時にあらかじめいくつかの設定が実施されているため、不要な手順も存在していることに注意してください。BTPの環境全体がつかめていない方は、「[SAP Business Technology Platform (BTP) のインフラ概要](https://qiita.com/Yanagawa_Yoshihisa/items/073dc9723c50f463d2a6)」をご確認ください。

下記が今回のチュートリアルで準備している環境のイメージです。

黄色がBTP上でのオブジェクト（概念）、ピンクが設定しているオブジェクトの名称、オレンジが対応するYouTubeのチャプターを意味しています。

![スクリーンショット 2023-04-01 11.37.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/53356866-66ed-1545-5a0c-837fc4d54493.png)


### 動画

[BTP DevOps: Getting Started](https://www.youtube.com/watch?v=fvqzVMrVx1s&list=PLkzo92owKnVybjwraUeSsMip0YTQnq013&index=2)

### 詳細説明

1. Introduction
2. Create subaccount（Trialの場合不要）
    1. チュートリアル実施対象の｢**Global Account**｣に開発環境に相当する、「**Subaccount**」を`dpedev`という名称で作成します。Trial活用時は初期より`trial`という「**Subaccount**」が既に作成されています。
    2. 「Sub-account」の概念がわからない方は、「[SAP Business Technology Platform (BTP) のインフラ概要-BTPの環境の考え方](https://qiita.com/Yanagawa_Yoshihisa/items/073dc9723c50f463d2a6#btp%E3%81%AE%E7%92%B0%E5%A2%83%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9)」を確認してください。
3. Enable Cloud Foundry (org) and create space（Trialの場合不要）
    1. ｢**Cloud Foundry Environment**｣を有効化します。（Cloud Foundryになじみの無い方は、アプリの実行環境を有効化しているようなイメージをもって頂ければと思います。）`dpedev`という｢**Cloud Foundry Organization**｣が作成されています。Trial環境では`XXXXXXtrial`が既に作成されています。
    2. その後、｢**Cloud Foundry Space**｣を作成します。（Cloud Foundryになじみの無い方は、アプリを動作させる部屋のような概念を作っているとイメージして下さい。チュートリアルでは`dev`という名称の**Space**を作成しております。Trial環境でも`dev`が既に作成されています。
4. Entitlements (add 9 service plans)（Trialの場合不要）
    1. 「**Subaccount**」に｢**Entitlements**｣を割り当てます。「**Subaccount**」で利用できるサービス(**Entitlements**)を指定しているイメージです。Trial環境では利用可能なすべての｢**Entitlements**｣が「**Subaccount**」に割当あらかじめ割当られているため不要です。
    2. こちらに関しても、｢**Entitlements**｣の概念がわからない方は、｢[SAP Business Technology Platform (BTP) のインフラ概要-BTPの環境の考え方](https://qiita.com/Yanagawa_Yoshihisa/items/073dc9723c50f463d2a6#btp%E3%81%AE%E7%92%B0%E5%A2%83%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9)｣を確認して下さい。
5. Subscriptions（Trialの場合不要）
    1. BTP上の開発ツールである**BAS**を有効化（Subscriptions）します。これによりBTP上で、BASが利用できるようになります。
6. Assign role collection（Trialの場合不要）
    1. BASを利用するために必要な権限（Role Collection）を付与します。権限の概念については｢[SAP Business Technology Platform (BTP) のインフラ概要-BTPの環境の考え方](https://qiita.com/Yanagawa_Yoshihisa/items/073dc9723c50f463d2a6#btp%E3%81%AE%E7%92%B0%E5%A2%83%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9)｣を確認して下さい。
7. Create SAP HANA Cloud instance
    1. 後続の作業で利用するDBサービスである｢HANA Cloud｣のインスタンスを作成します。
    2. ここでチュートリアルでは｢Connections｣の設定を`Allow only BTP IP addresses`としているのですが、Trialの不具合なのかこの設定のままだと、後続のアプリケーションをデプロイするステップでエラーとなります。よってここを`Allow all IP addresses`にしてください。すべてのIPからアクセス可能になり、セキュリティ的には望ましくないので、チュートリアルの一連の作業が終わったら、戻すようにしてください。
8. Recap

### 環境理解のポイント

BTP上のサービスは上の図にも示されるように｢Subscription｣と｢Instance｣という考え方があります。

｢Subscription｣は｢Cloud Foundry Environment｣とは別の次元で動いているアプリケーションで、BTP上で単独でサービスが稼働しているようなイメージです。BASなどはこちらに相当します。

｢Instance｣は｢Cloud Foundry Environment｣に存在するアプリケーションの稼働環境で｢Cloud Foundry Space｣上で稼働します。

慣れないうちは、ごっちゃにしてしまいがちですが、Cockpit上も明確に区別されているため、意識してチュートリアルを実施するようにしましょう。これらの違いにより、挙動だったり、運用のコツなどが違ってきます。

![スクリーンショット 2023-04-01 11.48.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/f86c6e75-b72f-e994-0940-07e8ef56c3c5.png)

## 動画３: Develop Application

### 概要

この動画では、**BAS**を用いてTemplateより｢**SAP Cloud Application Programming Model（CAP）**｣のアプリケーションを作成します。そのアプリケーションと事前に準備した｢**GitHub Repository**｣を連係し、GitHubにプッシュします。

GitHubの基礎知識が必要になるため、用語等に馴染みのない方は、インターネット等で調べて、わからないことは学習するようにしましょう。

下記が今回のチュートリアルで実施している作業のイメージです。

黄色がBTP上でのオブジェクト（概念）、ピンクが設定しているオブジェクトの名称、オレンジが対応するYouTubeのチャプターを意味しています。

![スクリーンショット 2023-04-01 11.51.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/59082369-3dc3-e6b8-5ee3-eadaf4c917ac.png)


### 動画

[BTP DevOps: Develop Application](https://www.youtube.com/watch?v=FGLNJyEC-ow&list=PLkzo92owKnVybjwraUeSsMip0YTQnq013&index=3)

### 詳細説明

1. Introduction
2. GitHub Repository
    1. ソースコード管理システムである｢**GitHub**｣にアプリの保管領域である｢**GitHub Repository**｣を作成します。｢**GitHub**｣のアカウントを保持していない方はあらかじめ取得しておいて下さい。
    2. チュートリアルでは`app`という名前の｢**GitHub Repository**｣を作成します。この際、リポジトリには固有のアドレスが付与されます。
3. Create SAP Business Application Studio workspace Full Stack Cloud Application
    1. BASの作業領域に相当する「**Dev Space**」を作成します。作成時には「Template」の選択が可能であり、チュートリアルではCAPのアプリケーションを作成するために「Full Stack Cloud Application」を選択し、`dev`という名称を付けます。これにより、「CAP Tools」などのツールセットが「**Dev Space**」に組み込まれます。
4. Clone Git Project
    1. ツールセットだけが組み込まれた空っぽの状態の「**Dev Space**」に対して、オリジナルのコードを構築する準備をします。今回は「**GitHub**」からのクローンを実施します。（通常は、GitHub上に何らかのコードがあり、それをBASに取り込む際に使うのですが、今回においては「Gitのリポジトリ」が空なので、「app」というほぼ空のリポジトリがコピーされます。）
    2. (オプション) チュートリアルでは、簡素化のために「**GitHub Repository**」作成の際に、Public（公開）でリポジトリを作成しているため、認証の実施がされません。（アドレスを知っていれば誰でもアクセス可能です。）通常は、Privateで「**GitHub Repository**」を作成しします。その場合は、クローン時にユーザIDとパスワード（もしくはトークン）を求められます。
5. Login to Cloud Foundry
    1. この状態ではBASの「**Dev Space**」はローカル環境であり、どこにも接続していません。今後、アプリを作成する際にはデプロイ先が必要になりますが、ここではそのデプロイ先のCloud Foundry環境を指定しています。まず、CF環境の｢**API Endpoint**｣を指定します。（｢**API Endpoint**｣がチュートリアルと現在のTrial環境では異なっていることに注意してください。Cockpitからご自身の｢**API Endpoint**｣を確認しましょう）誰でも環境にログインできてしまうと困るので、ここで認証が必要になります。（認証はTrial環境にログインする際のIDとパスワードを利用します。）
6. Launch Template Wizard
    1. 次にアプリを作成するための｢**Generator**｣をインストールします。ゼロからアプリを作るのは大変なので、ガイダンスにてアプリの要件を入力し、アプリのひな形を作成してくれるものが｢**Generator**｣です。チュートリアルでは`generator-saphanaacademy-cap`という｢**Generator**｣を選択します。
7. Configure Project and enable CI/CD
    1. 作者が作った「**Generator**」に必要な情報を入力して、アプリを生成します。設定を変更する箇所としては、アプリが接続するバックエンドのAPIとしてNASAによって公開されているAPIを使用します。また、後続で「**Continuous Integration & Delivery**」を利用するため、該当箇所を「Yes」に変更します。これにより、`.pipeline`フォルダが作成され、起動する際のパラメータ情報が記載された`config.yml`が作成されます。
8. Configure Project and enable CI/CD
    1. 生成したアプリをGitに転送します（Pushします）。Pushする前に、変更内容を確認し、該当の変更を転送するために確認（Commitし）、それにコメントをつけます。Gitのお作法がわからない方は各自基本を調べてください。
    2. 誰でもコードを変更されると困るので、ここで認証がかかります。よって、次に認証の対応をします。認証の際にIDとともに回答する情報は、パスワードかトークンですが、本件ではトークンを利用するため、GitHubのIDに対するトークンの発行をしています。このトークンは発行時しか確認できないので、忘れずに控えておいてください。
    3. Git側のブランチ（名称）がチュートリアルでは`master`になっていますが、GitHubのルールの変更により現在は`main`となっています。
9. Recap

## 動画４: Continuous Integration & Delivery

### 概要

動画では、｢**Continuous Integration & Delivery**｣の環境を構築し、GitHubへのコードのPushを｢**Continuous Integration & Delivery**｣が検知し、ソースコードを取得後、Cloud Foundry環境にCAPアプリケーションをDeployするための一連の設定を実施しています。

下記が今回のチュートリアルで実施している作業のイメージです。

黄色がBTP上でのオブジェクト（概念）、ピンクが設定しているオブジェクトの名称、オレンジが対応するYouTubeのチャプターを意味しています。

チャプター10では、PushからDeployの作業が｢**Continuous Integration & Delivery**｣により、Cloud Foundry Environment上にInstanceとApplicationがDeployされます。

![スクリーンショット 2023-04-01 11.55.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/347859d8-0c09-b2cf-9f03-f9940807c45c.png)


### 動画

[BTP DevOps: Continuous Integration & Delivery](https://www.youtube.com/watch?v=1K8zwUy2dxc&list=PLkzo92owKnVybjwraUeSsMip0YTQnq013&index=4)

### 詳細説明

1. Introduction
2. Subscribe to Continuous Integration & Delivery
    1. ｢**Continuous Integration & Delivery**｣を有効化（Subscription）します。
3. Assign role collection
    1. 有効化により、「**Continuous Integration & Delivery**」を利用するために必要なロールコレクションが作成されるため、それを自身のユーザにアサインします。
4. Assign role collection
    1. ｢**Continuous Integration & Delivery**｣にログインします。
5. Add repository
    1. 「**Continuous Integration & Delivery**」に自分で作成したGitHubの情報を登録します。登録場所はに「**Continuous Integration & Delivery**」存在する｢**Repository**｣というオブジェクトです。（GitHubをPublicで作成しているため、「Credential」は不要です）
6. Configure Webhook
    1. GitHubにソースコードがプッシュした際に、その情報を「**Continuous Integration & Delivery**」に連係するための準備をします。
    2. ｢**Repository**｣の作成の際に「**Webhook**」を受け入れるための認証が「**Continuous Integration & Delivery**」に作成されます。（「**Credentials**」にTypeが`Webhook Secret`のレコードが作成されています。）この情報をもとに、GitHubのRepositoryに「**Webhook**」を追加し、認証情報を入力します。これにより、GitHubに変更があった際に、変更した旨の情報が「**Continuous Integration & Delivery**」側に連携されます。
7. Add job
    1. 次にデプロイ作業を実施するための｢**JOB**｣を作成します。｢**JOB**｣に取得すべきリポジトリとブランチを指定し、デプロイするアプリの種類は｢CAP｣を指定します。チュートリアルでは｢**JOB**｣の名称を`app`としています。
8. Pipeline settings
    1. `.pipeline`の`config.yml`の内容を確認します。
9. Add credential for technical user
    1. 「**Continuous Integration & Delivery**」からCloud FoundryにアプリケーションをデプロイするためにCloud Foundryの認証を受ける必要があります。そのための認証情報を｢**Credentials**｣に登録します。チュートリアルでは、デプロイ用のユーザをテクニカルユーザとして別途準備していましたが、Trial環境の際は、自身のユーザを登録するようにして下さい。
    2. デプロイに必要な情報は、ソースコード上にすべて記載されています。ただし、認証の情報はソースコード上にセキュリティの観点から記載することは適切では無いため、｢**Credentials**｣に登録しています。ソースコード上は`deploy-to-cf`を使うということが記載されているため、名称はこの名称を利用します。
10. Add technical user as member to Cloud Foundry space（Trialの場合不要）
    1. テクニカルユーザを用いた場合は、Cloud Foundry spaceを操作する権限が、テクニカルユーザに付与されている必要があるため、付与を実行しています。Trial環境で自身のユーザを設定した場合は、既に権限が付与されているため、対応は不要です。
11. Commit and push to trigger app deployment
    1. コードの一部を変更し、GitHubにPushします。これにより、GitHub側で｢**Webhook**｣が起動し、｢**Continuous Integration & Delivery**｣に変更を通知します、それを受け｢JOB｣が起動し、ソースコードの受け取り、デプロイ作業を実施します。
    2. この際、HANAのDBが停止していると、エラーとなるため、停止してる場合は稼働させるようにして下さい。（リソース負荷を下げるための使用していないと停止されます。）
12. Cloud Foundry services and applications
    1. Cloud Foundry Spaceにアプリケーションが構築されていることを確認します。
13. Assign role collection to business user
    1. 作成したアプリは認証が必要な仕様となっています。そのために、アプリのアクセスに必要なロールコレクションをユーザに付与します。
14. Run app
    1. アプリにアクセスし、動作することを確認します。
15. Recap

# 最後に
つぎは、[[SAP BTP 開発管理・DevOps 入門] 海外チュートリアルをStep by Stepで解説する（Transport Management編）](https://qiita.com/Yanagawa_Yoshihisa/items/ca595356010daeb59977)です。