【Azure DevOps で作る】
Microsoft HoloLens アプリ CI 環境
株式会社ネクストスケープ 酒井辰也
Global Azure BOOTCAMP 2019
自己紹介
酒井 辰也(@saka_it)
株式会社ネクストスケープ
• 2015/07~ ネクストスケープ入社
• Web系システムをメインにやっていました
• 2017/05~ xRアプリ開発をやってます
• HoloLensとARアプリ開発をやっています
• Azure もくもく会@新宿 開催しています
• 次回は05月15日(水)19:00~
• 平成最後の年 おじさんになりました
弊社 HoloLens チームのCI/CD環境
Azure DevOps
Repos
Azure DevOps
Pipelines
Azure VM
(Unity・VS)
Azure
Blob Storage
・Git ソース管理
・ブランチ戦略としてGitLab Flowを採用
・CI/CD全体を管理
・masterブランチをトリガーにビルド開始
・Unity/UWPビルドの都合により、
VMを使用してビルド
・成果物をバージョン毎に管理
・アプリを利用してHoloLensへインストール
やること
• ビルドサーバーを構築する
• Azure DevOps にSelf-Hosted-Agentとして登録する
• Pipeline(YAML)を作成する
• ビルドを確認する
なぜ、ビルドサーバーが必要なのか?
• Azure DevOps Pipeline には二つのAgentsがある
• Microsoft-hosted agents
• 予め用意されているビルド環境
• 一定時間無料+追加時間課金で利用できる
• 対応していれば、簡単に利用可能
• Self-hosted agents
• 自前で用意したビルド環境を利用する
• ビルド環境の運用コスト + Agent 単位の課金(無料枠有)で利用できる
• 環境構築が必要だが、カスタマイズしたビルド環境を利用可能
• Unity 対応のビルド環境はないので、Self-hosted を使用
【VM】ビルドサーバーを作成する
• 今回は Azure 上に VM 作成
• OS は Windows Server 2016
• UWP ビルドの都合
• 地域はどこでも OK
• 今回は、MSDN 利用の都合で
「米国西部 2」を使用
• なお、オンプレサーバーなどを
使うこともできます
【VM】ビルドサーバーにアプリをインストールする
• 通常の HoloLens アプリが
ビルドできるように構築
• Visual Studio
• Unity
• Unity をコマンド実行するため
UnityBuildRunner を導入
• guitarrapc さん作成のツール
• dotnet tool コマンドを使用して
インストール
やること
• ビルドサーバーを構築する
• Azure DevOps にSelf-Hosted-Agentとして登録する
• Pipeline(YAML)を作成する
• ビルドを確認する
【DevOps】トークンを作成する
• 右上のユーザーメニューから
「Security」を選択
• 「Personal Access Tokens」の
「New Token」をクリック
【DevOps】トークンを作成する
• Name を入力して、Scopesの
Show all scopes をクリックし、
下記にチェックを入れる
• Agent Pools:Read & manage
• Deployment Groupes:
Read & manage
• 作成後表示されるトークンを
コピーしておく
• 再表示できないので注意!
【DevOps】Agent を作成する
• 「Project settings」から
「Agent pools」を選択
• 「Default」を選択
【DevOps】Agent を作成する
• 「Project settings」から
「Agent pools」を選択
• 「Default」を選択
• 右上の「New agent」をクリック
【DevOps】Agent を作成する
• 「Project settings」から
「Agent pools」を選択
• 「Default」を選択
• 右上の「New agent」をクリック
• 追加手順が表示される
• Download から Agent を
ダウンロードし、zipファイルを
サーバーにコピーする
【VM】Agent をインストールする
• コピーしたファイルを
適当なディレクトリに解凍する
• PowerShell で開き、
下記コマンドを実行する
• 画面の指示通り入力していく
• 設定が完了したら、
下記コマンドで実行する
> .¥config
> .¥run
【VM】Agent をインストールする
https://dev.azure.com/{プロジェクト名}/
トークン文字列
サービス登録・
自動起動をするか?
(今回は手動起動)
Agentを起動
【DevOps】Agent の登録を確認
• Azure DevOps に戻り、
「Default」のAgent pool を開く
• Agents を開く
• 先ほど追加した Agent が
追加されていることを確認する
やること
• ビルドサーバーを構築する
• Azure DevOps にSelf-Hosted-Agentとして登録する
• Pipeline(YAML)を作成する
• ビルドを確認する
【DevOps】Pipeline(YAML)を作成する
• Pipeline → Builds を開く
• 「New pipeline」をクリック
【DevOps】Pipeline(YAML)を作成する
• Pipeline → Builds を開く
• 「New pipeline」をクリック
• コードのあるサービスを選択
(今回は Repos を使用)
【DevOps】Pipeline(YAML)を作成する
• Pipeline → Builds を開く
• 「New pipeline」をクリック
• コードのあるサービスを選択
(今回は Repos を使用)
• 対象のリポジトリを選択
【DevOps】Pipeline(YAML)を作成する
• Pipeline → Builds を開く
• 「New pipeline」をクリック
• コードのあるサービスを選択
(今回は Repos を使用)
• 対象のリポジトリを選択
• 「Starter pipeline」を選択
【DevOps】Pipeline(YAML)を作成する
• Pipeline → Builds を開く
• 「New pipeline」をクリック
• コードのあるサービスを選択
(今回は Repos を使用)
• 対象のリポジトリを選択
• 「Starter pipeline」を選択
• Pipeline YAMLが表示される
【DevOps】Pipeline(YAML)をカスタマイズする(1/5)
pool:
name: 'Default'
trigger:
- master
variables:
UnityPath: 'C:¥Program Files¥Unity¥Editor¥Unity.exe'
UWPSolution: 'UWP¥LAB-HoloLens-CI.sln'
BuildConfiguration: 'release'
UWPAppPackages: 'UWP¥LAB-HoloLens-CI¥AppPackages¥'
使用する Agent pool 名
トリガーとなるブランチ名
ビルド用の変数定義
環境に応じて、
変更する
【DevOps】Pipeline(YAML)をカスタマイズする(2/5)
steps:
- task: DeleteFiles@1
displayName: 'Delete files'
inputs:
Contents: '.¥UWP'
- script: 'UnityBuildRunner -UnityPath "$(UnityPath)" -quit -buildTarget
"WindowsStoreApps" -batchmode -projectPath "$(Build.Repository.LocalPath)" -logfile
"log.log" -executeMethod HoloToolkit.Unity.HoloToolkitCommands.BuildSLN'
displayName: 'Run Unity Build'
Unity ビルド実行部分
(コマンドは1行です)
【DevOps】Pipeline(YAML)をカスタマイズする(3/5)
- task: NuGetToolInstaller@0
displayName: 'Use Nuget'
inputs:
versionSpec: '4.3.0'
- task: NuGetCommand@2
displayName: 'NuGet Restore'
inputs:
restoreSolution: '$(UWPSolution)'
UWP プロジェクトの
NuGet リストア
【DevOps】Pipeline(YAML)をカスタマイズする(4/5)
- task: VSBuild@1
displayName: 'Build solution'
inputs:
solution: '$(UWPSolution)'
msbuildArgs: '/p:AppxBundle=Always;AppxBundlePlatforms="x86"'
platform: 'x86'
configuration: '$(BuildConfiguration)'
clean: true
UWP ビルド実行部分
【DevOps】Pipeline(YAML)をカスタマイズする(5/5)
- task: CopyFiles@2
displayName: 'Copy files'
inputs:
sourceFolder: '$(UWPAppPackages)'
contents: |
**¥*.appxbundle
**¥Dependencies¥x86¥*.appx
targetFolder: '$(Build.BinariesDirectory)'
- task: ArchiveFiles@2
displayName: 'Archive'
inputs:
rootFolderOrFile: '$(Build.BinariesDirectory)'
includeRootFolder: false
archiveFile: '$(Build.ArtifactStagingDirectory)/artifact.zip'
- task: PublishBuildArtifacts@1
displayName: 'Publish Build Artifacts'
inputs:
pathtoPublish: '$(Build.ArtifactStagingDirectory)'
ビルド結果をアーカイブして、
パブリッシュ
【DevOps】Pipeline(YAML)をカスタマイズする(全部)
pool:
name: 'Default'
trigger:
- master
variables:
UnityPath: 'C:¥Program Files¥Unity¥Editor¥Unity.exe'
UWPSolution: 'UWP¥LAB-HoloLens-CI.sln'
BuildConfiguration: 'release'
UWPAppPackages: 'UWP¥LAB-HoloLens-CI¥AppPackages¥'
steps:
- task: DeleteFiles@1
displayName: 'Delete files'
inputs:
Contents: '.¥UWP'
- script: 'UnityBuildRunner -UnityPath "$(UnityPath)" -quit -buildTarget "WindowsStoreApps" -batchmode -projectPath "$(Build.Repository.LocalPath)" -logfile "log.log" -executeMethod HoloToolkit.Unity.HoloToolkitCommands.BuildSLN'
displayName: 'Run Unity Build'
- task: NuGetToolInstaller@0
displayName: 'Use Nuget'
inputs:
versionSpec: '4.3.0'
- task: NuGetCommand@2
displayName: 'NuGet Restore'
inputs:
restoreSolution: '$(UWPSolution)'
- task: VSBuild@1
displayName: 'Build solution'
inputs:
solution: '$(UWPSolution)'
msbuildArgs: '/p:AppxBundle=Always;AppxBundlePlatforms="x86"'
platform: 'x86'
configuration: '$(BuildConfiguration)'
clean: true
- task: CopyFiles@2
displayName: 'Copy files'
inputs:
sourceFolder: '$(UWPAppPackages)'
contents: |
**¥*.appxbundle
**¥Dependencies¥x86¥*.appx
targetFolder: '$(Build.BinariesDirectory)'
- task: ArchiveFiles@2
displayName: 'Archive'
inputs:
rootFolderOrFile: '$(Build.BinariesDirectory)'
includeRootFolder: false
archiveFile: '$(Build.ArtifactStagingDirectory)/artifact.zip'
- task: PublishBuildArtifacts@1
displayName: 'Publish Build Artifacts'
inputs:
pathtoPublish: '$(Build.ArtifactStagingDirectory)'
【DevOps】Pipeline(YAML)を保存する
• 右上の「Save and Run」を
クリックする
• コミットするため、ダイアログが
出てくるので適宜入力
• master ブランチに直接の他
別ブランチを作成することも可能
• 入力したら、「Save and run」
をクリックする
やること
• ビルドサーバーを構築する
• Azure DevOps にSelf-Hosted-Agentとして登録する
• Pipeline(YAML)を作成する
• ビルドを確認する
【DevOps】ビルド動作を確認する
• (表示されていなければ)
Pipeline → Builds を開く
• 最新のビルドを選択
【DevOps】ビルド動作を確認する
• (表示されていなければ)
Pipeline → Builds を開く
• 最新のビルドを選択
• 成功していれば
• 緑チェックが付く
【DevOps】ビルド動作を確認する
• (表示されていなければ)
Pipeline → Builds を開く
• 最新のビルドを選択
• 成功していれば
• 緑チェックが付く
• 失敗していれば
• 赤バツが付く
• ジョブをクリックで詳細を確認
【DevOps】ビルド結果をダウンロードする
• 成功すれば右上の
「Artifacts」→「drop」から
成果物をダウンロード可能
【DevOps】ビルド結果をダウンロードする
• 成功すれば右上の
「Artifacts」→「drop」から
成果物をダウンロード可能
• 成果物が表示されるので
対象の「Download」を選択
【DevOps】ビルド結果をダウンロードする
• 成功すれば右上の
「Artifacts」→「drop」から
成果物をダウンロード可能
• 成果物が表示されるので
対象の「Download」を選択
• このように成果物を確認可能
• 通常は、この後に Releases で
CD を設定して、適当な場所へ
デプロイします
やったこと
• ビルドサーバーを構築する
• Azure DevOps にSelf-Hosted-Agentとして登録する
• Pipeline(YAML)を作成する
• ビルドを確認する
良い CI ライフを!

AzureDevOpsで作るHoloLensアプリCI環境