我有以下构建环境:
- Ubuntu
- Java 1.6.0_24
- Apache Ant 1.8.2
- Jenkins 1.427
- 码头 6.1.26
我可以从命令行(在 jenkins 工作区)创建一个发布 APK(zipaligned 和签名),方法是运行 ant release
,然后在出现提示时输入 keystore 传递。
然而,使用来自 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
在 jenkins ant target 步骤中,我设置了以下属性:
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
什么会导致 jenkins 无法签名,从而从命令行执行相同的目标工作正常?
我在谷歌上搜索过这个,发现有些人正在编写自己的 bash 脚本来签署他们的 APK,然后将它们作为 shell 目标运行,但这似乎是一种很肮脏的方式……有什么建议吗?
谢谢
最佳答案
我们已经设置了 Jenkins 服务器以使用您在此处概述的相同技术对我们的 APK 进行签名,这对我们很有效。一个区别是我将完全限定的路径放在 keystore 中,而不是依赖于相对路径。我永远不确定他们来自哪里。如果您的 keystore 处于版本控制中,Jenkins 会提供一个工作区根环境变量,您可以使用它来指向它。
还值得从命令行测试此构建,您可以在其中使用 ant -Dkey.store=/some/key.store ...
指令定义所有这些属性,以确保所有您提供的值是正确的。
关于android - 无法从 Jenkins 签署 Android APK,但可以从命令行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7350318/