📝【Flask × SQLite】インフラエンジニアがゼロから作る ToDo アプリ④ ~【CI/CD 編】GitHub Actions と Render で自動デプロイ環境を構築する ~

IT、仕事

前回の記事では、Flask × SQLite で作った ToDo アプリを
Render にデプロイして Web 公開するところまで進めました。

今回はその続きとして、
GitHub Actions を使った CI/CD(自動テスト+自動デプロイ)環境の構築をまとめます。

この記事を読むと、以下のことができるようになります。

  • push するだけで自動テストが走る
  • Flask アプリが壊れていないか自動チェック
  • CI が成功したら Render に自動デプロイ
  • 完全自動のパイプラインが完成

📌 1. CI/CD を導入する目的

個人開発でも CI/CD を入れるメリットは大きいです。

  • 壊れたコードが本番に行かない
  • push するだけでデプロイできる
  • ミスを仕組みで防げる
  • インフラエンジニアとしてのスキルが確実に上がる

特に Flask アプリは import ミスやルーティングの typo で簡単に壊れるので、
CI で自動チェックしておくと安心です。


📌 2. CI(自動テスト)を作る

まずは CI(継続的インテグレーション)から。

今回は以下のチェックを自動化します。

  • Python のセットアップ
  • ライブラリのインストール
  • flake8 による Lint チェック
  • Flask アプリが起動できるかテスト

🔧 2-1. .github/workflows/ci.yml を作成

.github/
└── workflows/
    └── ci.yml

🔧 2-2. CI の YAML(全文)

name: CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.12"

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
          pip install flake8

      - name: Lint with flake8
        run: |
          flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
          flake8 . --count --exit-zero --max-complexity=10 --max-line-length=120 --statistics

      - name: Flask 起動テスト
        run: |
          python - << 'EOF'
          from app import app
          print("Flask app imported successfully!")
          EOF


📌 3. CD(自動デプロイ)を作る

次に CD(継続的デリバリー)です。

今回は以下の仕組みを作ります。

  • CI が成功したら
  • Render に自動デプロイする

🔧 3-1. Render の API Key と Service ID を取得

✔ API Key

Render → Account SettingsAPI KeysGenerate

✔ Service ID

Render の Web Service URL の末尾にある ID
例:
https://dashboard.render.com/web/services/abcd1234
abcd1234


🔧 3-2. GitHub Secrets に登録

GitHub → リポジトリ → SettingsSecrets and variablesActions

NameValue
RENDER_API_KEYRender の API Key
RENDER_SERVICE_IDRender の Service ID


🔧 3-3. CD の YAML(CI 成功後だけ動く構成)

.github/workflows/deploy.yml を作成します。

name: CD

on:
  workflow_run:
    workflows: ["CI"]
    types:
      - completed

jobs:
  deploy:
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    runs-on: ubuntu-latest

    steps:
      - name: Trigger Render Deploy
        env:
          RENDER_API_KEY: ${{ secrets.RENDER_API_KEY }}
          RENDER_SERVICE_ID: ${{ secrets.RENDER_SERVICE_ID }}
        run: |
          curl -X POST \
            -H "Accept: application/json" \
            -H "Authorization: Bearer $RENDER_API_KEY" \
            -H "Content-Type: application/json" \
            -d '{"clearCache": false}' \
            https://api.render.com/v1/services/$RENDER_SERVICE_ID/deploys

📌 4. 実際に動かしてみる

main に push すると…

  1. CI が動く
  2. CI が緑なら CD が動く
  3. Render が自動デプロイ
  4. 本番環境が更新される

📸 ここに CD が 1 回だけ動いているスクショを挿入

大地の環境でも、
修正後は CD が 1 回だけ動くようになり、
理想的なパイプラインが完成しました。


📌 5. まとめ

この記事では、Flask アプリのための CI/CD を構築しました。

✔ CI

  • flake8 による Lint
  • Flask 起動テスト
  • push するだけで自動チェック

✔ CD

  • CI 成功後だけ Render に自動デプロイ
  • 完全自動のパイプラインが完成

CI/CD を導入することで、
「動くアプリ」から「壊れないアプリ」へ進化します。

個人開発でも、インフラエンジニアとしてのスキルアップとしても、
非常に価値のある取り組みです。

タイトルとURLをコピーしました