我正试图用Jenkins建立一个Android持续集成环境,我希望每次Jenkins构建机器运行时,我的versionCode和versionNumber都增加1。该应用程序是使用ApacheAnt构建的,我试图避免包含外部库。几个星期以来,我一直在寻找这个问题的解决方案,但似乎什么都做不到。
如果可能的话,我需要帮助:
找到跟踪当前版本Code和版本Name并递增一的方法。我发现的一个可能的解决方案是在build.properties文件中创建条目,以跟踪构建号。在build.xml中使用'operation="+"'可以很容易地递增,但实际上不可能将值(例如154)而不是地址(例如${build.number})输入Manifest!
将实际整数或字符串值获取到versionCode和versionNumber中,而不是属性值的地址。我似乎无法使用replaceregexp或任何其他ant替换任务将实际值输入到versionCode和versionName中。例如:
<replaceregexp file="/Users/holt.bowmer/Documents/SVNRepo/mobile-trunk/android/AndroidManifest.xml"
match="versionCode=(.*)"
replace= 'versionCode= "${build.number}"' />
将versionCode从versionCode="154"更改为versionCode="${build.number},这是不允许的!
总的来说,这非常令人沮丧,我一直在疯狂地试图找到这个问题的解决方案。所有其他的stackoverflow或谷歌解决方案都不起作用,所以任何帮助都将不胜感激。这是我第一次发到stackoverflow,所以如果东西放错地方或发错了,请原谅我。
谢谢!
编辑
好吧,我想好了,我会为其他必须处理这个可怕问题的人更新我的回应。为什么Jenkins Android Emulator不能做到这一点,我永远不会理解,但这里是我的解决方案:
步骤1:下载Jenkins上的"Hudson Next Build Number"插件。诀窍是Jenkins的内部版本号自动递增,然后通过调用${build_number}来使用它。Hudson插件只允许您将内部版本号设置为您想要的任何内容。
步骤2:在配置菜单的Build部分,您调用Android Emulator插件并(可能)调用ant,您希望添加一个构建步骤。您希望添加"执行shell",并将其放置在构建列表的顶部,Emulator和ant之前。
步骤3:在这个shell文件中,你想放入以下代码:
sed -i "" "s/android:versionCode=.*/android:versionCode= "${BUILD_NUMBER}"/" Users/your.name/Documents/workspace/android/AndroidManifest.xml
sed -i "" "s/"1.3.*"/1.3.${BUILD_NUMBER}"/" /Users/your.name/Documents/workspace/android/AndroidManifest.xml
对于第二个shell脚本,您可能需要更改"1.3.*"one_answers"1.3.${BUILD_NUMBER}",以匹配清单中的主要和次要版本号。此外,sed调用后的文件路径应该指向您试图更改的AndroidManifest.xml。
步骤4:转到选项菜单中的"设置下一个内部版本号"选项卡,就在您的构建历史记录上方,并将内部版本号设置为您想要的任何版本号。
步骤5:让Android Emulator插件和您的ant版本在shell脚本运行后完成它们的工作。
这为我解决了这个问题,所以希望我能帮助其他陷入类似困境的人。
如果你愿意重新考虑使用外部库,我自己的安卓蚂蚁任务库有自定义任务,可以做你想做的事情:
http://zutubi.com/source/projects/zutubi-android-ant/
特别是,有一个bumpversion
任务将为您递增versionCode
(以及可选的versionName
)。
我自己的Java简单工具可以在这里使用:安卓清单内部版本号
特点:
- versionName应该是major.minor.point(根据Android文档的建议)
- versionName可以保留、重置为1.0.0或递增(其中一个部分和尾部设置为0)
- versionCode将替换为Unix时间