ハードウェアの気になるあれこれ

技術的に興味のあることを調べて書いてくブログ。主にハードウェアがネタ。

Github Actionsを使ってChiselの自動テスト環境を構築

スポンサーリンク

Github Actionsが使えるようになったので、ChiselのCI環境を構築できないかを試してみる。

とりあえずGithub Actionsをお試し

最初にやるべきっぽい"Simple workflow"を実行してみる。

f:id:diningyo-kpuku-jougeki:20191006180318p:plain

最初は"Start Commit"を押した際にプルリクを使った。

f:id:diningyo-kpuku-jougeki:20191006180332p:plain

この際に何をどう間違えたのかワークフローの設定用のYAMLファイルがリポジトリの直下に登録されてしまい、その状態でgit pullを実行しても何も起こらなかった。

再度トライ

もう一度セットアップをしてみた所".github/workflows"の下に"main.yaml"が生成されていた。

f:id:diningyo-kpuku-jougeki:20191006180415p:plain

この状態でコミットしてプッシュしてみる。

なんか動いた!

f:id:diningyo-kpuku-jougeki:20191006180427p:plain

タスクの詳細を開いてみると" successful 10 minutes ago in 4s "と出て成功していた。

f:id:diningyo-kpuku-jougeki:20191006180438p:plain

main.yamlを確認

実行されたCIワークフローは以下の様なもの。 github actionsで実際に実行されたワークフローと併せて確認すると、何も知らなくてもなんとなく読める感じ。

name: CI # ワークフローの名称

on: [push] # トリガーアクション。今回はpush時に実行

jobs:
  build:

    runs-on: ubuntu-latest # 最新版のUbuntuで実行する

    steps:
    - uses: actions/checkout@v1 # どうもこれで仮想環境化に対象リポジトリのデータがcloneされている様子
    - name: Run a one-line script # 1行のスクリプトを実行
      run: echo Hello, world!
    - name: Run a multi-line script # 複数行のスクリプトを実行
      run: | # | を入れておくと、複数のコマンドが書けるみたい
        echo Add other actions to build,
        echo test, and deploy your project.

usesってので他の人が定義した各種処理をインポートして実行できる、、という感じに見えた。

もう少し調べてみる

先ほどのmain.yamlruns-onの部分から何となくはわかると思うがGithub Actionsで自動実行するワークフローは仮想環境上で動作するようだ。 ということで幾つか気になることを調べてみた。

OSのバージョン

まずはubuntu-latestってどれになるの?という話から。以降に示す情報はstepsの部分にそれらを調べるためのコマンドを追加して実際に実行した結果。

f:id:diningyo-kpuku-jougeki:20191006180526p:plain

CPUの情報

次はCPUの情報。これは/proc/cpuinfoを表示させたもの。 ちょっと情報が多かったのでテキストで。

processor    : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 79
model name  : Intel(R) Xeon(R) CPU E5-2673 v4 @ 2.30GHz
stepping    : 1
microcode   : 0xffffffff
cpu MHz     : 2294.681
cache size  : 51200 KB
physical id : 0
siblings    : 2
core id     : 0
cpu cores   : 2
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 20
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt
bugs        : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips    : 4589.36
clflush size    : 64
cache_alignment : 64
address sizes   : 44 bits physical, 48 bits virtual
power management:

processor   : 1
vendor_id   : GenuineIntel
cpu family  : 6
model       : 79
model name  : Intel(R) Xeon(R) CPU E5-2673 v4 @ 2.30GHz
stepping    : 1
microcode   : 0xffffffff
cpu MHz     : 2294.681
cache size  : 51200 KB
physical id : 0
siblings    : 2
core id     : 1
cpu cores   : 2
apicid      : 1
initial apicid  : 1
fpu     : yes
fpu_exception   : yes
cpuid level : 20
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt
bugs        : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips    : 4589.36
clflush size    : 64
cache_alignment : 64
address sizes   : 44 bits physical, 48 bits virtual
power management:

ということでXeonの2-core。

aptは使えるかどうか

結論から書くと使えた。以下のような処理が正常に終了する。

      - name: Build verilator
        run: |
          sudo apt install flex bison

ここまでわかればとりあえず環境を作ることは可能なので試してみた。

Chisel-templateの環境で自動テスト実行

というわけでこちらが今日のメインの話。Chisel-templateの環境には最初からGCDのChiselモジュールとそれに対してのテストが実装されているので、これを自動実行する環境を作ってみた。

まずは適当なリポジトリgithubに作って、そこにChisel-templateのデータを展開したものを準備。

そのリポジトリの直下に".github/workflows"というディレクトリを追加して、そこに自動テスト用のYAMLファイルを追加する。 中身は以下のようなもの。(2019/10/13修正:sbtのインストールをapt経由にしました)

name: Chisel-test

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v1
      - name: Build verilator
        run: |
          sudo apt install flex bison gpg
          wget https://www.veripool.org/ftp/verilator-4.018.tgz
          tar xf verilator-4.018.tgz
          cd verilator-4.018
          ./configure
          make -j 2
          sudo make install
          verilator --version
      - name: Install sbt
        run: |
          echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
          sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823
          sudo apt update
          sudo apt install sbt
      - name: Run test
        run:
          sbt "test"

とりあえず今回は自分で色々必要なデータをかき集めて、実行する形にしている。Javaは最初からインストールされていたので

  • verilator
  • sbt

が主に必要なもの。

実行結果

GCDのテストがFAILするようにしたもの/PASSするようにしたものをそれぞれコミット&プッシュして自動実行した際の画面が以下。

  • テストがFAILするようにしたもの

f:id:diningyo-kpuku-jougeki:20191006180541p:plain

  • テストがPASSするようにしたもの

f:id:diningyo-kpuku-jougeki:20191006180549p:plain

ただverilatorのビルドに6分半かかってるので、そこが若干ネック。バージョンが新しいものでなくても大丈夫ならaptコマンドでインストールすることも可能なので、そちらのほうが早いはず。 またこの辺の作業をツイッターでつぶやいていた所、Docker hubにchisel3-toolsというのがあるよーと教えて頂いた。

試してみて、とりあえずpull&runが出来ることは確認できているのだが、まだうまくフローに組み込めていないのでもう少し調査してみようと思う。 こちらはDockerを動かすのに2分半くらいだったので、うまく動けばこちらを使った方が確実に早くなる、、ハズ!