GitHub Actions + KiBotでKiCadをCI/CDしてみた

2022.08.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。CX事業本部Delivery部のakkyです。

いままでに、KiCadから自動的にファイルを出力する方法として、さかじさんがKiAutoを紹介されていました。KiAutoを使うと回路図やBOMをコマンドで出力できるようになります。

KiAutoを使ってCLIでKiCadデータを出力してみた

KiAuto単体でも有用なのですが、さらに便利に使えるプロダクトとして、KiAutoを利用して構築され、ガーバーやドリルファイルなどを設定ファイルを元に出力できるようにした、KiBotという同作者のOSSがあります。

今回は、GitHub ActionsでKiBotを使って、KiCadプロジェクトをCI/CDする方法を試してみましたので、ご紹介します。

KiBotのインストールと動作確認

まずは動作確認と設定ファイルの作成のため、ローカルで動かしてみます。KiBotは依存ソフトウェアも多いので、Dockerを使うのが簡単です。今回はWSL2上のUbuntu 20.04で実行しました。KiCadプロジェクトはver.5系(ローカルのバージョンは5.1.12)のものを使いました。

以下のコマンドで取得してきます。KiCad ver.6プロジェクトの場合は、setsoft/kicad_auto:ki6としてください。

docker pull setsoft/kicad_auto        # KiCad ver.5
docker pull setsoft/kicad_auto:ki6    # KiCad ver.6

KiCadファイルの存在するディレクトリに移動し、以下のコマンドを実行すると、Generatedディレクトリにひととおりの出力結果と設定ファイル(kibot_generated.kibot.yaml)が生成されます。

docker run -v $PWD:/tmp -w /tmp setsoft/kicad_auto kibot --quick-start

GitHub Actionsの設定

まずは自動生成されたファイルをそのまま利用することにし、kibot_generated.kibot.yamlをconfig.kibot.yamlにリネームし、次にGitHub Actionsの設定ファイルを.github/workflows/kibot.ymlという名前で以下の内容で作成します。

uses: INTI-CMNB/KiBot@v2はKiCad 5用です。KiCad 6の場合は@v2_k6としてください。 sample.schとsample.kicad_pcbはプロジェクトのファイル名に合わせて変更してください。

.github/workflows/kibot.yml

name: kibot

on:
  push:
    paths:
    - '**.sch'
    - '**.kicad_pcb'
    - '.github/workflows/kibot.yml'
  pull_request:
    paths:
      - '**.sch'
      - '**.kicad_pcb'
      - '.github/workflows/kibot.yml'

jobs:
  example:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: INTI-CMNB/KiBot@v2
      with:
        # Required - kibot config file
        config: config.kibot.yaml
        # optional - prefix to output defined in config
        dir: output
        # optional - schematic file
        schema: 'sample.sch'
        # optional - PCB design file
        board: 'sample.kicad_pcb'
    - name: upload results
      uses: actions/upload-artifact@v3
      with:
        name: output
        path: output

このファイルを含んだリポジトリをGitHubへコミットすると、Actionsタブが現れ、実行が完了すると以下のような画面になります。

コミット名のadd switchをクリックすると、詳細が表示され、出力結果のファイルであるoutputがダウンロードできます。

output.zipを解凍すると、手元で生成したのと同じファイルであることが確認できました!

S3へのアップロード

GitHubで保存するファイルは90日間のみ保存され、消えてしまうので、Amazon S3にアップロードするactionも追加してみましょう。 S3へのアップロードにはjakejarvis/s3-sync-actionを使いました。 kibot.ymlを以下のようにします。

.github/workflows/kibot.yml

name: kibot

on:
  push:
    paths:
    - '**.sch'
    - '**.kicad_pcb'
    - '.github/workflows/kibot.yml'
  pull_request:
    paths:
      - '**.sch'
      - '**.kicad_pcb'
      - '.github/workflows/kibot.yml'

jobs:
  example:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: INTI-CMNB/KiBot@v2
      with:
        config: config.kibot.yaml
        dir: output
        schema: 'sample.sch'
        board: 'sample.kicad_pcb'
    - name: upload results
      uses: actions/upload-artifact@v3
      with:
        name: output
        path: output
    - name: upload to s3
      uses: jakejarvis/s3-sync-action@master
      with:
        args: --delete
      env:
        AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        AWS_REGION: ap-northeast-1
        SOURCE_DIR: output

AWSのアクセスキーはGitHubのsecrets機能で保存しておきます。

actionが使うIAMユーザーと結果を保存するS3バケットを作っておきます。今回はファイルを上書きしていくので、S3でバージョニングを有効にしておくと、過去のバージョンも見られると思います。 Settings→Security内のSecrets→Actionsを開き、AWS_S3_BUCKET、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEYを保存します。

この状態でコミットすると・・・アップロードされていることが確認できました!

おわりに

KiBotを使い、KiCadプロジェクトから自動的にファイルを生成することができるようになりました。これで、製造やレビューに必要なファイルをいちいち生成する必要がなくなりますね。

個人的にはもうひとつやりたいことがあり、それは回路図や基板のGitHub上での比較です。GitHubの画像Diffは大変便利なので、Web上で相違点を見られたらいいなと思うのですが、これはGitHub actionsでは実現が難しいかもしれません。GitのHook機能などで実現できると思うので、今後試してみたいと思います。