我正在为我们的 iphone 应用程序设置一个自动化的夜间构建服务器,并寻求有关哪些有效和哪些无效的建议。
基本上,至少每晚运行所有单元测试并将新的临时构建发布到我们的内部网站。
所有开发人员都使用笔记本电脑(它会在一夜之间关闭),所以我正在考虑使用专用的 Mac Mini 来执行此操作。
我不确定我应该获得标准 Mac OS X 还是服务器版本。
至少在第一次尝试时,我正在考虑仅使用从 crontab 运行的简单 shell 脚本来完成实际工作。将来一个完整的持续集成服务器(hudson 等)会很好。
我已经通过搜索找到了一些文章,虽然它们很简短:
http://nachbaur.com/blog/how-to-automate-your-iphone-app-builds-with-hudson
http://blog.jeffreyfredrick.com/2008/11/27/continuous-integration-for-iphonexcode-projects/
而且这个 stackoverflow 问题也有一些有用的软件信息(虽然它现在已经两年了):
Continuous Integration for Xcode projects?
如果人们可以就如何设置构建服务器和任何潜在问题提供任何指导,我们将不胜感激。
谢谢!
约瑟夫
最佳答案
Hudson(或其分支 Jenkins)确实不难设置;这是我们内部使用的。我们不只是从中运行 iphone 构建 - 事实上,只有一个单独的 mac mini 设置用于 iphone 构建,而且它是一个相对较新的添加。一段时间以来,我们已经为其他不同平台安装了六个其他奴隶。
您可以通过 Meet Hudson 上的“试驾”链接玩它。页面以了解设置的容易程度。 (这是卖给我的东西之一;它真的很容易上手,但仍然可配置、可扩展且功能强大,足以让我们在过去几年中不断扩展。它取代了一堆非常笨拙的手-滚动的脚本和程序,尽管是作者,但我很高兴看到安息。)
我们在强大的 Mac OSX 服务器上运行 hudson 后端,但没有理由不能在任何地方(linux、windows、mac)运行它。
至于配置构建——项目配置中大概有6行shell脚本,主要是调用xcodebuild并传递-project和-配置参数。
例子:
cd ${WORKSPACE}/Engineering/
set -e
set -v
xcodebuild -project foo.xcodeproj -alltargets -configuration Distribution clean
xcodebuild -project foo.xcodeproj -alltargets -configuration Release clean
xcodebuild -project foo.xcodeproj -alltargets -configuration Debug clean
xcodebuild -project foo.xcodeproj -alltargets -configuration Distribution
xcodebuild -project foo.xcodeproj -alltargets -configuration Release
xcodebuild -project foo.xcodeproj -alltargets -configuration Debug
我们还没有设置从属服务器作为服务运行——这在 TODO 列表中。现在,只要我们重新启动它所在的 mini,我们就通过 JNLP 启动它。
Repository 是 SVN,hudson master 负责为我们记住 https auth 信息。
我们积极使用 Email-ext插件,并且有一个构建超时插件和一个审计跟踪插件,因为有很多其他人在使用该系统,并且一些构建行为不正常。我们已经对 Warnings 进行了简短的实验。插件和 Static Code Analysis plugins同样,需要将它们用于更多项目(我们通常会在构建中将警告作为错误,但我们确实在某些项目中使用 PC-Lint 和其他工具;在这里汇总和跟踪输出非常好)。最后是最重要的 Chuck Norris和 Emotional Hudson插件。
我们目前没有在任何 iphone 版本上运行单元测试(真遗憾!),我们只是使用 hudson 内置的普通“归档工件”功能来存储版本。这些可以通过授权用户通过 hudson Web 界面访问。我毫不怀疑在框架内运行单元测试对您来说并不难。
我们唯一真正的问题与 mac mini 上的 AFP 和 SMB 有关——与 hudson 完全无关,更多的是我们的内部网络基础设施。 mini 对我来说有点慢——我们通常运行相当强大的构建奴隶,理论认为快速的自动构建周转是一件好事。出于这个原因,mini 可能会在某个时候获得 SSD。
关于iphone - 为 iphone 应用程序设置自动构建服务器的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3837043/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r