環境
- Windows 10
- Python 3.9.4
- VSCode
CI/CDフロー
- GithubActionsで仮想マシン(ubuntu)上でpytestを実行
- pytestが通ったら、XServerへSFTPでデプロイ
- 上記1.と2.の結果はそれぞれslackの専用チャンネルに通知する
以降では、上記フローのポイントを順番に説明していきます。
pytestを自動実行
- actions/setup-python@v2のactionsを用いて、指定バージョンのpythonをインストール
- pipenv syncで依存ライブラリ(開発用含む)をPipfile.lockからインストール
- flake8でコードの静的解析
- pipenvでpytestを実行
.github\workflows\python-app.yml
name: Python application
on:
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.9.4
uses: actions/setup-python@v2
with:
python-version: "3.9.4"
- name: Install pipenv
run: |
python -m pip install --upgrade pip
python -m pip install pipenv
- name: Install dependencies
run: |
pipenv sync --dev
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
pipenv run flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
pipenv run flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Run test
run: |
pipenv run pytest tests
masayan
pythonにはpipが同梱されており、pipでpipenvをインストールするという流れです。また、flakeを使用することにより、ソースコードに関して、以下のような内容の静的解析が可能です。
・pycodestyle : コードがコーディング規約(PEP8)に準じているか
・pyflakes : コードに論理的なエラーが無いか
・mccabe : 循環的複雑度のチェック
テスト結果をslackに通知
- rtCamp/action-slack-notifyのactionsを使用して、unittestのjobの結果をslackへ通知
- 成功時と失敗時で文言や色・アイコンなどを分岐
.github\workflows\python-app.yml
jobs:
test:
・・・割愛
- name: Slack Notification on Success
uses: rtCamp/action-slack-notify@v2.0.2
if: success()
env:
SLACK_TITLE: Test Success
SLACK_COLOR: good
SLACK_ICON_EMOJI: ":white_check_mark:"
- name: Slack Notification on Failure
uses: rtCamp/action-slack-notify@v2.0.2
if: failure()
env:
SLACK_TITLE: Test Failed
SLACK_COLOR: danger
SLACK_ICON_EMOJI: ":fire:"
XserverへSFTPで自動デプロイ
こちらのftpデプロイ用のactionsを使用します
- テスト結果が成功の場合のみ、wlixcc/SFTP-Deploy-Actionのactionsを使用して、sftpでデプロイ
- リポジトリのsecretsにあらかじめ以下の情報を登録しておく
- username
- sftp接続時のユーザー名
- server
- デプロイ先のサーバーのIP
- ssh_private_key
- xserverのサーバーパネル→SSH設定→公開鍵認証用鍵ペアの生成から生成したキー(このようなファイル)
-----BEGIN RSA PRIVATE KEY----- ・・・ -----END RSA PRIVATE KEY-----
- username
- local_pathにはデプロイするフォルダ等を、remote_pathにはデプロイ先のxserverのディレクトリを指定
.github\workflows\python-app.yml
test
・・・割愛
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: SFTP Deploy Action
uses: wlixcc/SFTP-Deploy-Action@v1.0
with:
username: ${{ secrets.SFTP_USER_NAME }}
server: ${{ secrets.SFTP_SERVER_IP }}
ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }}
port: 10022
local_path: ''
remote_path: '/home/・・・
今回はレンタルサーバー(XServer)へデプロイします。XServerでのSSH接続時のポート番号は【10022】となっており、一般的なポート【22】とは異なっているためご注意ください。また、公開鍵認証用鍵ペアの生成時は、パスフレーズを設定せずに発行して下さい。パスフレーズを設定してしまうと、sftp接続時に処理が中断してしまいます。
デプロイ結果をslackに通知
こちらはunittestの通知とほぼ同じなので割愛します。
まとめ
いかがでしたでしょうか。本記事では、PythonアプリケーションのCI・CD環境をGithubActionsで構築する方法について紹介しています。デプロイ先はレンタルサーバーのxserverにしています。ぜひ参考にしてみてください。