The Travis CI Blog: Windows is Available (Early Release)
※1
Travis CI で Windows OS が使えるようになりました。
というわけで早速使ってみました。
(
ちょうど昨日、この記事に書いたことに対応した環境に更新されったっぽいので、状況変わってそうです。https://travis-ci.community/t/c-support-on-windows/282/10)
iutest で試してみた
サクッと試したいので、既存のリポジトリを使って、Windows でのテストを追加したいと思います。
対象のリポジトリは
iutest です。
概要
*
https://github.com/srz-zumix/iutest
* C++
* CMake でビルド、テスト
差分
最初にできあがった .travis.yml の差分を見ていきましょう。
https://github.com/srz-zumix/iutest/pull/116/files
追加した変更が下記のあたりになります。
情報
Windows のビルド環境の情報は以下の公式ページにまとまっています。
https://docs.travis-ci.com/user/reference/windows
os: windows とすることで、Windows 上でのビルド・テストが実行できるようになるわけですが、
プリインストールされているツールやサポートされている言語など、こちらで確認しておくとよいでしょう。
基本的には公式ドキュメントを見れば、ジョブを組めると思いますが、 iutest で行ったことのうちポイントになりそうところを紹介していきます。
C++ はまだ対応言語に含まれていない
C++ はまだ対応言語に含まれてません。
現在(2018/10)、対応している言語は以下の4つです。
* Node.js (language: node_js)
* Rust (language: rust)
* Go (language: go)
* Bash variants (language: shell, language: sh)
https://docs.travis-ci.com/user/reference/windows#supported-languages
フォーラムに
topic も上がってるので対応されるのを期待して待つとして、
Visual Studio がインストールされているので C++ のビルドができるでしょという期待のもと、 language: sh で一時しのぎしました。
pre-installed ツールにパスが通っていない?
Windows 環境のプリインストールツールは以下のようですが、cmake がいない(見えていない?)状態でした。
https://docs.travis-ci.com/user/reference/windows#pre-installed-packages
昔の記憶をたよりに、探してみると…
(Chocholatey をむかーし使ったときの記憶だと、インストールパスがツールによって異なったりして困ったことがあったので)
Program Files にいました!
というわけで、CMake 使う場合は下記のようにパスを通しましょう
(今後の更新でデフォで見えてるようになることを願う)
export PATH=$PATH:${PROGRAMFILES}/CMake/bin
(ProgramFiles だった気がするんだが、PROGRAMFILES だった…??)
pre-install ツールが見えなかったら、デフォルトインストールパスを探してみましょう。
cmake --build でタイムアウト
cmake へのパスが通って、コマンドが無事叩けましたが、今度は cmake --build でタイムアウトしてしまいました。
AppVeyor ではどうしていたかな?と確認すると、そちらでは cmake --build を使わずソリューションファイル指定をして、msbuild が叩かれていたので、同じように msbuild を使うように修正しました。
MSBuild もパスが通ってない
(デフォルトで通ってて欲しいなー)こちらもパスを通しましょう。
Windows ビルドを調べていたら、find で検索してパスをセットしている .travis.yml があったので、そちらの方法に切り替えました。
(これで環境変わってもある程度大丈夫になるはず)
https://github.com/chensoft/libfs/blob/339aa134aa94a34b5c5a27f5a30a4d37a6af66d5/.travis.yml
CMAKE=`dirname "$(find '/c/Program Files'* -name 'cmake.exe' 2>/dev/null | head -n1)"`
MSBUILD=`dirname "$(find '/c/Program Files'* -name 'MSBuild.exe' 2>/dev/null | grep 'amd64' | head -n1)"`
export PATH=$PATH:"$CMAKE":"$MSBUILD"
MSBuild もタイムアウト
MSBuild に切り替えましたが、症状変わらずタイムアウト…
そこで Widonws ビルドに関係のない設定をすべて取り払って見たところ、ログが出ました。。。(うーん、謎)
https://travis-ci.org/srz-zumix/iutest/jobs/444078696
before_install:
- |
if [ "$TRAVIS_OS_NAME" == "windows" ]; then
CMAKE=`dirname "$(find '/c/Program Files'* -name 'cmake.exe' 2>/dev/null | head -n1)"`
MSBUILD=`dirname "$(find '/c/Program Files'* -name 'MSBuild.exe' 2>/dev/null | grep 'amd64' | head -n1)"`
export PATH=$PATH:"$CMAKE":"$MSBUILD"
echo $PATH
fi
- python .ci/travisci/travis_blocking_stdout.py || true
script:
- |
if [ "${USE_CMAKE}" == '1' ]; then
set -e
mkdir ./cmake-build && cd ./cmake-build
cmake ../projects/cmake
if [ "$TRAVIS_OS_NAME" == "windows" ]; then
echo msbuild
MSBuild.exe iutest.sln /verbosity:minimal
else
cmake --build .
fi
ctest -C Debug -V
cd ..
fi
matrix:
include:
- os: windows
language: sh
env: WINDOWS=1 USE_CMAKE=1
before_script:
- cmake.exe --version
- cmd.exe /C echo test
- MSBuild.exe --version
- os: windows
language: go
env: WINDOWS=1 USE_CMAKE=1
before_script:
- powershell /?
- os: windows
language: rust
env: WINDOWS=1 USE_CMAKE=1
- os: windows
language: node_js
env: WINDOWS=1 USE_CMAKE=1
dist: trusty とか sudo: false が悪さをしているのかと思って試してみましたが、ログは出ず。
上記のような(マトリックスしてるのはテストのため)最小構成だと、ちゃんとログが出る。
(ちなみに、before_script で MSBuild.exe --version してるのもログが出ないので、ますますよくわからん)
tee コマンドで回避
結局は
tee コマンドを介して上げるとログ出力がちゃんと認識されたので、それで回避しました。
なんとか完成
tee コマンドでなんとか問題回避できたので、ようやくビルド・テストに成功しました!
cmake --build でも tee すれば回避できました
というわけで、最終的に最初に示した YAML となりました。
最後に
ログ出力がなぜか出ず、タイムアウトしてしまうのに手こずりましたがなんとか Windows でのビルド・テストが Travis-CI 上でできるようになりました。
まだベータ状態なのでこれから改善されていくとは思いますが、この記事が誰かの参考になれば幸いです。。。
※1 マイクロソフトの許諾を得て使用しています。