Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CIサービスの導入 #15

Closed
equal-l2 opened this issue Dec 19, 2016 · 25 comments
Closed

CIサービスの導入 #15

equal-l2 opened this issue Dec 19, 2016 · 25 comments

Comments

@equal-l2
Copy link
Contributor

equal-l2 commented Dec 19, 2016

WindowsやUbuntuでの動作確認に、CIサービスを利用してみてはいかがでしょうか。

Ubuntu環境についてはTravis CIが利用できます。
Windows環境についてはAppVeyorが利用できます。
どちらもオープンソースのプロジェクトについては無料です。

どちらのサービスも1つのビルドあたり60分程度の制限時間があるので、LLVMやBoostのビルドはテストできませんが、Theolizer本体のみのビルドには十分な時間かと思います。

@yossi-tahara
Copy link
Owner

なんとなくCIサービスってWEB系プロジェクト向けと思い込んでました。後日調べてみます。
ご提案、ありがとうございます。

@yossi-tahara
Copy link
Owner

この件の中間報告です。

現在のビルド・システムを各CIサービス上で実行できるようにすることで、利用できるだろうと思います。
問題は、llvmライブラリをどうやってCIサービスからアクセスできるようにするのか?です。
現在のライブリラは数GBytesあるため、これをビルドの度にCIサービスへコピーすることは現実的ではありません。
しかし、実際に使っているライブラリはそんなに多量にはないので使っているもののみ抽出してCIサービスへコピーするのであれば可能な筈と見込んでいます。

CIサービスを利用することによるメリットは、現状より頻繁にビルド→自動テストできるようになることと思います。
そのためのコストは、上記作業を行うことです。

当プロジェクトにおける現時点での最優先作業は自動テストの実装と当プロジェクトの宣伝と考えています。そこで、自動テスト実装完了後、CIサービスを利用できる仕組みを構築する方向で検討中です。

@equal-l2
Copy link
Contributor Author

equal-l2 commented Jan 4, 2017

パッケージマネージャのLLVMを使用することは出来ませんか?

(Travisなら)パッケージマネージャでLLVM 3.5~3.9 をインストールして使うことが出来ます。

@yossi-tahara
Copy link
Owner

yossi-tahara commented Jan 4, 2017

(Travisなら)パッケージマネージャでLLVM 3.5~3.9 をインストールして使うことが出来ます。

なんと!! そんなことが可能なのですか。
でも、Windows用がなければ、結局、必要なライブラリの準備作業は必要になるので大差ないかも。

ところで、この件、急いだ方が良いでしょうか? 要は作業順序の問題だけですので、急ぐことも可能です。
私はCIサービスを使ったことがないので1~2週間かかりそうな気がしているので躊躇してます。

@equal-l2
Copy link
Contributor Author

equal-l2 commented Jan 4, 2017

@yossi-tahara

Windows用がなければ、結局、必要なライブラリの抽出作業は必要になるので大差ないかも。

Windowsなら公式サイトから落とせるプレビルト版でどうにかできないでしょうか
(Windowsにはあまり詳しくないので、間違っていたらすみません)

この件、急いだ方が良いでしょうか?

瑣事に手を取られて開発が滞ってしまっては本末転倒ですから、優先順位がそれほど高いとは思いません。
個人的には、WindowsがうまくいかないならとりあえずLinuxからCIをサポート、という風にできるところからやって行ってもらえればと思っています。

@yossi-tahara
Copy link
Owner

yossi-tahara commented Jan 4, 2017

公式のWindows向けプリビルド版にはlibToolingが含まれていないのですよ。
含まれていたら、llvmのビルドを節約できるので本当にありがたかったのですが。

Travisのサービスもこの辺はちょっと心配です。ただ、yumetodoさんによるとmsys2の場合はlibToolingも含まれていたそうなので、Travisにも含まれていることを期待したいところです。

個人的には、WindowsがうまくいかないならとりあえずLinuxからCIをサポート、という風にできるところからやって行ってもらえればと思っています。

なるほど。
linuxだけなら、もしかするとあまり手間をかけずに対応できるかも知れません。
AppVeyorから先に調べていたのでTravisについてはまだ未調査です。さくっと導入できるかどうか、順次調べてみます。

