概要
前回はフツーの 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 へデプロイすることが可能であるとわかったところでヨシとしよう。