如何从 Jenkins/Hudson 上传 APK 到 Play 商店?
Posted
技术标签:
【中文标题】如何从 Jenkins/Hudson 上传 APK 到 Play 商店?【英文标题】:How to upload an APK from Jenkins/Hudson to Play Store? 【发布时间】:2013-01-08 14:23:14 【问题描述】:我使用 Jenkins 实现了一个持续集成管道,但作为最后一步,我希望 Jenkins 将签名的 APK 文件部署/上传到 Google Play 商店和 androidPit。我查找了 Jenkins/Hudson 插件,但只找到了两个:一个用于 Appaloosa,一个用于 Zubhium。
我在 Google Play 和 AndroidPit 上都有一个可用的开发者帐户,并且可以手动上传 Jenkins 生成的 APK。但我的问题是:有人知道教 Jenkins 的方法(例如通过 shell 脚本吗?)将 APK 上传到上述应用商店?
【问题讨论】:
我在 Google 询问过,他们回答说 Play 商店不提供此功能。有人有想法吗? 如果有人正在寻找解决方案,请快速更新。最新版本的 Google Play Developer API 现在允许将更改推送到 Google Play 列表。请参阅:developers.google.com/android-publisher/api-ref 【参考方案1】:Jenkins 有一个Google Play Android Publisher plugin,它使用Google Play Publishing API,在 Google I/O 2014 上宣布。
Google 还发布了 Java and Python libraries 以帮助使用 API。
有关 API 的更多信息,另请参阅:http://android-developers.blogspot.com/2014/07/grow-with-google-play-scaled-publishing.html
【讨论】:
这是一个很好的答案,因为谷歌已经发布了 API 我已经发布了一个基于 google 的 python 脚本的 Gist,可以在没有用户交互的情况下上传 apk。现在您可以通过 Jenkins 命令 shell 插件执行此脚本:gist.github.com/marta-rodriguez/20b8684e76fb1262576e【参考方案2】:我只能为 Google 的 Play 商店说话。有一种方法,但请注意,它并不漂亮,您必须编写解决方案。我现在正在写一篇学士论文来解决这个问题——“Android 应用程序的持续交付”。我的解决方案是我的,这意味着我不会声称拥有完美的解决方案,但我可以说它是非常有效的原型。
我发现了以下内容:
第一个解决方案是无。谷歌提供Play Store API,但它缺乏上传内容。似乎他们已经在考虑制作这样的 API,但它只提供应用内计费控制
第二个解决方案是使用 Apache HttpComponents 库,它可以让您为 Google Play 开发者控制台实现自己的客户端,但是HttpClient 缺少 javascript 解释器...有几种方法可以实现或添加一个。但当然,这不是最简单的方法。
我正在研究的第三个解决方案是使用Selenium Web 浏览器自动化框架。所以基本上我从那些 Play 商店页面和对话中创建 PageObjects。之后,您可以创建一些工厂来维护控制这些 PageObjects 的“路径”。
据我所知,使用它们有两个选项,例如WebDriver Objects 使用“不可见”浏览器进程,如 FF 或 Chrome,另一个我使用的是 ChromeDriver,它使用可见浏览器进程,执行用户操作。并且不要忘记使用异常处理程序,它会在使用时扫描网页以查找出现的错误。
由于 Google 的设计可能发生变化,因此存在很多陷阱,这会让您的软件崩溃。但也有一些方法可以处理。 =) 并创建一个包含有关应用程序的所有有价值信息的 XML,在继续下一步时会派上用场。
您可以create a Maven Plugin。您可以将其加载到您的持续集成服务器中。希望能帮到你。
【讨论】:
哦,这听起来很痛苦,真的很肮脏:) 你的论文如何看待新的开发者门户? :) @philipp,对不起,我不明白你的意思。我的论文怎么会喜欢?那是英语谚语吗,因为作为德国人,我对很多英语谚语都很陌生... :-) 这句话是不是有点像这样:“伦敦怎么样?”?请问您是指哪个开发者门户?最好的问候。 Es war als witz gemeint, wie es deiner Arbeit das neue Google Developer Portal gefaellt, da Google gerade alles umgestellt hat。 Wenn du einen Scraper geschrieben hast, wird der bald nicht mehr funktionieren。 lg @Philipp 好的。知道了。在 der Arbeit nutzte ich das neue 布局中。 Momentan geht alles。 Ich nutze den Kniff der PageObjects mit relativen Suchmustern, um WebElements zu identifizieren。 :) 是您的脚本能够以所有语言批量上传屏幕截图并更新描述。我会喜欢的,并且仍然上传我自己的 APK。【参考方案3】:自从 Google Play 发布了上传 API 以来,已经做了一个插件:
https://wiki.jenkins-ci.org/pages/viewpage.action?pageId=73533143
我还没有尝试过,但看起来这正是我们想要的。
还有其他插件声称可以做同样的事情(感谢@mdt)
【讨论】:
我还不会尝试,因为至少有两个插件声称可以这样做。让我们给开发人员一些时间,但它看起来很有希望! 还没有看到其他 2 个。用不同的选项编辑答案会很有趣。 好的,我包含了上面找到的插件。【参考方案4】:我认为 PlayStore API 目前并未包含它,以减轻系统压力并避免滥用。
我相信我们将来可能会在 gradle 插件和 IDE 中看到这一点。 在我们等待 google 决定开放 API 的同时,这里有一个解决方案,太无聊了,我只好提出它:
如果您有 GUI,请在最后一步使用 GUI 自动化。
【讨论】:
【参考方案5】:适用于 Jenkins 的 Google Play Android Publisher 插件是一个不错的插件。但是,它不支持上传描述和屏幕截图(至少目前是这样)。
我找到了不错的 Gradle 插件,名为 Gradle Play Publisher。支持上传apk、更新元数据、上传截图。而且只需几个步骤即可设置。
【讨论】:
【参考方案6】:首先在浏览器中访问Google Play Console,打开您的应用页面,然后寻找允许新电子邮件地址上传 APK 的选项。如果它不存在,则可能意味着您不是该 Play 商店帐户的管理员,您需要让管理员为您添加它(基于每个应用程序)。要了解要添加的电子邮件地址,请转到 Google Developer Service Accounts 并为您现有的任何 Google 开发人员服务帐户创建一个 JSON 密钥,或使用 JSON 密钥创建一个新服务帐户。请注意与您已为其创建(或将要创建) JSON 密钥的服务帐户关联的电子邮件地址。它很可能是 gserviceaccount.com 上的东西。此电子邮件地址必须由对您的 Play 帐户拥有管理员权限的人授予上传 APK 的权限。
完成后,通过wget https://gist.githubusercontent.com/mix3d/665f4ab329b4482297a2f425ebba402c/raw/0949385dd6c80d0701170746b1bd5fd479303412/basic_upload_apks_service_account.py
下载Madison Dickson's updated version of Marta Rodriguez's script 并通过pip install google-api-python-client
(或sudo pip install google-api-python-client
,视情况而定)安装依赖项。
然后在自动化脚本中,您可以使用(例如)python basic_upload_apks_service_account.py -t beta -p org.example.MyApp -s JSON_file_I_made.json -a MyApp.apk
(假设您的 JSON 文件、APK 和 basic_upload_apks_service_account.py
都在当前目录中,并且 pip install
已在该机器或容器上完成)。
我强烈建议上传到测试版(因此上面的 -t beta
)而不是直接上传到生产环境。以防万一出现问题并且它以某种方式到达 APK 上传。我认为“推出到生产”的最终新闻应该始终由人来完成。但如果您真的想自动执行此操作,您可以改用-t production
。
【讨论】:
以上是关于如何从 Jenkins/Hudson 上传 APK 到 Play 商店?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Jenkins/Hudson 中以编程方式设置环境变量?