継続的レイトレ合宿

はじめに

このページはレイトレ合宿5‽のアドベントカレンダー2週目の記事です。
べ、別に、怖い人たちが記事を書く前に、さっさと済ませておこうなんてつもりじゃないんだからねっ!

概要

さて、本題に入りますが、レイトレ合宿では、レギュレーションが定められています。
例えば、一枚絵の場合には、次のようなルールになっています。

  • 何もインストールしていないまっさらなマシン上で動作するようにしてください。
  • 実行ファイルを叩いたら自動で始まるようにしてください。キーボード、マウスの操作を要求する作りにしないでください。
  • ネットワーク越しに何かをやるような動作をさせないでください。
  • おおよそ30秒毎に、レンダリングの途中経過をbmpかpngで連番(000.png, 001.png, …) で出力してください。
  • 4分33秒以内に自動で終了してください
  • マシンスペック:AWS(Microsoft Windows Server 2016 Base/Amazon Linux)

もーめんどくさいなぁ。
ルールに準拠するサンプル用意してくださいよ~

と思ってしまうのは、人の常ではないでしょうか?!

と言うことで用意したのが、imagirelab/raytracingcamp5 になります(Amazon Linux AMI 2017.03.1.20170617 x86_64 HVM GP2で動作確認済み)。
同じようなものは以前、用意したのですが、今年は一歩進めてCDですよ、CD。
CDといっても、Compact Disc 出はなくて、Continuous Delivery。そう、継続的デプロイです。
プログラムをGitHubに上げると、ビルドをしてzipして、すぐ配れるんですから。
それだけじゃなくて、プログラムを実行して、実行結果がホームページとして見れてしまうのですよ。

この環境を使えば、ローカルにビルド環境や実行環境がなくてもレイトレ合宿のプログラムができるのですよ。
そう。スマホからレイトレ合宿の開発が可能です!

中身

やっていることは、Travis CI をまわしてるだけです。

Travisフロー.png

ルートに.travis.ymlを置いて、あとは、pushされたときに自動実行していきます。

ビルドと実行に成功した後は、別のリポジトリにpushして、GitHubのgh-pages(リポジトリをホームページにする機能)を使って、公開します。ホームページのHTMLは、あらかじめ静的に用意しておきます。

フォルダ構成

使わないファイルを省くと、リポジトリのファイルは次のようになっています。srcフォルダ内が実際のレイトレのファイルで、sdkフォルダに外部のライブラリを格納しています。static フォルダは、ビルド結果のホームページの静的ファイルで、HTMLファイルを用意しています。ちなみにレイトレ自体は、Shirley御大の In One Weekend (週末レイトレーシング)の内容に少しだけ手を入れたものとなっております。

+--README.md // GitHubのリポジトリアクセス用
+--LICENSE // ライセンス表示
+--.travis.yml // TravisCIの設定ファイル
+--.gitignore // gitの対象ファイルの設定
+--src // レイトレのソースファイル
| +--main.cpp
| +--makefile
| +--my_rand.h
| +--raytracingcamp5.sln
| +--raytracingcamp5.vcxproj
| +--raytracingcamp5.vcxproj.filters
| +--renderer.cpp
| +--renderer.h
| +--RT_struct.h
+--static
| +--index.html// ビルド後のホームページのHTML
+--sdk
 +--stb // nothings/stb(1ファイルヘッダオンリーのライブラリ集)
   +--stb_image.h
   +--stb_image_write.h

.travis.yml

ビルドのかなめは、.travis.yml です。.travis.yml の最初は環境変数の設定になります。

language: cpp
env:
 global:
 - email=imagire@gmail.com
 - username=imagire
 - secure: "v6…(中略)…U="

今回は、C++を使うので、cppのコンテナを呼び出します。また、git用にメールアドレスや、ユーザー名を設定しておきます。

その後の、secureは、GitHubのパスワードを暗号化して書き込んでいます。具体的には、次の様に作ります。この文字列は、後から出てくる${GH_TOKEN}という文字列を実際に使用する際に、複合化されて呼び出されます。この暗号化の手順は次の通り。

  • GitHubの自分のプロフィールから、Personal access token を取得
  • sudo gem install travis でtravis CI Clientをインストール
  • travis encrypt -r (ユーザー名)/(リポジトリ名) GH_TOKEN=(取得したPersonal access tokens) でPersonal access tokenを暗号化
    • 例:travis encrypt -r imagirelab/raytracingcamp5 GH_TOKEN=c45cf01c53cf64b41869b3f070e64e7783d177ed

まぁ、でも、コンソールで行わないといけないので特にWindowsの人は面倒ですよね。travis CIの「setting」-「Environment Variables」で設定するという方法もあります。

traviscienv

.travis.ymlのその次の行からは、実行するコマンドです。「-」をつけて、実行する命令を並べていきます。今回は、gcc を makefile をつかってビルドしています。make dependで依存性を調べた後、makeでビルドします。ビルドファイルはa.outとしています。

実行ファイルができた後(レイトレ合宿5ではzipで提出するので)、実行ファイルをzipで固めた後、実行ファイルを実行しています。

script:
 # gcc のバージョンを確認してみる
 - g++ --version
 # build
 - cd src
 - mkdir bin
 - make clean
 - make depend
 - make
 - ls -lsaR # ファイルがビルドできたか確認
 # 実行
 - cd bin
 - zip -r raytracingcamp.zip ./ #zip を作る
 - ./a.out # プログラムの実行!

ここまでできたら、事後のプロセスということで、GitHubに結果を上げていきます。masterブランチのみの更新を対象として、プルリクでも呼び出しは更新に含めないというのが定番な設定のようなので、その設定を最初に行います。次に、あらかじめホームページ用のHTMLファイルを置いておいた「static」ディレクトリの中身をコピーしてきてから、gitに追加して、GitHubに上げています。GitHubのリポジトリは、ソースコードのリポジトリと別のリポジトリにしています。

after_success: # デプロイ
 - test "$TRAVIS_BRANCH" != "master" && exit 1 # マスターブランチが更新されたのでなければ無視
 - test "$TRAVIS_PULL_REQUEST" = "true" && exit 1 # プルリクで呼ばれた時にはデプロイしない
  # 静的なHTMLファイルを取ってくる 
  - cp ../../static/* . 
 # git に新しくpush
 - git config --global user.email "$email"
 - git config --global user.name "$username"
 - rm -rf .git
 - git init
 - git add --all
 - git commit -m "deploy commit from travis"
 - git push -f https://${GH_TOKEN}@github.com/imagirelab/rtc5.git master

サービス設定

GitHubの設定は、ソースコードが置いてあるリポジトリの設定の、「Integrations & services」でTravis CIを追加します。具体的な設定方法が詳しく知りたい方は、例えばこの記事を書いているのググった結果の一番最初にあった「さくらのナレッジ:GitHubと連携できる継続的インテグレーションツール「Travis CI」入門」などの入門記事がありますので、そちらを読まれると良いでしょう。

TravisCiIntegrations

また、実行結果の方のリポジトリ(imagirelab/rtc5)は、GitHub Pages の設定を行います。こちらは、GitHubのリポジトリの設定で、ホームページとして公開するブランチを指定すれば、ホームページのURLをもらえ、ブランチが更新されるたびに、ホームページが自動で更新されます。

TravisGhPages

さいごに

さぁ、このプロジェクトをforkして、srcの中身をあなたのレイトレに書き換えれば、あなたもレイトレ合宿に参加可能です。

諏訪湖で僕と握手!