2017年4月17日月曜日

[CI] Codefresh を始めました



Codefresh というサービスを知ったので使ってみました。
(ちょうど Google Test の互換性テストを Travis CI から引っ越ししようかなと思っていたので、タイミングが良かった)
Codefresh は Docker 対応を売りにした CI サービスのようです。
が、個人的には Docker 使ったことがないですし、iutest のテストでも使う必要がないので、全くもって Codefresh の旨味を使うことがないです。
なので、Docker 的な話は公式サイトや以下のような記事を参照してくださいm(__)m


ともあれ、そこに CI サービスがあれば使うおじさんなので(もはや、手段と目的がごっちゃになってますが)始めて行きましょう。

Pricing
ちなみに Codefresh も (オープンソースであれば) 無料から始めることができます。
フリープランでは並列ビルドなし、Environment も1つだけです。


Environment
Codefresh ではビルドした Docker イメージ(Service)からコンテナを実行することができます。
この実行環境が Environment です。
フリープランだとこれが1つに限定されます。
今回は特に使わないので、省略します。

アカウント作成
アカウント作成をしていきましょう。
最初にログインアカウントとして Github or Bitbucket の選択をします。(今回は Github を選択)


権限要求されるので問題なければ許可しましょう。


アカウント名やメールアドレスが自動で入力されます。変更が不要であれば「NEXT」をクリック。


このあとアンケートが少しありますが、飛ばしてしまっても構いません。


これでアカウント作成は完了です。

サービスの作成
Codefresh では他の CI サービスでいうジョブのことをサービスと表現します。
やることは他の CI サービスとほとんど同じです。

まずは、リポジトリを選択しましょう。



リポジトリを選択したら、サービスを何で構築するかを「YAML」「Dockerfile」「Template」から選択します。
今回は「TEMPLATE」を選択。


プラットフォームの選択画面になるので、条件に合うものを選択します。
今回は「Ubuntu」を選択。


Dockefile が作成されます。
編集はあとでもできるので次に進んでしまって問題ないです。


これでサービスが作成できました。
「BUILD」ボタンを押して実行してみましょう。
テンプレートから変更していないので成功するはずです。



テスト
Codefresh では、作成した Docker image に対してテストを実行することができます。
テストは「Unit Test Script」に記述します。


特に難しいことはなく、コマンドを書いていくだけです。
これで iutest の CI 環境としては完成です。
Codefresh の特徴を活かすのであれば、このあと Launch するのがいいのでしょうが、iutesst はサービスではないのでここまでです。

最後にお約束のバッジ
バッジは「General Settings」のバッジをクリックすると Markdown テキストなどが得られます。




今回は以上です。では。

2017年4月10日月曜日

[Docker] 始めてみたけど躓きまくってるので備忘録として残しておくよ

注意:有益な情報はありません
完全な個人用メモです。
それでも引っかかる情報はあるかもしれませんが、今すぐバックすることをおすすめします。
自分でも調べてて感じましたが、変化が激しいので古い情報はすでに当てはまらないことがあります。
検索ツールで期間を絞ったり、バージョンを絞ったりして調べることをおすすめします。

前提条件

* Windows + Docker Toolbock
* Windows 10

VBoxManage.exe: error: Failed to create the host-only adapter

Vagrantでのhost-only adapterのエラーを回避する方法 on Windows10 - OSSを触りながらつぶやく日記

Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter

VirtualBoxでHost-Only Ethernet Adapterが原因でVMが起動しない時 | ぅゎょぅι゛ょっょぃ

ssh
docker-machine ssh default


ホストの作成からやり直す
"Docker Quickstart Terminal" ショートカットを使った場合、既にホストが存在すれば作成をスキップします。
なので、設定とか変えてもう一度ホストを作成しなおしたい場合は、
docker-machine rm default
としてからショートカットを起動します。


コンテナの一括削除
docker rm `docker ps -a -q`

不要になったイメージ・コンテナの削除
docker image prune
docker container prune
docker system prune


server misbehaving.
$ docker run hello-world
time="2017-02-24T10:07:02+09:00" level=info msg="Unable to use system certificate pool: crypto/x509: system root pool is not available on Windows"
Unable to find image 'hello-world:latest' locally
C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 10.0.2.3:53: server misbehaving.
See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.

/etc/resolv.conf に nameserver 8.8.8.8 を追加する

$ docker run hello-world
time="2017-02-24T10:18:53+09:00" level=info msg="Unable to use system certificate pool: crypto/x509: system root pool is not available on Windows"
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/


