GitHub Actionを使ってBTPにMTAアプリをデプロイする

## はじめに
以前作成したこちらのUI5アプリを今も活用しているのですが、BTPのトライアルアカウントで実行しているため、3か月ごとに新しいアカウントにデプロイしなおす必要があります。

https://qiita.com/tami/items/ee31d5528628748dc262

ターミナルからデプロイしてもよいのですが、[GitHub Actions](https://docs.github.com/en/actions)を使ってボタン1つでデプロイできるようにしてみました。

**※当記事で作成したワークフローはほとんど、以下のブログを参考にしています**

https://community.sap.com/t5/technology-blogs-by-members/devops-cap-ci-cd-with-github-actions/ba-p/13471172

## ワークフローの作成
プロジェクトのルートディレクトリに以下の構成でディレクトリとファイルを作成します。deploy.ymlのファイル名は何でも構いません。

```
.github
└── workflows
    └── deploy.yml
```

deploy.ymlの中身は以下のようになっています。プロジェクトをビルドし、Cloud Foundryにデプロイするだけのシンプルなワークフローです。
```yaml:deploy.yml
name: Deploy
on: workflow_dispatch

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3     
       
      - name: Setup Node.js environment
        uses: actions/setup-node@v4
        with:
          node-version: 20 

      - name: Install MTA Build tool
        run: npm install -g mbt

      - name: Install dependency
        run: npm install

      - name: Build MTA
        run: mbt build -p cf -t mta_archives --mtar mta.tar

      - name: Upload Artifact
        uses: actions/upload-artifact@v4
        with:
          name: mta
          path: ./mta_archives/mta.tar

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Download Artifact
        uses: actions/download-artifact@v4
        with:
          name: mta
          path: ./

      - name: Deploy to Cloud Foundry
        uses: miyasuta/cf-cli-action@master
        with:
          cf_api: ${{ vars.CF_API }}
          cf_username: ${{ secrets.CF_USER }}
          cf_password: ${{ secrets.CF_PASSWORD }}
          cf_org: ${{ vars.CF_ORG }}
          cf_space: ${{ vars.CF_SPACE }}
          command: deploy ./mta.tar
```

### ワークフローの説明
#### buildジョブ
- `on: workflow_dispatch`: マニュアルでワークフローを起動したときに実行されるように設定しています。リモートリポジトリにプッシュしたときに動かしたい場合は"push"イベントを指定します。複数イベントを指定することも可能です。（参考：[Events that trigger workflows](https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows)）
- `run: mbt build -p cf -t mta_archives --mtar mta.tar`: ビルドするときにmtarに"mta.tar"とジェネリックな名前を指定しています。このため、このワークフローは他のプロジェクトでもそのまま使用可能です。

#### deployジョブ
- `uses: miyasuta/cf-cli-action@master`: Cloud Foudnry CLIを実行するためのアクションです。参考にしたワークフローでは[guerric-p/cf-cli-action](https://github.com/Guerric-P/cf-cli-action)を使用していたのですが、使用しているCloud Foudnry CLIのバージョンが低いため警告が出ており、cf deployコマンドも使えない状態でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/cbd4264c-3d34-02af-b6b7-f3285e962dfa.png)

そこで、guerric-p/cf-cli-actionの[元になったリポジトリ](https://github.com/citizen-of-planet-earth/cf-cli-action)をforkし、インストールするCF CLIのバージョンを上げたところ、デプロイができるようになりました。残念ながら元のリポジトリは4年ほど前からメンテナンスが止まっているようです。

変更内容
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/8a76beb2-0c45-fd3d-269b-c73ab3c2b485.png)

### 実行準備
Deployステップで使用する変数、およびシークレットをリポジトリに登録します。

```yaml:Deployステップで使用している変数、シークレット
      - name: Deploy to Cloud Foundry
        uses: miyasuta/cf-cli-action@master
        with:
          cf_api: ${{ vars.CF_API }}
          cf_username: ${{ secrets.CF_USER }}
          cf_password: ${{ secrets.CF_PASSWORD }}
          cf_org: ${{ vars.CF_ORG }}
          cf_space: ${{ vars.CF_SPACE }}
          command: deploy ./mta.tar
```

Settings > Secrets and variables > Actionsから登録します。

Secretsタブで以下を設定します。
- **CF_USER**: Cloud Foundryのログインユーザ
- **CF_PASSWORD**: Cloud Foundryのログインパスワード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/3f7361da-1425-5c2e-411a-767e4725b0d3.png)

Variablesタブで以下を設定します。
- **CF_API**: デプロイ先のCloud FoundryのAPI
- **CF_ORG**: デプロイ先のCloud Foundry組織
- **CF_SPACE**: デプロイ先のCloud Foundryスペース

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/c25e8bba-ca60-a0e2-6622-ac0d405c59b6.png)

すべてシークレットにしてもよかったのですが、秘密にしたい情報とそうでない情報を分けてみました。新しいトライアルアカウントに変わったときは、Variablesの情報だけ設定し直せばOKです。

### ワークフローの実行
"Actions"タブから"Deploy"ワークフローを選択して実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/f62003b4-ec56-4a8a-796e-b83079edb28d.png)

デプロイが成功すると以下の状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/0789c42d-b017-1386-e46f-7809be6e5f07.png)

"deploy"ジョブをクリックすると、デプロイ時のログが見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9f3be2a1-dea4-306a-671a-bfe3183b7681.png)

## おまけ
ワークフローを定義したymlファイルですが、構文エラーがあってもデプロイしてみないと気づくことができません。[actionlint](https://github.com/rhysd/actionlint/blob/main/docs/usage.md#docker)というツールを使うと、開発環境で構文をチェックすることができます。使い方は簡単で、プロジェクトのルートディレクトリで以下のコマンドを実行するだけです（Dockerが必要）。

```
docker run --rm -v "$(pwd):$(pwd)" -w "$(pwd)" rhysd/actionlint:latest
```

参考：[GitHub CI/CD実践ガイド――持続可能なソフトウェア開発を支えるGitHub Actionsの設計と運用](https://www.amazon.co.jp/GitHub-CI-CD%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89%E2%80%95%E2%80%95%E6%8C%81%E7%B6%9A%E5%8F%AF%E8%83%BD%E3%81%AA%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%82%92%E6%94%AF%E3%81%88%E3%82%8BGitHub-Actions%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A8%E9%81%8B%E7%94%A8-%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E9%81%B8%E6%9B%B8/dp/4297141736) - p76