PythonアプリケーションのCI・CD環境をGithubActionsで構築する

環境

  • Windows 10
  • Python 3.9.4
  • VSCode

使用するソースコード

以下の公開リポジトリに置いています

GitHub - masayan1126/tao-py-py: 作業自動化用 Python ライブラリ
作業自動化用 Python ライブラリ. Contribute to masayan1126/tao-py-py development by creating an account on GitHub.

CI/CDフロー

  1. GithubActionsで仮想マシン(ubuntu)上でpytestを実行
  2. pytestが通ったら、XServerへSFTPでデプロイ
  3. 上記1.と2.の結果はそれぞれslackの専用チャンネルに通知する
masayan
masayan

以降では、上記フローのポイントを順番に説明していきます。

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
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を使用します

GitHub - wlixcc/SFTP-Deploy-Action: Deploy files to server use GitHub actions
Deploy files to server use GitHub actions . Contribute to wlixcc/SFTP-Deploy-Action development by creating an account on GitHub.
  • テスト結果が成功の場合のみ、wlixcc/SFTP-Deploy-Actionのactionsを使用して、sftpでデプロイ
  • リポジトリのsecretsにあらかじめ以下の情報を登録しておく
    • username
      • sftp接続時のユーザー名
    • server
      • デプロイ先のサーバーのIP
    • ssh_private_key
      • xserverのサーバーパネル→SSH設定→公開鍵認証用鍵ペアの生成から生成したキー(このようなファイル)
      • -----BEGIN RSA PRIVATE KEY-----
        ・・・
        -----END RSA PRIVATE KEY-----
  • 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/・・・
masayan
masayan

今回はレンタルサーバー(XServer)へデプロイします。XServerでのSSH接続時のポート番号は【10022】となっており、一般的なポート【22】とは異なっているためご注意ください。また、公開鍵認証用鍵ペアの生成時は、パスフレーズを設定せずに発行して下さい。パスフレーズを設定してしまうと、sftp接続時に処理が中断してしまいます。

デプロイ結果をslackに通知

こちらはunittestの通知とほぼ同じなので割愛します。

Python学習におすすめの書籍

独習Python/山田祥寛【3000円以上送料無料】
bookfan 1号店 楽天市場店
¥ 3,300(2022/08/04 17:32時点)
タイトルとURLをコピーしました