2020 type : string
2121
2222jobs :
23- kicad_checks :
23+ find-projects :
2424 runs-on : ubuntu-latest
25- name : KiCad DRC and 3D Export
25+ outputs :
26+ projects : ${{ steps.find-projects.outputs.projects }}
2627 steps :
2728 - name : Checkout
2829 uses : actions/checkout@v4
29-
30+
3031 - name : Find KiCad projects
31- id : find_projects
32+ id : find-projects
3233 run : |
3334 echo "Searching for KiCad projects in pmod directory..."
3435
@@ -42,86 +43,68 @@ jobs:
4243
4344 if [ -z "$PROJECTS" ]; then
4445 echo "No KiCad projects found matching the filter"
45- echo " projects=" >> $GITHUB_OUTPUT
46+ echo ' projects=[]' >> $GITHUB_OUTPUT
4647 else
47- echo "Found projects: $PROJECTS"
48- echo "projects=$PROJECTS" >> $GITHUB_OUTPUT
48+ # Convert to JSON array for matrix output
49+ JSON_PROJECTS=$(echo "$PROJECTS" | jq -R -s -c 'split("\n") | map(select(. != ""))')
50+ echo "Found projects: $JSON_PROJECTS"
51+ echo "projects=$JSON_PROJECTS" >> $GITHUB_OUTPUT
4952 fi
5053
51- - name : Process each KiCad project
54+ kicad-checks :
55+ needs : find-projects
56+ runs-on : ubuntu-latest
57+ strategy :
58+ matrix :
59+ project : ${{ fromJson(needs.find-projects.outputs.projects) }}
60+ name : KiCad DRC and 3D Export - ${{ matrix.project }}
61+ steps :
62+ - name : Checkout
63+ uses : actions/checkout@v4
64+
65+ - name : Extract project name
66+ id : project-info
67+ run : |
68+ PROJECT_NAME=$(basename "${{ matrix.project }}")
69+ echo "project_name=$PROJECT_NAME" >> $GITHUB_OUTPUT
70+ echo "Processing project: ${{ matrix.project }}"
71+ echo "Project name: $PROJECT_NAME"
72+
73+ - name : Find project file
74+ id : project-file
5275 run : |
53- # Check if any projects were found
54- if [ -z "${{ steps.find_projects.outputs.projects }}" ]; then
55- echo "No KiCad projects found to process"
56- exit 0
76+ KICAD_DIR="${{ matrix.project }}/KiCad"
77+ PROJECT_FILE=$(find "$KICAD_DIR" -name "*.kicad_pro" -exec basename {} .kicad_pro \; | head -1)
78+ if [ -n "$PROJECT_FILE" ]; then
79+ echo "project_file=$PROJECT_FILE" >> $GITHUB_OUTPUT
80+ echo "kicad_dir=$KICAD_DIR" >> $GITHUB_OUTPUT
81+ else
82+ echo "No KiCad project file found in $KICAD_DIR"
83+ exit 1
5784 fi
5885
59- for PROJECT_PATH in ${{ steps.find_projects.outputs.projects }}; do
60- echo "Processing project: $PROJECT_PATH"
61- PROJECT_NAME=$(basename "$PROJECT_PATH")
62- KICAD_DIR="$PROJECT_PATH/KiCad"
63- ASSETS_DIR="$PROJECT_PATH/assets"
64-
65- # Find the main project file (without .kicad_pro extension)
66- PROJECT_FILE=$(find "$KICAD_DIR" -name "*.kicad_pro" -exec basename {} .kicad_pro \; | head -1)
67-
68- if [ -n "$PROJECT_FILE" ]; then
69- echo "Found KiCad project: $PROJECT_FILE"
70-
71- # Change to the KiCad directory for processing
72- cd "$KICAD_DIR"
73-
74- # Run DRC
75- echo "Running DRC for $PROJECT_FILE..."
76- pcb_drc_result=0
77- /usr/bin/docker run --rm -v "$PWD:/workspace" sparkengineering/kicad-action:latest \
78- --kicad_pcb "$PROJECT_FILE.kicad_pcb" --pcb_drc || pcb_drc_result=$?
79-
80- # Generate 3D render
81- echo "Generating 3D render for $PROJECT_FILE..."
82- pcb_3d_result=0
83- /usr/bin/docker run --rm -v "$PWD:/workspace" sparkengineering/kicad-action:latest \
84- --kicad_pcb "$PROJECT_FILE.kicad_pcb" --pcb_3d --pcb_3d_output "temp_3d.png" || pcb_3d_result=$?
85-
86- # Create assets directory and move 3D render
87- if [ $pcb_3d_result -eq 0 ] && [ -f "temp_3d.png" ]; then
88- echo "Moving 3D render to assets directory..."
89- mkdir -p "../../assets"
90- mv "temp_3d.png" "../../assets/default.png"
91- echo "3D render saved to $PROJECT_PATH/assets/default.png"
92- fi
93-
94- # Go back to workspace root
95- cd "$GITHUB_WORKSPACE"
96-
97- # Upload artifacts for this project
98- if [ $pcb_drc_result -ne 0 ] && [ -f "$KICAD_DIR/drc.rpt" ]; then
99- echo "Uploading DRC report for $PROJECT_NAME"
100- cp "$KICAD_DIR/drc.rpt" "drc_${PROJECT_NAME}.rpt"
101- fi
102-
103- if [ -f "$PROJECT_PATH/assets/default.png" ]; then
104- echo "Uploading 3D render for $PROJECT_NAME"
105- cp "$PROJECT_PATH/assets/default.png" "render_${PROJECT_NAME}.png"
106- fi
107-
108- else
109- echo "No KiCad project file found in $KICAD_DIR"
110- fi
111- done
112-
113- # Upload DRC reports only if DRC failed
114- - name : Upload DRC reports
86+ - name : Create assets directory
87+ run : |
88+ mkdir -p "${{ matrix.project }}/assets"
89+
90+ - name : Run KiCad DRC and 3D render
91+ uses : sparkengineering/kicad-action@v4
92+ with :
93+ kicad_pcb : " ${{ steps.project-file.outputs.kicad_dir }}/${{ steps.project-file.outputs.project_file }}.kicad_pcb"
94+ pcb_drc : true
95+ pcb_3d : true
96+ pcb_3d_output : " ${{ matrix.project }}/assets/default.png"
97+
98+ - name : Upload DRC report if failed
11599 uses : actions/upload-artifact@v4
116100 if : ${{ failure() }}
117101 with :
118- name : drc-reports
119- path : drc_*.rpt
120-
121- # Upload 3D renders if generation succeeded
122- - name : Upload 3D renders
102+ name : drc-report-${{ steps.project-info.outputs.project_name }}
103+ path : ${{ steps.project-file.outputs.kicad_dir }}/drc.rpt
104+
105+ - name : Upload 3D render
123106 uses : actions/upload-artifact@v4
124107 if : ${{ !cancelled() }}
125108 with :
126- name : 3d-renders
127- path : render_* .png
109+ name : 3d-render-${{ steps.project-info.outputs.project_name }}
110+ path : ${{ matrix.project }}/assets/default .png
0 commit comments