changed dl and diff
Some checks failed
KiBot PCB Generation / generate (push) Failing after 26s
KiBot PCB Generation / deploy (push) Has been skipped

This commit is contained in:
2025-09-08 16:32:36 +07:00
parent 055e9f4792
commit 75f74bfe30

View File

@@ -1,480 +1,297 @@
# KiBot configuration for 2/4/6 layer boards - name: Download component datasheets
# Works with Gitea CI/CD pipeline if: steps.config_check.outputs.found == 'true'
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
if [ -d "${GITHUB_WORKSPACE}/Generated/BoM/Datasheets" ]; then
cat > "${GITHUB_WORKSPACE}/Generated/BoM/Datasheets/README.md" << EOF
# Component Datasheets
This folder contains downloaded datasheets for components used in the project.
- Datasheets are downloaded automatically from URLs in the schematic
- Files are named based on the component reference and original filename
- Only unique datasheets are downloaded (duplicates are linked)
Generated on: $(date)
Project: ${{ steps.find_project.outputs.project_name }}
EOF
echo "Datasheet folder contents:"
ls -la "${GITHUB_WORKSPACE}/Generated/BoM/Datasheets/" || true
else
echo "Note: Datasheet folder not created yet - will be created by KiBot"
finame: "KiBot PCB Generation"
kibot: # Controls when the action will run
version: 1 on:
push:
paths:
- '**/*.kicad_sch'
- '**/*.kicad_pcb'
- '**/*.kicad_pro'
- 'kibot.yaml'
- '.gitea/workflows/*.yml'
pull_request:
paths:
- '**/*.kicad_sch'
- '**/*.kicad_pcb'
- '**/*.kicad_pro'
- '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'
global: # A workflow run is made up of one or more jobs that can run sequentially or in parallel
# Filters for ERC/DRC warnings jobs:
filters: generate:
- number: 1007 runs-on: kicad-kibot-runner
- number: 1015
- number: 58
- number: 61
# Default output directory - will be overridden by command line
# output: 'Fabrication' # Commented out to use command line option
# Variant for assembly if needed
variant: ''
# Date format for filenames
date_format: '%Y-%m-%d_%H-%M-%S'
preflight: steps:
run_erc: true - uses: actions/checkout@v3
run_drc: true with:
check_zone_fills: true # So we can run a diff between last 2 changes
ignore_unconnected: false fetch-depth: '0'
update_xml: true
erc:
warnings_as_errors: false
# Continue even if ERC fails
dont_stop: true
drc:
warnings_as_errors: false
# Continue even if DRC fails
dont_stop: true
outputs: - name: Find KiCad project
# Schematic outputs id: find_project
- name: 'print_sch' run: |
comment: "Schematic PDF" # Find all .kicad_pcb files in the repository
type: pdf_sch_print PCB_FILES=$(find . -name "*.kicad_pcb" -type f | grep -v -E '/(backups?|backup|old|archive|deprecated)/' | head -5)
dir: Schematic
options: if [ -z "$PCB_FILES" ]; then
output: '%f-schematic.%x' echo "Error: No KiCad PCB files found"
exit 1
fi
# Use the first PCB file found
PCB_FILE=$(echo "$PCB_FILES" | head -1)
PROJECT_DIR=$(dirname "$PCB_FILE")
PROJECT_NAME=$(basename "$PCB_FILE" .kicad_pcb)
echo "Found KiCad project: $PROJECT_NAME"
echo "Project directory: $PROJECT_DIR"
echo "PCB file: $PCB_FILE"
# Find schematic file
SCH_FILE=$(find "$PROJECT_DIR" -name "*.kicad_sch" -o -name "*.sch" | head -1)
echo "pcb_file=$PCB_FILE" >> $GITHUB_OUTPUT
echo "project_dir=$PROJECT_DIR" >> $GITHUB_OUTPUT
echo "project_name=$PROJECT_NAME" >> $GITHUB_OUTPUT
echo "sch_file=$SCH_FILE" >> $GITHUB_OUTPUT
# List all found projects for debugging
echo "All PCB files found:"
echo "$PCB_FILES"
- name: 'print_sch_svg' - name: Set layer count
comment: "Schematic SVG" id: layers
type: svg_sch_print run: |
dir: Schematic # Use workflow input or default to 4 layers
options: LAYERS="${{ github.event.inputs.board_layers }}"
output: '%f-schematic.%x' if [ -z "$LAYERS" ]; then
LAYERS="4" # Change this default if needed
fi
echo "layers=$LAYERS" >> $GITHUB_OUTPUT
echo "Using $LAYERS layer configuration"
# PCB 2D renders - name: Check for KiBot config
- name: 'pcb_top' id: config_check
comment: "PCB render top" run: |
type: pcbdraw # Check if kibot.yaml exists in repository root
dir: PCB/2D_render if [ -f "kibot.yaml" ]; then
options: echo "found=true" >> $GITHUB_OUTPUT
output: '%f-top.%x' echo "Using kibot.yaml configuration from repository root"
format: svg else
show_components: all echo "found=false" >> $GITHUB_OUTPUT
dpi: 300 echo "No kibot.yaml found in repository root - will use --quick-start mode"
fi
- name: 'pcb_bottom' - name: Run ERC
comment: "PCB render bottom" if: steps.config_check.outputs.found == 'true'
type: pcbdraw run: |
dir: PCB/2D_render cd "${{ steps.find_project.outputs.project_dir }}"
options:
output: '%f-bottom.%x' if [ -n "${{ steps.find_project.outputs.sch_file }}" ]; then
format: svg echo "Running ERC on schematic files..."
bottom: true # Use absolute path to config file in repo root
show_components: all kibot -c "${GITHUB_WORKSPACE}/kibot.yaml" -s run_erc -v || true
dpi: 300 else
echo "No schematic files found, skipping ERC"
fi
continue-on-error: true
# PCB PDF documentation - name: Run DRC
- name: 'print_pcb' if: steps.config_check.outputs.found == 'true'
comment: "PCB PDF" run: |
type: pdf_pcb_print cd "${{ steps.find_project.outputs.project_dir }}"
dir: PCB/PDF
options: echo "Running DRC on PCB..."
output: '%f-pcb.%x' # Use absolute path to config file in repo root
plot_sheet_reference: true kibot -c "${GITHUB_WORKSPACE}/kibot.yaml" -s run_drc -v || true
monochrome: false continue-on-error: true
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
# Gerber files - automatically handles 2/4/6 layers - name: Generate outputs with custom config
- name: 'gerbers' if: steps.config_check.outputs.found == 'true'
comment: "Gerber files" run: |
type: gerber cd "${{ steps.find_project.outputs.project_dir }}"
dir: Gerbers
options: echo "Generating outputs for ${{ steps.layers.outputs.layers }} layer board"
output: '%f%i.%x' echo "Project: ${{ steps.find_project.outputs.project_name }}"
exclude_edge_layer: true echo "Using config: ${GITHUB_WORKSPACE}/kibot.yaml"
exclude_pads_from_silkscreen: true
plot_sheet_reference: false # Run KiBot with the configuration from repo root
plot_footprint_refs: true # Skip ERC/DRC preflight checks to avoid stopping on errors
plot_footprint_values: false kibot -c "${GITHUB_WORKSPACE}/kibot.yaml" -s run_erc,run_drc -d Fabrication -v
force_plot_invisible_refs_vals: false
tent_vias: true # Move outputs to root Generated folder
use_protel_extensions: false mkdir -p "${GITHUB_WORKSPACE}/Generated"
create_gerber_job_file: true if [ -d "Fabrication" ]; then
disable_aperture_macros: true cp -r Fabrication/* "${GITHUB_WORKSPACE}/Generated/"
gerber_precision: 4.6 fi
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
# Excellon drill files - name: Quick Start fallback
- name: 'drill' if: steps.config_check.outputs.found == 'false'
comment: "Drill files" run: |
type: excellon cd "${{ steps.find_project.outputs.project_dir }}"
dir: Gerbers echo "Running KiBot in quick-start mode"
options: kibot --quick-start
output: '%f%i.%x'
metric_units: true # Move outputs to root Generated folder
minimal_header: false mkdir -p "${GITHUB_WORKSPACE}/Generated"
mirror_y_axis: false if [ -d "Generated" ]; then
report: cp -r Generated/* "${GITHUB_WORKSPACE}/Generated/"
filename: '%f-drill_report.txt' fi
pth_and_npth_single_file: false
# Drill map - name: Add board information to outputs
- name: 'drill_map' run: |
comment: "Drill map" echo "Board configuration: ${{ steps.layers.outputs.layers }} layers" > Generated/board_info.txt
type: gerb_drill echo "Project: ${{ steps.find_project.outputs.project_name }}" >> Generated/board_info.txt
dir: Gerbers echo "Project path: ${{ steps.find_project.outputs.project_dir }}" >> Generated/board_info.txt
options: echo "Generated on: $(date)" >> Generated/board_info.txt
output: '%f-drill_map.%x' echo "Commit: ${{ github.sha }}" >> Generated/board_info.txt
# Pick and place files - name: Fix file permissions
- name: 'position' run: |
comment: "Pick and place file" chmod -R a+rw Generated || true
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
# Interactive BOM - name: Retrieve results - All outputs
- name: 'ibom' uses: actions/upload-artifact@v3
comment: "Interactive BOM" with:
type: ibom name: Automatic_outputs
dir: Assembly path: Generated
options:
output: '%f-ibom.%x'
dark_mode: false
hide_pads: false
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
# Generic BOM in CSV format - name: Retrieve results - Gerbers
- name: 'bom_csv' if: steps.config_check.outputs.found == 'true'
comment: "Bill of Materials in CSV format" uses: actions/upload-artifact@v3
type: bom with:
dir: BoM/Generic name: Gerbers-${{ steps.layers.outputs.layers }}layer
options: path: Generated/Gerbers
output: '%f_bom.%x'
format: CSV
separator: ','
ref_separator: ','
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'
# Generic BOM in HTML format - name: Retrieve results - Assembly
- name: 'bom_html' if: steps.config_check.outputs.found == 'true'
comment: "Bill of Materials in HTML format" uses: actions/upload-artifact@v3
type: bom with:
dir: BoM/Generic name: Assembly-${{ steps.layers.outputs.layers }}layer
options: path: Generated/Assembly
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'
# Generic BOM in XLSX format - name: Retrieve results - BOM
- name: 'bom_xlsx' if: steps.config_check.outputs.found == 'true'
comment: "Bill of Materials in Excel format" uses: actions/upload-artifact@v3
type: bom with:
dir: BoM/Generic name: BOM-${{ steps.layers.outputs.layers }}layer
options: path: Generated/BoM
output: '%f_bom.%x'
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'
# Download datasheets - name: Retrieve results - 3D Model
- name: 'download_datasheets' if: steps.config_check.outputs.found == 'true'
comment: "Download component datasheets" uses: actions/upload-artifact@v3
type: download_datasheets with:
dir: BoM/Datasheets name: 3D-Model
run_by_default: true # Changed to run by default path: Generated/3D
options:
output: '%f_datasheets.csv' # CSV list of downloaded files
field: 'Datasheet' # Field containing datasheet URLs
dnf: false # Don't download for DNF parts
repeated: false # Don't download the same datasheet twice
# 3D model - name: Retrieve results - Fabrication Package
- name: 'step' if: steps.config_check.outputs.found == 'true'
comment: "3D STEP model" uses: actions/upload-artifact@v3
type: step with:
dir: 3D name: Fabrication-Package-${{ steps.layers.outputs.layers }}layer
options: path: Generated/*.zip
output: '%f-3D.%x'
metric_units: true
origin: grid
no_virtual: true
# Board characteristics report - name: Retrieve results - JLCPCB Package
- name: 'report' if: steps.config_check.outputs.found == 'true'
comment: "Board report" uses: actions/upload-artifact@v3
type: report with:
dir: . name: JLCPCB-${{ steps.layers.outputs.layers }}layer
options: path: Generated/*_JLCPCB_compress.zip
output: '%f-report.%x'
do_convert: true
# Schematic diff - name: Retrieve results - Diff Report
- name: 'sch_diff' if: steps.generate_diff.outputs.has_diff == 'true'
comment: "Schematic diff PDF" uses: actions/upload-artifact@v3
type: diff with:
dir: DIFF name: Schematic-PCB-Diff
run_by_default: false # Only run when explicitly requested path: Generated/DIFF
options:
output: '%f-schematic-diff.%x'
format: PDF
diff_mode: 'red_green'
old: 'HEAD~1'
new: 'HEAD'
cache_dir: '.cache'
add_link_id: true
only_different: true
# PCB diff
- name: 'pcb_diff'
comment: "PCB diff PDF"
type: diff
dir: DIFF
run_by_default: false # Only run when explicitly requested
options:
output: '%f-pcb-diff.%x'
format: PDF
diff_mode: 'red_green'
old: 'HEAD~1'
new: 'HEAD'
cache_dir: '.cache'
pcb: true
only_different: true
# JLCPCB fabrication package # Deploy to documentation branch
- name: 'jlcpcb_gerbers' deploy:
comment: "Gerbers for JLCPCB" runs-on: kicad-kibot-runner
type: gerber needs: generate
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
# JLCPCB drill files steps:
- name: 'jlcpcb_drill' - uses: actions/checkout@v4
comment: "Drill files for JLCPCB"
type: excellon
dir: JLCPCB
options:
output: '%f%i.%x'
metric_units: true
minimal_header: false
mirror_y_axis: false
pth_and_npth_single_file: false # JLCPCB prefers separate files
# JLCPCB ZIP file
- name: 'jlcpcb_zip'
comment: "JLCPCB fabrication ZIP"
type: compress
dir: .
options:
output: '%f_JLCPCB_compress.%x'
format: ZIP
files:
- source: JLCPCB/*
dest: /
# Fabrication package (ZIP) - name: Retrieve results
- name: 'fabrication' uses: actions/download-artifact@v3
comment: "Fabrication package" with:
type: compress name: Automatic_outputs
dir: . path: Generated
options:
output: '%f-fabrication.%x'
format: ZIP
files:
- source: Gerbers/*
dest: /
- source: PCB/PDF/*
dest: /Documentation
- source: Assembly/*
dest: /Assembly
- source: 3D/*
dest: /3D
# Variants for different layer counts (optional) - name: Disable Jekyll
variants: # Jekyll will filter the KiRi folders
- name: 2layer run: |
comment: "2 layer board variant" touch Generated/.nojekyll
type: kibom
- name: Push to docu branch
- name: 4layer env:
comment: "4 layer board variant" GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
type: kibom run: |
# Set up git identity
- name: 6layer git config --global user.email "${{ gitea.actor }}@noreply.localhost"
comment: "6 layer board variant" git config --global user.name "${{ gitea.actor }}"
type: kibom
# 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