KiCad CI #4
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: KiCad CI | |
| on: | |
| push: | |
| paths: | |
| - 'pmod/**' | |
| - '!pmod/assets/**' | |
| - '!pmod/template/**' | |
| pull_request: | |
| paths: | |
| - 'pmod/**' | |
| - '!pmod/assets/**' | |
| - '!pmod/template/**' | |
| workflow_dispatch: | |
| inputs: | |
| project_filter: | |
| description: 'Filter by specific project (optional)' | |
| required: false | |
| default: '' | |
| type: string | |
| jobs: | |
| find-projects: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| projects: ${{ steps.find-projects.outputs.projects }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Find KiCad projects | |
| id: find-projects | |
| run: | | |
| echo "Searching for KiCad projects in pmod directory..." | |
| # If manual run with project filter, only look for that specific project | |
| if [ -n "${{ github.event.inputs.project_filter }}" ]; then | |
| echo "Filtering for project: ${{ github.event.inputs.project_filter }}" | |
| PROJECTS=$(find pmod -name "*.kicad_pro" -path "*/${{ github.event.inputs.project_filter }}/KiCad/*" | sed 's|/KiCad/.*\.kicad_pro||' | sort -u) | |
| else | |
| PROJECTS=$(find pmod -name "*.kicad_pro" -path "*/KiCad/*" | sed 's|/KiCad/.*\.kicad_pro||' | sort -u) | |
| fi | |
| if [ -z "$PROJECTS" ]; then | |
| echo "No KiCad projects found matching the filter" | |
| echo 'projects=[]' >> $GITHUB_OUTPUT | |
| else | |
| # Convert to JSON array for matrix output | |
| JSON_PROJECTS=$(echo "$PROJECTS" | jq -R -s -c 'split("\n") | map(select(. != ""))') | |
| echo "Found projects: $JSON_PROJECTS" | |
| echo "projects=$JSON_PROJECTS" >> $GITHUB_OUTPUT | |
| fi | |
| kicad-checks: | |
| needs: find-projects | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| project: ${{ fromJson(needs.find-projects.outputs.projects) }} | |
| name: KiCad DRC and 3D Export - ${{ matrix.project }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Extract project name | |
| id: project-info | |
| run: | | |
| PROJECT_NAME=$(basename "${{ matrix.project }}") | |
| echo "project_name=$PROJECT_NAME" >> $GITHUB_OUTPUT | |
| echo "Processing project: ${{ matrix.project }}" | |
| echo "Project name: $PROJECT_NAME" | |
| - name: Find project file | |
| id: project-file | |
| run: | | |
| KICAD_DIR="${{ matrix.project }}/KiCad" | |
| PROJECT_FILE=$(find "$KICAD_DIR" -name "*.kicad_pro" -exec basename {} .kicad_pro \; | head -1) | |
| if [ -n "$PROJECT_FILE" ]; then | |
| echo "project_file=$PROJECT_FILE" >> $GITHUB_OUTPUT | |
| echo "kicad_dir=$KICAD_DIR" >> $GITHUB_OUTPUT | |
| else | |
| echo "No KiCad project file found in $KICAD_DIR" | |
| exit 1 | |
| fi | |
| - name: Create assets directory | |
| run: | | |
| mkdir -p "${{ matrix.project }}/assets" | |
| - name: Run KiCad DRC | |
| uses: sparkengineering/kicad-action@v4 | |
| with: | |
| kicad_pcb: "${{ steps.project-file.outputs.kicad_dir }}/${{ steps.project-file.outputs.project_file }}.kicad_pcb" | |
| pcb_drc: true | |
| - name: Generate 3D render | |
| uses: sparkengineering/kicad-action@v4 | |
| with: | |
| kicad_pcb: "${{ steps.project-file.outputs.kicad_dir }}/${{ steps.project-file.outputs.project_file }}.kicad_pcb" | |
| pcb_image: true | |
| pcb_image_path: "${{ matrix.project }}/assets/default.png" | |
| - name: Upload DRC report if failed | |
| uses: actions/upload-artifact@v4 | |
| if: ${{ failure() }} | |
| with: | |
| name: drc-report-${{ steps.project-info.outputs.project_name }} | |
| path: ${{ steps.project-file.outputs.kicad_dir }}/drc.rpt | |
| - name: Upload 3D render | |
| uses: actions/upload-artifact@v4 | |
| if: ${{ !cancelled() }} | |
| with: | |
| name: 3d-render-${{ steps.project-info.outputs.project_name }} | |
| path: ${{ matrix.project }}/assets/default.png |