2017-02-23 20 views
1

私はXamarinフォームプロジェクトを構築している単純なバッチスクリプトを持っています。マシン上で手動で実行すると動作しますが、Jenkinsによるビルドステップとして実行しようとすると失敗します。次のエラーが表示されます。JenkinsがAndroid SDKを見つけられないのはなぜですか?

Did not find Android SDK
C:\Program Files x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(567,2): error XA5205: The Android SDK Directory could not be found.
Please set via /p:AndroidSdkDirectory .

私はすべての環境変数が正しく設定されていることを確信しています。
PATHは私も同様C:\Program Files\Android\android-sdkANDROID_HOMEセットを持って

C:\Program Files\Android\android-sdkを含んでいます。私は/p:AndroidSdkDirectory(これは私が今やっている予定)で設定していませんが、なぜそれが見つからないのかに興味があります。PATHまたはANDROID_HOMEどんな助けでも大歓迎です!ありがとう!

EDIT:

私のバッチファイル:

SET projectPath=%1 
SET projectName=%2 
SET keystorePath=%3 
SET password=%4 
SET alias=%5 
SET config=%6 
SET apkName=%7 

msbuild %projectPath%\%projectName% /p:Configuration=%config% /t:Clean 
msbuild %projectPath%\%projectName% /p:Configuration=%config% /t:PackageForAndroid /p:AndroidSdkDirectory="C:\Program Files\Android\android-sdk" 

jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore %keystorePath% -storepass %password% -signedjar %projectPath%\bin\%config%\com.company.helloworld-signed.apk %projectPath%\bin\%config%\com.company.helloworld.apk %alias% 

zipalign -f -v 4 %projectPath%\bin\%config%\com.company.helloworld-signed.apk %projectPath%\bin\%config%\%apkName%.apk 

私のシステム変数:

ANDROID_NDK_PATH  "C:\Program Files\Android\android-ndk-rl3b" 
ANDROID_SDK_HOME  "C:\Program Files\Android\android-sdk" 
ComSpec    C:\Windows\system32\cmd.exe 
SDK_HOME    C:\Program Files\Java\jdk1.8.0_121 
NUMBER_OF_PROCESSORS 4 
OS      Windows_NT 

私のシステムPATH

C:\ProgramData\Oracle\Java\javapath 
%SystemRoot%\system32 
%SystemRoot% 
%SystemRoot%\System32\Wbem 
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\ 
C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static 
C:\Program Files (x86)\Skype\Phone\ 
%USERPROFILE%\.dnx\bin 
C:\Program Files\Microsoft DNX\Dnvm\ 
C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit 
C:\Program Files\Microsoft SQL Server\130\Tools\Binn\ 
C:\Program Files\Perforce 
C:\Program Files\Perforce\DVCS\ 
C:\Program Files (x86)\MSBuild\14.0\Bin 
C:\Program Files\Java\jdk1.8.0_121 
C:\Program Files\Android\android-sdk 
C:\Program Files\Java\jre1.8.0_121\bin 
C:\Program Files\Java\jdk1.8.0_121\bin 
C:\Program Files\Android\android-sdk\build-tools\25.0.2 

JenkinsをWindowsサービスとしてインストールしました。

+0

私は/ p:AndroidSdkDirectoryを追加した後にsdkを見つけましたが、今はzipalignが見つかりません。 JenkinsがシステムPATHを使用する際に問題が発生するのはなぜですか? –

+0

ビルドステップでPATHを表示すると、正しい変数のように見えます。 –

+0

したがって、コンピュータを再起動するとzipalignが見つかり、/ p:AndroidSdkDirectoryを使用すると正しくビルドされます。私はまだJenkinsからビルドするときに、なぜローカルではなく、そのargを使用する必要があるのか​​混乱しています。どんな助けもまだ評価されます。 –

答えて

1

それはエラーメッセージ行

C:\Program Files x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(567,2): 

