Parallelize pytest execution jobs #333
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Pull Request Check | |
on: [pull_request] | |
jobs: | |
build: | |
name: 'Build docker image' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./.github/actions/setup-test-image | |
lint-ruff: | |
name: 'Lint check (ruff)' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: chartboost/ruff-action@v1 | |
unit-test: | |
name: 'Unit tests' | |
runs-on: ubuntu-latest | |
needs: build | |
strategy: | |
fail-fast: true | |
matrix: | |
db: [postgres, mysql] | |
test_target: [ | |
'tests/app/admin_* tests/app/company_* tests/app/config_* tests/app/contract_*', | |
'tests/app/dex_*', | |
'tests/app/e2e_* tests/app/eth_*', | |
'tests/app/events_*', | |
'tests/app/messaging_* tests/app/node_info_* tests/app/notification_* tests/app/openapi_*', | |
'tests/app/position_ListAllCouponConsumptions_*', | |
'tests/app/position_Position_*', | |
'tests/app/position_PositionCoupon* tests/app/position_PositionMembership*', | |
'tests/app/position_PositionShare*', | |
'tests/app/position_PositionStraightBond*', | |
'tests/app/token_*', | |
'tests/app/userinfo_*', | |
'tests/batch/indexer_Block_* tests/batch/indexer_CompanyList_* tests/batch/indexer_Consume_*', | |
'tests/batch/indexer_DEX_*', | |
'tests/batch/indexer_Position_Bond_*', | |
'tests/batch/indexer_Position_Coupon_*', | |
'tests/batch/indexer_Position_Membership_*', | |
'tests/batch/indexer_Position_Share_*', | |
'tests/batch/indexer_Token_Detail_*', | |
'tests/batch/indexer_Token_Holders_*', | |
'tests/batch/indexer_Token_List_*', | |
'tests/batch/indexer_Transfer_*', | |
'tests/batch/indexer_TransferApproval_*', | |
'tests/batch/processor_*', | |
] | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./.github/actions/setup-test-image | |
- name: build image on compose | |
run: docker compose build | |
- name: Change owner of output directory | |
run: | | |
sudo chown runner:docker /home/runner/work/ibet-Wallet-API/ibet-Wallet-API/cov | |
sudo chmod 777 /home/runner/work/ibet-Wallet-API/ibet-Wallet-API/cov | |
- name: run unit test using ${{ matrix.db }} | |
run: docker compose run -e TEST_TARGET="${{ matrix.test_target }}" ibet-wallet-api-${{ matrix.db }} | |
- run: mv cov/.coverage cov/.coverage-${{ strategy.job-index }} | |
- uses: actions/upload-artifact@v4 | |
if: matrix.db == 'postgres' | |
with: | |
name: .coverage-${{ strategy.job-index }} | |
path: cov/.coverage-${{ strategy.job-index }} | |
include-hidden-files: true | |
- run: mv cov/pytest.xml cov/pytest-${{ strategy.job-index }}.xml | |
- uses: actions/upload-artifact@v4 | |
if: matrix.db == 'postgres' | |
with: | |
name: pytest-${{ strategy.job-index }} | |
path: cov/pytest-${{ strategy.job-index }}.xml | |
collect_coverage: | |
runs-on: ubuntu-latest | |
needs: unit-test | |
permissions: | |
actions: read | |
contents: read | |
packages: read | |
pull-requests: write | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./.github/actions/setup-test-image | |
- name: build image on compose | |
run: docker compose build | |
- name: Change owner of output directory | |
run: | | |
sudo chown runner:docker /home/runner/work/ibet-Wallet-API/ibet-Wallet-API/cov | |
sudo chmod 777 /home/runner/work/ibet-Wallet-API/ibet-Wallet-API/cov | |
- uses: actions/download-artifact@v4 | |
with: | |
pattern: '.coverage-*' | |
path: cov/ | |
merge-multiple: true | |
- name: combine coverage files | |
run: docker compose run -w /app/ibet-Wallet-API/cov ibet-wallet-api-postgres bash --login -c 'poetry run coverage combine .coverage-*' | |
- name: generate coverage xml file | |
run: docker compose run -w /app/ibet-Wallet-API ibet-wallet-api-postgres bash --login -c 'poetry run coverage xml --data-file=cov/.coverage -o cov/coverage.xml' | |
- uses: actions/download-artifact@v4 | |
with: | |
pattern: 'pytest-*' | |
path: cov/ | |
merge-multiple: true | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
- name: Install junit-report-merger | |
run: npm install -g junit-report-merger | |
- name: Merge reports | |
run: jrm cov/pytest.xml "cov/pytest-*.xml" | |
- name: Pytest coverage comment | |
id: coverageComment | |
uses: MishaKav/pytest-coverage-comment@main | |
with: | |
report-only-changed-files: true | |
pytest-xml-coverage-path: cov/coverage.xml | |
junitxml-path: cov/pytest.xml | |
- name: Count test cases in repository | |
id: countTest | |
run: | | |
RESULT=$(docker compose run -w /app/ibet-Wallet-API ibet-wallet-api-postgres bash --login -c 'poetry run pytest --collect-only | grep -e "<Function" -e "<Coroutine"' | wc -l) | |
echo "::set-output name=test_count::$RESULT" | |
- name: Check the count of test cases in CI | |
if: steps.coverageComment.outputs.tests != steps.countTest.outputs.test_count | |
run: exit 1 | |
migration-test: | |
name: 'Migration tests' | |
runs-on: ubuntu-latest | |
needs: build | |
strategy: | |
fail-fast: true | |
matrix: | |
db: [postgres, mysql] | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./.github/actions/setup-test-image | |
- name: run unit test using ${{ matrix.db }} | |
run: docker compose run ibet-wallet-api-${{ matrix.db }} bash --login -c "cd /app/ibet-Wallet-API && poetry run pytest -vv --test-alembic -m 'alembic'" |