5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

この記事はRust+SvelteKit+CDK で RSS 要約アプリを作ってみる Advent Calendar 2025の 21 日目の記事になります。

また、筆者が属している株式会社野村総合研究所のアドベントカレンダーもあるので、ぜひ購読ください。

はじめに

GitHub Actions を使うと、GitHub 上の CI/CD 環境を構築することができます。
今日の開発現場において(使うツールは何であれ)CI/CD はデファクトスタンダートになっていると思います。よくある使い方としては、Git のコミットやプッシュ、PR 作成時などに走らせることで、コミット時(もしくはコミット前)にコードの品質を保つことが挙げられます。
GitHub ACtions では、それだけでなく、指定した時間に起動するスケジュール実行も可能です(GitHub に限ったものではありませんが)。
今回は、GitHub Actions を使って SvelteKit の SSG および成果物のS3へのデプロイを自動化する方法を紹介します。

CI と CD を分ける

今回は CI/CD のそれぞれでジョブ定義を分けました。CI では PR 作成時のテストやビルド確認を行う一方、CD では main ブランチへの Push 時に実際のデプロイを行う仕組みになっています。
今回はそのうちの CD 部分を解説します。

余談ですが、CI と CD では実行する目的が異なるため、ジョブをしっかり分けるよう設計するように心がけています。
業務でも、例えばデプロイする前にもテストや Lint などを実行していたプロジェクトがありましたが、そのようなジョブは CI として実行すべきであり、CD のパイプラインではあくまでデプロイに必要最低限なものに絞るようにしました。
CI で品質の保証を行い、CD でデプロイの実行を行う、というように、明確に責務の分割を行いましょう。

SumaRSS での実装

SumaRSS では、パッケージマネージャとして Bun を採用しているため、Actions 上でもoven-sh/setup-bunを使用しています。

デプロイワークフロー (deploy.yml)

.github/workflows/deploy.ymlで、インフラ(CDK)とフロントエンド(Web)のデプロイを定義しています。

name: Build and Deploy Web App

on:
  push:
    branches:
      - main
  schedule:
    - cron: "0 23 * * *"
  workflow_dispatch:

jobs:
  # フロントエンドのデプロイ
  web_deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: oven-sh/setup-bun@v2

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ vars.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ vars.AWS_REGION }}

      - name: Build web app
        working-directory: ./web
        run: |
          bun install --frozen-lockfile
          bun run build

      - name: Deploy to S3
        run: aws s3 sync ./web/build s3://${{ vars.WEBSITE_BUCKET_NAME }} --delete

      - name: Invalidate CloudFront
        run: aws cloudfront create-invalidation --distribution-id ${{ vars.CLOUDFRONT_DISTRIBUTION_ID }} --paths "/*"

  # インフラのデプロイ
  cdk_deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: oven-sh/setup-bun@v2

      # ... AWS Credentials設定 ...

      - name: CDK Deploy
        working-directory: ./cdk
        run: |
          bun install --frozen-lockfile
          bun install -g aws-cdk
          cdk deploy --all --require-approval never

スケジュール実行

scheduleには、どのような設定で定期実行するかを指定できます。今回はUTCで毎日23:00に実行させるため、cron: "0 23 * * *"を指定しています。

Secrets と Variables の管理

セキュリティのため、AWS のアクセスキーなどの機密情報は GitHub リポジトリのSecretsに、バケット名などの公開しても良い設定値はVariablesに登録しています。

  • secrets.AWS_SECRET_ACCESS_KEY: 秘密鍵
  • vars.AWS_ACCESS_KEY_ID: アクセスキー ID
  • vars.WEBSITE_BUCKET_NAME: デプロイ先バケット名

S3 へのデプロイ

SSG であるため、ビルド成果物にはすでに構造化されたディレクトリに各ルートの静的な HTML が存在しています。そのため、デプロイ自体は成果物をそのまま S3 にコピーするだけで完了します。

S3 には Cloudfront 経由でアクセスするため、S3 側のファイルが更新されても、Cloudfront 側のキャッシュが残っているとそのキャッシュが表示されてしまいます。そのため、S3 にアップロードした直後に Cloudfront のキャッシュを削除すると、新しい断面がすぐに表示されるようになります。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?