目次
1. はじめに
本シリーズでは、.NET 9 + PostgreSQL + Docker + AWS Fargate を用いた
フルスタック開発環境の構築から自動デプロイまで を扱っている。
これまでに:
- macOS上での .NET 9 開発環境構築
- PostgreSQL コンテナ連携
- VSCode での Blazor WebApp 修正とデバッグ
を実施してきた。
今回(第4回)では、
「自動ビルドと修正反映」+「AWSデプロイ前のCI検証」 をテーマとする。
すなわち、ローカルで動かして終わりではなく、
GitHub Actions による自動テストとデプロイフローを実際に構築していく。
2. 全体像:ローカル開発からクラウドデプロイまで
以下は、開発からデプロイまでの全体フロー。
| フェーズ | 処理内容 | 実行環境 |
|---|---|---|
| ① 開発 | コード修正、docker build
|
VSCode(macOS) |
| ② テスト |
dotnet test による自動検証 |
GitHub Actions |
| ③ ビルド | Docker イメージ生成・ECR Push | GitHub Actions |
| ④ デプロイ |
copilot deploy により Fargate に反映 |
AWS Fargate |
この流れを構築することで、
手動操作を最小化し、Git操作(push・PRマージ)のみで
クラウド更新までを自動化できる。
3. Docker イメージの自動ビルドと反映
ローカル環境では docker-compose.yml により、
PostgreSQL と WebApp の両方を起動できる。
services:
db:
image: postgres:18
container_name: postgres-db
platform: linux/arm64
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
ports:
- "5432:5432"
volumes:
- postgres-data18:/var/lib/postgresql/data
- ./pgconf/postgresql.conf:/etc/postgresql/postgresql.conf:ro
command: ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
retries: 5
web:
build:
context: ./src/WebApp
dockerfile: Dockerfile
container_name: dotnet9-webapp
platform: linux/arm64
depends_on:
db:
condition: service_healthy
environment:
ConnectionStrings__Default: "Host=db;Port=5432;Database=${POSTGRES_DB};Username=${POSTGRES_USER};Password=${POSTGRES_PASSWORD};Pooling=true;"
ASPNETCORE_ENVIRONMENT: "Container_Development"
ports:
- "9999:8080"
restart: unless-stopped
volumes:
postgres-data18: {}
ローカルで修正した内容は、
以下のコマンドで即時反映できる。
docker compose build web
docker compose up -d
4. GitHub Actions による CI 構成
リポジトリ配下の .github/workflows/webapp-ci.yml に
以下のような設定を置く。
name: build_and_deploy
on:
push:
branches:
- main
- chore/*
pull_request:
branches: [ main ]
jobs:
build_and_test:
runs-on: ubuntu-latest
env:
AWS_REGION: ${{ secrets.AWS_REGION }}
ECR_ACCOUNT_ID: ${{ secrets.ECR_ACCOUNT_ID }}
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.x
- name: Restore & Test
run: |
dotnet restore
dotnet test tests/WebApp.IntegrationTests --logger "trx;LogFileName=test_results.trx"
deploy_to_fargate:
needs: build_and_test
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Login to ECR
uses: aws-actions/amazon-ecr-login@v2
- name: Build and Push Docker image
run: |
docker build -t $ECR_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/webapp/webapp:latest -f src/WebApp/Dockerfile src/WebApp
docker push $ECR_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/webapp/webapp:latest
- name: Install Copilot CLI
run: |
curl -Lo /usr/local/bin/copilot https://github.com/aws/copilot-cli/releases/latest/download/copilot-linux
chmod +x /usr/local/bin/copilot
- name: Deploy to AWS Fargate
run: |
copilot deploy --name webapp --env test
主なポイント
| 要素 | 内容 |
|---|---|
on.push |
mainブランチと chore/* ブランチで起動 |
dotnet test |
自動テストを実行 |
needs: |
テスト成功後のみ deploy ジョブを実行 |
if: |
main ブランチ以外では AWS デプロイをスキップ |
5. デプロイ前検証:自動テストの実行
tests/WebApp.IntegrationTests/LoginTests.cs は、
アプリが正常にログイン可能かを確認する簡易テスト。
[Fact]
public async Task Login_With_AdminCredentials_Should_Return_Success()
{
using var client = new HttpClient();
var response = await client.PostAsync("http://localhost:9999/Login",
new FormUrlEncodedContent(new Dictionary<string, string>
{
["UserName"] = "admin",
["Password"] = "admin123!"
}));
response.EnsureSuccessStatusCode();
}
このテストにより、アプリが最低限起動しているかをCIで検証できる。
運用ではさらにAPIレスポンスやDB操作テストも追加可能。
6. Secrets 設定と CLI 自動化
GitHub Actions では AWS 認証やアプリ構成を Secrets に登録する。
手動でGUIから設定する代わりに、GitHub CLI でスクリプト化できる。
gh auth login
gh secret set AWS_ACCESS_KEY_ID --body "<your-access-key>"
gh secret set AWS_SECRET_ACCESS_KEY --body "<your-secret>"
gh secret set AWS_REGION --body "ap-northeast-1"
gh secret set ECR_ACCOUNT_ID --body "327845752170"
これにより、GUI操作なしで環境構築を自動化できる。
7. ローカルでの動作検証
AWS にデプロイする前に、ローカルでも同じビルドが再現できる。
docker compose build
docker compose up -d
アプリが起動したらブラウザで以下にアクセス。
http://localhost:9999
ログイン画面が表示され、
admin / admin123! でログイン可能であれば成功。
8. まとめ
- GitHub Actions によりビルド・テスト・デプロイの流れを自動化
- mainブランチのみ Fargate に反映
- Secrets 管理は CLI でスクリプト化
- ローカル検証とクラウドCIの動作を統一