Error response from daemon: Get https://registry-1.docker.io/v2/: Method Not Allowed
いろいろやってるうちに、こんなエラーがでるようになった。
素の host を作り直したら、server misbehaving. も含めてなぜか解決した…
解決した理由がよくわからない…

No space left on device
boo2docker だと、tmpfs がメモリにマウントされるらしいので virtualbox のメインメモリを増やしてあげます。
docker-machine create に --virtualbox-memory オプションを指定すればいいみたいです。
ショートカットから start.sh を実行している場合は、一度 default を削除して、start.sh の create コマンドを実行しているところに、--virtualbox-memory を指定します。
もしくは、default を stop して VirtualBox マネージャーから設定を変更すれば OK です。

TMP じゃなくて普通にディスクサイズが足らない場合は、--virtualbox-disk-size オプションを指定するか、同様にマネージャーで容量増やしてください。
※ start.sh で docker-machine create -d virtualbox default してるだけなので、一度削除してから --virtualbox-disk-size つけるのが楽そうでした。


docker run -v > Error response from daemon: invalid bind mount spec
ホストディレクトのパスは絶対パスなので、c:\ とか書くと上記エラーになる。
Windows のパス形式 (c:\hoge) だとダメなので、/c/hoge のように書く必要があります。

PowerShell (Windows) で Docker コンテナにホストディレクトリをデータボリュームとしてマウントする際に pwd 相当のことをしたい - ひだまりソケットは壊れない

※ docker cp のときは Windows 形式

ホストとコンテナ間でのファイルコピー

docker cp from to

コンテナのパスは コンテナ名:パス のように書く。
e.g.
docker cp aa237:/path/to/dir hoge

コンテナ名は docker ps で確認できる。
ハッシュにしたくない場合は、run するときに --name オプションを付けると良い。

docker run 時に環境変数を設定する
dockerのコンテナ実行時にLANGなどの環境変数を設定する方法 - Qiita
docker run -e HOGE=hoge

ストレージの保存場所を変更する
MACHINE_STORAGE_PATH 環境変数にパスを設定すれば OK

Looks like something went wrong... Looking for vboxmanage.exe
VBOX_MSI_INSTALL_PATH 環境変数がなくなってないか確認する。(VirtualBox を更新すると消える?)



SVN: can't convert string from 'utf-8' to native encoding
Docker ではなく svn co したときのエラーですが、日本語ファイル名が含まれていると発生します。

以下を Dockerfile に追記して対応しました。
参考:「オデの日記@WEB系: svnでどんなに頑張っても"can't convert string from 'utf-8' to native encoding"エラーが治らない

RUN localedef -f UTF-8 -i ja_JP ja_JP.utf8
ENV LC_CTYPE ja_JP.utf8


最後に
一応これで docker を使い始めることができるようになりました。
が、Dockerfile 書きながらイメージを作っていくと、あれが足りなかった、あれが間違っていたと、何回もやり直しして想像以上に構築に時間がかかってしまっています。
なにかうまいやり方がある気がするのですが、知識不足が非常にネックになっている状況ですね。
どこか勉強会とかに行ったり、聞いたりするのがいいのかもな~
ということで、雑にまとめましたが、ここで書きなぐりを一旦終えます。
以上。




2017年4月3日月曜日

Doxygen の特殊コマンドの typo チェックをする

ソースコードのドキュメント生成に Doxygen はよく使われていると思います。
/**
 * @ingroup VALUE_PARAMETERIZED_TEST
 * @def     IUTEST_INSTANTIATE_TEST_CASE_P
 * @brief   パラメータテストインスタンス化マクロ
 * @param   prefix_         = インスタンス名
 * @param   testfixture_    = テストフィクスチャ
 * @param   generator_      = Range, Bool, Values, ValuesIn, Combine, Pairwise ...
 * @param   ...             = Param name generator function (option)
*/
このようなコメントを記述することで自動的にドキュメントを生成する仕組みですが、
この @ から始まる特殊コマンドをよく typo してしまうことがあるので CI で簡単にチェックできるようにしてみました。

チェック用の .mk がこちら

make -C DoxygenCommandCheck.mk ROOT=path/to/dir

のように使用します。

自作の C++ テスティングフレームワークの iutest で実際に検出した結果がこちら。



やっぱり typo してましたね…
生成されたドキュメントを見ても、気づきにくいところだと思うので是非活用してみてください。
(しかし、なんで make で書いたんだろ… .sh で良かったのでは…)