は空白文字の代わりに、x86の開き括弧(左が含まれていることは興味深いです。


システムPATH環境変数は、最初のディレクトリパスとして持つべきではない

C:\ProgramData\Oracle\Java\javapath 

これは、ディレクトリのリストにおける第五のディレクトリ・パスでなければなりません。


私は、Android SDKには、私のWindowsコンピュータのいずれかで、これまでインストールされていませんが、私はそれは好奇心ANDROID_SDK_HOMEANDROID_SDK_HOMEのディレクトリパスを囲む二重引用符が含まれて定義されていることがわかります。

これは正しいかもしれませんが、これらの2つの環境変数がバッチファイルによってどのように参照されるか、アプリケーションで使用されるかによって問題を引き起こす可能性があります。

ディレクトリパスは通常、二重引用符を囲まずに環境変数に割り当てられます。


バッチファイルでは、第1引数と第2引数の処理が問題になる可能性があります。

SET projectPath=%1 
SET projectName=%2 
msbuild %projectPath%\%projectName% /p:Configuration=%config% /t:Clean 

プロジェクトパスまたはプロジェクト名はスペース文字や、彼らがバッチファイルを起動するには、二重引用符で囲まれて指定する必要があります&()[]{}^=;!'+,`~これらの文字のいずれかが含まれている場合。ディレクトリパス、ファイル名、およびその他のパラメータを二重引用符で囲んだバッチファイルに渡すのが一般的です。

第1引数と第2引数は、バッチファイルの開始時にコマンドラインで定義されている環境変数projectPathprojectNameに割り当てられています。

良くない
msbuild "C:\Project Path"\"Project Name" /p:Configuration=xxx /t:Clean 

:プロジェクトパスとプロジェクト名の場合は二重引用符で囲まれ、3行目に例えば、実行前に展開されます。それは、Windowsのコマンド・インタープリタのエラー訂正がどれだけ優れているかによって、それぞれWindowsのカーネル機能が動作する可能性があります。しかし、バッチファイルの引数を環境変数に代入するときに二重引用符が削除されていることを確認し、パラメータ文字列を必要な場所に二重引用符で囲むか、以下のコマンドラインでパラメータ文字列を参照することを強くお勧めします。


また、フルで実行するアプリケーションを指定することで、特にシステムアカウントでサービスとしてジェンキンスを実行する上で、可能な限り環境変数PATHPATHEXTの依存を避けるために、ジェンキンスが使用するバッチファイルで感知なるだろう環境変数を使用しないか、Windows自体で定義されたシステム環境変数を使用しないでください。ここ


ジェンキンスMSBuildののJava SDKのJava JDK又はアンドロイドSDKconfigパラメータが短いワードであると仮定すると、全くインストールせずに書かれたバッチコードであります重要な文字は一切含まれません。

set "projectPath=%~1" 
set "projectName=%~2" 
set "keystorePath=%~3" 
set "password=%~4" 
set "alias=%~5" 
set "config=%~6" 
set "apkName=%~7" 

rem Get directory paths of used applications for build task. 
for /D %%I in ("%ProgramFiles(x86)%\MSBuild\*") do set "MSBUILD_PATH=%%I\Bin" 
for /D %%I in ("%ProgramFiles%\Java\jdk*") do set "JAVA_JDK_PATH=%%I\bin" 

"%MSBUILD_PATH%\msbuild.exe" "%projectPath%\%projectName%" /p:Configuration=%config% /t:Clean 
"%MSBUILD_PATH%\msbuild.exe" "%projectPath%\%projectName%" /p:Configuration=%config% /t:PackageForAndroid /p:AndroidSdkDirectory="%ProgramFiles%\Android\android-sdk" 

"%JAVA_JDK_PATH%\jarsigner.exe" -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore "%keystorePath%" -storepass "%password%" -signedjar "%projectPath%\bin\%config%\com.company.helloworld-signed.apk" "%projectPath%\bin\%config%\com.company.helloworld.apk" "%alias%" 

"%JAVA_JDK_PATH%\zipalign.exe" -f -v 4 "%projectPath%\bin\%config%\com.company.helloworld-signed.apk" "%projectPath%\bin\%config%\%apkName%.apk" 

本当にバッチファイルを見つけるための良いアイデアである場合、私は知らないMSBuildのとシステム環境変数を使用してのJava JDKパスか。インストールMSBuildのおよび/またはのJava JDKの複数のバージョンを持っている場合のMSBuildのJava JDKパスの自動検索は良い考えではないかもしれません。

ただし、可変パラメータ文字列を二重引用符で囲んで、%~1%~2、...などで囲まれた二重引用符を削除してバッチファイル引数を環境変数に割り当てることを強くおすすめします。

コマンドプロンプトウィンドウで実行すると、ヘルプ出力call /?は、参照する引数にどの修飾子を使用できるかを説明しています。この問題に関連したWWW検索エンジンで見つけ

ページ:

これらのウェブページは、トップ7の結果の4です私の好みのワールドワイドウェブ検索で検索するエンジンは"Android SDK Directory could not be found"の二重引用符で囲まれており、正確にこの用語を含むページを見つけることができます。


もう一つのヒント:Windowsのコントロールパネルを介してユーザによって定義されたまたは編集

システム環境変数のアプリケーションやサービスが変更後を開始しただけのために有効になります。

サービス/プロセス/アプリケーションの起動時に親プロセスから派生したすでに実行中のサービス/プロセス/アプリケーションのメモリに、Windowsによって自動的に作成された独自の環境変数セットが既にあります。

親プロセスが実行中の子プロセスの環境変数を操作したり、子プロセスが親プロセスの環境変数を操作したりすることはできません。

すべてのプロセスには、新しいプロセスを開始するプロセスの環境変数リストのコピーとしてWindowsによって自動的に作成された独自の環境変数リストがあります。

バックグラウンドで実行されているWindowsサービスの場合、システム環境変数を変更するには、実行中のWindowsサービスの親プロセスが何であるかに応じて、少なくともサービスを停止して再起動する必要があります。

関連する問題