Jenkins构建失败,原因是缺少Android SDK。

30
正如标题所述,我的Jenkins构建失败,因为找不到Android SDK,尽管它位于环境路径中。
以下是控制台日志:
Started by user anonymous
Building in workspace /Users/lmnapp/.jenkins/jobs/Android_app_master/workspace
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url https://bitbucket.org/xxxxx-xxx/xxxx-android-app.git # timeout=10
Fetching upstream changes from https://bitbucket.org/xxxx-mob/xxxx-android-app.git
 > git --version # timeout=10
using .gitcredentials to set credentials
 > git config --local credential.helper store --file=/var/folders/gj/xxxxxxxx/T/xxxxx.credentials # timeout=10

+ export ANDROID_HOME=/Users/lmnapp/android-sdk-macosx
+ ANDROID_HOME=/Users/lmnapp/android-sdk-macosx
+ export ANDROID_SDK=/Users/lmnapp/android-sdk-macosx/platforms
+ ANDROID_SDK=/Users/lmnapp/android-sdk-macosx/platforms
+ export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/Users/lmnapp/android-sdk-macosx/tools:/Users/lmnapp/android-sdk-macosx/platform-tools:/Users/lmnapp/android-sdk-macosx
+ PATH=/usr/bin:/bin:/usr/sbin:/sbin:/Users/lmnapp/android-sdk-macosx/tools:/Users/lmnapp/android-sdk-macosx/platform-tools:/Users/lmnapp/android-sdk-macosx
+ export AVD_NAME=jenkinsGoogleApi18_1
+ AVD_NAME=jenkinsGoogleApi18_1
+ echo displayPath
displayPath
+ echo ....
....
+ echo ....
....
+ echo /usr/bin:/bin:/usr/sbin:/sbin:/Users/lmnapp/android-sdk-macosx/tools:/Users/lmnapp/android-sdk-macosx/platform-tools:/Users/lmnapp/android-sdk-macosx
/usr/bin:/bin:/usr/sbin:/sbin:/Users/lmnapp/android-sdk-macosx/tools:/Users/lmnapp/android-sdk-macosx/platform-tools:/Users/lmnapp/android-sdk-macosx
+ adb start-server
[Gradle] - Launching build.
[workspace] $ /Users/lmnapp/.jenkins/jobs/Android_app_master/workspace/gradlew assembleProductionRelease
Failed to notify ProjectEvaluationListener.afterEvaluate(), but primary configuration failure takes precedence.
java.lang.RuntimeException: SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.
    at com.android.build.gradle.internal.SdkHandler.getAndCheckSdkFolder(SdkHandler.java:103)
    at com.android.build.gradle.internal.SdkHandler.getSdkLoader(SdkHandler.java:113)
    at com.android.build.gradle.internal.SdkHandler.initTarget(SdkHandler.java:87)
    at com.android.build.gradle.BasePlugin.ensureTargetSetup(BasePlugin.groovy:467)
    at com.android.build.gradle.BasePlugin.access$0(BasePlugin.groovy)
    at com.android.build.gradle.BasePlugin$_createTasks_closure9.doCall(BasePlugin.groovy:372)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:278)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016)
    at groovy.lang.Closure.call(Closure.java:423)
    at org.gradle.listener.ClosureBackedMethodInvocationDispatch.dispatch(ClosureBackedMethodInvocationDispatch.java:40)
    at org.gradle.listener.ClosureBackedMethodInvocationDispatch.dispatch(ClosureBackedMethodInvocationDispatch.java:25)
    at org.gradle.listener.BroadcastDispatch.dispatch(BroadcastDispatch.java:83)
    at org.gradle.listener.BroadcastDispatch.dispatch(BroadcastDispatch.java:31)
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy12.afterEvaluate(Unknown Source)
    at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:79)
    at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:65)
    at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:504)
    at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:83)
    at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:47)
    at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:35)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:129)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:80)
    at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33)
    at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:36)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
    at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:51)
    at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:171)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:237)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:210)
    at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:35)
    at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:206)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:169)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
    at org.gradle.launcher.Main.doAction(Main.java:33)
    at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:54)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:35)
    at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:30)
    at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:127)
    at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:55)

FAILURE: Build failed with an exception.

* Where:
Build file '/Users/lmnapp/.jenkins/jobs/Android_app_master/workspace/project/build.gradle' line: 120

* What went wrong:
A problem occurred evaluating project ':project'.
> SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

