なんとかするから、なんとかなる

エンジニア関係のことを書きます

Jenkinsを使ってiOSの自動ビルドおよびテストをする(ipa生成、テスト実行編)

はじめに

前回に引き続き、iOSの自動ビルド環境を作っていきたいと思います。

今回はBuild実行後のipaの作成方法と、Build後にテストを実行する方法です。

前回

Jenkinsを使ってiOSの自動ビルドおよびテストをする(Jenkinsビルド編) - なんとかするから、なんとかなる

準備

  • 前回作成したテストが追加された、iOSのProject XcodeでProjectを生成する際に、[Include Unit Tests]にチェックを入れていれば大丈夫です。

    • テストの内容は今回関係ないので、とりあえずテストができるばOKです。
  • 一度、ipaファイルを手動で生成しておく。ipaの詳しい生成方法は、目の前のデバイスで検索してください。

    • [Product]-[Product]-[Archive] で作成できます。今回は[Ad-Hoc]で一度生成してください。

Jenkinsでipaを生成する

Jenkinsの設定

Xcode Pluginの設定を変更します。

General build settings

前回チェックを入れなかった[Pack application, build and sign .ipa?]にチェックを入れます。

f:id:hopita:20170606203853p:plain

そして、各設定項目を入力します。 ここでは、[Export method]に"ad-hoc", [.ipa filename pattern]に"${VERSION}“を入力しました。

設定項目について

[Export method]では、生成するipaの種類を入れます。ここでは準備の段階で生成したipaと同じ種類します。

[.ipa filename pattern]では、.ipaのファイル名を付けられます。Vesion以外にも日付などを設定することができます。

[Output directory]では、ipaを出力するdirectoryを変更できるようです。

ビルド

JenkinsのJobを実行すれば、指定したdirectoryにipaが出力されます。

自動テストを実行する

buildが完了したタイミングで、projectに含まれるテストを実行するようにします。

Jenkinsの設定

Jobの設定で[Build]の項目を追加します。 現在、Xcode Pluginの設定がある枠の一番下にある[Add build step]をクリックし、[Execute shell]を選択します。

f:id:hopita:20170606203913p:plain

そして、下記のCommandを追加します。

xcodebuild test -scheme "MySampleApp" -sdk iphonesimulator -project 'MySampleApp.xcodeproj' -configuration Debug -destination "platform=iOS Simulator,name=iPhone 6,OS=10.3"

f:id:hopita:20170606203926p:plain

項目について

  • xcodebuild test

    • xcodebuild でtestを実行するコマンドです。その後に各パラメータを付けます。
  • -scheme

    • テスト対象
  • -sdk

    • テストを実行する環境
  • -project

    • テストするProject
    • ちなみに、workspaceに対してテストする場合は、-workspaceとしてxcworkspaceを入力する
  • -configuration

    • ReleaseビルドかDebugビルドか
  • -destination

    • テストを実行する端末やOSなど細かな設定
    • 上記以外でもよいが、Simulatorであれば既にインストールされている必要がある。

試しに、JenkinsのJoでテストを実行してみると、テスト実施可能なSimulatorの端末とOSが一覧でConsole上で見られます。

ビルド

JenkinsのJobを実行すればビルド後に、テストが実行されます。

テスト結果について

Jenkinsでそのままテストを実行しても、テスト結果はconsoleに出力され、とても見ずらいです。

別途、iOSテストの結果をわかりやすく表示するプラグインなどを紹介したいと思います。

なんかうまくいかないぞQ&A

実践していくうえで、困りそうなことをまとめておきます。

ipaを生成しようしたらエラーがでる

ipaを生成しようとしたら下記のようなエラーが出る場合

error: exportArchive: The operation couldn’t be completed. (IDEDistributionErrorDomain error 3.)

解決方法

一度手動で、ipaを生成してみる

ios - error: exportArchive: The operation couldn’t be completed. (IDEDistributionErrorDomain error 3.) - Stack Overflow

テストしようとしたら、"Xcode project not found"

