App Service の CI/CDでビルドエラー

ちょっとはまったのでメモ。(そのうち改善されると思われる)

はまった環境: Visual Studio 2017 で .NET Framework 4.6.2 なクラスライブラリでNuGetなパッケージを使用しているC#プロジェクト(NuGetはPackageReferenceを参照する)と、それを参照するASP.NETなアプリ(1つのソリューションにASP.NETとクラスライブラリなプロジェクトがある状態)
はまった理由:  App Service上(Kudu上)で msbuild 15.x がないから(たぶん)

普通にApp Service上でCI/CDを使って(今回はLocal Git)上記なプロジェクトをデプロイ(git push)すると以下のようにNuGetで取得するパッケージに含まれるアセンブリが見つからない旨のエラーがでてビルドに失敗します。(nuget restoreやdonet restoreしてるにも関わらず)

省略
:
remote: D:\Program Files (x86)\dotnet\sdk\2.0.0-preview1-005977\Microsoft.Common.CurrentVersion.targets(1964,5): warning MSB3245: Could not resolve this reference. Could not locate the assembly "Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors. [D:\home\site\repository\web1\Shared\Shared.csproj]
:
以下略

カスタムデプロイスクリプトを使用するようにして、dotnet build や dotnet msbuild を使ってもダメです。
※Kudu上に現状Previewなmsbuildがありますがそちらを使ってもダメ
※ちなみにプロジェクトがPackage.configを参照するようになってたら問題なくビルドできます。PackageReferenceの場合のみおかしい。

回避策: クラスライブラリなプロジェクトファイル(.csproj)を新しい形式に変換する

変換は以下のURLを参考に。

最低限Project要素の属性を新しくして TargetFrameworkVersion を TargetFrameworkにしてv.4.6.2 とかを net462 とかにします。あとは不要な要素はバスバスけして、AssemblyInfo.csも消したりしました。
修正後、Visual Studio 2017上でちゃんとプロジェクトがロードできてビルドできればひとまず大丈夫かと思います。(Minなcsprojにしてから後でNuGetパッケージ追加したりもろもろいじってもよいかと思います。

変換後は dotnet build や dotnet publish で問題なくビルドできます。(つら)

過渡期な問題だと思いますが、もし嵌った人がいれば参考にしてもらえると。

Web Apps で Let’s Encrypt Site Extension の Renewが失敗する

Azure Web AppsでLe’ts Encryptのサイトエクステンションを使用してサーバー証明書を設定している場合に証明書の更新でコケていたので回避方法など。

環境: Azure Web Appsでプラットフォームをx64にしている、かつLet’s Encryptのx64版サイトエクステンションを使用している
エラー内容: Functions.RenewCertificateなWebJobsで以下の例外が発生してRenewに失敗する

続きを読む

ノートPCでも外付けGPUを使いたい

今使ってるノートPCでGPU使いたいなーとふと思いまして、外付けGPUユニットを買いました。
ノートPCのスペック的には外付けGPUもいけるだろうと思ってThunderbolt 3 (PCI Express Gen3 x 2レーン)で40Gbps双方向サポートされてる機種です。(DELLのXPS 13

外付けGPUを載せる筐体としてはPowerColor DEVIL BOXを選んでみました。(納期等の都合)
で、つないでみたのですがGPUを認識しないんですよね。TB3の設定みると
image
外付けGPUサポート:いいえ とか言われる始末。ファームが更新されたりドライバが更新されるのを心待ちしてたわけですが、親切なてんきちゃんに教えてもらったところ外付けの筐体側のファームを更新してみよう(人柱ヨロ)ということだったのでそのようにしてみました。

いろいろ見ると

As of 23-April-2017, TI83 (red) marked enclosures deliver only half their TB3-specced host-to-device bandwidth and are awaiting a firmware fix.

とか書いており、そのままじゃダメそうです。ただ

Allows eGPU detection in Windows for systems reporting “external GPUs supported: no” in the Intel Thunderbolt software.

とあるのでリンクにあるファーム更新ツールで強制的にファームを変えてみることにしました。※接続してファーム更新後OS再起動
TBソフトウェア上は外付けGPUサポートはいいえのままですが、ちゃんとGPU認識しました!やったね。

というわけでノートPCでも無事GPUが使えるようになりましたとさ。

※ GPUの取り外し時の確認ウィンドウがちゃんと描画されなかったりするし、稼働アプリがある状態で切断するとアプリ落ちるしその後の挙動が怪しい気もする(ノートPCのディスプレイの解像度がちゃんとならなかったり)ので、気軽に接続・切断はしにくくなった気もしますが概ね満足です。