diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a1828ff..57618ae 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,13 +1,10 @@ -name: Build + CI +name: Unittest and Build + CI # Triggers: Equivalent to ADO trigger block on: pull_request: branches: - develop - # paths: - # - 'app/**' - # - '.github/workflows/**' # Concurrency control: Ensures only one run per branch at a time, Equivalent to batch: true concurrency: @@ -15,8 +12,23 @@ concurrency: cancel-in-progress: true jobs: + run_backend_unittests: + name: Run Backend unit tests + permissions: + checks: write + secrets: inherit # Inherit secrets from the parent workflow + # Call the reusable workflow for unit tests + uses: ./.github/workflows/template_unit_pytest.yml + # Pass parameters as inputs to the reusable workflow + with: + projectName: Backend # Value defined in original variables + workingDir: app/backend + testsFolderName: tests + # secrets: inherit # Inherit secrets from the parent workflow + # This job defines the matrix and calls the reusable workflow for each image build build: + needs: run_backend_unittests name: Build ${{ matrix.image_config.IMAGE_NAME }} # Define necessary permissions if needed (e.g., for GitHub Packages) permissions: diff --git a/.github/workflows/template_test.yml b/.github/workflows/template_test.yml index bc27407..b5646fe 100644 --- a/.github/workflows/template_test.yml +++ b/.github/workflows/template_test.yml @@ -1,4 +1,4 @@ -name: Reusable Test Workflow +name: Reusable Integration Test Template on: workflow_call: diff --git a/.github/workflows/template_unit_pytest.yml b/.github/workflows/template_unit_pytest.yml new file mode 100644 index 0000000..81344d1 --- /dev/null +++ b/.github/workflows/template_unit_pytest.yml @@ -0,0 +1,93 @@ +name: Reusable Unit Test with Pytest Template + +on: + workflow_call: + inputs: + projectName: + description: 'Name of the project' + required: true + type: string + workingDir: + description: 'Working directory for the component' + required: true + type: string + testsFolderName: + description: 'Tests folder name' + required: true + type: string + +jobs: + build_and_test: + name: Build and Test ${{ inputs.projectName }} + runs-on: ubuntu-latest + timeout-minutes: 120 + + # Define environment variables based on inputs, similar to Azure variables + env: + SRC_PATH: ${{ github.workspace }}/${{ inputs.workingDir }} + TESTS_PATH: ${{ github.workspace }}/${{ inputs.workingDir }}/${{ inputs.testsFolderName }} + TESTS_RESULTS_PATH: ${{ github.workspace }}/${{ inputs.workingDir }}/results.xml + TESTS_COVERAGE_REPORT_PATH: ${{ github.workspace }}/${{ inputs.workingDir }}/coverage.xml + # Use the working directory input for commands that need it + WORKING_DIR: ${{ inputs.workingDir }} + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python 3.11 + uses: actions/setup-python@v5 # Use latest stable version + with: + python-version: '3.11' + + - name: Install build dependencies + run: | + python -m pip install --upgrade pip + pip install pipenv + + - name: Install environment including dev dependencies + working-directory: ${{ env.WORKING_DIR }} + run: | + echo "Current directory:" + pwd + echo "Listing files:" + ls -al + echo "Pipfile content:" + cat Pipfile + pipenv sync -d + + - name: Run tests with pytest + working-directory: ${{ env.WORKING_DIR }} + run: | + pipenv run pytest --version + # Use the environment variables defined above for paths + pipenv run pytest -v -s -o log_cli=true --junitxml=results.xml --cov=${{ env.SRC_PATH }} --cov-report=xml:${{ env.TESTS_COVERAGE_REPORT_PATH }} ${{ env.TESTS_PATH }} + echo "Listing results in working directory:" + ls -al ${{ github.workspace }}/${{ env.WORKING_DIR }} + + + # Use a popular action for publishing test results for better GitHub integration + - name: Publish Test Report + uses: dorny/test-reporter@v1 + if: success() || failure() # always run even if tests fail + with: + name: ${{ inputs.projectName }} Test Results + path: ${{ env.TESTS_RESULTS_PATH }} + reporter: java-junit # Specify JUnit format + + # Upload coverage report as an artifact + - name: Upload coverage report artifact + uses: actions/upload-artifact@v4 + if: success() || failure() # always run + with: + name: ${{ inputs.projectName }}-coverage-report + path: ${{ env.TESTS_COVERAGE_REPORT_PATH }} + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v5 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ${{ env.TESTS_COVERAGE_REPORT_PATH }} + fail_ci_if_error: true + + diff --git a/README.md b/README.md index 7611cb0..89d48c8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build + CI](https://github.com/aimingmed/aimingmed-ai/actions/workflows/build.yml/badge.svg)](https://github.com/aimingmed/aimingmed-ai/actions/workflows/build.yml) +[![Unittest and Build + CI](https://github.com/aimingmed/aimingmed-ai/actions/workflows/build.yml/badge.svg)](https://github.com/aimingmed/aimingmed-ai/actions/workflows/build.yml) ## Important note: diff --git a/app/frontend/vite.config.ts b/app/frontend/vite.config.ts index 915b45e..041bc3d 100644 --- a/app/frontend/vite.config.ts +++ b/app/frontend/vite.config.ts @@ -7,7 +7,7 @@ export default defineConfig({ server: { host: true, strictPort: true, - port: 5173 + port: }, test: { globals: true,