CI/CD パイプラインの構築: GitHub Actions で自動化の流れを整える 🔄🛠️

この章では、開発の生産性を飛躍的に向上させる CI/CD パイプラインの構築方法に焦点を当てます。GitHub Actions を利用して、コードの自動テスト、ビルド、デプロイメントプロセスを設定する手順を詳細に説明します。読者は、プルリクエストのたびに自動で実行されるユニットテストや、マージ後の自動デプロイメントフローの構築に必要な YAML ファイルの書き方を学びます。この章を通じて、安定したリリースサイクルを保証し、サーバーレスアプリケーションの品質を維持するための最良の実践を習得することができます。

## Google Service Account キーを Github Secret へ登録する

以下のコマンドを実行し、Google Service Account キーをダウンロードします。

```bash
skeet iam pull
```

`./keyfile.json` というファイルが生成されます。

次に以下のコマンドを実行し、Github Secret へ登録します。

```bash
skeet iam sync
```

これで、Github Secret への登録が完了しました。

## Github リポジトリの作成、コミット

以下のコマンドを実行し、Github リポジトリを作成、コミット、プッシュします。

```bash
skeet add ghActions
```

Github Actions を確認すると、

![](https://storage.googleapis.com/zenn-user-upload/569b90a1ffe7-20231116.png)

無事にデプロイが成功しています。

## Github Actions の設定

`.github/workflows` ディレクトリに、以下のファイルが生成されます。

```yml
name: Skeet
on:
  push:
    branches:
      - main
    paths:
      - 'functions/skeet/**'
      - '.github/workflows/functions-skeet.yml'

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v2
      - name: Install Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '18.18.1'
      - id: auth
        uses: google-github-actions/auth@v0
        with:
          credentials_json: ${{ secrets.SKEET_GCP_SA_KEY }}
      - name: Install yarn and firebase tools
        run: npm i -g npm yarn firebase-tools
      - name: GitHub repository setting
        run: git config --global url."https://github.com".insteadOf ssh://git@github.com
      - name: Install dependencies
        run: cd ./functions/skeet && yarn install --frozen-lockfile
      - name: Build App
        run: cd ./functions/skeet && yarn build
      - name: Deploy to Firebase
        run: firebase deploy --only functions:skeet
```

この workflow のアプリの用途にあわせてテストなどを追加してください。

## Firebase Functions のスペックの設定

デフォルトでは以下のディレクトリに

`publicHttpOption` と　`privateHttpOption`

が配置されています。

`functions/skeet/src/routings/options/httpOptions.ts`

```ts
import { HttpsOptions } from 'firebase-functions/v2/https'
import skeetOptions from '../../../skeetOptions.json'

const appName = skeetOptions.name
const project = skeetOptions.projectId
const region = skeetOptions.region
const serviceAccount = `${appName}@${project}.iam.gserviceaccount.com`
const vpcConnector = `${appName}-con`
const cors = true

export const publicHttpOption: HttpsOptions = {
  region,
  cpu: 1,
  memory: '1GiB',
  maxInstances: 100,
  minInstances: 0,
  concurrency: 1,
  timeoutSeconds: 540,
  labels: {
    skeet: 'http',
  },
}

export const privateHttpOption: HttpsOptions = {
  region,
  cpu: 1,
  memory: '1GiB',
  maxInstances: 100,
  minInstances: 0,
  concurrency: 80,
  serviceAccount,
  ingressSettings: 'ALLOW_INTERNAL_AND_GCLB',
  vpcConnector,
  vpcConnectorEgressSettings: 'PRIVATE_RANGES_ONLY',
  cors,
  timeoutSeconds: 540,
  labels: {
    skeet: 'http',
  },
}
```

タスクの用途にあわせて、適切な設定を行ってください。

## Firebase Functions の拡張インスタンス

今回は Firebase Functions の `http` インスタンスを使用しましたが、
以下のインスタンスが用意されています。

| インスタンスタイプ | 説明                                                                   |
| ------------------ | ---------------------------------------------------------------------- |
| Http               | HTTP リクエストを受け取る関数                                          |
| PubSub             | PubSub メッセージを受け取る関数                                        |
| Scheduler          | スケジュールされた関数                                                 |
| Firestore          | Firestore のドキュメントの作成、更新、削除などのトリガーを受け取る関数 |
| Auth               | Firebase ユーザーアカウントの作成と削除などのトリガーを受け取る関数    |


`skeet add method <methodName>` コマンドで、

`functions/skeet/src/routings/<インスタンス名>` ディレクトリに
テンプレートが生成されます。


## ロードバランサーとGoogle Cloud Armorの組み合わせ

Webhookエンドポイントの強化

Firebase Functionsは迅速かつ効率的にWebhookエンドポイントを構築する強力なツールですが、プロジェクトが成長するにつれて、そのインフラを強化する必要が出てきます。この点で、ロードバランサーの導入がキーとなります。ロードバランサーを使用することで、エンドポイントのパフォーマンスと信頼性が大幅に向上し、高いトラフィックや異常なアクセスパターンに対しても弾力的に対応することができます。

さらに、Google Cloud Armorの統合により、セキュリティ面でも大きな強化が図られます。Google Cloud Armorは、DDoS攻撃やウェブ攻撃から保護するための強力なツールであり、ロードバランサーと併用することで、Webhookエンドポイントを様々な脅威から守る堅牢な防御層を提供します。これにより、エンドユーザーへのサービス提供がさらに安定し、ビジネスの信頼性も高まります。

初期段階ではシンプルなセットアップで問題なく開始できますが、プロジェクトの成長に伴い、ロードバランサーとGoogle Cloud Armorの導入を検討することで、ネットワークの安定性とセキュリティを大幅に強化することが可能です。この戦略的アプローチにより、ビジネスがスケールアップする過程でのニーズに迅速に対応し、エンドユーザーに対して一貫して高品質なサービスを提供することができるようになります。

ロードバランサーとGoogle Cloud Armorの設定方法については、
以下のリンクで詳細をご確認いただけます。

https://skeet.dev/ja/doc/skeet-firestore/initial-deploy/


## まとめ：次なるステップへ

Firebase Functionsを活用し、わずか2つの機能でDiscord Botを創出することに成功しました。この旅を通じて、あなたはサーバーレスアーキテクチャの力を実際に体験し、開発における新たな可能性を発見しました。この経験は、単なる開発以上のものです。
それは、あなたのアイデアを現実の形に変えるための具体的なスキルと知識を提供する旅でした。

この章を締めくくるにあたり、私たちはあなたにさらなる一歩を踏み出すことを提案します。ELSOUL LABOのDiscordチャンネルでは、同じ志を持つ開発者たちが集まり、経験と知識を共有しています。
あなたがこの旅で得た知見、さらに探求したいトピック、または疑問点など、どんな話題でも歓迎しております。

ELSOUL LABO Discordチャンネル: 

https://discord.gg/hfb3drqfaw

一緒に学び、成長し、新たなプロジェクトの可能性を探求しましょう。
あなたの一歩が、次なる大きなイノベーションへの扉を開くかもしれません。