概要

前回はフツーの Linux サーバへデプロイしたね。

それじゃあ今度はクラウドサービスへデプロイしよっか! なんか最近はクラウドへデプロイするのが主流らしいからね。ただクラウドって、緑さん愛用のフツーの Linux サーバとくらべてバケモンみたいにレンタル料金が高いから、趣味で使うぶんには、ナイな……。今回ももちろん、無料枠の範囲内で遊んでいるよ。

 

App Service はもう準備されているね?

このあたりはもうあるものとする。もうマジで「あとはデプロイするだけ」って状態であるのが前提ね。

  • App Service
  • 本番環境で接続できる DB(SQLite は App Service では使えないからちゃんと用意して!)
  • DB に schema は用意しておく
  • Django アプリケーション本体
  • Django は DB にちゃんと接続できるようにしておく
  • GitHub にリポジトリ化されている
  • requirements.txt
  • VSCode

デプロイをとりあえず試すだけならば、 DB を使わない設定にするのがシンプルで良いような気もする。ケド今回はアリでやっちまった。

 

CREDENTIALS を取得する

Azure App Service へのデプロイをするためには、 GitHub Actions の中から Azure へのログインをしないといけない。ログインのための資格情報(credential)を取得する方法を書く。

マジメにやるならばこちら↓の手順なのだけど……

VSCode や GitHub に慣れているぼくにとって、もっとカンタンな方法↓があったので使う。

  • GitHub > settings > Developer > Personal access tokens 発行。
  • Token には「repo すべて」「workflow」の権限を与える。
  • VSCode の拡張機能 Deploy to Azure をインストール。
  • VSCode コマンドパレット > Deploy to Azure:Configure CI/CD Pipeline(ちっと忘れちゃったんだけれど、このへんで access token を入力するはず)
  • Python to Linux Web App on Azure を選択 > サブスクリプションを選択
  • そうすると一気に……
    • Credential が発行される
    • その credential が GitHub Actions へ登録される
    • 基本的な yaml も生成される

VSCode、 GitHub ユーザにとって都合がよい!

 

yaml を編集する

上述の VSCode 拡張機能 Deploy to Azure がデフォルトで生成してくれる yaml は捨て、こんな yaml にする。

name: Build and deploy Django app to Azure App Service

on:
  push:
    branches:
      - master

jobs:

  # ジョブひとつめ。
  build-and-test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      # App Service の Python が3.7です。統一します。
      - name: Setup Python version
        uses: actions/setup-python@v2
        with:
          python-version: 3.7

      # 仮想環境を作成、起動します。
      - name: Create and start virtual environment
        run: |
          python3 -m venv venv
          source venv/bin/activate

      - name: Install dependencies
        run: pip install -r requirements.txt

      - name: Collect static
        run: python manage.py collectstatic --noinput

      - name: Run tests
        run: python manage.py test

      # 次のジョブのためにファイルをアップロードします。
      # NOTE: 仮想環境はランタイム OS と互換性がないのでアップロードされません。
      # NOTE: ジョブの最後にファイルをアップロードすると、
      #       デプロイに失敗した場合には、[アクション] タブからファイルをダウンロードしてデバッグやコンテンツの確認できます。
      - name: Upload artifact for deployment jobs
        uses: actions/upload-artifact@v2
        with:
          name: python-app
          path: |
            .
            !venv/

  # ジョブふたつめ。
  deploy-to-webapp:
    needs: build-and-test
    runs-on: ubuntu-latest

    steps:

      # 前のジョブでアップロードしたファイルをダウンロードします。
      - uses: actions/download-artifact@v2
        with:
          name: python-app
          path: .

      # Azure CLI にログインします。
      # NOTE: CREDENTIALS は Deploy to Azure 拡張機能で自動生成してもらったものです。
      - name: Log in to Azure CLI
        uses: azure/login@v1
        with:
          creds: ${{ secrets.CREDENTIALS }}

      # DISABLE_COLLECTSTATIC: 前のジョブで行ったので不要です。
      # POST_BUILD_COMMAND: ランタイムビルドに続いてコマンドを実行できるフックです。
      # SCM_DO_BUILD_DURING_DEPLOYMENT: oryx ビルドパイプラインを有効にするものらしいがよくわからないです。
      # DJANGO_ENV: Django を production にします。
      # NOTE: settings.py だけしか設定ファイルがないとき有効なのかは知りません。
      - name: Disable static collection and set migration command on App Service
        uses: Azure/appservice-settings@v1
        with:
          app-name: <ここに App Service の名前>
          app-settings-json: '[
            { "name": "DISABLE_COLLECTSTATIC", "value": "true" },
            { "name": "POST_BUILD_COMMAND",  "value": "python manage.py makemigrations && python manage.py migrate" },
            { "name": "SCM_DO_BUILD_DURING_DEPLOYMENT", "value": "true" },
            { "name": "DJANGO_ENV", "value": "production"}
          ]'

      # デプロイします。
      - name: Deploy to App Service
        uses: azure/webapps-deploy@v2
        with:
          app-name: <ここに App Service の名前>

      # Azure logout
      - name: logout
        run: |
          az logout

 

以上だ!

が、まあぼくは App Service で Django を運用し続けたことはない。継続的にデプロイを続けていくのならば、改善点はあるのかもしれない。今回は、 GitHub Actions から App Service へデプロイすることが可能であるとわかったところでヨシとしよう。