name: Analyse Python project on: workflow_call: inputs: project_name: required: true type: string path_to_project: required: true type: string secrets: sonar_token: required: true sonar_host: required: true jobs: test: name: Build and test on Python ${{ matrix.python-version }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: python-version: ["3.8.12", "3.9.12", "3.10.4"] steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python3 -m pip install --upgrade pip setuptools pytest pytest-cov pytest-subtests pytest-asyncio cd ${{ inputs.path_to_project }} python3 -m pip install -r requirements.txt --upgrade (test -f dev-requirements.txt && pip install -r dev-requirements.txt --upgrade) || true - name: Run tests run: python3 -m pytest --cov=. --cov-report=xml --junit-xml pytest.xml --asyncio-mode=strict || true working-directory: ${{ inputs.path_to_project }} - name: Upload results if: always() uses: actions/upload-artifact@v2 with: name: Unit test coverage (Python ${{ matrix.python-version }}) path: ${{ inputs.path_to_project }}/*.xml sonar: name: Analyse Python project with SonarQube needs: test runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 with: fetch-depth: 0 - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt --upgrade working-directory: ${{ inputs.path_to_project }} - name: Download test results uses: actions/download-artifact@v2 with: path: ${{ inputs.path_to_project }}/artifacts - uses: sonarsource/sonarqube-scan-action@master env: SONAR_TOKEN: ${{ secrets.sonar_token }} SONAR_HOST_URL: ${{ secrets.sonar_host }} with: projectBaseDir: ${{ inputs.path_to_project }} args: > -Dsonar.projectKey=${{ inputs.project_name }} -Dsonar.login=${{ secrets.sonar_token }} -Dsonar.verbose=true -Dsonar.python.coverage.reportPaths=artifacts/*/coverage.xml -Dsonar.coverage.exclusions=**/external/**/* -Dsonar.exclusions=**/external/**/*,artifacts/**/* publish-test-results: name: Publish unit test results needs: test runs-on: ubuntu-latest if: always() steps: - name: Download artifacts uses: actions/download-artifact@v2 with: path: artifacts - name: Publish results uses: EnricoMi/publish-unit-test-result-action@v1 with: files: artifacts/*/pytest.xml