ラベル Wandbox の投稿を表示しています。 すべての投稿を表示
ラベル Wandbox の投稿を表示しています。 すべての投稿を表示

2022年1月27日木曜日

wandbox-api version 0.9.38 をリリースしました

wandbox-api 0.9.38 をリリースしました。
0.9.37〜0.9.38 で新環境の Wandbox への対応と不具合修正をしています。
詳細はリリースノートを確認してください。
https://github.com/srz-zumix/wandbox-api/releases/tag/v0.9.38
https://github.com/srz-zumix/wandbox-api/releases/tag/v0.9.37

新しい Wandbox ではいくつかの言語が削除されました。(CoffeeScript,CMake,F#,Rill)
また、各言語のコンパイラーバージョンも大幅に削減されています。
これらに伴い、削除された言語、コンパイラーの alias コマンドを削除してます。

新しい環境になって、動作してない言語・バージョンもあるようなので拙作のステータスページなども確認してください。
https://srz-zumix.github.io/wandbox-status/

時間が取れたら、wandbox-builder に環境の修正 PR でもしていきたいです。
以上。

2021年3月11日木曜日

wandbox-builder のテスト環境構築

 最近 Wandbox のコンパイラー環境を作成する wandbox-builder に PR 投げまくっており、その際のテスト環境構築で詰まったところを備忘録としてメモしておく。
なお、本流にマージしても問題ないだろうと思う部分は PR を出しています。

kennel.json の修正

https://github.com/srz-zumix/wandbox-builder/pull/1/files#diff-39e78c9920d894556bc58bc9693d6357a2737275ce6c2ac89198d8caed4e3c64
Wandbox の更新に追従が必要です。
.session.key と db ファイルはテスト環境のものを参照するようにし、それらのファイルは追加・作成するように変更しています。

ip 制限処理への対応

https://github.com/srz-zumix/wandbox-builder/pull/1/files#diff-8339ab6ea29831802ca594668bddeb7e22d576a0cee4bb6a5492cb104492c98f
Wandbox で ip 制限がかかるようになったのですが、テスト環境からテストスクリプトを実行した際に「 [warning] [kennel.cpp:409] X-Real-IP is empty」となり、失敗していました。
ヘッダに「X-Real-IP」を追加して回避しました。
(これが正攻法なのかはわからないです)

setuid の失敗への対応

こちらは筆者の実行環境が macOS なのが関係してるかもしれません。
マウントしたパスへの setuid が以下のように失敗するようなので、cattleshed の設定で uids オプションを削除するようにしました。
「cmake-head: {u'status': u'1', u'compiler_error': u'setuid: Operation not permitted\n', u'compiler_message': u'setuid: Operation not permitted\n'}」

https://github.com/srz-zumix/wandbox-builder/pull/2/files

以上、Wandbox に言語やコンパイラバージョンを追加したい場合の参考になれば幸いです。

2020年8月31日月曜日

wandbox-api の CLI に C/CPP/Go/JavaScript/Nim/OpenSSL/Perl/Python/Ruby/TypeScript を追加しました

 表題のとおりですが以前公開した wandbox-api
C/CPP/Go/JavaScript/Nim/OpenSSL/Perl/Python/Ruby/TypeScript のラッパーコマンドを追加しました。(以前の記事はこちら「ブログズミ: Wandbox の CLI ツールを作ってみた」)
それぞれ言語ごと特有のオプションやコンパイラオプション・ランタイムオプションが使用可能かどうかに対応しています。

また、C/CPP/C++ であれば #include してるファイル(システムヘッダー除く)を自動的にファイルリストに追加する機能がありますが、Python の import や Ruby の require なども対応をしています。

OpenSLL は少し特殊でローカルで openssl を使うのと同じように使えるように工夫してます。
(あんまりデバッグしてないので対応してないサブコマンドありそうですが・・)
例えば、以下のように鍵の作成が可能です。

> wandbox-ssl genrsa -out test.key 2048
> wandbox-ssl rsa -in test.key -pubout -out test.key.pub

需要があるのかわからないけど、openssl がインストールされてなくても python があれば openssl 相当のことができるようになりました。 

最後に

筆者が明るくない言語はファイルリストの自動登録機能が正しく動作してなかったり、対応してない構文があったりするかもしれません。
(実際、JavaScript/TypeScript の require は対応してないです)
ぜひ、PR いただけると嬉しいです。

ではでは。

2020年6月29日月曜日

Wandbox の CLI ツールを作ってみた


タイトルの通りコマンドラインツールを作ってみました。
リポジトリはこちら。https://github.com/srz-zumix/wandbox-api/

言語は Python で PyPI に Publish してますので、 pip install wandbox-api ですぐに使えます!
PyPI に初めて Publish しました〜
この辺は「Github ActionsでPyPIにパッケージを公開する」を参考に、GitHub Actions で tag をトリガーに Publish されるようにしました。
name: PyPI Publish
on:
  push:
    tags:
      - v*

jobs:
  pypi:
    runs-on: ubuntu-18.04
    steps:
    - uses: actions/checkout@master
    - name: Set up Python 3.7
      uses: actions/setup-python@v1
      with:
        python-version: 3.7
    - name: Init .pypirc
      env:
        PYPI_USERNAME: __token__
        PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
      run: |
        echo -e '[pypi]' >> ~/.pypirc
        echo -e "username = ${PYPI_USERNAME}" >> ~/.pypirc
        echo -e "password = ${PYPI_PASSWORD}" >> ~/.pypirc
    - name: Publish
      run: |
        pip install twine wheel
        python setup.py sdist bdist_wheel
        twine upload --repository pypi dist/*


現在の機能は、Wandbox が対応している言語・コンパイラー・オプションのリストアップとコンパイル&実行です。また、C++ 用に特化した wandbox-cxx コマンドもあります。
使用例
言語リストを取得
$ wandbox lang
Bash script
C
C#
C++
CMake
CPP
CoffeeScript
Crystal
D
Elixir
Erlang
F#
Go
Groovy
Haskell
Java
JavaScript
Lazy K
Lisp
Lua
Nim
OCaml
OpenSSL
PHP
Pascal
Perl
Pony
Python
R
Rill
Ruby
Rust
SQL
Scala
Swift
TypeScript
Vim script
コンパイラーのリストを取得
-l オプションで言語を選択してリストアップします。言語指定がない場合はすべての言語のコンパイラーをリストアップします。
$ wandbox -l C++ compiler
gcc-head
gcc-9.3.0
gcc-9.2.0
gcc-9.1.0
gcc-8.3.0
gcc-8.2.0
gcc-8.1.0
gcc-7.3.0
gcc-7.2.0
gcc-7.1.0
gcc-6.3.0
gcc-6.2.0
gcc-6.1.0
gcc-5.5.0
gcc-5.4.0
gcc-5.3.0
gcc-5.2.0
gcc-5.1.0
gcc-4.9.3
gcc-4.9.2
gcc-4.9.1
gcc-4.9.0
gcc-4.8.5
gcc-4.8.4
gcc-4.8.3
gcc-4.8.2
gcc-4.8.1
gcc-4.7.4
gcc-4.7.3
gcc-4.6.4
gcc-4.5.4
gcc-4.4.7
clang-head
clang-10.0.0
clang-9.0.0
clang-8.0.0
clang-7.0.0
clang-6.0.1
clang-6.0.0
clang-5.0.0
clang-4.0.1
clang-4.0.0
clang-3.9.1
clang-3.8.1
clang-3.7.1
clang-3.6.0
clang-3.5.0
clang-3.4
clang-3.3
clang-3.2
clang-3.1
zapcc-2017.08
zapcc-1.0.1
コンパイラーのオプションを取得
-c オプションでコンパイラーを選択すると、そのコンパイラーで使用できるオプションをリストアップします。指定がない場合はすべてのオプションをリストアップします。

$ wandbox -c clang-head option
C++: 
warning (default)
optimize
cpp-verbose
boost-1.73.0-clang-head (default)
  boost-nothing-clang-head
  boost-1.60.0-clang-head
  boost-1.61.0-clang-head
  boost-1.62.0-clang-head
  boost-1.63.0-clang-head
  boost-1.64.0-clang-head
  boost-1.65.0-clang-head
  boost-1.65.1-clang-head
  boost-1.66.0-clang-head
  boost-1.67.0-clang-head
  boost-1.68.0-clang-head
  boost-1.69.0-clang-head
  boost-1.70.0-clang-head
  boost-1.71.0-clang-head
  boost-1.72.0-clang-head
  boost-1.73.0-clang-head
sprout
msgpack
gnu++2a (default)
  std-c++-default
  c++98
  gnu++98
  c++11
  gnu++11
  c++14
  gnu++14
  c++17
  gnu++17
  c++2a
  gnu++2a
cpp-no-pedantic (default)
  cpp-no-pedantic
  cpp-pedantic
  cpp-pedantic-errors
C++ のコードをビルド・実行する
wandbox-api パッケージには C++ 用のコマンドとして、wandbox-cxx と wandbox-g++/wandbox-clang++ が含まれています。
cxx は wandbox コマンドに -l C++ を指定したのと同等です。wandbox-g++/wandbox-clang++ はさらに -c オプションでコンパイラーの指定をしたものになります
(バージョンはそれぞれ head)
また、これらは通常の wandbox コマンドのコマンドラインオプションに加えて、 C++ コンパイラー向けの Wandbox オプションがコマンドラインオプションで設定できるようになっています。
  --std VERSION         set --std options
  --boost VERSION       set boost options version X.XX or nothing
  --optimize            use optimization
  --cpp-verbose         use cpp-verbose
  --sprout              use sprout
  --msgpack             use msgpack
run に続く引数は、コンパイラーへの引数としてそのまま渡されます。
$ wandbox-clang++ run main.cpp test.cpp
program_message:
Hello, Wandbox!
test
$ wandbox-clang++ run main.cpp test.cpp -DTEST
program_message:
test
test
-s オプションを付けると permlink を発行できます。
wandbox-clang++ -s run main.cpp test.cpp -DTEST
program_message:
test
test


permlink: TuvMXWckFrkxGPAs
url: https://wandbox.org/permlink/TuvMXWckFrkxGPAs
[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ https://wandbox.org/permlink/6AGrKCojBOo1oCUv


使用したソースコードはこちらです。
今後
今後、ちまちまと他の言語のコマンドも追加していこうと思います。
もちろん PR 大歓迎です!
今回は以上です。では。



2019年7月24日水曜日

[Wandbox] 処理速度比較したいときのテンプレ

C++ 書いてる(じゃないな見てる)と、これはこう書いたほうが速いんじゃないか、こう書いたほうが簡潔になるけどパフォーマンス落ちないかな、と思うことが多々あります。
そんなときは、サクッと Wandbox で試してみるのですが毎回計測コードをどう書くんだっけ?となっていたのでテンプレを用意しました。





2018年10月25日木曜日

iutest v1.16.7 をリリースしました

C++ テスティングフレームワーク iutest v1.16.7 をリリースしました。
Github: https://github.com/srz-zumix/iutest/releases
OSDN: https://osdn.net/projects/iutest/releases/70218

1.16 系は終わったと言ったな。。。あれはウソだ!

変更点は以下の通りです。
* Improved
  *  iuwandbox: コードサイズをさらに削減したヘッダーファイルに対応(--iutest-use-wandbox-min)

* Bug fixes
  * 古い google mock の互換性エラー修正
  * いくつかの不具合を修正

今回は主に、iuwandbox で利用する iutest.min.hpp のさらなる圧縮をした iutest.wandbox.min.hpp を使用するオプションを追加しました。
こちらの機能は試験的機能となっております。
問題なさそうであれば 1.17 系でデフォルトになる予定です。







もともと 600KB 近くあったのを、500KB 以下まで削減しました。
(↑は develop ブランチの計測なので、v1.16.7 だと少し違うかも。)

できあがった iutest.wandbox.min.hpp を見えもらえるとわかると思うのですが(Gist においておきました)、
iutest.min.hpp には、主に「構文の許す限りのインデントや改行削除」を行っていたのですが、iutest.wandbox.min.hpp では「内部マクロの名前省略」「Wandbox にない OS/Compiler 向け Config 削除」をしました。

iutest.min.hpp を作ったときの記事は以前書いているのでそちらも見ていただくとなにをしているかが、よりわかると思います。


今回の Wandbox 向けの圧縮はまた別途まとめて記事にしたいと思います。
(ローカル変数名とか、公開している部分でなければもっと名前の省略はできると思う)
(同一で連続したアクセス修飾子は消しても大丈夫なはずなので、そこも削れるはず)
(独自のリストクラスを使ってる部分をやめたらかなり減らせると思う。v1.17 でやる予定)

2018年9月25日火曜日

Wandbox の対応言語・コンパイラバージョンの追加を通知するアカウントを作った

こんにちは。
Wandbox の更新を通知する仕組みは前々あって、新しいコンパイラーが追加されるとリプライをくれるようにしてました。
ブログズミ: Wandbox のコンパイラー追加を通知する環境を作った


それがいつからかリプライを送らなくなってしまってました。


どうやら、Zapier 側で @ 付きのメッセージが制限され、@ を取り除かれてツイートするようになったためでした。


Zapier から Integromat への引っ越しも考えましたが、 引越し先でも @ 制限がかかる可能性は高いので、
Zapier はそのままに通知専用の Twitter アカウントを作成しました。


というわけで、@Wandbox_News をよろしくお願いします。

2017年6月5日月曜日

Wandbox のコンパイラー追加を通知する環境を作った

Wandbox で対応コンパイラーが増えたら、自分宛てにツイートしてくれる環境を作りました。



構成
Appveyor + Zapier

概要
https://github.com/srz-zumix/wandbox-news
ソースコードをみていただければ、どんなことやっているかはわかると思います。
特に難しいことはしてなくて、Wandbox API で取ってきたリストを成果物として保存して、前回との差分があれば Webhook を投げます。
あとは、Zapier で Webhook を受け取ってツイートするだけです。

その他
最初は、Google App Engine とか Circle CI とか使おうと思ってましたが、定期ビルド、Webhook Notification、成果物の保存・取得ができる Appveyor に落ち着きました。

あとは、Notification でカスタム json を作るのに、ちょっと手間取りました。
デフォルトで送ると Zapier で message を取るのがめんどくさかった(というか、うまくできない?)ので、カスタムで送るようにしてます。
url が secure 指定できなかったので、Web UI 設定にしてますが、appveyor.yml にコメントで書いてあるので参考にしてください。

では。


※更新なしが FAIL 更新ありが PASS になっているが、どちらも PASS にできるならしたい。
※Webhook を発行するトリガーとして、ステータスを利用しているため。
※最初は逆だったが、成果物取得で落ちてくるのが lastSuccessBuild のものだったため、更新があったときを PASS にしている。

※Zapier で tweet する際に改行がスペースに置換されてしまっている。
※改行のまま tweet したい。

2017年2月27日月曜日

[CI][Wercker] Workflows を利用してテストのパラメタライズと並列化をしてみた

安定運用していたので、あまり見ていなかった Wercker から、もう non-Docker なやつはやめるから移行してやーってメール来たので、見てみたら Workflows という新機能が実装されていたので、ついでにその機能を使った CI に変えました。

Workflow についてはこちらを参照してください。
Manage complex CI/CD automation scenarios with Workflows

必要こととしては、wercker.yml にパイプライン処理を追加するのと、
Wercker のページ上で Pipelines と Workflows を構築する2点です。

パイプライン処理の作成(YAML)
wercker.yml の方はドキュメントとかを参考にこのように変更しました。(ちょっと長いです)

定義したパイプラインは2つで、wandbox と nothing です。
wandbox は iuwandbox を使用してテストコードを Wandbox に投げつけテストします。
CI サービス + Wandbox は以前にこのブログで紹介したので、そちらを参照してください。
ブログズミ: Shippable + Wandbox で C++ の CI 環境構築

wandbox パイプラインのポイントとして compiler と --std オプションを環境変数にしているところです。(IUWANDBOX_COMPILER と IUWANDBOX_CPPVER)
後述しますが、Wercker ではパイプラインごとに環境変数を設定できます
パイプラインは、YAML に書いたパイプライン処理と環境変数等のセットで、1つになります。
つまり、パラメータを環境変数にしておくことで、YAML の定義1つで、複数のパイプラインを作ることができるのです。

また、ワークフローのジョイント用に何もしない nothing パイプラインも用意しました。

wercker.yml の設定は以上です。
パイプライン・ワークフローの作成
続いて、Web 上でワークフローを作っていきます。
プロジェクトの設定ページを開いたら、「Workflows」があるのでそこを開きます。
Editor の下にフローっぽいのがありますが、まずはさらに下にある「Pipelines」でパイプラインを作っていきます。


「Add new pipeline」を押すと、以下のようなページが開くので、任意のパイプライン名と YAML に定義したパイプライン処理の名前を記入します。
「Hook Type」には、「Default(パイプライン連結)」と「Git Push」がありますので、用途に合わせて選択してください。今回はパイプラインを連結していくので、「Default」を選択しました。


「Create」ボタンを押すと設定ページが開きます。
ここで環境変数などが設定できます。(今回は IUWANDBOX_COMPILER と IUWANDBOX_CPPVER を設定)


これで1つ目のパイプラインができました。
あとは、同じことを環境変数を変えつつ必要なパターン分だけ用意します。
(これ結構めんどくさいんですけどね…)



パイプラインができたら、最後に Workflows です。
Workflows のページに戻ってきたら、Editor のところにあった + アイコンをクリックします。
下の画像のように、ブランチフィルターとパイプラインを選択するポップアップがでてくるので、選んで「Add」を押します。


あとは、同様に + をクリックして好きなように連結していきましょう。


以下は現時点(2017/2)での挙動における注意点

※ 1つのパイプラインを複数使用することはできません
※ 分岐したパイプラインを Join することはできません
※ パイプラインは40個以上作れるのですが、パイプライン追加のリストに入らいないため実質40個が上限になっています。

実行結果


最後に
パラメタライズドな感じでパイプラインを定義して自由にフローを組み立てられるのは非常に便利だなと思いました。(Jenkins もこんな感じにできないのかなぁ)

あとは Join ができるとすごく嬉しいですが、なくてもすごく便利に使えると思うのでオススメです!
今回は以上です。
では。

2016年8月2日火曜日

[C++] Shippable + Wandbox でテストしてテスト結果の集計までを行う

ブログズミ: Shippable + Wandbox で C++ の CI 環境構築
以前、上記記事で Shippable + Wandbox で C++ のテスト実行をするようにしたのですが、iutest v1.15.2(v1.15.1) で Wandbox でのテスト結果を xml 出力できるように対応したので、テスト結果の集計まで行うようにしました。

iutest + Wandbox
iutest の Wandbox 実行ツールを利用することで、iutest で記述されたテストコードを Wandbox 上で実行できます。iutest v1.15.2(v1.51.1) では、このツールに xml 出力機能が追加されました。
iuwandbox.py test.cpp --xml test_result.xml
--xml コマンドラインオプションを付けると、指定のパスにテスト結果の xml を出力します。

Shippable でテスト結果 xml の集計
Shippable では junit 形式のテストレポートが集計できます。
Shippable Build Configuration - Shippable Documentation

方法としては簡単です。
shippable/testresults フォルダを作成して、そのフォルダに xml ファイルをコピーするだけです。

e.g.
build:
  ci:
    - mkdir -p shippable/testresults
    - nosetests python/sample.py --with-xunit --xunit-file=shippable/testresults/nosetests.xml
詳しくはドキュメントを確認してください。
iutest の場合
iutest では以下のようにテストをしています。
(Shippable だけでなく Wercker + Wandbox でも同様の方法でテストを実行しています。)
language: python

python: 2.7
cache: true
parallelized_test: true

branches:
  except:
    - gh-pages

install:
  - pip install requests

before_script:
  - export PYTHONDONTWRITEBYTECODE=1
  - make -C tools/fused
  - mkdir -p shippable/testresults

script:
  - cd tools/wandbox
  - python ./iuwandbox.py --list_options ${WANDBOX_COMPILER}
  - python ./iuwandbox.py ../../test/syntax_tests.cpp -c ${WANDBOX_COMPILER} -f"-DIUTEST_USE_MAIN=1" --default --boost nothing --encoding utf-8-sig --expand_include --verbose --xml ../../shippable/testresults/test_result.xml

env:
  matrix:
    - WANDBOX_COMPILER=gcc-head
    - WANDBOX_COMPILER=gcc-6.1.0
    - WANDBOX_COMPILER=gcc-5.3.0
    - WANDBOX_COMPILER=gcc-5.2.0 # travis (5.2.1)
#    - WANDBOX_COMPILER=gcc-5.1.0 # wercker
#    - WANDBOX_COMPILER=gcc-4.9.2 # circle ci
#    - WANDBOX_COMPILER=gcc-4.9.1 # wercker
#    - WANDBOX_COMPILER=gcc-4.9.0 # wercker
#    - WANDBOX_COMPILER=gcc-4.8.2 # wercker
    - WANDBOX_COMPILER=gcc-4.8.1
    - WANDBOX_COMPILER=gcc-4.7.3
#    - WANDBOX_COMPILER=gcc-4.6.4 # drone
    - WANDBOX_COMPILER=gcc-4.5.4
#    - WANDBOX_COMPILER=gcc-4.4.7 # snap ci
    - WANDBOX_COMPILER=gcc-4.3.6
    - WANDBOX_COMPILER=clang-head
#    - WANDBOX_COMPILER=clang-3.8 # travis ci
#    - WANDBOX_COMPILER=clang-3.7 # circle ci / wercker
#    - WANDBOX_COMPILER=clang-3.6 # semaphore
#    - WANDBOX_COMPILER=clang-3.5 # c++config.h not found
    - WANDBOX_COMPILER=clang-3.4
#    - WANDBOX_COMPILER=clang-3.3 # wercker
#    - WANDBOX_COMPILER=clang-3.2 # wercker
#    - WANDBOX_COMPILER=clang-3.1 # wercker
    - WANDBOX_COMPILER=clang-3.0

after_success:
  - echo OK
  
notifications:
  email:
    on_success: change
    on_failure: always



最後に
Wandbox でのテスト結果を xml ファイルに出力できるようになったことで、テストツールとして完成されてきた感じがしてきました。
iutest のテストとしてはかなり便利に使わせていただいています。
もう個人的には最強の環境になったかなと思います。

ただ、複数ファイルのコンパイルができない(ヘッダーは可能)ので、まだちょっとプロダクトのテストをするとまでは至っていませんが、ヘッダーオンリーなライブラリーとかであれば、かなり良いテスト環境になるのではないでしょうか。

2015年4月28日火曜日

Wandbox が複数ファイル対応したので試してみた



Wandbox が複数ファイルに対応したようなので、早速試してみました。
iuwandbox
iuwandbox は私が作っている C++ テスティングフレームワーク iutest を Wandbox 使うためのツールです。
今回はこちらを複数ファイル対応しました。

以前の、iuwandbox では iutest の実装をすべて1つのファイルに展開し、実現していました。
Wandbox の複数ファイル対応によって、この展開が不要になります。
以前の iuwandbox については、Boost.勉強会の LT でもお話しましたので、そちらのスライドを参考にしてください。

ブログズミ: Boost.勉強会#16 大阪に行ってきました > 発表資料
ブログズミ: Shippable + Wandbox で C++ の CI 環境構築

Wandbox の複数ファイル対応にあたって、API に codes パラメータが追加されています。
https://github.com/melpon/wandbox/blob/master/kennel2/API.rst
codes には、file にファイル名を code に内容を書いて配列データとして追加します。
Wandbox の API に関わる部分だけ切り出して公開してますので、ご自由にお使い下さい。
https://github.com/srz-zumix/wandbox-api

続いて、iuwandbox 側の修正です。
これまでは #include "path/iutest.hpp" という(パスは何でも良い)行があったら、そこにコードを全展開していました。
これを iutest.hpp という別ファイルと #include "iutest.hpp" として処理するようにしました。
また、--expand_include オプションを指定しなかった場合に、対象のファイルも追加ファイルとして送るように修正しています。

こちらの修正は github から取得できます。
https://github.com/srz-zumix/iutest

サンプル
https://github.com/srz-zumix/iutest/tree/master/tools/wandbox
こちらにあるサンプルの実行結果が以下になります。

複数ファイル対応前の結果:http://melpon.org/wandbox/permlink/rxop0vcJGIrj9BwC
複数ファイル対応後の結果:http://melpon.org/wandbox/permlink/HTCDKqWvJ8TlvmUa
※対応前のリンクは開くのに時間がかかるので注意!

複数ファイル対応後の方を開いていただくとわかると思いますが、ページを開くのがとっても速くなってます!
また、一番見たいテストコード部分がすぐに確認できるようにもなりました。

Wandbox ますます便利になりましたね\(^o^)/

2014年12月5日金曜日

Shippable + Wandbox で C++ の CI 環境構築

C++ Advent Calendar 2014
こちらは C++ Advent Calendar 2014 5日目の記事になります。

前置き
CI 環境構築のお話ですが、まずは簡単に用語の説明をしたいと思います。
  • CI
    Continuous Integration (継続的インテグレーション) の頭文字を取って CI 。
    ビルドやテストなどを継続的に(繰り返し)実行することで、問題の発見などをする手法です。
    この CI 環境のためのツールがたくさんあります。代表的なのは Jenkins でしょうか。
  • Shippable
    Shippable は CI ツールの一つです。
    github や bitbucket と連携して push をトリガーに、任意の処理を実行できるサービスです。
    類似サービスに Travis-CI があり、こちらの方が有名だとは思います(私も使ってます)
    が、今回は Shippable を使います。
  • Wandbox
    Wandbox は説明するまでもないでしょう。Online Compiler のひとつです。

ということで、
今回は Shippable と Wandbox を利用して、 C++ のソースコードを定期的にビルド、テストしてみようと思います。

なぜ Shippable と Wandbox か?
Wandbox は便利である
今回 Wandbox を使う理由は、
  • 豊富なコンパイラー
  • API がある
の2点です。

Wandbox でなくとも複数のコンパイラーで動作検証することは可能です。
しかし、環境構築の手間がかなりあると思います。
Wandbox ならば、そのような面倒なことをしなくとも API でコードを投げるだけで、コンパイル結果と実行結果が得られます。

なぜ Shippable か?
実は、Shippable のサポート言語には C++ がありません。
なので、 C++ の CI 環境としては Shippable は通常適さないのですが、今回はコンパイルや実行は Wandbox にお任せなので、CI 環境の要件としては Wandbox に API でコードを投げれるかどうかになります。まぁ簡単に言えば、Wandbox さえあればなんでも OK です!

でも、なんでわざわざサポートされていない環境を使うの?と思う方もいると思います。

それは、前述した通り C++ がサポートされているかどうかは、Wandbox を使うので関係ないからです。
つまり、サポート言語の縛りがなく、料金体系や private リポジトリを扱えるのかどうかなど、他の条件で CI サービスを選ぶことができます。

私の場合、Travis-CI を既に利用しており、そちらはそちらでテストが稼働中だったのと、
「言語サポートされていない環境でも CI できる」というのがネタになると思ったので、Shippable にしました。

Shippable + Wandbox で C++ の CI 環境構築
前置きはこのくらいにして、ここからどのように環境を整えたのか説明していきます。
実例
長々と説明を始めてもわかりにくいと思いますので、
はじめに Shippable + Wandbox で CI をしている実例を紹介したいと思います。

https://github.com/srz-zumix/iutest
こちらは私が作成している C++ テスティングフレームワークです。
ページを開くと README にバッジが付いているのがわかると思います。

そこに Shippable のバッジがあります。(build:shippable と書かれている黄緑のやつです)

バッジをクリックすると Shippable のページにジャンプします。
https://app.shippable.com/projects/541904d2ac22859af743f867/builds/latest


コンソールログの script あたりに Wandbox での実行結果が出力されていると思います。
こんな感じで、push があるたびに Shippable が自動的にビルドとテストをしてくれます。

だいたいどんな感じで動いているか、わかりましたでしょうか?
それでは、仕組みについて説明をしていきます。

Wandbox API を使う
まずは、Wandbox にコードを投げられるようにします。
API のドキュメントがあるのでそちらを参考に作成しました。
https://github.com/melpon/wandbox/blob/master/kennel2/API.rst

import requests
import json;

class Wandbox:
 """wandbox api class"""
 api_url = 'http://melpon.org/wandbox/api'
 parameter = { 'code':'' }
 def get_compiler_list(self):
  r = requests.get(self.api_url + '/list.json')
  r.raise_for_status()
  return r.json()
 def run(self):
  headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
  payload = json.dumps(self.parameter)
  r = requests.post(self.api_url + '/compile.json', data=payload, headers=headers)
  r.raise_for_status()
  return r.json()
 def get_permlink(self, link):
  r = requests.get(self.api_url + '/permlink/' + link )
  r.raise_for_status()
  return r.json()

 def code(self, str):
  self.parameter.update({'code':str})
 def compiler(self, str):
  self.parameter.update({'compiler':str})
 def options(self, str):
  self.parameter.update({'options':str})
 def stdin(self, str):
  self.parameter.update({'stdin':str})
 def compiler_options(self, str):
  self.parameter.update({'compiler-option-raw':str})
 def runtime_options(self, str):
  self.parameter.update({'runtime-option-raw':str})
 def permanent_link(self, b):
  self.parameter.update({'save':b})
 def dump(self):
  print self.parameter

if __name__ == '__main__':
 w = Wandbox()
 w.compiler('gcc-head')
 w.options('warning,gnu++1y')
 w.compiler_options('-Dx=hogefuga\n-O3')
 w.code('#include <iostream>\nint main() { int x = 0; std::cout << "hoge" << std::endl; }')
 print w.run()

こちらはベースとなるコードで、
iutest ではコマンドラインオプションに対応などをした iuwandbox.py という形で提供しています。
https://github.com/srz-zumix/iutest/blob/master/tools/wandbox/iuwandbox.py
使い方に関しては前回のブログで書いてますのでそちらを参照してください。
ブログズミ: iutest v1.11.0 をリリースしました

Wandbox でのコンパイルと実行ができるようになったら、ローカルでテストしておくとよいでしょう。

Shippable の登録とプロジェクト設定
Shippable の設定をします。
まずは、アカウント登録をします。

github か bitbucket が選べるのでお好きな方を使ってください。
今回は github で説明します。


github を選ぶとアクセス権を要求されます。問題なければ許可してください。




アカウント登録が済んだら、ダッシュボードの Organizations から github/bitbucket のアカウントを選択、
Repos から実行させたいリポジトリを選択するとプロジェクトが作成されます。



Shippable.yml の設定
次に、実行する処理の設定をします。
Shippable はリポジトリ直下の shippable.yml ファイルの記述にしたがって動作します。
shippable.yml の書き方は公式ドキュメントも確認してください。

language: python

python: 2.7

install:
  - pip install requests

before_script:
  - export PYTHONDONTWRITEBYTECODE=1
  - make -C tools/fuse

script:
  - cd tools/wandbox
  - python ./iuwandbox.py ../../test/iutest_syntax_tests.cpp -c ${WANDBOX_COMPILER} -f"-DIUTEST_USE_MAIN=1" --encoding utf-8-sig --expand_include

env:
  - WANDBOX_COMPILER=gcc-head
  - WANDBOX_COMPILER=gcc-4.9.1
#  - WANDBOX_COMPILER=gcc-4.9.0 # wercker
  - WANDBOX_COMPILER=gcc-4.8.2
#  - WANDBOX_COMPILER=gcc-4.8.1 # travis
  - WANDBOX_COMPILER=gcc-4.7.3
#  - WANDBOX_COMPILER=gcc-4.6.4 # drone
  - WANDBOX_COMPILER=gcc-4.5.4
#  - WANDBOX_COMPILER=gcc-4.4.7 # wercker
  - WANDBOX_COMPILER=gcc-4.3.6
  - WANDBOX_COMPILER=clang-head
#  - WANDBOX_COMPILER=clang-3.5
#  - WANDBOX_COMPILER=clang-3.4 # travis
  - WANDBOX_COMPILER=clang-3.3
#  - WANDBOX_COMPILER=clang-3.2 # wercker
#  - WANDBOX_COMPILER=clang-3.1 # wercker
  - WANDBOX_COMPILER=clang-3.0

notifications:
  email:
    on_success: change
    on_failure: always
こちらは iutest で実際に使用している設定です。
https://github.com/srz-zumix/iutest/blob/master/shippable.yml

Wandbox 連携部分(iuwandbox.py)を Python で書いているので言語は Python にしています。
install や script、before_script などはそれぞれビルドしたい内容にあわせて書くことになると思います。

また、env にコンパイラーを列挙してマトリックスを組んでいます。
Wandbox を使うのですから、様々なコンパイラーでテストするよう設定しました。

設定は以上
設定は以上です。あとはリポジトリに push すれば、自動的にビルドが走り出し、テストまでやってくれます!

バッジをつける
せっかくなので、バッジを付けたいと思います。
README なんかでよく見るアレです。

Shippable もバッジに対応していてます。
プロジェクトページの Badge を開くと、画像のリンクか Markdown のテキストが出てくるので適宜コピーして使ってください。




まとめ
  • Wandbox 最高!
    今回 CI 環境構築の肝となったのが Wandbox でした。
    多種多様なコンパイラーが扱えるので、テストに大変役に立っています。
    ホントにありがとうございます。いつもお世話になっておりますm(__)m

    とはいえ、今回紹介した iutest では push する度に 3万行近くのソースコードを投げているのですが、(しかも、マトリックス組んでるので x 10)こういう使い方は大丈夫なんでしょうか…今のところ問題は出ていませんが…ただ、それだけが気がかりではあります。

    最近だと、paiza.IO というのもリリースされたようですので、そちらも試してみようかと思ってます。

  • 使える CI ツールの幅が広がった!
    C++ で絞ると割と数が限られていた CI サービスですが、今回の方法なら言語サポートを気にすることなく使えますので、選択の幅が大きく広がったと思います。
  • C++ の話はほとんどなかった…
    C++ の話は皆無でしたね…すみません(汗)

C++ Advent Calendar 2014
明日は Fuyutsubaki さんです。よろしくお願いします。

それでは!


おまけ
この記事を執筆中、Shippable が不安定だったため、別の CI サービスとして wercker も試していました。
おまけとして簡単に紹介しておきます。

wercker も Shippable と同様に CI サービスの一種です。
対応言語は、PHP/Python/Ruby/Node.js/Go/java:android 。こちらも C++ がサポート外ですが問題ありません。

wercker も yml で動作を設定します。http://devcenter.wercker.com/articles/werckeryml/
wercker は Box と Step の組み合わせで動作する仕組みが特徴です。
http://devcenter.wercker.com/articles/introduction/pipeline.html

これら Box や Step は自作も可能ですが、今回はやってません。

また、Shippable のようなマトリックスができなさそうだったので、直列に各コンパイラーごとに Step を記述しました。
iutest の wercker.yml はこちら。
https://github.com/srz-zumix/iutest/blob/master/wercker.yml
実行結果はこんな感じになります。
https://app.wercker.com/project/bykey/d385156052aa4118a7f24affe4a8f851

2014年9月22日月曜日

Boost.勉強会#16 大阪に行ってきました

Boost.勉強会#16 大阪に行ってきました。

久しぶりの勉強会参加です。
今回は LT で発表してきました。
勉強会でしゃべるのは初めてのことでとても緊張しました。
あまりうまくしゃべれなかった気がします。。。

発表資料はこちら

話した内容は iutestWandbox 対応したという話でした。
LT では触れませんでしたが Google Test にはない機能もたくさんありますので、ドキュメントをみていただけると幸いです。
今回これを実装した理由は、Wandbox でテスティングフレームワークを使おうとした場合、選択肢が Boost.Test しかなかったので、普段 Google Test を使っている身としては Google Test の構文で書きたいなと思ったからです。

まだパッケージリリースはしてませんが、trunk で確認できます。(trunk/tools/wandbox)
詳しいことはリリースしたときに、このブログに書きたいと思います。

これができるようになったことで、C++ に対応していない CI サービスでも Wandbox を使ってテストをすることができます(たぶん)。現在、Shippable を使って検証中ですので、これもまたブログに書けたらと思います。

最後になりましたが、発表者・参加者の皆様お疲れ様でした&楽しい時間をありがとうございました。