''
Some checks failed
KiBot PCB Generation / generate (push) Failing after 46s
KiBot PCB Generation / deploy (push) Has been skipped

This commit is contained in:
2025-09-08 16:35:41 +07:00
parent 75f74bfe30
commit 0d57021e08

View File

@@ -1,297 +1,544 @@
- name: Download component datasheets # KiBot configuration for 2/4/6 layer boards
if: steps.config_check.outputs.found == 'true' # Works with Gitea CI/CD pipeline
continue-on-error: true
run: |
echo "Datasheets will be downloaded by KiBot's download_datasheets output"
echo "They will be saved in Generated/BoM/Datasheets/"
# Create a README for the datasheets folder if KiBot creates it kibot:
if [ -d "${GITHUB_WORKSPACE}/Generated/BoM/Datasheets" ]; then version: 1
cat > "${GITHUB_WORKSPACE}/Generated/BoM/Datasheets/README.md" << EOF
# Component Datasheets
This folder contains downloaded datasheets for components used in the project. global:
# Filters for ERC/DRC warnings
filters:
- number: 1007
- number: 1015
- number: 58
- number: 61
- Datasheets are downloaded automatically from URLs in the schematic # Default output directory - will be overridden by command line
- Files are named based on the component reference and original filename # output: 'Fabrication' # Commented out to use command line option
- Only unique datasheets are downloaded (duplicates are linked)
Generated on: $(date) # Variant for assembly if needed
Project: ${{ steps.find_project.outputs.project_name }} variant: ''
EOF
echo "Datasheet folder contents:" # Date format for filenames
ls -la "${GITHUB_WORKSPACE}/Generated/BoM/Datasheets/" || true date_format: '%Y-%m-%d_%H-%M-%S'
else
echo "Note: Datasheet folder not created yet - will be created by KiBot"
finame: "KiBot PCB Generation"
# Controls when the action will run preflight:
on: run_erc: true
push: run_drc: true
paths: check_zone_fills: true
- '**/*.kicad_sch' ignore_unconnected: false
- '**/*.kicad_pcb' update_xml: true
- '**/*.kicad_pro' erc:
- 'kibot.yaml' warnings_as_errors: false
- '.gitea/workflows/*.yml' # Continue even if ERC fails
pull_request: dont_stop: true
paths: drc:
- '**/*.kicad_sch' warnings_as_errors: false
- '**/*.kicad_pcb' # Continue even if DRC fails
- '**/*.kicad_pro' dont_stop: true
- 'kibot.yaml'
- '.gitea/workflows/*.yml'
repository_dispatch:
types: [run_qs]
workflow_dispatch:
inputs:
board_layers:
description: 'Number of PCB layers'
required: false
default: '2'
type: choice
options:
- '2'
- '4'
- '6'
# A workflow run is made up of one or more jobs that can run sequentially or in parallel outputs:
jobs: # Schematic outputs
generate: - name: 'print_sch'
runs-on: kicad-kibot-runner comment: "Schematic PDF"
type: pdf_sch_print
dir: Schematic
options:
output: '%f-schematic.%x'
steps: - name: 'print_sch_svg'
- uses: actions/checkout@v3 comment: "Schematic SVG"
with: type: svg_sch_print
# So we can run a diff between last 2 changes dir: Schematic
fetch-depth: '0' options:
output: '%f-schematic.%x'
- name: Find KiCad project # PCB 2D renders
id: find_project - name: 'pcb_top'
run: | comment: "PCB render top"
# Find all .kicad_pcb files in the repository type: pcbdraw
PCB_FILES=$(find . -name "*.kicad_pcb" -type f | grep -v -E '/(backups?|backup|old|archive|deprecated)/' | head -5) dir: PCB/2D_render
options:
output: '%f-top.%x'
format: svg
show_components: all
dpi: 300
if [ -z "$PCB_FILES" ]; then - name: 'pcb_bottom'
echo "Error: No KiCad PCB files found" comment: "PCB render bottom"
exit 1 type: pcbdraw
fi dir: PCB/2D_render
options:
output: '%f-bottom.%x'
format: svg
bottom: true
show_components: all
dpi: 300
# Use the first PCB file found # PCB PDF documentation
PCB_FILE=$(echo "$PCB_FILES" | head -1) - name: 'print_pcb'
PROJECT_DIR=$(dirname "$PCB_FILE") comment: "PCB PDF"
PROJECT_NAME=$(basename "$PCB_FILE" .kicad_pcb) type: pdf_pcb_print
dir: PCB/PDF
options:
output: '%f-pcb.%x'
plot_sheet_reference: true
monochrome: false
pages:
- layers:
- F.Cu
- F.Paste
- F.Silkscreen
- Edge.Cuts
sheet: 'Front copper'
- layers:
- B.Cu
- B.Paste
- B.Silkscreen
- Edge.Cuts
mirror: true
sheet: 'Bottom copper'
- layers:
- In1.Cu
- Edge.Cuts
sheet: 'Inner layer 1'
skip_if_no_layer: true
- layers:
- In2.Cu
- Edge.Cuts
sheet: 'Inner layer 2'
skip_if_no_layer: true
- layers:
- In3.Cu
- Edge.Cuts
sheet: 'Inner layer 3'
skip_if_no_layer: true
- layers:
- In4.Cu
- Edge.Cuts
sheet: 'Inner layer 4'
skip_if_no_layer: true
echo "Found KiCad project: $PROJECT_NAME" # Gerber files - automatically handles 2/4/6 layers
echo "Project directory: $PROJECT_DIR" - name: 'gerbers'
echo "PCB file: $PCB_FILE" comment: "Gerber files"
type: gerber
dir: Gerbers
options:
output: '%f%i.%x'
exclude_edge_layer: true
exclude_pads_from_silkscreen: true
plot_sheet_reference: false
plot_footprint_refs: true
plot_footprint_values: false
force_plot_invisible_refs_vals: false
tent_vias: true
use_protel_extensions: false
create_gerber_job_file: true
disable_aperture_macros: true
gerber_precision: 4.6
use_gerber_x2_attributes: false
use_gerber_net_attributes: false
line_width: 0.1
subtract_mask_from_silk: true
layers:
# Copper layers - automatically included if present
- F.Cu
- B.Cu
- In1.Cu
- In2.Cu
- In3.Cu
- In4.Cu
# Technical layers
- F.Paste
- B.Paste
- F.Silkscreen
- B.Silkscreen
- F.Mask
- B.Mask
- Edge.Cuts
- User.Comments
- F.Fab
- B.Fab
# Find schematic file # Excellon drill files
SCH_FILE=$(find "$PROJECT_DIR" -name "*.kicad_sch" -o -name "*.sch" | head -1) - name: 'drill'
comment: "Drill files"
type: excellon
dir: Gerbers
options:
output: '%f%i.%x'
metric_units: true
minimal_header: false
mirror_y_axis: false
report:
filename: '%f-drill_report.txt'
pth_and_npth_single_file: false
echo "pcb_file=$PCB_FILE" >> $GITHUB_OUTPUT # Drill map
echo "project_dir=$PROJECT_DIR" >> $GITHUB_OUTPUT - name: 'drill_map'
echo "project_name=$PROJECT_NAME" >> $GITHUB_OUTPUT comment: "Drill map"
echo "sch_file=$SCH_FILE" >> $GITHUB_OUTPUT type: gerb_drill
dir: Gerbers
options:
output: '%f-drill_map.%x'
# List all found projects for debugging # Pick and place files
echo "All PCB files found:" - name: 'position'
echo "$PCB_FILES" comment: "Pick and place file"
type: position
dir: Assembly
options:
output: '%f-position-%i.%x' # Added %i to differentiate front/back files
format: CSV
units: millimeters
separate_files_for_front_and_back: true
only_smd: false
- name: Set layer count # Interactive BOM
id: layers - name: 'ibom'
run: | comment: "Interactive BOM"
# Use workflow input or default to 4 layers type: ibom
LAYERS="${{ github.event.inputs.board_layers }}" dir: Assembly
if [ -z "$LAYERS" ]; then options:
LAYERS="4" # Change this default if needed output: '%f-ibom.%x'
fi dark_mode: false
echo "layers=$LAYERS" >> $GITHUB_OUTPUT hide_pads: false
echo "Using $LAYERS layer configuration" show_fabrication: false
hide_silkscreen: false
highlight_pin1: true
no_redraw_on_drag: false
board_rotation: 0
check_extra_fields: false
include_tracks: false
include_nets: false
- name: Check for KiBot config # Generic BOM in CSV format
id: config_check - name: 'bom_csv'
run: | comment: "Bill of Materials in CSV format"
# Check if kibot.yaml exists in repository root type: bom
if [ -f "kibot.yaml" ]; then dir: BoM/Generic
echo "found=true" >> $GITHUB_OUTPUT options:
echo "Using kibot.yaml configuration from repository root" output: '%f_bom.%x'
else format: CSV
echo "found=false" >> $GITHUB_OUTPUT separator: ','
echo "No kibot.yaml found in repository root - will use --quick-start mode" ref_separator: ','
fi group_fields: ['Value', 'Footprint', 'Tolerance', 'Voltage']
columns:
- field: 'References'
name: 'Reference'
- field: 'Value'
name: 'Value'
- field: 'Quantity Per PCB'
name: 'Qty'
- field: 'Footprint'
name: 'Package'
- field: 'Description'
name: 'Description'
- field: 'Manufacturer'
name: 'Manufacturer'
- field: 'MPN'
name: 'Part Number'
- field: 'LCSC'
name: 'LCSC Part'
- field: 'Digikey'
name: 'Digikey Part'
- field: 'Mouser'
name: 'Mouser Part'
- name: Run ERC # Generic BOM in HTML format
if: steps.config_check.outputs.found == 'true' - name: 'bom_html'
run: | comment: "Bill of Materials in HTML format"
cd "${{ steps.find_project.outputs.project_dir }}" type: bom
dir: BoM/Generic
options:
output: '%f_bom.%x'
format: HTML
html:
style: 'modern-blue' # Style for HTML output
datasheet_as_link: 'Datasheet' # Column name for datasheet links
generate_dnf: true
logo: false
title: 'Bill of Materials - %f'
group_fields: ['Value', 'Footprint', 'Tolerance', 'Voltage']
columns:
- field: 'References'
name: 'Reference'
- field: 'Value'
name: 'Value'
- field: 'Quantity Per PCB'
name: 'Qty'
- field: 'Footprint'
name: 'Package'
- field: 'Description'
name: 'Description'
- field: 'Manufacturer'
name: 'Manufacturer'
- field: 'MPN'
name: 'Part Number'
- field: 'LCSC'
name: 'LCSC Part'
- field: 'Digikey'
name: 'Digikey Part'
- field: 'Mouser'
name: 'Mouser Part'
if [ -n "${{ steps.find_project.outputs.sch_file }}" ]; then # Generic BOM in XLSX format
echo "Running ERC on schematic files..." - name: 'bom_xlsx'
# Use absolute path to config file in repo root comment: "Bill of Materials in Excel format"
kibot -c "${GITHUB_WORKSPACE}/kibot.yaml" -s run_erc -v || true type: bom
else dir: BoM/Generic
echo "No schematic files found, skipping ERC" options:
fi output: '%f_bom.%x'
continue-on-error: true format: XLSX
xlsx:
datasheet_as_link: 'Datasheet' # Column name for datasheet links
generate_dnf: true
logo: false
title: 'Bill of Materials'
max_col_width: 50
highlight_empty: true
group_fields: ['Value', 'Footprint', 'Tolerance', 'Voltage']
columns:
- field: 'References'
name: 'Reference'
- field: 'Value'
name: 'Value'
- field: 'Quantity Per PCB'
name: 'Qty'
- field: 'Footprint'
name: 'Package'
- field: 'Description'
name: 'Description'
- field: 'Manufacturer'
name: 'Manufacturer'
- field: 'MPN'
name: 'Part Number'
- field: 'LCSC'
name: 'LCSC Part'
- field: 'Digikey'
name: 'Digikey Part'
- field: 'Mouser'
name: 'Mouser Part'
- field: 'Datasheet'
name: 'Datasheet'
- name: Run DRC # Download datasheets
if: steps.config_check.outputs.found == 'true' - name: 'download_datasheets'
run: | comment: "Download component datasheets"
cd "${{ steps.find_project.outputs.project_dir }}" type: download_datasheets
dir: BoM/Datasheets
run_by_default: true
options:
# Don't specify output - let KiBot handle the downloaded files
# output: '%f_datasheets.csv' # Removed - this was causing the issue
field: 'Datasheet' # Field containing datasheet URLs
dnf_filter: '_none' # Don't filter DNF parts
download: true # Actually download the files (not just list them)
link_repeated: true # Create links for repeated datasheets
repeated: false # Don't download the same datasheet twice
echo "Running DRC on PCB..." # 3D model
# Use absolute path to config file in repo root - name: 'step'
kibot -c "${GITHUB_WORKSPACE}/kibot.yaml" -s run_drc -v || true comment: "3D STEP model"
continue-on-error: true type: step
dir: 3D
options:
output: '%f-3D.%x'
metric_units: true
origin: grid
no_virtual: true
- name: Generate outputs with custom config # Board characteristics report
if: steps.config_check.outputs.found == 'true' - name: 'report'
run: | comment: "Board report"
cd "${{ steps.find_project.outputs.project_dir }}" type: report
dir: .
options:
output: '%f-report.%x'
do_convert: true
echo "Generating outputs for ${{ steps.layers.outputs.layers }} layer board" # Schematic diff
echo "Project: ${{ steps.find_project.outputs.project_name }}" - name: 'sch_diff'
echo "Using config: ${GITHUB_WORKSPACE}/kibot.yaml" comment: "Schematic diff PDF"
type: diff
dir: DIFF
run_by_default: true
options:
output: '%f-schematic-diff.%x'
format: 'pdf' # Output format: pdf, svg, ps, or png
pcb: false # This is for schematic
old: 'HEAD~1' # Old version to compare (previous commit)
new: 'HEAD' # New version (current)
cache_dir: '.cache'
add_link_id: true # Add link IDs to the generated diff
only_different: true # Only include pages that changed
threshold: 0 # Difference threshold (0 = any difference)
fuzz: 5 # Fuzzy matching tolerance in pixels
diff_mode: 'red_green' # How to show differences
old_color: '#FF0000' # Color for old/removed items
new_color: '#00FF00' # Color for new/added items
# Run KiBot with the configuration from repo root # PCB diff
# Skip ERC/DRC preflight checks to avoid stopping on errors - name: 'pcb_diff'
kibot -c "${GITHUB_WORKSPACE}/kibot.yaml" -s run_erc,run_drc -d Fabrication -v comment: "PCB diff PDF"
type: diff
dir: DIFF
run_by_default: true
options:
output: '%f-pcb-diff.%x'
format: 'pdf' # Output format
pcb: true # This is for PCB
old: 'HEAD~1' # Old version to compare
new: 'HEAD' # New version
cache_dir: '.cache'
add_link_id: false # Not used for PCB
only_different: true # Only include layers that changed
threshold: 0 # Difference threshold
fuzz: 5 # Fuzzy matching tolerance
diff_mode: 'red_green' # Visual diff mode
old_color: '#FF0000' # Color for removed items
new_color: '#00FF00' # Color for added items
layers: # Which PCB layers to include in diff
- 'F.Cu'
- 'B.Cu'
- 'In1.Cu'
- 'In2.Cu'
- 'In3.Cu'
- 'In4.Cu'
- 'F.Silkscreen'
- 'B.Silkscreen'
- 'F.Mask'
- 'B.Mask'
- 'Edge.Cuts'
- 'F.Courtyard'
- 'B.Courtyard'
- 'F.Fab'
- 'B.Fab'
# Move outputs to root Generated folder # Interactive diff using KiRi (HTML output)
mkdir -p "${GITHUB_WORKSPACE}/Generated" - name: 'interactive_diff'
if [ -d "Fabrication" ]; then comment: "Interactive HTML diff"
cp -r Fabrication/* "${GITHUB_WORKSPACE}/Generated/" type: diff
fi dir: DIFF
run_by_default: false # Optional - can be slow
options:
output: '%f-interactive-diff.%x'
format: 'html' # HTML format for interactive viewing
pcb: true
old: 'HEAD~1'
new: 'HEAD'
cache_dir: '.cache'
only_different: true
diff_mode: 'stats' # Show statistics in HTML
- name: Quick Start fallback # SVG diff for web viewing
if: steps.config_check.outputs.found == 'false' - name: 'svg_diff'
run: | comment: "SVG diff for web"
cd "${{ steps.find_project.outputs.project_dir }}" type: diff
echo "Running KiBot in quick-start mode" dir: DIFF
kibot --quick-start run_by_default: false
options:
output: '%f-diff.%x'
format: 'svg' # SVG format for web embedding
pcb: true
old: 'HEAD~1'
new: 'HEAD'
cache_dir: '.cache'
only_different: true
diff_mode: 'red_green'
old_color: '#FF0000'
new_color: '#00FF00'
zones: 'fill' # How to handle zones: fill, outline, or none
# Move outputs to root Generated folder # JLCPCB fabrication package
mkdir -p "${GITHUB_WORKSPACE}/Generated" - name: 'jlcpcb_gerbers'
if [ -d "Generated" ]; then comment: "Gerbers for JLCPCB"
cp -r Generated/* "${GITHUB_WORKSPACE}/Generated/" type: gerber
fi dir: JLCPCB
options:
output: '%f%i.%x'
exclude_edge_layer: false
exclude_pads_from_silkscreen: true
plot_sheet_reference: false
plot_footprint_refs: true
plot_footprint_values: false
force_plot_invisible_refs_vals: false
tent_vias: true
use_protel_extensions: true # JLCPCB prefers Protel extensions
create_gerber_job_file: false # JLCPCB doesn't need this
disable_aperture_macros: true
gerber_precision: 4.6
use_gerber_x2_attributes: false
use_gerber_net_attributes: false
line_width: 0.1
subtract_mask_from_silk: true
layers:
- F.Cu
- B.Cu
- In1.Cu
- In2.Cu
- In3.Cu
- In4.Cu
- F.Paste
- B.Paste
- F.Silkscreen
- B.Silkscreen
- F.Mask
- B.Mask
- Edge.Cuts
- name: Add board information to outputs # JLCPCB drill files
run: | - name: 'jlcpcb_drill'
echo "Board configuration: ${{ steps.layers.outputs.layers }} layers" > Generated/board_info.txt comment: "Drill files for JLCPCB"
echo "Project: ${{ steps.find_project.outputs.project_name }}" >> Generated/board_info.txt type: excellon
echo "Project path: ${{ steps.find_project.outputs.project_dir }}" >> Generated/board_info.txt dir: JLCPCB
echo "Generated on: $(date)" >> Generated/board_info.txt options:
echo "Commit: ${{ github.sha }}" >> Generated/board_info.txt output: '%f%i.%x'
metric_units: true
minimal_header: false
mirror_y_axis: false
pth_and_npth_single_file: false # JLCPCB prefers separate files
- name: Fix file permissions # JLCPCB ZIP file
run: | - name: 'jlcpcb_zip'
chmod -R a+rw Generated || true comment: "JLCPCB fabrication ZIP"
type: compress
dir: .
options:
output: '%f_JLCPCB_compress.%x'
format: ZIP
files:
- source: JLCPCB/*
dest: /
- name: Retrieve results - All outputs # Fabrication package (ZIP)
uses: actions/upload-artifact@v3 - name: 'fabrication'
with: comment: "Fabrication package"
name: Automatic_outputs type: compress
path: Generated dir: .
options:
output: '%f-fabrication.%x'
format: ZIP
files:
- source: Gerbers/*
dest: /
- source: PCB/PDF/*
dest: /Documentation
- source: Assembly/*
dest: /Assembly
- source: 3D/*
dest: /3D
- name: Retrieve results - Gerbers # Variants for different layer counts (optional)
if: steps.config_check.outputs.found == 'true' variants:
uses: actions/upload-artifact@v3 - name: 2layer
with: comment: "2 layer board variant"
name: Gerbers-${{ steps.layers.outputs.layers }}layer type: kibom
path: Generated/Gerbers
- name: Retrieve results - Assembly - name: 4layer
if: steps.config_check.outputs.found == 'true' comment: "4 layer board variant"
uses: actions/upload-artifact@v3 type: kibom
with:
name: Assembly-${{ steps.layers.outputs.layers }}layer
path: Generated/Assembly
- name: Retrieve results - BOM - name: 6layer
if: steps.config_check.outputs.found == 'true' comment: "6 layer board variant"
uses: actions/upload-artifact@v3 type: kibom
with:
name: BOM-${{ steps.layers.outputs.layers }}layer
path: Generated/BoM
- name: Retrieve results - 3D Model
if: steps.config_check.outputs.found == 'true'
uses: actions/upload-artifact@v3
with:
name: 3D-Model
path: Generated/3D
- name: Retrieve results - Fabrication Package
if: steps.config_check.outputs.found == 'true'
uses: actions/upload-artifact@v3
with:
name: Fabrication-Package-${{ steps.layers.outputs.layers }}layer
path: Generated/*.zip
- name: Retrieve results - JLCPCB Package
if: steps.config_check.outputs.found == 'true'
uses: actions/upload-artifact@v3
with:
name: JLCPCB-${{ steps.layers.outputs.layers }}layer
path: Generated/*_JLCPCB_compress.zip
- name: Retrieve results - Diff Report
if: steps.generate_diff.outputs.has_diff == 'true'
uses: actions/upload-artifact@v3
with:
name: Schematic-PCB-Diff
path: Generated/DIFF
# Deploy to documentation branch
deploy:
runs-on: kicad-kibot-runner
needs: generate
steps:
- uses: actions/checkout@v4
- name: Retrieve results
uses: actions/download-artifact@v3
with:
name: Automatic_outputs
path: Generated
- name: Disable Jekyll
# Jekyll will filter the KiRi folders
run: |
touch Generated/.nojekyll
- name: Push to docu branch
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
run: |
# Set up git identity
git config --global user.email "${{ gitea.actor }}@noreply.localhost"
git config --global user.name "${{ gitea.actor }}"
# Get the repository URL and add authentication
REPO_URL=$(git config --get remote.origin.url)
AUTHED_URL=${REPO_URL/https:\/\//https:\/\/${GITEA_TOKEN}@}
# Clone the docu branch into a separate folder
git clone --depth 1 --branch docu "$AUTHED_URL" docu-branch || \
git clone --depth 1 "$AUTHED_URL" docu-branch
cd docu-branch
git checkout -B docu
# Clean old contents and copy new files
rm -rf ./*
cp -r ../Generated/* ./
# Commit and push if there are changes
git add .
if ! git diff --cached --quiet; then
git commit -m "chore: update deployed documentation"
git push --force "$AUTHED_URL" docu
else
echo "No changes to deploy"
fi