この記事は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 のキャッシュを削除すると、新しい断面がすぐに表示されるようになります。