这实际上源于我之前的问题,其中一个答案让我想知道人们如何以不同的方式使用scm/repository进行开发.
Von*_*onC 22
之前(TeamCity,构建经理):
这个概念很简单,构建系统在你的提交进入trunk之间成为障碍,只有在构建系统确定你的提交没有破坏之后它才允许将提交引入版本控制,其他开发人员将同步和将该变更整合到他们的本地工作副本中
之后(使用像Git这样的DVCS,这是一个源存储库):
我使用Hudson进行预测试提交的工作流涉及三个独立的Git存储库:
- 我当地的回购(当地),
- 规范/中央回购(原产地)
- 和我的"世界可读"(在防火墙内)回购(公共).
对于预先测试的提交,我在世界可读的回购中使用了一个名为"pu"(潜在更新)的不断变化的分支.
在Hudson内部,我创建了一个工作,轮询世界上可读的repo(公共)以查找"pu"分支中的更改,并在推送更新时启动构建.我从初始变为原点的工作流程是:
* hack, hack, hack
* commit to local/topic
* git pup public
* Hudson polls public/pu
* Hudson runs potential-updates job
* Tests fail?
o Yes: Rework commit, try again
o No: Continue
* Rebase onto local/master
* Push to origin/master
Run Code Online (Sandbox Code Playgroud)
使用这个预先测试的提交工作流程,我可以将大部分测试需求卸载到构建系统的机器集群,而不是在本地运行它们,这意味着我可以花大部分时间编写代码而不是等待测试自己完成编码迭代之间的机器.
(变化)私人建筑(David Gageot,Algodeal)
原理与上面相同,但构建是在与用于开发的工作站相同的工作站上完成的,但是在克隆的repo上:
如何不长期使用CI服务器而不会在本地盯着构建时遭受越来越多的时间损失?
用git,它是小菜一碟.
首先,我们将工作目录"git clone"到另一个文件夹.Git的的确复制非常快.
下一次,我们不需要克隆.告诉git获取增量.最终结果:即时克隆.令人印象深刻.一致性怎么样?从工作目录中
执行一个简单的'git pull'将使用delta的摘要实现已经在共享存储库上推送的更改.
没事做.令人印象深刻.当然,当构建在第二个目录中运行时,我们可以继续处理代码.无需等待.
我们现在有一个私有构建,没有维护,没有额外的安装,不依赖于IDE,只使用一个命令行运行.共享存储库中没有更多破坏的构建.我们可以回收我们的CI服务器.
是.你听得很清楚.我们刚刚建立了无服务器CI.真实CI服务器的每个附加功能对我来说都是噪音.
#!/bin/bash
if [ 0 -eq `git remote -v | grep -c push` ]; then
REMOTE_REPO=`git remote -v | sed 's/origin//'`
else
REMOTE_REPO=`git remote -v | grep "(push)" | sed 's/origin//' | sed 's/(push)//'`
fi
if [ ! -z "$1" ]; then
git add .
git commit -a -m "$1"
fi
git pull
if [ ! -d ".privatebuild" ]; then
git clone . .privatebuild
fi
cd .privatebuild
git clean -df
git pull
if [ -e "pom.xml" ]; then
mvn clean install
if [ $? -eq 0 ]; then
echo "Publishing to: $REMOTE_REPO"
git push $REMOTE_REPO master
else
echo "Unable to build"
exit $?
fi
fi
Run Code Online (Sandbox Code Playgroud)
德米特里·塔什科诺夫(Dmitry Tashkinov)对DVCS和CI提出了一个有趣的问题:
我不明白"我们刚刚建立了无服务器CI"与Martin Fowler的状态:
"一旦我自己构建了一个正确同步的工作副本,我就可以最终将我的更改提交到主线,然后更新但是我的提交没有完成我的工作.此时我们再次构建,但这次是在基于主线代码的集成机器上.只有当这个构建成功时,我们才能说我的更改已经完成.有可能我错过了机器上的东西而且存储库没有正确更新."
你忽略或弯曲它吗?@Dmitry:我不会忽视也不会忽视Martin Fowler在他的ContinuousIntegration条目中描述的过程.
但你必须意识到DVCS将出版物作为分支的正交维度.
David描述的无服务器CI只是Martin详细描述的一般CI过程的实现:您没有CI服务器,而是推送到运行本地CI的本地副本,然后将"有效"代码推送到中央存储库.@VonC,但想法是在本地运行CI,特别是不要错过机器之间转换的东西.
当您使用所谓的本地CI时,它可能仅仅因为它是本地的而通过所有测试,但稍后在另一台机器上分解.
这是整合吗?我根本不在这里批评,这个问题对我来说很难,我正在努力理解.@Dmitry:"它是如此的整合"?
它是一个集成级别,可以帮助摆脱所有基本检查(如格式问题,代码样式,基本静态分析检测,......)
因为您有这种发布机制,您可以将这种CI链接到另一个CI服务器,如果你想.反过来,该服务器可以自动推送(如果这仍然快进)到"中央"仓库.David Gageot不需要额外的级别,在部署架构(PC-> PC)方面已经达到目标,并且只需要基本类型的CI级别.
这并不妨碍他设置更完整的系统集成服务器以进行更完整的测试.
我的最爱?一个未发布的工具,它使用Bazaar(一个经过深思熟虑的显式重命名处理的DSCM)通过将数据存储表示为目录结构来跟踪树结构数据.
这允许XML文档被分支和合并,现代分布式源代码控制使得所有优点(冲突检测和解析,审查工作流,当然还有更改日志记录等)变得容易.将文档的组件及其元数据拆分到自己的文件中可防止允许接近创建错误冲突的问题,并允许Bazaar团队对文件系统树版本化所做的所有工作使用其他类型的树结构数据.
| 归档时间: |
|
| 查看次数: |
3604 次 |
| 最近记录: |