我大部分时间都是单独的开发人员,从事一些大型的,主要是基于PHP的项目.我希望专业化和自动化如何处理代码库的更改,并创建一个持续集成过程,使过渡在团队中工作,而不必进行根本性的更改.
我现在正在做的是,我为每个项目都有一个本地测试环境; 我为每个项目使用SVN; 更改在本地进行测试,然后通常通过FTP传输到联机版本.API文档是从源代码手动生成的; 单元测试是我慢慢进入的,它还不是我日常工作的一部分.
我想象的"构建周期"将执行以下操作:
在本地测试后,变更集将被检入SVN.
我开始构建过程.SVN HEAD修订版将被检出,必要时进行修改,并准备上传.
API文档会自动生成 - 如果我还没有详细设置,使用默认模板,扫描整个代码库.
新修订通过FTP部署到远程位置(包括一些目录重命名,chmodding,导入数据库,和喜欢.)这是我已经喜欢phing非常多,但我很开放的,当然选择.
运行驻留在预定义位置的单元测试.我被告知他们使用电子邮件,RSS或(最好)HTML输出的失败或成功,我可以抓取并放入网页.
(可选)预定义位置的最终用户"changelog"文本文件使用提交消息的预定义部分进行更新("现在可以同时过滤"foo"和"bar"此消息不一定与SVN提交消息相同,后者可能包含更多内部信息.
像代码指标,代码样式检查等等东西现在不是我的主要关注点,但从长远来看,它们肯定会.带来这种开箱即用的解决方案非常受到关注.
我在寻找
来自或处于类似情况的人的反馈和经验,并已成功实施此解决方案
特别是,关于如何设置它的好的分步教程和演练
提供尽可能多的自动化的解决方案,例如为每个新项目创建框架API,测试用例等.
并且
我忙于工作,所以我倾向于简单的解决方案.另一方面,如果缺少一个功能,我会因为它太有限而哭泣.:)欢迎使用点击式解决方案.我也是可以使用PHP项目的商业产品推荐.
我的设置
我在本地工作Windows(确切地说是7),大多数客户端项目都在LAMP堆栈上运行,通常在共享主机上运行(=没有远程SSH).我正在寻找可以在我自己的环境中运行的解决方案.我准备为此设置一个Linux VM,没问题.托管解决方案对我来说很有意思,只要它们提供了所描述的所有方面,或者足够灵活,可以与流程的其他部分进行交互.
赏金 我接受了我觉得会给我最多里程的答案.这里有很多很棒的输入,我希望我能接受不止一个答案.感谢大家!
我想在我的应用程序中同时使用Phing和Composer.Phing作为构建系统和Composer来管理依赖项.但是应该使用哪种方式呢?
目前,我们正在所有服务器上全局安装Phing.Phing应该完全自动化我们各种项目的构建.只需签出项目的副本,使用默认目标运行Phing,你应该很好.这也意味着在那里应该有一个Phing目标,它要求Composer安装所有依赖项.所以,Phing叫作曲家.但我一直无法找到有关此设置的任何信息.没有ComposerTask或任何类似的东西,谷歌搜索并没有透露任何人这样工作.
但我确实看到了很多相反的方式.使用Composer的人将Phing安装为项目依赖项.
那么,每种方法的(dis)优势是什么?我试图从错误的方式做到这一点吗?
php phing build-automation dependency-management composer-php
我正在进行PHP开发,我正在考虑使用其中一种.我的机器上安装了PHP和Java.理论上我可以使用这两者中的任何一个.
选择Phing over Ant有什么令人信服的论据?
如何正确地将应用程序从开发部署到生产以及如何处理多个站点配置.我的所有开发都通过位于var/svn/myapp/trunk的svn完成,实际的生产代码在/ var/www/myapp中.
我将本地计算机的最新代码检出到名为"myapp_latest_svn"的目录中.我在我的主settings.php中有特定于站点和位置的代码,其中包含db_host,db_user_name和db_password的H_PATH =' http: //myapp.com '和db配置设置,这与您在本地计算机设置中所知的不同(其中localhost) /myapp.com只是一个Apache别名)&生产(在myapp.com上运行的实时站点)服务器.
.htaccess文件也与生产服务器上的文件不同.简而言之,开发和生产之间存在许多差异.
我把我所有的工作都放在了SVN中.每天早上我使用SVN Update将最新代码更新到我的本地svn存储库.当我准备好上线时,我使用svn Commit构建一个版本.
然后在发布中我必须记住将所有适当的开发文件更改为其生产对应文件.现在我必须手动编辑生产settings.php和.htaccess以反映特定于站点的更改.
我正在寻找一种自动化的方式,从开发到生产完成版本控制,没有手动编辑文件,这是容易出错和不好的做法.
一种方法是使文件的生产版本只读(0444).这样,当我执行svn导出时,它们不会被文件的开发版本覆盖,我不必担心在从开发到生产的每个移动中编辑文件.但这是做持续整合等事情的坏方法.
还可以制作settings.php的多个副本(一个用于localhost,beta和prod).然后使用从svn导出的shell脚本,然后在导出完成后,它将settings.php替换为正确的settings.php,具体取决于我们部署到的位置.这样一切都是自动化的.但这也是一种蹩脚的方式.
最后一种方式是
if( eregi ("myapp.com$", $_SERVER['HTTP_HOST']) ){
define('H_PATH', 'myapp.com');
} else {
define('H_PATH', 'localmyapp.com');
}
Run Code Online (Sandbox Code Playgroud)
就settings.php而言,这很好.但是什么是.htaccess,你不能像上面的.htaccess一样检查.
我不希望每次部署我的网站时都要做,我必须更改设置.
我的数据库架构不在版本控制中,所以db不是我的问题,只有settings.php和.htaccess.
另外我怎么能告诉svn不要更新某些目录,因为它也是特定于站点的(/ log,/ cache,/ assets,/ downloads).此外,我还需要为上述文件保留完整的apache(www_data)写访问权限.
最后,我不想在导出时将空主目录和.svn文件复制到生产服务器.
在从svn构建到生产服务器时,如何使用Phing甚至shell脚本进行集成而不会导致任何这些问题.
这可能对许多想要在那里疯狂的应用程序开发人员有用.
提前致谢,
ocptime
在阅读了2008年11月版的php | architect杂志上讨论单元测试(phpUnit),构建工具(Phing)和持续集成(Xinc)的"现代PHP工作流程"文章之后,我激发了更多关于一些适用于PHP的工具,尤其是Phing.
在过去,我经常通过将实时站点作为subversion工作副本运行并简单地在生产盒上运行"svn update"来部署最新版本的代码来处理生产服务器的部署.
你是否使用PHP代码的构建工具?您认为他们提供哪些优势而不是直接从subversion部署?我应该注意什么,或者我可能面临的问题是什么?
我正在尝试设置phing以使用travis-ci,但是我无法让它运行安装脚本来安装所有依赖项.
我的.travis.yml文件是:
language: php
php:
- 5.2
script: ./.travis-phing.sh
Run Code Online (Sandbox Code Playgroud)
在travis中,我收到错误:
/home/travis/build.sh: line 105: ./.travis-phing.sh: Permission denied
Run Code Online (Sandbox Code Playgroud)
是什么造成的?
有没有办法在Phing中分组目标?我有许多目标可以通过以不同的顺序和组合运行它们来重用.例如,要创建一个新的开发版本:
$ phing clean
$ phing prepare
$ phing build
$ phing runtests
Run Code Online (Sandbox Code Playgroud)
或者从repo更新dev构建:
$ phing update
$ phing runtests
Run Code Online (Sandbox Code Playgroud)
有没有办法将这些目标分组以单个命令运行它们?我知道你可以链接目标,例如:
$ phing clean prepare build runtests
$ phing update runtests
Run Code Online (Sandbox Code Playgroud)
但理想情况下我想运行如下命令:
$ phing cleanbuild
Run Code Online (Sandbox Code Playgroud)
这将运行所有四个目标.这样,构建文件可以分离成可重用的目标.创建执行此操作的新目标将导致现有目标的代码重复.我知道你可以使用depends参数来执行其他目标,但我希望每个目标彼此独立.
Phing文档似乎不是很清楚如何做到这一点,但我确信可以在其他目标中调用目标,因为它必须是一种非常常见的做事方式.非常感谢.
我希望有一个像这样的foreach任务,它迭代目录"A"中的所有文件/目录 -
<foreach param="dirname" absparam="absname" target="subtask">
<fileset dir="${dir.destination}/${dir.subdir}/">
<type type="file" />
</fileset>
</foreach>
Run Code Online (Sandbox Code Playgroud)
目标"子任务"应该检查文件/文件夹的对应物是否存在于另一个目录"B"中(我基本上比较目录A和B),如果不是,则返回以下任一项 -
以下是一些参考代码 -
<target name="subtask">
<if>
<filesmatch file1="${file1}" file2="${file2}"/>
<then>
Return false. But how?
</then>
<else>
Return true of name of the file. How?
</else>
</if>
</target>
Run Code Online (Sandbox Code Playgroud)
注意 - 如果可以在不调用目标的情况下完成此操作,则可以.我不确定逻辑是否适合在foreachtask本身.在phing文档中找不到任何这样的东西.
基本上,我应该在循环结束时获得目录B中不存在的文件名列表.
你也可以阅读我的这个问题,如果你能给出一些指示以某种方式解决问题.
更新
重述这个问题,因为我觉得问题描述不清楚.该phing文件说,一个目标没有返回值-
目标是在项目中分配了唯一名称的项目组件(但不是其他目标)的集合.目标通常执行特定任务 - 或调用执行特定任务的其他目标 - 因此目标有点像函数(但目标没有返回值).
我不明白它为什么这么设计.有了这个赏金,我想知道除了必须在PHP中定义自己的自定义任务,然后设置属性之外是否还有一些解决方法 -
$this->getProject()->setNewProperty('modifiedElements', implode("\n\n",$modifiedElementsArray));
Run Code Online (Sandbox Code Playgroud)
可以在构建文件中访问
我有一个目标,检查我的生产代码库是否与预期的git版本有任何差异 -
<target name="compare_prod_with_expected_revision">
<input propertyname="box.git_version">
Enter git version of the production …Run Code Online (Sandbox Code Playgroud) phing ×10
php ×8
ant ×1
build ×1
composer-php ×1
deployment ×1
github ×1
integration ×1
scripting ×1
shell ×1
svn ×1
travis-ci ×1
xinc ×1