What does HackerNews think of KiBot?

KiCad automation utility

Language: Python

There's also an amazing KiBot ([1]) that enables a lot of automation without much effort to setup.

1. https://github.com/INTI-CMNB/KiBot

KiBot [0] is super handy for this, the documentation has an explicit section on CI/CD usage.

It does have to basically script drive the GUI to achieve some functionality which has now been added to the kicad cli, so hopefully going forward CI/CD with KiCad will be even easier!

0: https://github.com/INTI-CMNB/KiBot

I gathered my setup from a few sources but the main one is https://github.com/INTI-CMNB/kicad_auto and https://github.com/INTI-CMNB/KiBot . Here is my current setup for gitlab:

When adding components, add "LCSC" to overall schematic (BOM export will fail if added to each part separately (join issue)) and the part number in each part in order to use the JLCPCB assembly service. Only parts with LCSC column are exported in the JLCPCB BOMs.

.gitlab-ci.yml

  ...
  tests:
    image: setsoft/kicad_auto:dev_k6
    stage: testing
    script:
      - "[ -f *.kicad_pcb ] && kibot -c test.kibot.yaml"
    tags:
      - docker

  pcb_outputs:
    image: setsoft/kicad_auto:dev_k6
    stage: gen_fab
    script:
      - "[ -f *.kicad_pcb ] && kibot -c output.kibot.yaml"
    only:
      refs:
      - master
    artifacts:
      when: always
      paths:
        - Fabrication/
    tags:
      - docker
  ...
test.kibot.yaml

  kibot:
    version: 1

  preflight:
    run_erc: false
    update_xml: false
    run_drc: true
    check_zone_fills: true
    ignore_unconnected: false
output.kibot.yaml

  # Gerber and drill files for JLCPCB, without stencil
  # URL: https://jlcpcb.com/
  kibot:
    version: 1

  filters:
    - name: only_jlc_parts
      comment: 'Only parts with JLC (LCSC) code'
      type: generic
      include_only:
        - column: 'LCSC'
          regex: '^C\d+'

  variants:
    - name: rotated
      comment: 'Just a place holder for the rotation filter'
      type: kibom
      variant: rotated
      pre_transform: _rot_footprint

  outputs:
    - name: JLCPCB_gerbers
      comment: Gerbers compatible with JLCPCB
      type: gerber
      dir: JLCPCB
      options: &gerber_options
        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: true
        create_gerber_job_file: false
        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:
        # Note: a more generic approach is to use 'copper' but then the filenames
        # are slightly different.
        - F.Cu
        - B.Cu
        - F.Paste
        - B.Paste
        - F.SilkS
        - B.SilkS
        - F.Mask
        - B.Mask
        - Edge.Cuts

    - name: JLCPCB_drill
      comment: Drill files compatible with JLCPCB
      type: excellon
      dir: JLCPCB
      options:
        pth_and_npth_single_file: false
        pth_id: '-PTH'
        npth_id: '-NPTH'
        metric_units: false
        output: "%f%i.%x"

    - name: JLCPCB
      comment: ZIP file for JLCPCB
      type: compress
      dir: Fabrication/JLCPCB
      options:
        files:
          - from_output: JLCPCB_gerbers
            dest: /
          - from_output: JLCPCB_drill
            dest: /

    - name: ibom
      comment: Interactive BOM
      type: ibom 
      dir: Fabrication/ibom
      options:
        dark_mode: true

    - name: 'JLCPCB_position'
      comment: "Pick and place file, JLCPCB style"
      type: position
      dir: Fabrication/JLCPCB-BOM
      options:
        variant: rotated
        output: '%f_cpl_jlc.%x'
        format: CSV
        units: millimeters
        separate_files_for_front_and_back: false
        only_smd: true
        columns:
          - id: Ref
            name: Designator
          - Val
          - Package
          - id: PosX
            name: "Mid X"
          - id: PosY
            name: "Mid Y"
          - id: Rot
            name: Rotation
          - id: Side
            name: Layer

    - name: 'JLCPCB_bom'
      comment: "BoM for JLCPCB"
      type: bom
      dir: Fabrication/JLCPCB-BOM    
      options:
        output: '%f_%i_jlc.%x'
        exclude_filter: 'only_jlc_parts'
        ref_separator: ','
        columns:
          - field: Value
            name: Comment
          - field: References
            name: Designator
          - Footprint
          - field: 'LCSC'
            name: 'LCSC part number'
        csv:
          hide_pcb_info: true
          hide_stats_info: true
          quote_all: true*