无法从 Jenkins 签署 Android APK,但可以从命令行运行

Jim*_*mmy 5 ubuntu continuous-integration android android-2.1-eclair jenkins

我有以下构建环境:

  • 乌班图
  • Java 1.6.0_24
  • 阿帕奇蚂蚁1.8.2
  • 詹金斯 1.427
  • 码头 6.1.26

我可以从命令行(在 jenkins 工作区区域)创建一个发布 APK(经过压缩对齐和签名),方法是运行ant release并在提示时输入密钥库通行证。

但是,使用 Jenkins 作业中的相同构建命令会失败,并显示以下内容:

release:
     [echo] Signing final apk...
  [signjar] Signing JAR: /home/james/.jenkins/workspace/android-sam/androidsam/bin/AndroidSam-unsigned.apk to /home/james/.jenkins/workspace/android-sam/androidsam/bin/AndroidSam-unaligned.apk as mykeystore 
  [signjar] jarsigner: Certificate chain not found for: mykeystore .  mykeystore  must reference a valid KeyStore key entry containing a private key and corresponding public key certificate chain.

BUILD FAILED
/home/james/tools/android-sdk-linux_x86/tools/ant/main_rules.xml:641: jarsigner returned: 1
Run Code Online (Sandbox Code Playgroud)

在 jenkins ant 目标步骤中,我设置了以下属性:

key.store=my-release-key.keystore
key.alias=mykeystore 
key.store.password=<mypass>
key.alias.password=<mypass>
sdk.dir=/home/james/tools/android-sdk-linux_x86
Run Code Online (Sandbox Code Playgroud)

什么会导致詹金斯无法签名,从而从命令行执行相同的目标工作正常?

我用谷歌搜索了这个,发现有些人正在编写自己的 bash 脚本来签署他们的 APK,然后将它们作为 shell 目标运行,但这似乎是一种很肮脏的方式......有什么建议吗?

谢谢

Arg*_*yle 3

我们已经设置了 Jenkins 服务器,使用您在此处概述的相同技术来签署我们的 APK,并且它对我们有用。一个区别是我将完全限定的路径放在密钥库中,而不是依赖相对路径。我一直不确定他们是哪里的亲戚。如果您的密钥库处于版本控制中,Jenkins 会提供一个工作区根环境变量,您可以使用它来指向它。

还值得从命令行测试此构建,您可以在命令行中使用ant -Dkey.store=/some/key.store ...指令定义所有这些属性,以确保您提供的所有值都是正确的。