Skip to content

Workflow file for this run

name: 🧪 test
on:
push:
paths-ignore:
- '**.md'
branches:
- long_lived/**
- main
- release/**
tags:
- '**'
pull_request:
paths-ignore:
- '**.md'
branches:
- '**'
workflow_dispatch: null
concurrency:
group: ${{ github.ref }}-${{ github.workflow }}-${{ github.event_name }}--${{ (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/') || startsWith(github.ref, 'refs/heads/long_lived/')) && github.sha || '' }}
cancel-in-progress: true
jobs:
configure:
name: Configure matrix
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Python environment
uses: Chia-Network/actions/setup-python@main
with:
python-version: '3.9'
- name: Generate matrix configuration
id: configure
run: |
python tests/build-job-matrix.py --per file --verbose --only wallet/cat_wallet/test_trades.py --duplicates 5 > matrix.json
cat matrix.json
echo configuration=$(cat matrix.json) >> "$GITHUB_OUTPUT"
echo matrix_mode=${{ ( github.event_name == 'workflow_dispatch' ) && 'all' || ( github.repository_owner == 'Chia-Network' && github.repository != 'Chia-Network/chia-blockchain' ) && 'limited' || ( github.repository_owner == 'Chia-Network' && github.repository == 'Chia-Network/chia-blockchain' && github.ref == 'refs/heads/main' ) && 'main' || ( github.repository_owner == 'Chia-Network' && github.repository == 'Chia-Network/chia-blockchain' && startsWith(github.ref, 'refs/heads/release/') ) && 'all' || ( github.repository_owner == 'Chia-Network' && github.repository == 'Chia-Network/chia-blockchain' && startsWith(github.base_ref, 'release/') ) && 'all' || 'main' }} >> "$GITHUB_OUTPUT"
outputs:
configuration: ${{ steps.configure.outputs.configuration }}
matrix_mode: ${{ steps.configure.outputs.matrix_mode }}
macos:
uses: ./.github/workflows/test-single.yml
needs: configure
with:
emoji: 🍎
matrix: macos
name: macOS
file_name: macos
concurrency_name: macos
configuration: ${{ needs.configure.outputs.configuration }}
matrix_mode: ${{ needs.configure.outputs.matrix_mode }}
runs-on: macos-latest
ubuntu:
uses: ./.github/workflows/test-single.yml
needs: configure
with:
emoji: 🐧
matrix: ubuntu
name: Ubuntu
file_name: ubuntu
concurrency_name: ubuntu
configuration: ${{ needs.configure.outputs.configuration }}
matrix_mode: ${{ needs.configure.outputs.matrix_mode }}
runs-on: ubuntu-latest
windows:
uses: ./.github/workflows/test-single.yml
needs: configure
with:
emoji: 🪟
matrix: windows
name: Windows
file_name: windows
concurrency_name: windows
configuration: ${{ needs.configure.outputs.configuration }}
matrix_mode: ${{ needs.configure.outputs.matrix_mode }}
runs-on: windows-latest
coverage:
name: ${{ matrix.os.emoji }} Coverage - ${{ matrix.python.name }}
runs-on: ${{ matrix.os.runs-on }}
needs:
- macos
- ubuntu
- windows
strategy:
fail-fast: false
matrix:
os:
- emoji: 🐧
matrix: ubuntu
name: Ubuntu
runs-on: ubuntu-latest
python:
- name: '3.9'
action: '3.9'
apt: '3.9'
install_sh: '3.9'
matrix: '3.9'
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Set Env
uses: Chia-Network/actions/setjobenv@main
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download Results
uses: actions/download-artifact@v3
with:
name: junit-data
path: junit-data
- name: Format JUnit data and prepare results
run: |
sudo snap install yq
ls junit-data/*.xml | xargs --max-procs=10 --replace={} yq eval '.testsuites.testsuite.testcase |= sort_by(.+@classname, .+@name)' --inplace {}
sudo apt-get install junitparser
mkdir junit-results
junitparser merge junit-data/*.xml junit-results/junit.xml
ls junit-results/*.xml | xargs --max-procs=10 --replace={} yq eval '.testsuites.testsuite |= sort_by(.+@name) | .testsuites.testsuite[].testcase |= sort_by(.+@classname, .+@name)' --inplace {}
- name: Publish formatted JUnit data
uses: actions/upload-artifact@v3
with:
name: junit-data
path: junit-data/*
if-no-files-found: error
- name: Publish JUnit results
if: always()
uses: actions/upload-artifact@v3
with:
name: junit-results
path: junit-results/*
if-no-files-found: error
- name: Download Coverage
uses: actions/download-artifact@v3
with:
name: coverage-data
path: coverage-data
- name: Set up ${{ matrix.python.name }}
uses: Chia-Network/actions/setup-python@main
with:
python-version: ${{ matrix.python.action }}
- uses: ./.github/actions/install
with:
python-version: ${{ matrix.python.action }}
development: true
- uses: chia-network/actions/activate-venv@main
- name: Coverage Processing
run: |
coverage combine --rcfile=.coveragerc --data-file=coverage-reports/.coverage coverage-data/
coverage xml --rcfile=.coveragerc --data-file=coverage-reports/.coverage -o coverage-reports/coverage.xml
coverage html --rcfile=.coveragerc --data-file=coverage-reports/.coverage --directory coverage-reports/html/
- uses: coverallsapp/github-action@v2
if: always()
env:
COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
- name: Coverage report (chia/)
if: always()
run: |
set -o pipefail
coverage report --rcfile=.coveragerc --data-file=coverage-reports/.coverage --include='chia/**/*' --show-missing | tee coverage-reports/coverage-chia-stdout
- name: Coverage report (tests/)
if: always()
run: |
set -o pipefail
coverage report --rcfile=.coveragerc --data-file=coverage-reports/.coverage --include='tests/**/*' --show-missing | tee coverage-reports/coverage-tests-stdout
- name: Coverage report (diff)
if: always()
env:
compare-branch: ${{ github.base_ref == '' && github.event.before || format('origin/{0}', github.base_ref) }}
run: |
diff-cover --compare-branch=${{ env.compare-branch }} --fail-under=100 --html-report=coverage-reports/diff-cover.html --markdown-report=coverage-reports/diff-cover.md coverage-reports/coverage.xml | tee coverage-reports/diff-cover-stdout
COV_STATUS="${PIPESTATUS[0]}"
echo "COV_STATUS=$COV_STATUS" >> "$GITHUB_ENV"
if [[ $COV_STATUS != '0' ]]; then
exit 1
fi
- name: Remove previous coverage report comment and label from PR
if: always()
shell: bash
env:
COV_STATUS: ${{ env.COV_STATUS }}
GH_TOKEN: ${{ github.token }}
ORG_REPO: ${{ github.repository }}
run: |
PR_NUM=$(jq -r '.number' "$GITHUB_EVENT_PATH")
COMMENTS=$(gh api -X GET /repos/"${ORG_REPO}"/issues/"${PR_NUM}"/comments)
COMMENT_ID=$(echo "$COMMENTS" | jq '.[] | select(.user.login == "github-actions[bot]" and (.body | tostring | contains("<!-- COVERAGE_COMMENT_'${PR_NUM}' -->"))) | .id')
COVERAGE_LABEL=$(gh pr view "$PR_NUM" --json labels --jq ' .labels[].name | select(. == "coverage-diff")')
if [[ -n "$COMMENT_ID" ]]; then
gh api -X DELETE /repos/"${ORG_REPO}"/issues/comments/"${COMMENT_ID}"
fi
if [[ "$COV_STATUS" != '0' ]]; then
if [[ "$COVERAGE_LABEL" == "coverage-diff" ]]; then
gh pr edit "$PR_NUM" --remove-label "coverage-diff"
fi
fi
- name: Add diff coverage report comment to PR
if: always()
env:
BRANCH_NAME: ${{ github.sha }}
COV_STATUS: ${{ env.COV_STATUS }}
GH_TOKEN: ${{ github.token }}
ORG_REPO: ${{ github.repository }}
run: |
if [[ $COV_STATUS != '0' ]]; then
BASE_URL="https://github.com/${ORG_REPO}/blob/${BRANCH_NAME}"
PR_NUM=$(jq -r '.number' "$GITHUB_EVENT_PATH")
COVERAGE_LABEL=$(gh pr view "$PR_NUM" --json labels --jq ' .labels[].name | select(. == "coverage-diff")')
CONTENT=$(<coverage-reports/diff-cover-stdout)
OUTPUT="<!-- COVERAGE_COMMENT_${PR_NUM} -->\n| File | Coverage | Missing Lines |\n|------|----------|---------------|\n"
TOTAL_LINES="Unknown"
MISSING_LINES="Unknown"
TOTAL_COVERAGE="Unknown"
IFS=$'\n'
for LINE in $CONTENT; do
if [[ $LINE =~ ^(.*\.py)\ \(([0-9\.]+%)\)\:\ Missing\ lines\ (.*)$ ]]; then
FILE="${BASH_REMATCH[1]}"
COVERAGE="${BASH_REMATCH[2]}"
MISSING="${BASH_REMATCH[3]}"
MISSING_TRANSFORMED="lines "
IFS=',' read -ra MISSING_PARTS <<< "$MISSING"
for PART in "${MISSING_PARTS[@]}"; do
if [[ $PART =~ ^([0-9]+)\-([0-9]+)$ ]]; then
MISSING_TRANSFORMED+="[${BASH_REMATCH[1]}-${BASH_REMATCH[2]}](${BASE_URL}/${FILE}#L${BASH_REMATCH[1]}-L${BASH_REMATCH[2]}), "
else
MISSING_TRANSFORMED+="[${PART}](${BASE_URL}/${FILE}#L${PART}), "
fi
done
MISSING_TRANSFORMED=${MISSING_TRANSFORMED%, }
OUTPUT+="| [${FILE}](${BASE_URL}/${FILE}) | ${COVERAGE} | ${MISSING_TRANSFORMED} |\n"
elif [[ $LINE =~ ^Total:\ \ \ (.*)\ lines$ ]]; then
TOTAL_LINES="${BASH_REMATCH[1]} lines"
elif [[ $LINE =~ ^Missing:\ (.*)\ lines$ ]]; then
MISSING_LINES="${BASH_REMATCH[1]} lines"
elif [[ $LINE =~ ^Coverage:\ (.*)%$ ]]; then
TOTAL_COVERAGE="${BASH_REMATCH[1]}%"
fi
done
OUTPUT+="\n| Total | Missing | Coverage |\n|-------|---------|----------|\n| ${TOTAL_LINES} | ${MISSING_LINES} | ${TOTAL_COVERAGE} |\n"
echo -e "$OUTPUT" > temp_comment.txt
gh pr comment "$PR_NUM" -F temp_comment.txt
if [[ $COVERAGE_LABEL != "coverage-diff" ]]; then
gh pr edit "$PR_NUM" --add-label "coverage-diff"
fi
fi
- name: Add diff coverage report to workflow summary
if: always()
run: |
cat coverage-reports/diff-cover.md >> "$GITHUB_STEP_SUMMARY"
- name: Publish coverage reports
if: always()
uses: actions/upload-artifact@v3
with:
name: coverage-reports
path: coverage-reports/*
if-no-files-found: error