@equal-l2
Copy link
Contributor Author

equal-l2 commented Jan 4, 2017

Travisのサービスもこの辺はちょっと心配です。

TravisのLinuxビルド環境はUbuntuベースで、Ubuntuではlibclang-devというパッケージにlibclangTooling.aが含まれています。
おそらく問題ないかと思います。

@yossi-tahara
Copy link
Owner

了解です。情報ありがとうございます。

ということは、もしかして、標準のubuntuにもパッケージがあって、それに含まれているそうな気がしてきました。
であれば、llvmのビルドが不要になるのでありがたい。今度調べてみます。

@yossi-tahara
Copy link
Owner

yossi-tahara commented Jan 15, 2017

Travice CIを使えないか検討中です。

思わぬ落とし穴がありました。結局、こちらでビルドしたライブラリ(boost)をTravis CIへインストールして使う方法が必要そうです。

現状です。

  1. 手元の環境でPASS/FAIL判定を自動化できる仕組みを実装しました。
    従来は結果を目で見て判定が必要でした。CIサービスを使うには結果を自動判定できないとあまり役に立たないと思います。

  2. libToolingのバージョン調査
    Travis CIでは、ubuntu 12.04 LTS、もしくは、ubuntu 14.04 LTSが使えるようです。
    後者なら、ubuntuからlibClang3.8パッケージとllvm3.8パッケージが提供されています。そして、手元のubuntu(16.04)で両方をインストールできることも確認できました。この中にTheolizerドライバが必要とするライブラリのファイルが含まれていることも確認できました。インストール先フォルダがlibclangとllvmが異なりますが、CMakeのfindPackageで対応していることを期待しています。手元のubuntuでトライできるのでなんとかなるとは思います。
    そして、Theolzierはllvm 3.8と3.9に対応していますので、libToolingは大丈夫そうです。

  3. boostのバージョン調査

    • ここでハマりました。
      ubuntuのバッケージ検索で適切なパッケージを見つけることができませんでした。
      しかし、libboost-devにて1.58をインストールできることは手元のubuntuで確認できました。
      更にしかし、静的リンク・ライブラリがインストールされていないことも確認できました。ヘッダとsoのみのインストールでした。Theolizerはboostを静的リンクしますのでこれでは使えません。
    • また、もともとTheolizerの共有リンク・ライブラリを提供する場合は、boost静的リンクするため、boostは-fPICオプション付きでビルドする必要が有ります。
    • boostをTravis CI上でビルドする方法と、手元でビルドしたboostをTravis CIへどうにかしてインストールして使う方法の2つが考えられます。前者についてはIssue boostの自動ダウンロードに失敗する環境がある #5 の問題が懸念事項です。Travis CIでも同様の問題が起きる可能性があります。linuxに不慣れな私がリモートで追求するのは厳しいと思います。
      ですので、boostは手元の環境でビルドしたものをTravis CIへインストールした方が良さそうです。
  4. gccのバージョン調査
    公式でバージョンを見つけることができませんでした。(何処かに記載されているとは思うのですが)
    しかし、最新版を入れる方法が見つかりましたので、恐らく解決できる筈です。
    また、現在のTheolizerはコンパイラを一旦置き換えてテストします(ちゃんと戻してます)ので、コンパイラをインストールして使った方が確実です。(もし、他と共有している場合は置き換えに失敗する可能性があります。)

  5. CMake調査は未着手
    これはあまり心配していません。最悪でも必要なバージョンをインストールして使えると思います。

質問です。

@equal-l2 殿。Travis CI上に手元のubuntuでビルドしたboostのイメージをインストールする手順として何が考えられるでしょうか? この分野はあまり詳しくないので、もし、良い方法をご存知でしたらご教授下さい。
また、それを行う.travis.ymlのサンプルがあると助かります。

@equal-l2
Copy link
Contributor Author

進捗報告ありがとうございます。

boostのバージョン調査

静的リンクライブラリがないのは困りものですね。
パッケージのデプロイ等には明るくないのですが、こちらでも調べてみます。

