update greet message #7
Workflow file for this run
This file contains hidden or 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: PR Checks | |
| on: | |
| pull_request: | |
| branches: | |
| - main | |
| - develop | |
| paths: | |
| - 'libs/**' | |
| - '.github/workflows/pr-checks.yml' | |
| jobs: | |
| detect-changes: | |
| name: Detect Changed Libraries | |
| runs-on: ubuntu-latest | |
| outputs: | |
| matrix: ${{ steps.set-matrix.outputs.matrix }} | |
| has-changes: ${{ steps.set-matrix.outputs.has-changes }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 # Fetch all history for accurate change detection | |
| - name: Detect changed libraries | |
| id: set-matrix | |
| run: | | |
| # Get the base branch (main or develop) | |
| BASE_REF="${{ github.event.pull_request.base.ref }}" | |
| HEAD_REF="${{ github.event.pull_request.head.sha }}" | |
| echo "Comparing changes between origin/${BASE_REF} and ${HEAD_REF}" | |
| # Fetch the base branch | |
| git fetch origin ${BASE_REF} | |
| # Get list of changed files | |
| CHANGED_FILES=$(git diff --name-only origin/${BASE_REF}...${HEAD_REF}) | |
| echo "Changed files:" | |
| echo "$CHANGED_FILES" | |
| # Initialize array to track changed libraries | |
| CHANGED_LIBS=() | |
| # Check if core library has changes | |
| if echo "$CHANGED_FILES" | grep -q "^libs/core/"; then | |
| echo "✓ Core library has changes" | |
| CHANGED_LIBS+=("core") | |
| fi | |
| # Check if public_health library has changes | |
| if echo "$CHANGED_FILES" | grep -q "^libs/public_health/"; then | |
| echo "✓ Public health library has changes" | |
| CHANGED_LIBS+=("public_health") | |
| fi | |
| # Check for root-level changes that affect all libraries | |
| if echo "$CHANGED_FILES" | grep -qE "^(pyproject.toml|Makefile|setup.sh)$"; then | |
| echo "✓ Root-level files changed, testing all libraries" | |
| CHANGED_LIBS=("core" "public_health") | |
| fi | |
| # Create matrix JSON with library and python-version combinations | |
| if [ ${#CHANGED_LIBS[@]} -eq 0 ]; then | |
| echo "No library changes detected" | |
| echo "matrix={\"include\":[]}" >> $GITHUB_OUTPUT | |
| echo "has-changes=false" >> $GITHUB_OUTPUT | |
| else | |
| # Remove duplicates | |
| UNIQUE_LIBS=($(echo "${CHANGED_LIBS[@]}" | tr ' ' '\n' | sort -u)) | |
| echo "Building matrix for libraries: ${UNIQUE_LIBS[@]}" | |
| # Build matrix with library and python-version combinations | |
| MATRIX_INCLUDE="[" | |
| FIRST=true | |
| for lib in "${UNIQUE_LIBS[@]}"; do | |
| # Read python versions from the library's python_versions.json | |
| PYTHON_VERSIONS=$(cat "libs/${lib}/python_versions.json" | jq -r '.[]') | |
| for py_version in $PYTHON_VERSIONS; do | |
| if [ "$FIRST" = true ]; then | |
| FIRST=false | |
| else | |
| MATRIX_INCLUDE+="," | |
| fi | |
| MATRIX_INCLUDE+="{\"library\":\"${lib}\",\"python-version\":\"${py_version}\"}" | |
| done | |
| done | |
| MATRIX_INCLUDE+="]" | |
| MATRIX_JSON="{\"include\":${MATRIX_INCLUDE}}" | |
| echo "Matrix JSON: ${MATRIX_JSON}" | |
| echo "matrix=${MATRIX_JSON}" >> $GITHUB_OUTPUT | |
| echo "has-changes=true" >> $GITHUB_OUTPUT | |
| fi | |
| build-and-test: | |
| name: Build ${{ matrix.library }} (Python ${{ matrix.python-version }}) | |
| needs: detect-changes | |
| if: needs.detect-changes.outputs.has-changes == 'true' | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: ${{ fromJson(needs.detect-changes.outputs.matrix) }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 # Needed for setuptools_scm versioning | |
| - name: Set up Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@v4 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: Install uv | |
| run: | | |
| curl -LsSf https://astral.sh/uv/install.sh | sh | |
| echo "$HOME/.cargo/bin" >> $GITHUB_PATH | |
| - name: Install vivarium_build_utils | |
| run: | | |
| uv pip install --system vivarium_build_utils | |
| - name: Install dependencies for ${{ matrix.library }} | |
| run: | | |
| cd libs/${{ matrix.library }} | |
| # Install the package with dev dependencies | |
| uv pip install --system -e ".[dev]" | |
| - name: Linting ${{ matrix.library }} | |
| run: | | |
| cd libs/${{ matrix.library }} | |
| echo "Running linting..." | |
| make lint | |
| - name: Running mypy for ${{ matrix.library }} | |
| run: | | |
| cd libs/${{ matrix.library }} | |
| if [ -f "src/${{ matrix.library }}/py.typed" ]; then | |
| echo "Running mypy..." | |
| make mypy | |
| else | |
| echo "Library is untyped. Skipping mypy." | |
| fi | |
| - name: Running tests for ${{ matrix.library }} | |
| run: | | |
| cd libs/${{ matrix.library }} | |
| echo "Running fast tests..." | |
| make test-all | |
| - name: Building docs for ${{ matrix.library }} | |
| run: | | |
| if [ ${{ matrix.python-version }} = "3.11" ]; then | |
| cd libs/${{ matrix.library }} | |
| echo "Building documentation" | |
| make build-docs | |
| else | |
| echo "Skipping documentation build (Python $$PYTHON_VERSION, only builds on 3.11)" | |
| fi | |
| - name: Running doctest for ${{ matrix.library }} | |
| run: | | |
| if [ ${{ matrix.python-version }} = "3.11" ]; then | |
| cd libs/${{ matrix.library }} | |
| echo "Running doctest..." | |
| make test-docs | |
| else | |
| echo "Skipping doctests (Python $$PYTHON_VERSION, only builds on 3.11)" | |
| fi | |
| pr-status-check: | |
| name: PR Status Check | |
| needs: [detect-changes, build-and-test] | |
| if: always() | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Check build status | |
| run: | | |
| if [ "${{ needs.detect-changes.outputs.has-changes }}" == "false" ]; then | |
| echo "✓ No library changes detected - PR checks passed" | |
| exit 0 | |
| elif [ "${{ needs.build-and-test.result }}" == "success" ]; then | |
| echo "✓ All library builds passed" | |
| exit 0 | |
| elif [ "${{ needs.build-and-test.result }}" == "skipped" ]; then | |
| echo "✓ No libraries to build" | |
| exit 0 | |
| else | |
| echo "✗ Some library builds failed" | |
| exit 1 | |
| fi |