如您所见,该路径明显已正确设置了android_home。

我正在尝试通过Jenkins中的gradle构建此项目。

这是我配置此作业要执行的预先命令行:

export ANDROID_HOME=/Users/lmnapp/android-sdk-macosx
export ANDROID_SDK=/Users/lmnapp/android-sdk-macosx/platforms
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME
export AVD_NAME=jenkinsGoogleApi18_1

echo displayPath
echo ....
echo ....

echo $PATH
7个回答

68

问题已解决。

  1. 进入 Jenkins > Manage Jenkins > Configure System
  2. 勾选 "环境变量" 选项
  3. 添加名称为 ANDROID_HOME,值为您的 Android SDK 目录
  4. 点击 "添加"
  5. 向下滚动并点击保存

1
非常感谢!这么简单的解决方案在网上却很难找到。 - Chris Lang
解决了我的问题,太棒了! - Mikkel Larsen

6
问题在于您正在“执行 shell”步骤中导出ANDROID_HOME环境变量。一旦 shell 步骤完成,该环境就会消失 - 这些变量将不会传递到后续的构建步骤中。
如果您在单个构建步骤中执行所有操作,包括 Gradle,则可以正常工作,例如:
export ANDROID_HOME=/foo/bar/sdk
./gradlew clean assembleProductionRelease

但是,由于您将Gradle插件用作单独的构建步骤,因此环境变量不再可用。
通过在Jenkins配置中全局导出环境变量,就像您自己的答案中所做的那样,是解决此问题的一种方法,但您也可以使用EnvInject插件在构建期间注入环境变量。使用此插件设置的变量将对所有构建步骤都可用。
对于构建机器,最佳实践是尽量减少手动设置的数量,例如安装Android SDK和将环境变量硬编码到服务器配置中。
我建议将Android SDK Manager插件添加到您的Gradle构建中-它将自动为您安装Android SDK以及任何构建依赖项。

我首先尝试配置ANDROID_HOME,但它没有解决错误“local.properties(Le fichier spécifié est introuvable)”。然后我尝试了您的想法,通过在同一调用中调用export和build,但它并没有解决问题。有什么建议吗? - Seynorth

3
我用以下方法解决了它:
  1. 复制Android文件夹 \Users{yourUser}\Library\Android\
  2. 将其粘贴到文件夹 \Users\Shared\Jenkins\Library 中
  3. 进入 Jenkins -> 管理 Jenkins -> 配置系统
  4. 勾选“环境变量”
  5. 添加名称:ANDROID_HOME,值为:\Users\Shared\Jenkins\Library\Android\sdk
  6. 添加
  7. 保存

0

@Jonathan大部分是正确的,只需添加一个提示,您的SDK路径应该放在Jenkins有权限的某个地方。
当我将我的sdk放在/root/sdk下时,我陷入了困境,在这种情况下,即使我设置了ANDROID_HOME,它仍然无法工作。
将sdk移动到/usr/local/sdk后,它就可以工作了


0

您可以使用EnvInject插件在构建配置中添加ANDROID_HOME环境变量。

  1. 如果您尚未安装EnvInject插件,请先安装它(通常在Jenkins配置后已完成)。

  2. 进入Jenkins->您的构建->配置。

  3. 向下滚动到“构建环境”。

  4. 找到“将环境变量注入构建过程”并选中它。

  5. 在“属性内容”输入字段中键入“ANDROID_HOME=/you/Android/Sdk/location”。

  6. 别忘了保存。


0

我通过向您的Android SDK目录添加权限来解决了这个问题

chmod 777 /Users/USER_NAME/Library/Android


-1
我想你已经将包含本地机器SDK文件路径的local.properties文件检入版本控制中(在设置项目或打开项目时会自动完成此操作)。请将local.properties文件更改为默认的SDK路径(这样它就可以根据本地机器自动处理更改)。

sdk.dir=/Applications/android_sdk

检查更改是否已提交到版本控制,然后将 local.properties 添加到你的 .gitignore 文件中(点击此处获取帮助)。


我没有检查本地的properties文件。 - Jono
刚看到了你的回答,这正是我要建议的,因为我认为预设脚本并没有全局设置环境或者存活足够长的时间供gradle访问。通常我在构建时只需将local.properties放在我的repo中,这通常可以处理SDK路径。还有别忘了接受你自己的答案,这样其他人才能看到它! - Kurt Bonatz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接