テストしようとしたら、Projectが見つからない、workspaceが見つからないと出た。

解決方法

テスト実行用に設定したコマンドを確認する。

テスト対象が、 * プロジェクト単体であれば -project “MySampleApp.xcodeproj”

Simulatorが無いのようなことを言われる。

あるはずのSimulatorを指定してもうまくいかない

解決方法

-destinationを代表する文字列を指定する部分を確認する。

スペースや大文字小文字が違うだけで、失敗します。

おわりに

今回はipaの生成方法から、テスト実行まで行いました。 次回は、テスト結果の整形(見やすくする)やメールやslackへの通知を試してみたいと思います。

Jenkinsを使ってiOSの自動ビルドおよびテストをする(Jenkinsビルド編)

はじめに

前回の続きで、今回はとりあえずサンプルプロジェクトをJenkinsでビルドしてみます。

前回

Jenkinsを使ってiOSの自動ビルドおよびテストをする(Jenkins準備編) - なんとかするから、なんとかなる

必要のもの

  • Apple Developerライセンス(DeveloperとDistributionが必要)
  • ビルドするサンプルアプリ(空Projectで良い)のProvisioning Profile
    • Git Repositoryからビルドするので、サンプルアプリ生成時に[Create Git repository]にチャックを忘れずに。

Pluginをインストー

  1. Jenkinsを起動したら下記を開きます [Jenkins] - [Manage Jenkins] - [Manage Plugins] f:id:hopita:20170530202315p:plain

  2. タブで[Available]を選択し、[Filter]で"Xcode"を入力します。 f:id:hopita:20170530203007p:plain

  3. 上の画像には出ていませんが、"Xcode integration"を選択して[Download now and install after restart]でインストールする

ちなみに、アドレスバーで下記を入力することで、再起動できます。

localhost:8080/safeRestart

これでPluginの準備は完了です。

JenkinsのJobを作成する

Jobの新規作成

New Itemをクリックします。

f:id:hopita:20170530201839p:plain

JobのGitの設定

Source Code Managementの項目を設定します。

f:id:hopita:20170530203426p:plain

[Git]を選択して、[Repository URL]に作成したサンプルアプリの".git"が入っているところを選びます。 まずは、ビルドするだけなのでBranchはそのままにしておきます。

Xcodeのビルドを設定する

[Build]の[Add build step]で"Xcode"を選択します。 [Target]の項目で作成しておいたサンプルアプリのTargetを指定します。

f:id:hopita:20170530204024p:plain

Code signing & OS X keychain options

[Deveper Team]は"None"のままで、Development Team ID はApple Developer Accountで確認できるIDを入力します。

[Keychan path]は何もいじっていなければ以下を入力。あとkeychainにアクセスするためのPasswordを入力しておきます。

$(HOME)/Library/KeyChains/login.keychain

f:id:hopita:20170530204610p:plain

Advanced Xcode build options

ビルドだけなら必要ないかもしれないですが、以下の設定をしました。

[Clean test reports?]にチェック

[Xcode Schema File]にサンプルアプリのFile名を入力。おそらくTargetと同じだと思います。

Saveする

上記の設定がすべて完了したら、下部の[Save]をクリックしてjobを保存します。

ビルド

設定が完了したら、さっそくビルドです。

[Build Now]をクリックします。

f:id:hopita:20170530205558p:plain

Build Historyが青くなればBuild成功です!

失敗すると赤くなります。