gccのバージョン調査

参考ページでは、gccをインストールするにあたって次のようにしています。

install:
    - sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test
    - sudo apt-get -qq update
    - sudo apt-get -qq install g++-4.8

Travisとしてはsudoはあまり使ってほしくないようで、パッケージをインストールするために特別な構文があります。

addons:
  apt:
    sources:
      - ubuntu-toolchain-r-test
    packages:
      - g++-4.8

この構文でインストールできるのは、公式レポジトリか、Travisのホワイトリストにあるレポジトリのパッケージのみですが、多くの場合問題ないでしょう。

ちなみに、ホワイトリストにはUbuntu 12.04(Precise)用のLLVMレポジトリ(llvm-toolchain-precise)も入っていて、これを使えばPreciseでも新しいLLVMが使えます。

@yossi-tahara
Copy link
Owner

yossi-tahara commented Jan 15, 2017

equal-l2さん、こんにちは。

情報、ありがとうございます。特にホワイトリスト助かります。

sudoはVMを起動しないといけないから、負荷が高くなるから嫌なのでしょうね。理解できます。
そして、llvmはコンテナでも大丈夫そうですね! しかも、3.9があるので嬉しいです。現時点でのTheolizerの正規対応は3.9なので。libToolingはバージョンアップでほんの少しですが挙動が変わることが多いので、何かしら対処が必要になるのですよ。それを避けることができると嬉しいです。

gccがどのバージョンまで使えるのかいまいちはっきりしませんが、少なくとも5.0は使えそうなので、恐らく大丈夫でしょう。
それと、現在のTheolizerはコンパイラをTheolizerドライバに置き換えてビルド・システムに割り込む仕組みになっています。なので、そのインストール機能のテストにsudoしている部分がまずいかも。
sudo無しで、コンパイラの置き換えができない場合にはその部分のテストはCIサービスで行うテストからは外す方向で考えます。(たかだか5項目くらいの僅かなテストですし、ほとんど触ることのない部分ですから、プリビルド版の作成時にやれば十分と思います。)

後はboostですね。linuxの文化に詳しくないので、boostの状況を見通せなくて苦労してます。
もしかして、linuxではboostは共有ライブラリで使うことが一般的でしょうか?
Windowsでboostを動的リンクするとTheolizerを使えない人が多くなることが目に見えていることと、Windowsとlinuxで仕組みを変える必要がない部分は同じにしたいので静的リンクにしましたが、linuxで共有ライブラリが一般的なのであれば、linuxでは共有ライブラリにすることも検討した方がよいような気がしてきました。
この方向でも検討してみます。

@yossi-tahara
Copy link
Owner

boostの件はうまくいくかも知れません

手元のubuntuでまずトライしたら、ヘッダは見つけるけど、ライブラリを見つけてくれませんでした。
似た問題に苦しんでいる人が解決策を公開してくれていました。
要するにubuntu標準のPPAではなくboostのPPAを使えと言うことのようです。
その通りにしたら、静的リンクライブラリも入り、その環境でのTheolizerのビルドは成功しました。
Travis CIのホワイト・リストを見る限り、同じPPAを使っているように見えますのでTravis CIでもうまくいくかも知れません。

llvmもboostと同様うまくいくことが期待できます

boostと共にllvmもubuntu標準で入るものでビルドを試みたのですが、CMakeがllvmを見つけることができません。バグ報告がありました。
https://llvm.org/bugs/show_bug.cgi?id=20884
https://llvm.org/bugs/show_bug.cgi?id=23352
https://bugs.launchpad.net/ubuntu/+source/llvm-toolchain-3.6/+bug/1493329
上記とほぼ同じ場所でダメでした。それを修正しても更に別の不具合がでたので諦めました。
llvm-3.8から3.9へ上げた時、上記に絡むライブラリの存在場所が変更になっていますし。

Travis CIのホワイト・リストを見て気がついたのですが、llvm.orgにppaがあるようです。これは見落としてました。早速、これを手元のubuntuにインストールしてみたら、成功しました。

