name: Pull Request Checks on: pull_request: branches: - main - develop env: REGISTRY: gitea-http.taildb3494.ts.net IMAGE_NAME: will/unitforge jobs: test: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Install uv uses: astral-sh/setup-uv@v3 with: version: "latest" - name: Set up Python run: uv python install 3.11 - name: Install dependencies run: | uv venv uv pip install -e ".[dev]" - name: Run linting run: | source .venv/bin/activate make lint - name: Run type checking run: | source .venv/bin/activate make type-check - name: Run tests with coverage run: | source .venv/bin/activate make test-cov - name: Security check run: | source .venv/bin/activate make security-check - name: Upload coverage reports uses: codecov/codecov-action@v3 if: always() with: file: ./htmlcov/coverage.xml flags: unittests name: codecov-umbrella build-test: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Verify vendor assets run: | if [ ! -f frontend/static/vendor/bootstrap/css/bootstrap.min.css ]; then echo "Error: Missing bootstrap CSS file" exit 1 fi if [ ! -f frontend/static/vendor/bootstrap/js/bootstrap.bundle.min.js ]; then echo "Error: Missing bootstrap JS file" exit 1 fi if [ ! -f frontend/static/vendor/fontawesome/css/all.min.css ]; then echo "Error: Missing FontAwesome CSS file" exit 1 fi if [ ! -f frontend/static/vendor/fontawesome/webfonts/fa-solid-900.woff2 ]; then echo "Error: Missing FontAwesome font file" exit 1 fi if [ ! -f frontend/static/img/osi-logo.svg ]; then echo "Error: Missing OSI logo" exit 1 fi echo "All vendor assets verified" - name: Build multi-arch image (test only) uses: docker/build-push-action@v5 with: context: . file: ./Dockerfile platforms: linux/amd64,linux/arm64 push: false tags: unitforge:pr-${{ github.event.number }} cache-from: type=gha cache-to: type=gha,mode=max - name: Test container startup run: | docker run --rm -d --name unitforge-test -p 8080:8000 unitforge:pr-${{ github.event.number }} sleep 10 # Basic health check curl -f http://localhost:8080/health || exit 1 docker stop unitforge-test validate-config: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Install uv uses: astral-sh/setup-uv@v3 with: version: "latest" - name: Set up Python run: uv python install 3.11 - name: Install dependencies run: | uv venv uv pip install -e ".[dev]" - name: Validate configuration run: | source .venv/bin/activate make validate-config pr-summary: needs: [test, build-test, validate-config] runs-on: ubuntu-latest if: always() steps: - name: PR Summary run: | echo "## Pull Request Build Summary" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "| Check | Status |" >> $GITHUB_STEP_SUMMARY echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY echo "| Tests | ${{ needs.test.result == 'success' && '✅ Passed' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY echo "| Build | ${{ needs.build-test.result == 'success' && '✅ Passed' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY echo "| Config | ${{ needs.validate-config.result == 'success' && '✅ Passed' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY if [[ "${{ needs.test.result }}" == "success" && "${{ needs.build-test.result }}" == "success" && "${{ needs.validate-config.result }}" == "success" ]]; then echo "🎉 All checks passed! This PR is ready for review." >> $GITHUB_STEP_SUMMARY else echo "❌ Some checks failed. Please review the failed jobs above." >> $GITHUB_STEP_SUMMARY fi