OpenSCADのテスト with CircleCI

(2016-09-06 追記) ——————————————-

How To Install OpenSCAD 2015.03 On Ubuntu 14.10, Ubuntu 14.04, Ubuntu 12.04 And Derivative Systems

この記事にあるように、PPAを使ったら最新版がもっと簡単にいれれるのでこっちがおすすめ。

——————————————————————

OpenSCADのテストってどうすれば良いのだろうか

  • とりあえずモジュールがビルドできる
  • 変数の未定義はなぜかERRORでなくWARNINGとして処理されるので、WARNINGでもビルド失敗としたい

完成品は https://github.com/Drunkar/openscad_modules です。CircleCIによってstlが生成されます。

1. circle.yml: OpenSCADのバージョンに注意

OpenSCADはコマンドラインでビルド可能なのでとりあえずcircleciでビルドしてみると、謎のsyntax errorが発生する。。。

なんかよくよく調べてみると昔のOpenSCADでは多重use/includeをすると全く関係のない行でsyntax errorが発生するというバグがあった模様

そんでUbuntu 14.04 trustyのapt-getでインストールされるOpenSCADは2013.01+dfsg-2.2でこのバグに引っかかってるらしい

http://packages.ubuntu.com/ja/trusty/openscad

なのでただのapt-getじゃなくて新しいパッケージを取ってこないといけない。

https://launchpad.net/~openscad/+archive/ubuntu/releases/+build/7368891

trustyでもOpenSCAD 2015.03-1+dfsg-0.1いけるやん!てことでcircle.ymlはこんな感じになります


general:
    branches:
        ignore:
            - images

machine:
    timezone: Asia/Tokyo
    python:
        version: 3.5.1

dependencies:
    pre:
        - sudo apt-get update
        - sudo apt-get install libboost-filesystem1.54.0 libboost-program-options1.54.0  libboost-regex1.54.0 libglew1.10 libopencsg1 libqt5scintilla2-11 libcgal10
        - wget https://launchpad.net/~openscad/+archive/ubuntu/releases/+build/7368891/+files/openscad_2015.03-1+dfsg-0.1~trusty1_amd64.deb && sudo dpkg -i openscad_2015.03-1+dfsg-0.1~trusty1_amd64.deb
        - sudo apt-get update
        - sudo apt-get install openscad
        - sudo pip install --upgrade pip
        - sudo pip install -r requirements-dev.txt

test:
    post:
        - invoke test

 

おわかりいただけたでしょうか。testはinvokeで行います。なぜならローカルでも実行できるからです。

ではお次はtestの中身です

2. test: “WARNING”を検出してエラーにする

なんでかしらんけど、OpenSCADは未定義の変数があるとその変数に1を代入してWARNINGを出して実行を続けます。

どうみてもエラーだと思いますけどそうなっているので仕方ない。

invokeでnosetestsを呼び出します。(tasks.py)


#!/usr/bin/env python
# coding: utf-8
import invoke

@invoke.task
def test(ctx):
    invoke.run("nosetests -v -s")

 

すると test_build_all.py がテストスクリプトと判断され実行されます。

ここではPythonのsubprocess.Popenでopenscadコマンドを実行し、stdoutとstderrに”WARNING”または”ERROR”のどちらかの文字が含まれていればエラーを発生させています。CircleCIで生成したファイルは、CIRCLE_ARTIFACTSという環境変数に記載されたディレクトリに保存することでダッシュボードからダウンロード可能になるので、openscadの-oオプションで書き出すパスを指定しています。



#!/usr/bin/env python
# coding: utf-8
import os
from glob import glob
import subprocess

CMD = "openscad -o "
OUTPUT_PATH = os.environ["CIRCLE_ARTIFACTS"]


def test_build_all():
    for file in glob("modules/*.scad"):
        print("--------------------------------------------------------------")
        print(file)
        output_file = os.path.splitext(os.path.basename(file))[0]
        p = subprocess.Popen(["openscad", "-o", OUTPUT_PATH + "/" + output_file + ".stl", file],
                             stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out, err = p.communicate()
        error_count = out.count(b"ERROR") + err.count(b"ERROR")
        warning_count = err.count(b"WARNING") + out.count(b"WARNING")
        expect = 0
        print("stdout: " + out.decode("utf-8"))
        print("stderr: " + err.decode("utf-8"))
        try:
            assert error_count + warning_count == expect
        except AssertionError:
            raise Exception("ERROR or WARNING exists!")

これでモジュールづくりが捗ります

Leave a Comment

Your email address will not be published. Required fields are marked *