Visual Studio App Centerではビルド時の環境変数を定義でき、ビルドスクリプトやGradleのようなビルドシステムから値を取得できるのですが、定義しても環境変数が取れないという現象が発生しました。
tl;dr
SECRET のようなApp Centerが許可しないキーワードを含んだ環境変数を定義している場合、そのままの名前で露出しないようになっているようです。PASSWORD のような単語は通るので SECRET のみの制限かもしれません(ドキュメントに特に書いてない)。
ユーザー定義の環境変数は USER-DEFINED_ というプレフィックスがついた環境変数も定義されるのでそちらから取得する方法もありますが、ハイフンを含んでいるため参照も定義も一筋縄ではいかないのでお勧めできません。
問題と調査
API_KEY や NUGET_USERNAME のような環境変数を定義してみたところ特に問題なく取得できたので、もしかして変数名に問題があるのでは?と思いいくつかのパターンを試してみました。すると以下のパターンで違いが出ることがわかりました。
- SECRET_HAUHAU: hauhau1
- SEECRET_HAUHAU: hauhau2
- SECRE__HAUHAU: hauhau3
この定義を設定した上でビルドし、pre-buildスクリプトで環境変数をすべて出力すると…
##[section]Starting: Pre Build Script ============================================================================== Task : Shell Script Description : Run a shell script using bash Version : 2.1.3 Author : Microsoft Corporation Help : [More Information](https://go.microsoft.com/fwlink/?LinkID=613738) ============================================================================== [command]/bin/bash /Users/vsts/agent/2.127.0/work/1/s/app/appcenter-pre-build.sh ...snip... SECRE__HAUHAU=hauhau3 ...snip... USER-DEFINED_SEECRET_HAUHAU=hauhau2 ...snip... USER-DEFINED_SECRE__HAUHAU=hauhau3 ...snip... USER-DEFINED_SECRET_HAUHAU=hauhau1 ...snip... SEECRET_HAUHAU=hauhau2 ...snip...
|
…となり、SECRET_HAUHAU という変数のみそのまま露出しないようになっています。この結果からApp Centerは SECRET を含む環境変数をそのまま変数として露出しないようにしているようです。セキュリティのためでしょうか。
というわけで特別必要がなければ SECRET という名前を含めないでおくというのがハマらないポイントです。
Visual Studio App Centerでビルドする際、特定の名前でシェルスクリプトを置いておくことでビルドの前後でコマンドを実行できます。
2018年2月時点では Build scripts | Microsoft Doc にある通り、以下のスクリプトを認識します(for UWPなら.ps1)。
- appcenter-post-clone.sh: git clone後
- appcenter-pre-build.sh: パッケージ等復元後、ビルド前
- appcenter-post-build.sh: ビルド後
ここまでは書いてある通りなのですが、実際リポジトリにビルドスクリプトを含めても一向に実行されないという問題が発生しました。設定画面を見ると Build scripts: ✔ Post-clone と表示され認識はされているようでした。
新しいブランチを作ってビルド設定を追加して試すと問題なく動作したので悩んだのですが、実は Build scripts: ✔ Post-clone となった後に Save もしくは Save & Build で設定を保存する必要があるようです。
逆を言うと、ビルドスクリプトを削除した後も保存しなおさないとビルドがエラーになります。
新しいブランチを作った時に動いたのは、すでにビルドスクリプトが含まれていて、ビルド定義を作る際に Build scripts: ✔ Post-clone となった状態だったからということでした。