为什么Jenkins找不到Android SDK?
我有一个简单的批处理脚本,它正在构建一个Xamarin表单项目。当我在机器上手动运行它时,它可以工作,但当我试图通过Jenkins将其作为构建步骤运行时,它失败了。我得到以下错误: 未找到Android SDK为什么Jenkins找不到Android SDK?,android,jenkins,msbuild,xamarin.forms,Android,Jenkins,Msbuild,Xamarin.forms,我有一个简单的批处理脚本,它正在构建一个Xamarin表单项目。当我在机器上手动运行它时,它可以工作,但当我试图通过Jenkins将其作为构建步骤运行时,它失败了。我得到以下错误: 未找到Android SDK C:\Program Files x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(567,2):error XA5205:找不到Android SDK目录。 请通过/p:androidsdk目录设置 我非常确定我所有
C:\Program Files x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(567,2):
error XA5205:找不到Android SDK目录。请通过
/p:androidsdk目录设置
我非常确定我所有的环境系统变量都设置正确。
路径包括C:\ProgramFiles\Android\Android sdk
我还将安卓主页设置为C:\Program Files\ANDROID\ANDROID sdk
。我还没有通过/p:AndroidSdkDirectory
(我现在计划这样做)设置它,但我仍然对它为什么不能通过路径或安卓主页找到它感兴趣。任何帮助都将不胜感激!谢谢
编辑:
我的批处理文件:
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
我的系统路径
:
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服务。有趣的是,错误消息行
C:\Program Files x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(567,2):
包含空格
字符,而不是左括号(
x86左侧)
系统
PATH
环境变量不应作为第一个目录路径
C:\ProgramData\Oracle\Java\javapath
这应该是目录列表中的第五个目录路径
我的一台Windows计算机上从来没有安装过Android SDK,但我觉得奇怪的是,
Android\u SDK\u HOME
和Android\u SDK\u 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内核函数的错误纠正效果。但是,在将批处理文件参数分配给环境变量时,最好确保删除双引号,并将参数字符串括在双引号中re在下面的命令行中引用它们是必需的,或者至少强烈建议这样做
这在Jenkins使用的批处理文件中也有意义,以尽可能避免环境变量
PATH
和PATHEXT
的依赖性,特别是在使用系统帐户将Jenkins作为服务运行时,通过指定应用程序以完整路径执行,并且文件扩展名不使用环境变量或使用Windows本身定义的系统环境变量
这里是一个批处理代码,没有安装Jenkins、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搜索引擎找到的与此问题相关的页面:
“Android SDK目录找不到”
的前7个搜索结果中的4个,用双引号括起来,以查找正好包含此术语的网页
还有一个提示: 用户通过Windows控制面板定义或编辑的系统环境变量仅对修改后启动的应用程序和服务生效 所有已经运行的服务、进程和应用程序都已经有自己的一组环境变量,由Windows在启动服务/进程/应用程序时在已运行的服务/进程/应用程序的内存中自动创建 父进程不可能操纵任何正在运行的子进程的环境变量,子进程也不可能操纵其父进程的环境变量 每个进程都有自己的环境变量列表,由Windows自动创建,作为启动新进程的进程的环境变量列表的副本 因此,对于在后台运行的Windows服务,需要进行修改