ただし、zlib1g-devのインストールが必要でした。Travis CIのホワイトリストに記載がないことが、ちょっと気になりますが、標準で入っていても良いライブラリのように思いますので、それを期待します。

@yossi-tahara
Copy link
Owner

現在、Travis CIでビルドできないか、トライ中です。
addonsの構文が今ひとつ理解できていないので、苦労してます。
boostとcmakeは入りました。llvmにトライ中です。

boost(1.46)とcmake(3.2.3)のバージョンが古く、このバージョンでは初めてのトライになります。
g++(4.6.3)も標準は古いです。新しいもの(5)を入れようと思いますが、もしかするとboostやllvmとの互換性調整が必要になるかも。

17回ビルドした後18回目のビルドが始まらないです。密にやりすぎたかも知れません。明日確認します。

@equal-l2
Copy link
Contributor Author

equal-l2 commented Jan 17, 2017

ビルドログ拝見しました。

.travis.ymlを見る限りでは問題ありません。
(ただしkey_urlは不要です。あれは自分で外部のPPAを追加する際に必要なものですので)

LLVMがインストール出来ないのはLLVM公式のPrecise用APTが404エラーを返していて使えないのが原因だったようです。
Preciseはもう古いので、ひょっとするとサポートが打ち切られたのかもしれません。
公式からの発表が今のところ見当たらないのでただのトラブルかもしれませんが。
午前3時現在、復旧したようです。

次回の試行ではうまくいくと思います。

@yossi-tahara
Copy link
Owner

yossi-tahara commented Jan 18, 2017

おお、Travis側のトラブルだったのですね。教えて頂いて助かりました。
最後のpushがビルドされていないようなので、key_urlを削除して再度やってみます。

ダメでした。未だに404です。もう少しトライしてみます。

yossi-tahara added a commit that referenced this issue Jan 18, 2017
key_urlは不要とのことなので削除して再トライ。

******************************************************************
Sources are dirty.  Please build TheolizerDriver and TheolizerLib.
******************************************************************
@equal-l2
Copy link
Contributor Author

さっき見たときは大丈夫だったのですが、また3.9が使えなくなってますね…
3.8以下は大丈夫そうです。

@yossi-tahara
Copy link
Owner

yossi-tahara commented Jan 18, 2017

3.8にトライしてます。404はでないし、インストール・エラーにもならないですが、CMakeのfind_package()で見つかりません。
ログに警告やFATALが出ているので、インストールに失敗していることを疑いつつ、調査中です。
WARNING: The following packages cannot be authenticated!
FATAL: Could not load /lib/modules/4.8.12-040812-generic/modules.dep: No such file or directory

ログを確認し、LLVMのインストールには成功しているようでした。
CMakeがLLVMのパスを認識できていない可能に思い至り、.travis.cmakeでLLVM_ROOTを指定したところ、Theolizerのコンフィグに成功しました。
Theolizerのビルドは始まりましたが、初めてみるエラーがでてます。解析を進めます。

この原因はboostが古すぎてTheolizerが対応していないことでした。
boostのヘッダのインクルードに失敗してました。古いboostへの対応の必要は感じないので、trustyでトライします。

trustyならboostは1.54.0でした。Theolizerのビルドに成功しました。まだテストに成功しないので解析中です。

@yossi-tahara
Copy link
Owner

yossi-tahara commented Jan 18, 2017

あと少しのところまで来ていると思うのですが、Travis CIがダウンしてます。
Travis CIが復活するまで再開できないので、備忘録として現状を書いておきます。

現状は、Theolizerのビルドには成功し、Theolizerを使ったビルド・テストに落ちてます。
コンフィグ・ログを出力させることで、下記状況まで掴めてます。

  • StaticWithBoostでトライしてます。これはTheolizerLibにboostの必要ライブラリを静的リンクして、ユーザ・プログラムとリンクします。そのboost関数無しエラーになってます。途中boostを動的リンクしようした時のコードを消し忘れたため、boostライブラリのリンクに失敗したようです。

  • .travis.ymlのafter_scriptでビルド・ログを出力させようとしたのですが、うまく出ません。
    手元のubuntuでチェックすると細々とビルド・スクリプトにミスが見つかり、恐らくそれが原因です。