Build History(#××)をクリックして、Console Outputへ進むとエラーの詳細がみれるので調べつつ修正しましょう。

f:id:hopita:20170530205722p:plain

なんかうまくいかないぞQ&A

上記の作業をすべて読んでいれば同じことが書いてあるのですが、作業をしていて引っかかったところをまとめておきます。

Provisioning Profile がないとダメ

ビルドするだけならDeveloperだけで良いのではないかと思っていたのですが、DistributionとProvisioning Profileがないとダメみたいです。

解決方法

Apple Developer Accountで発行できます。

Jenkinsでビルドしたら、couldn’t find a Provisioning Profile のエラーが出る。

Jenkinsでビルドしたら、以下のようなエラーが出てくる。今回は下記の方法で解決しました。

Check dependencies
No profiles for '{Bundle Identifier}' were found:  Xcode couldn't find a provisioning profile matching '{Bundle Identifier}'.
Code signing is required for product type 'Application' in SDK 'iOS 10.3'

解決方法

JenkinsのJobの設定の中で

[Build]-[Xcode]-[Code signing & OS X keyChain options]-[DevelopmentTeam]

上記の中のDevelopment Team IDをきちんと指定していできていない可能性があります。

Apple Developer Accountの[Membership]-[Team ID]の項目をコピーしてくる。(DistributionのIDですね)

ちなみに

調べている中で、結構Xcode のGeneralで指定している[Automatically manage signing]を外してManualで指定するって記事がありました。

今回の記事を作成する中では、[Automatically manage signing]はチェックありでよさそうです。

進めていく中でダメだったら、そのとき修正します。

[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

Jenkinsを使ってiOSの自動ビルドおよびテストをする(Jenkins準備編)

はじめに

Jenkinsを使ってiOSの自動ビルドとテスト環境を作っていきたいと思います。

はじめはLocalのGitRepogitoryに対して自動ビルドを実行する。

そのあとipa生成とテスト。

最後に結果をslackへ通知を試してみたいと思います。

環境

Jenkinsの準備

Jenkinsのインストー

Jenkins のインストールはHomebrewを使ってインストー

$ brew install jenkins

まだHomebrewを持っていないという場合は以下のHPをみてインストー

Homebrew — macOS 用パッケージマネージャー

Jenkinsを起動

以下のコマンドでJenkinsを起動します。

$ jenkins

起動したらsafariで下記にアクセスすることでJenkinsの起動を確認できる。

http://localhost:8080/

Jenkinsの起動がうまくいかないとき

Jenkinsを起動しようとしたら、下記のようなエラーが発生してすぐには起動できませんでした。

下記の2つの対策を実行して無事起動することができました。

Main deleteWinstoneTempContents
WARNING: Failed to delete the temporary Winstone file /var/folders/l6/_hlf7bj12wg0q79ntn8v1vf00000gp/T/winstone/jenkins.war
Jenkins requires Java7 or later, but you are running 1.7.0_71-b14 from /Library/[f:id:hopita:20170528122726p:plain]Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home/jre
java.lang.UnsupportedClassVersionError: winstone/Launcher : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at Main._main(Main.java:224)
at Main.main(Main.java:112)

Java Runtime Enviroment (JRE) を更新する

ここで、Javaのversionが古いと起動できませんでした。

更新方法はMacのSystemPreferencesからJavaのアイコンをクリックして[Update Now]です。

Java Developer Kit (JDK)をインストールする

あとJDKをインストールする必要がありました。JDKは以下からインストールできます。

Java SE Development Kit 8 - Downloads

Jenkinsのセットアップ

Unlock Jenkins

初めてJenkinsを起動すると下記のような画面現れます。

f:id:hopita:20170528122726p:plain

画面に書いてあるPathを実行してPasswordを取得する必要があります。 ただし、そのまま実行すると"Permission Dennied" だったり、sudoで実行しても"Command not found"で実行できません。

コマンドラインから下記でPasswordを見ることができます。そう実行ファイルじゃないんですね。勘違いしました。

$ cat (Path)

Customize Jenkins

f:id:hopita:20170528123251p:plain

次に、初めにインストールするPluginを設定します。

まずは[Install Suggested plugins]でおすすめセットにしました。

Create First Admin User

f:id:hopita:20170528123521p:plain

次に初めのユーザを作成します。

余談ですが、ここでE-mail addressをさぼって入力せずに[Save and Finish]したら、ボタンがDisableになって進まなくなりました。 更新したらまたこのページなります。ちゃんと入力しましょう。

Jenkins起動

ついにJekinsを起動できました! f:id:hopita:20170528123738p:plain

参考URL

以下のサイトを参考にさせてもらいました

続き

Jenkinsを使ってiOSの自動ビルドおよびテストをする(Jenkinsビルド編) - なんとかするから、なんとかなる

改訂新版Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

改訂新版Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

Unite2017 参加しました その10

ゲームの見た目も盛ったら変わる!!!!ヤバい!!ポストプロセス!!入門!!!!!!!!!

www.slideshare.net

ポストプロセッシングとは

レンダリング後の画像に対して、見た目を豪華に、綺麗にすることができる。

Post Processing Stack

ポストプロセッシングをするための、アセット

おすすめ設定

  • ColorSetting = linear
  • Rendering Path = defferd
  • HDR = ON

弱点

  • AnimatorでAnimationをつけることができない  ⇨ スクリプト経由でアニメーションはつけられるが、アセットに対して破壊的変更をするため、オススメできない
  • シェーダバリアントを大量に生成してしまう。各機能の組み合わせに最適化されたシェーダが作成されてしまう。ビルドがやたらと長くなる。

Anti Aliasing

FXAA

軽量なアンチエイリアス、便利だけど品質低い

特徴

境界線を見つけ出して、そこにぼやっとつける。

TAA

こっちの方が高品質なアンチエイリアス

特徴

ピクセルに対して、サンプルする点をサブピクセル精度でランダムに変更する。 ジラジラ感を消すことができる。

引数について
  • Jitterを変更することで、処理速度が変わる
  • stationaryは周囲の影響を受けるピクセル数を変更する

Anviant Oculution

エッジ強調を行なって、映像のホリをくっきりさせる。くぼみが際立つ

Screen Space Reflection

  • レンダリングの後に、3D情報を元に、反射すべきものを判断して、反射させる。
  • そもそも画面にないものは反射しないので、見切れている場合は、ぼかすなどでごまかす。
  • 処理が重い
  • Defferd Shading限定

Width Modifier

見えないものは基本的に詰まっているという前提であるが、このパラメーターで見えない部分の詰まっている距離を抑えることができる。

Depth of Field

フォーカスを合わせる。近くにピントを合わせたり、遠くにピントを合わせる。 すごいこだわりを感じる機能

Motion Blur

シャッター速度が遅い時にできる、ブレをだす。

Eye Adaption

  • 画面の明るさを自動で制御することができる。
  • 急に明るいところに出た時などの目の慣れを表現できる
  • ComputeShader必須
  • AutoExposureなどの露光を変更することも可能

Bloom

発光、光っている感じを出すことができる。

Color Grading

明るさと色調の設定をすることができる。 トーマッピングで、白飛び黒潰れをなんとかできる。

Clomatic Avalation

レンズの歪みを再現することができる。

Grain

フィルムのザラザラ感をつける。拡大した時にザラザラして見える。

Vignette

カメラの周辺に黒枠をつけることができる。

Dithering

グラデーションのシマシマを消すことができる。

Unite2017 参加しました その9

WebGL:ゲームプラットフォームとしてのWebと現在と未来

www.slideshare.net

WebGLの動機

ブラウザのプラグインを無くしたい

Web Assembly(.wasm)

  • ブラウザ向けのバイナリフォーマット
  • W3Cのコミュニティグループで議論されている
  • WebAssembly Explorerでコードを書いてコンパイル結果を見ることができる

対応状況

  • FireFox ChromeはMVP(Minimum Viable Product 最低限の実装はサポート)
  • Edge, safariは開発中

WASM MVP とは

  • 最低限必要な要件が定義されている内容
  • WASMモジュールの構造などに対応する、などなど

WASMの特徴

  • 早い Nativeと比較して130〜150%くらいの実行時間で動くことができる。

    asm.jsとWASMの違い

  • WASMの方が早い。WASMは構文解析の時間が無いので早い。
  • asm.jsはブラウザごとにコンパイル方法が異なる。(ベンダー依存)

WebGL

今のところ2世代

普及率

WebGLはほとんど100%。WebGL2は50%ないくらい。

WebGL出力の注意点

WebGLでは以下のように出力される

C# ⇨ (MONO) ⇨ IL ⇨ (il2cpp) ⇨ C++ ⇨ (Clang) ⇨ LLVM IL ⇨  WASM + JS

  • 結構重たい処理はJSに投げた方がスレッドが異なるので楽。
  • 2種類のGCが存在するので注意。プロファイルする際は両方を使う

    • JSVM内のUnity用メモリはUnityのGCが使用される
    • JSVM内はJSVM用のGCが走る
  • ファイルシステムはメモリ上に仮想的に作っているので、ファイルが多すぎるとメモリを圧迫することになる。

    • IndexedDBもその裏ではメモリ上に展開している。

Webのこれから

  • Shared Array Buffer: 共有メモリ(スレッドの実現)
  • 音声処理の別スレッド化
  • payment
  • キャッシュ処理

Unite2017 参加しました その8

Unityライティング最新情報

www.slideshare.net

光表現について

  • GI Global illumination 間接光
  • Baked GI 事前に計算しておくGI
  • procomputed RealTime GI リアルタイムで間接光をつくる

UnityではStaticな動かない物体に対しては、前もって間接光を計算しておく。

LightProve

空間にライトを検知するものを置いて、間接光の影響を計算しやすくするための仕組み

  • 1モデル1つのproveからしか影響を受けられなかった。
  • 上記が改善され、モデルが複数のproveを受けられるようになった

リアルタイムな間接光について

リアルタイムな間接光はクラスタ単位で計算される。

クラスタの大小は変更可能。

影の表現

光を遮り、影を作るためにはメッシュやポリゴンは必要となる。

メッシュやポリゴンが増えると、負荷が上がるため辛い。

動的な影と静的な影について

それぞれの影を混ぜるMixed Lighting

Mixed Lighting

  • unity5.6以前では、うまくMixedすることができず、影の上に影が映ってしまうことがあった。 また、光沢の表現(スペキュラ)がお粗末だったらしい。
  • MixedLightingは大きく4種類
    • Subtractive
    • Baked Indirect
    • Shadow Mask
    • Distance Shadow Mask

Subtractive

  • 5.6以前のmixedに近い機能
  • 影を全てTextureに焼きこんでしまう(static)
  • 動的なオブジェクトに対しては計算をする。
  • 動的な場合は影の色を変更することができるので、影の上に影が描画されてしまうことを避けられる。
  • 影の上に影以外のmixedデメリットを引き継いでいる。光沢の表現は難しい

Baked Indirect

  • 間接光のみを事前に計算しておくが、影は全てリアルタイム表現しましょう。という発想。
  • 静的なオブジェクトに対しても影を描画するため辛いという欠点がある。処理時間がかかりすぎる

Shadow Mask

  • 静的な影は前もって計算、動的な影はその場で計算。
  • ライトは動的に描画することができるので光沢も表現することができる。
  • 間接光はテクスチャに焼き込む
ShadowMaskではクッキーがつかえる
  • マスクとして影を用意しているので、色や輝度を変更することは可能
  • ただし、間接光はすでにTexutreに焼かれているため注意が必要。
Baked Shadow Angle
  • 使用することはあるが動的な影と静的な影の差が見えてしまう。

Distance Shadow Mask

  • Dynamic とShadowMaskの混合
  • 距離が近い部分はDynamic,遠い部分はShadow Mask
  • すなわち、近くてよく見えるところは頑張って描画するが、遠いところは低解像度でもOKとする

Unity2017.1から

QualitySettingsからShadowMaskとDistanceShadowMaskは切り替えが可能となる。

ローレベルのユーザはShadowMask、ハイエンドユーザはDistance Shadow Maskを利用する。

その他

  • 影を落とすためだけのオブジェクトをおく方法もある。
  • 影を落とすためだけに、低解像度のメッシュを置いても良い。
  • 高解像度のポリゴンによる陰を低解像度オブジェクトで影を遮ることで作る。すなわち影を作るのはそこまでハイポリゴンは不要である。

ライトのBaked 設定

ライトの設定は大変なので、その改善方法を紹介

LightExplorer

シーン内のライト及びEmissiveの一覧を表示してくれる便利さん

Progressive LightMapper

  • シーンが見えているライトを優先的にBakedしていくので、プレビューが早い
  • 大まかに計算後、詳細に計算するのでやっぱりプレビューが早い
  • リアルタイムGIはできない。
  • ライトを焼いてから、proveを焼くので、proveに大きく依存するシーンではプレビューには時間がかかる

Unite2017 参加しました その7

最適化をする前に覚えておきたい技術

www.slideshare.net

最適化への手順

プロファイリング

処理ごとにかかった時間、メモリの使用状況を把握する。

まずは、Unityのprofiler 詳しく知りたければ、Nativeのprofiler(Xcodeとか)を使う

[window] - [プロファイラー]

対処する

メモリの使用量が多い

  • 単純な使用量か、メモリリーク
  • C#(MonoMemory)が原因か、Unityが原因か

C#が大きいぞ

  • C#スクリプトで使用しているメモリ。(GCされる)
  • C#が確保したメモリは解放されてもC#専用領域として残ってしまう。(reserved) (Editor拡張でもメモリは取られるので、実機で確認する。)

とりあえず スクリプトを修正する

Unityメモリが大きいぞ

  • TextutureやMeshなどが原因で、リークの可能性もある。
  • ProfilerからAsset毎にメモリ内の容量をチェックできる。その他に公式ツールも存在する。

不必要なアセットなどを削除するようにする

ロードが長い問題

何が長いのか、初期化処理か、ロード時間か、きちんと原因を調べる profilerでロード時間をフレーム毎に見てみる。

[スクリプト].awakeが長い場合は、初期化が辛いことになっている。

  • プロフィリングの時はDebugLogは止めるようにする。DebugLogは割と重い。

texture.awakeが重い

無駄なものを読み込んでいないか、やたらとリッチなTextureは存在しないかを確認する。

AssetBundleを使っている場合は、予期せず重複して読み込んでいることがあるので、注意。

一瞬ゲームが固まる問題

  • GCが走った場合に起こる現象。
  • profilerでCGが起きていないかを確認する。

対策

  • C#スクリプトでのメモリの消費を抑える。
  • 文字列の置換や検索、足し算は気をつける。

フレームレートが低い問題

FPSのフレーム間で終わらない処理をしてしまったのが原因(30FPSよりも下がると、人の体感で遅く感じてしまう)

  • ゲームロジックによる負荷か、描画処理による負荷か
  • profilerでrenderingをみることでわかる。

どうする

  • 描画ならデザイナーさんとの交渉
  • ゲームロジックなら、C#のスクリプトかUnity側の処理か。GameObejctが3000を超え始めたらC#のスクリプトの問題
  • BehaviourUpdateをprofilerを見ることでわかる。
  • phisicsなんとかで物理が重いのかがわかる。
  • insepectorのTimemanagerでフレーム数をきちんと下げると良い。
  • UIが重い場合、頂点の計算に時間がかかる
  • 何かの変更があれば、すべての頂点を計算し直すため
描画の負荷で考える
  • 無駄な描画をしている場合が割と多いので気をつける
  • Objectの描画処理はFrameDebuggerで確認することができる。
ちなみに
  • 頂点数もprofilerから確認することができる。
  • 透明描画や、半透明を塗るのも結構大変。ImageEffectなどもかなり時間がかかる
Shaderはどうですか?
  • ピクセル毎に細かく計算するため、気をつける。
  • 特に、地面や空は画面の中でかなりの面積をようするため軽めのShaderにすると良い。

Shaderについては各プラットフォームのprofilerで見た方がいい。

描画負荷を深掘りしたい場合

  • iOSならXcode
  • Androidなら各GPUメーカーによって問い合わせ、Tegra, SnapDragonなどのによって変わるので注意