我正在寻找有关版本控制软件最佳实践的一些建议。
背景
使用gradle构建自动化。
与Jenkins持续整合
CVS as SCM
语义版本控制
Sonatype Nexus inhouse repo
问题
让我说我做了一个改变来代码。自动CI作业将将其拉入并对其进行一些测试。如果这些测试通过,Jenkins是否应更新代码版本并将其推送到nexus?它应该被推到“SNAPSHOT”吗?它应该被推到nexus,还是直接留在存储库中,直到我想要发布它?
提前致谢
答案 0 :(得分:-2)
我知道你说你正在使用CVS,但首先,你检查过git-flow方法吗? http://nvie.com/posts/a-successful-git-branching-model/
我对CVS的经验不多,但它可以应用于它,并且良好的版本控制和CI过程从具有良好定义的分支开始,基本上至少一个用于最新版本,一个用于最新的开发版本
通过这种方式,您可以告诉CI应用程序它正在使用什么。
之前没有时间进行更详细的回答,所以我现在会延长,试着给出一般答案。
一旦你有明确定义的分支机构,你就可以控制你的工作流程。例如,通常有一个'主人'并且开发了一个'分支机构,主机将包含最新版本,并且开发将包含下一个版本。
这意味着您始终可以指向最新版本的代码,它位于master分支中,而下一个版本位于develop分支中。当然,这可以更详细,例如为各个版本标记主分支,或者为每个主要特征添加一个分支,但这两个分支就足够了。
在此之后,如果您需要更改代码,请编辑开发分支,并确保它是正确的,然后继续进行更改,直到您对当前版本感到满意为止,并将此代码移至主代码
现在,如何确保一切正确有效?通过在项目中包含测试。关于测试有很多可以阅读,但让我们保持简单。有两种主要类型的测试:
现在,进入下一步,你不会听到很多关于这两个测试的内容,相反人们会谈论以下几个:
"可能的最小代码"根据人和项目的不同,它有很多不同的含义。但是,如果您不能对其进行白盒测试,那么请保持简化,那么您正在创建集成测试。
集成测试包括数据库访问,运行服务器等,需要很长时间。至少比单元测试长得多。此外,由于其复杂性而进行的集成测试可能需要设置特定的环境。
这意味着虽然可以轻松地在本地运行单元测试,但集成测试可能非常慢,以至于人们不喜欢运行它们,或者可能无法在您的计算机上运行。
那你做什么?简单,分离测试,因此单元测试可以在每次更改后在本地运行,而集成测试在每次提交后由CI服务器运行(在单元测试之后)。
正如评论一样,不要停留在这种简化的测试愿景上。有几种处理测试的方法,有些测试我不适合单元测试或集成测试。例如,验证代码样式规则总是一个好主意,或者您可以进行仅将项目部署到服务器的测试,以确保它不会中断。
您的CI服务器应该监听提交,如果配置正确,它将知道此提交何时来自开发版本,发行版或其他任何内容。允许您根据需要自定义过程。
首先,它应该运行所有测试。没有任何借口,如果需要两个小时,请不要担心,它应该运行所有测试,因为这是您防范未来问题的屏障。
如果有错误,CI服务器将停止并发送警告。修复代码并重新开始。如果所有测试都通过,那么祝贺。
现在是时候部署了。
始终应谨慎部署。依赖项存储库中提供的最新版本应始终是最新版本。
在提交后将脚本部署到存储库中的脚本很不错,但除非你有一些简短的最终验证,一个人工控制的手动,你可能会发布一个糟糕的版本。
当然,您可以忽略开发版本,只要它们与实际版本分开,否则最好手动处理最终部署。
嗯,它可能是一个脚本或你喜欢的任何东西,但应该是你开始部署版本而不是机器。
拥有CI服务器不仅仅是测试和构建。
你喜欢报道吗?然后生成测试覆盖率报告,质量度量标准或您喜欢的任何内容。您正在使用外部服务吗?然后将文件发送给他并让它工作。您的项目是否包含生成文档的文件?构建它并将其存储在某个地方。