2017-02-23 85 views
1

У меня есть простой пакетный скрипт, который создает проект форм Xamarin. Он работает, когда я запускаю его вручную на машине, но он терпит неудачу, когда я пытаюсь запустить его как шаг сборки через 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-sdk

У меня также есть ANDROID_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

Hm он нашел sdk после того, как я добавил/p: AndroidSdkDirectory, но теперь он не может найти zipalign. Почему у Дженкинса возникли проблемы с использованием моей системы PATH? –

+0

Когда я печатаю PATH на этапе сборки, я вижу, что выглядит как правильная переменная. –

+0

Итак, после перезагрузки компьютера он может найти zipalign и правильно построить, если я использую/p: AndroidSdkDirectory. Я все еще смущен тем, почему мне нужно использовать этот аргумент при создании из Дженкинса, но не локально. Любая помощь по-прежнему ценится. –

ответ

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_HOME и ANDROID_SDK_HOME определяются с окружающими двойными кавычками включены.

Это может быть правильным, но может также вызвать проблемы в зависимости от того, как эти две переменные среды ссылаются на пакетные файлы или используются в приложениях.

Пути каталогов назначаются переменным окружения, обычно без окружающих двойных кавычек.


В пакетном файле может возникнуть проблема с обработкой первого и второго аргументов.

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

Если путь проекта или название проекта содержит пробел или один из этих символов &()[]{}^=;!'+,`~ они должны быть указаны заключены в двойных кавычках при запуске пакетного файла. Общепринятой практикой является передача каталогов, имен файлов и других параметров в пакетные файлы, заключенные в двойные кавычки.

Первый и второй аргументы присваиваются переменным окружения projectPath и projectName, как определено в командной строке при запуске командного файла, что означает без или с близкими двойными кавычками. В случае пути проекта и название проекта заключены в двойных кавычках, третья строка расширяются до выполнения, например, в:

msbuild "C:\Project Path"\"Project Name" /p:Configuration=xxx /t:Clean 

Это не хорошо. Он может работать в зависимости от того, насколько хорошо исправлена ​​ошибка интерпретатора команд Windows, соответственно, функции ядра Windows. Но было бы лучше убедиться, что двойные кавычки удаляются при назначении аргументов командного файла для переменных среды и заключают строки параметров в двойные кавычки, где это необходимо или, по крайней мере, настоятельно рекомендуется для ссылки на них в приведенных ниже командных строках.


Было бы также смысл в пакетный файл, используемый Дженкинс, чтобы избежать зависимости от переменных окружения PATH и PATHEXT как можно больше, особенно на управлении Дженкинс в качестве службы с системной учетной записью, указав приложения для выполнения с полным путь и расширение файла, не использующее переменные среды, или переменные системной среды, определенные самой Windows.


Вот пакетный код, написанный без Дженкинс, MSBuild, Java SDK, Java JDK или Android SDK установлен на всех с допущением, что параметр config короткое слово никогда не содержащий критического характера.

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 двигателя, связанные с этим вопросом:

тех веб-страниц 4 из топ 7 результатов на поиск с моим предпочтительным всемирным поиском в Интернете двигатель на срок "Android SDK Directory could not be found", заключенный в двойные кавычки, размещенный здесь, чтобы найти страницы, содержащие именно этот термин. более


Один намек:

системные переменные окружения, определенные или отредактированные пользователем с помощью панели управления Windows становятся эффективными только для приложений и служб начали после модификации.

Все уже запущенные службы, процессы и приложения уже имеют собственный набор переменных среды, созданных Windows, автоматически в память уже запущенного сервиса/процесса/приложения, полученного из родительского процесса, при запуске службы/процесса/приложения.

Невозможно, чтобы родительский процесс манипулировал переменными среды любого выполняющегося дочернего процесса, а дочерний процесс не обрабатывал переменные среды его родительского процесса.

Каждый процесс имеет свой собственный список переменных окружения, созданный Windows автоматически, как копию списка переменных окружения процесса, начинающегося с нового процесса.

Так что для служб Windows, работающих в фоновом режиме, изменение переменной системной среды требует, по крайней мере, остановки и перезапуска службы или, возможно, даже перезапуска Windows в зависимости от того, что является родительским процессом службы Windows.