macOSは記事作成時点でAppleシリコン搭載端末のみをサポートしており、AMDやIntelなどのx86チップを搭載したPCで使用することはできません。「OSX-PROXMOX」は、AMDやIntelのCPUを搭載したPCでもmacOSを実行できるようにするツールとして公開されています。
⇧ amazing...
GitHub Actionとは
GitHubのドキュメントによりますと、
⇧「CI/CD and DevOps」に該当する機能の1つでありますと。
「GitHub Actions」のドキュメントのページの概要を確認すると、
⇧『GitHub Actions は、ビルド、テスト、デプロイのパイプラインを自動化できる継続的インテグレーションと継続的デリバリー (CI/CD) のプラットフォームです。 リポジトリに対するすべての pull request をビルドしてテストしたり、マージされた pull request を運用環境にデプロイしたりするワークフローを作成できます。』
とありますと。
「GitHub Actions」における「ワークフロー」は何なのかというと、
リポジトリで、pull request のオープンや issue の作成などの イベント が発生したときにトリガーされるように GitHub Actions ワークフロー を構成できます。 ワークフローには、1 つ以上の ジョブ が含まれており、ジョブは順次にまたは並列で実行できます。 各ジョブは、専用の仮想マシン ランナー 内、またはコンテナー内で実行され、定義した スクリプト を実行するか、または アクション (ワークフローを簡略化できる再利用可能な拡張機能) を実行する 1 つ以上のステップで構成されます。
https://docs.github.com/ja/actions/about-github-actions/understanding-github-actions
⇧ 上図のよう感じで「Event」をトリガーとした処理の集合体といったものということになりますと。
Workflows
ワークフローとは、1 つ以上のジョブを実行する構成可能な自動化プロセスです。 ワークフローは、リポジトリにチェックインされる YAML ファイルによって定義され、リポジトリ内のイベントによってトリガーされたときに実行されます。また、手動でトリガーしたり、定義されたスケジュールでトリガーしたりすることもできます。
https://docs.github.com/ja/actions/about-github-actions/understanding-github-actions
ワークフローは、リポジトリ内の .github/workflows
ディレクトリで定義されます。 1 つのリポジトリで複数のワークフローを使用でき、それぞれで次のような異なるタスクのセットを実行できます。
https://docs.github.com/ja/actions/about-github-actions/understanding-github-actions
⇧ とあり、「GitHub」で管理している「Gitリポジトリ」に「.github/workflows」ディレクトリを作成し、処理を記述した「YAML」ファイルを配置する形になりますと。
GitHub Actionでgit pushをトリガーとしてPythonプロジェクトのpytestを自動実行させたい
ネット上の情報を漁った感じ、
⇧ まとめて下さっている方がおられました。
例えば、以下のような構成のGitリポジトリをGitHubで管理しているとして、
/my-git-repo/ # リポジトリのルートディレクトリ │ ├─ .github/ # GitHub Actions の設定ファイルを格納するディレクトリ │ └─ workflows/ # ワークフロー設定ファイルのディレクトリ │ └─ pytest.yml # pytestを実行するGitHub Actionsワークフローファイル │ ├─ other-project/ # 他のプロジェクトディレクトリ(my-git-repo内で別プロジェクトを管理している場合) │ ├─ some-file.py # 他のプロジェクトのPythonファイル │ └─ requirements.txt # 他のプロジェクトに必要な依存関係を記述したファイル │ ├─ my-project/ # 今作業しているプロジェクトディレクトリ │ └─ app/ # アプリケーションのソースコードとテストを格納するディレクトリ │ ├─ src/ # ソースコード(アプリケーションのロジック) │ ├─ tests/ # テストコード(アプリケーションのテスト) │ └─ requirements.txt # このプロジェクトの依存関係を記述したファイル │ └─ requirements.txt # リポジトリ全体に共通する依存関係を記述したファイル(親ディレクトリ)
⇧ 上記の「my-project」の「GitHub Actions」の「ワークフロー」は、
■my-git-repo/.github/workflows/pytest.yml
name: Run pytest with coverage on Push on: push: branches: - main # もしくは、特定のブランチを指定 - 'refs/heads/*' # 任意のブランチに対応したい場合 jobs: test: runs-on: ubuntu-latest # Ubuntuの最新バージョンで実行 steps: # リポジトリをチェックアウト - name: Checkout code uses: actions/checkout@v2 with: # プライベートリポジトリでも認証用のトークンを使用 token: ${{ secrets.GITHUB_TOKEN }} # Pythonの環境をセットアップ - name: Set up Python 3.11 uses: actions/setup-python@v2 with: python-version: 3.11 # 使用するPythonのバージョンを指定 # プロジェクトの依存関係をインストール - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r my-project/app/requirements.txt # my-project/app/の依存関係をインストール # pytestをカバレッジと共に実行 - name: Run pytest with coverage run: | pytest --cov=my-project/app/src --cov-report=xml --cov-report=term-missing my-project/app/tests/ # カバレッジレポートを保存 - name: Upload coverage report uses: actions/upload-artifact@v3 with: name: coverage-report path: coverage.xml # テスト結果をアップロード(JUnit形式で保存) - name: Upload Unit Test Results if: ${{ always() }} uses: actions/upload-artifact@v3 with: name: Unit Test Results (Python 3.11) path: results/pytest.xml # JUnitテスト結果をGitHubに表示する - name: Publish Unit Test Results uses: EnricoMi/publish-unit-test-result-action@v2 with: junit_files: results/**/*.xml
⇧ という感じになるとChatGPTからの回答。
pytestのテスト結果を可視化するには、非公式のライブラリが必要になってくると...
動作確認は必要ですな...
追記:↓ ここから
案の定というか、pytestのバグなのか、「PYTHONPATH」を設定しても「PYTHONPATH」が解釈されず「ImportError」「ModuleNotFoundError」が出るという...
そもそも、
⇧ 公式のドキュメントだと、「PYTHONPATH」を指定していないんよね...
泥沼な予感しか無いんだが...
そして、「PAT(Personal Access Token)」を利用しているような場合は、
「PAT(Personal Access Token)」の権限で「workflow」にチェックを入れておかないと、git pushとかできないので注意、というかネット上の情報で言及しているものがなかったので気付くまでに時間がかかって泥沼にハマった...
追記:↑ ここまで
2024年12月18日(水)追記:↓ ここから
何やら、「pytest」はディレクトリの構造に依存するっぽくて、
/my-git-repo/ # リポジトリのルートディレクトリ │ ├─ .git │ ├─ .github/ # GitHub Actions の設定ファイルを格納するディレクトリ │ └─ workflows/ # ワークフロー設定ファイルのディレクトリ │ └─ pytest.yml # pytestを実行するGitHub Actionsワークフローファイル │ ├─ other-project/ # 他のプロジェクトディレクトリ(my-git-repo内で別プロジェクトを管理している場合) │ ├─ some-file.py # 他のプロジェクトのPythonファイル │ └─ requirements.txt # 他のプロジェクトに必要な依存関係を記述したファイル │ ├─ my-project/ # 今作業しているプロジェクトディレクトリ │ └─ app/ # アプリケーションのソースコードとテストを格納するディレクトリ │ ├─ src/ # ソースコード(アプリケーションのロジック) │ ├─ tests/ # テストコード(アプリケーションのテスト) │ └─ requirements.txt # このプロジェクトの依存関係を記述したファイル │ └─ requirements.txt # リポジトリ全体に共通する依存関係を記述したファイル(親ディレクトリ)
のような構造で、「my-projyect/app/tests」のテストを「GitHub Actions」の「ワークフロー」によって「pytest」で実行させたい場合、
■my-git-repo/.github/workflows/pytest.yml
name: Run pytest with coverage on Push on: push: branches: - main # もしくは、特定のブランチを指定 - 'refs/heads/*' # 任意のブランチに対応したい場合 env: APP_ROOT: "my-project/app" jobs: test: runs-on: ubuntu-latest # Ubuntuの最新バージョンで実行 steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.x' - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Test with pytest env: PYTHONPATH: ${{ github.workspace }}/${{ env.APP_ROOT }} run: | pip install pytest pytest-cov pytest --rootdir=${{ github.workspace }}/${{ env.APP_ROOT }}
⇧ のような形で、明示的に
- PYTHONPATH
- rootdir
を指定してあげる必要があるっぽい。
「rootdir」を指定してあげないと、「pytest」はデフォルトの「rootdir」を基準にして「PYTHONPATH」を解釈しようとしてしまうので、「PYTHONPATH」を設定していても無視されるという挙動らしい。
つまり、「pytest」においては「rootdir」「PYTHONPATH」の両方を指定しないと意味が無いのである...
なので、「PYTHONPATH」だけ設定している場合は、偶然、ディレクトリ構成が「pytest」が動作する形になっているだけの可能性もあるので要注意ですかね...
2024年12月18日(水)追記:↑ ここまで
毎度モヤモヤ感が半端ない…
今回はこのへんで。