以上2項目を修正し、いざトライしたらTravis CIが落ちてました。orz

Update - Builds are processing slowly on both travis-ci.com and travis-ci.org. We're investigating the issue.
Jan 18, 08:42 UTC
Investigating - We are experiencing delays on travis-ci.org in starting builds. We are investigating.
Jan 18, 08:17 UTC

Travis CIのStatusページに記載があったので、回復したらメールで連絡があることを期待してSubscribeしてみました。

@yossi-tahara
Copy link
Owner

最後まで走るようにできましたが、ちょっと問題ありです。
Theolizerドライバにboostを静的リンクすると、Theolizerドライバを起動できません。Segmentation faultで落ちます。boostを動的リンクすると正常に起動し、ドライバ機能も正常に機能しているようです。(現在はテストを最小限にしてますが。)
boostのバージョンが古い(1.54)こと、もしくは、g++のバーションの相違の影響と思われます。もう少し追求してみます。

後、やはりsudoしないとコンパイラのリプレースには失敗します。最後のこのテストは省略する方向で進めます。

yossi-tahara added a commit that referenced this issue Jan 18, 2017
key_urlは不要とのことなので削除して再トライ。

******************************************************************
Sources are dirty.  Please build TheolizerDriver and TheolizerLib.
******************************************************************
@yossi-tahara
Copy link
Owner

g++のバージョンを4.9, 4.8とトライしましたが状況は変わりません。
諦めて、boostをビルドするようにしました。2分強くらいで終わるので許容範囲と思います。

現在実装済テストを全て有効にすると、テスト・ビルド処理に10分以上かかり、出力無し10分のタイムアウトでFAILします。travis_waitでタイムアウトを伸ばすことにトライ中です。これも構文がいまいちはっきりしないので試行錯誤中です。

masterへ反映するため、travis-tryブランチをリベースしました。なので、今までのtravis-tryブランチのコミット群が全て書き変わっています。travis-tryブランチはmasterへ反映後削除予定です。

@yossi-tahara
Copy link
Owner

ビルドとテスト成功しました。約30分ほどかかるようです。
明日、masterへ反映します。

@yossi-tahara
Copy link
Owner

yossi-tahara commented Jan 19, 2017

masterへ反映し、travis-tryブランチを削除しました。

単なるミス修正以外のコミットを残しています。
当Issueの内容と合わせて今後の参考にするためです。

@equal-l2 さん。
もし、キャッシュの使い方をご存知でしたら教えて頂けないでしょうか?
できれば、各種ツールとboostのビルド結果をキャッシュしたい(合わせて数分節約できる筈)のですが、WEB系ツール用の説明しかなくて理解できないのです。

@equal-l2
Copy link
Contributor Author

equal-l2 commented Jan 19, 2017

@yossi-tahara
Travisに詳しくなくて恐縮ですが、このあたりが参考になるかと思います。
https://docs.travis-ci.com/user/migrating-from-legacy/#How-Do-I-Cache-Dependencies-and-Directories%3F
https://docs.travis-ci.com/user/caching/

作業としては2つで、「キャッシュに保存するフォルダを指定する」ことと「キャッシュがない場合のみに依存ライブラリをビルドする」ことのようです。

@equal-l2
Copy link
Contributor Author

だいぶIssueが長くなってきたので、一旦このIssueは閉じて、WindowsのCIについてのIssueと、TravisのキャッシュについてのIssueに分割してみるのはどうですか?

@yossi-tahara
Copy link
Owner

cacheの件、ありがとうございます。前者のリンク先でやっと概念が理解できました。
確かにIssueは分けた方が良いですね。そうします。

yossi-tahara added a commit that referenced this issue Jan 19, 2017
  トピック・ブランチ(travis-try)を削除

----------------- MD5 Hash Values -----------------
TheolizerDriver  : 37753b8420fe7ee79fe5e3f40ac10847
TheolizerLibrary : edc9f9ac05fe3a82046667fab63f2435
Library's Header : 7fea2a2f4fbe28caf0ff9c39a95a9388
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants