Questions tagged «continuous-integration»

在软件工程中,持续集成(CI)经常执行对完整软件产品的持续构建和自动化测试。每天至少一次,通常一天几次,有时甚至在每次签入版本控制系统后的次数一样多。

13
是否有不使用版本控制和持续集成的严肃公司?为什么?
我的一位同事给我们的印象是我们的软件部门非常先进,因为我们同时使用了具有持续集成功能的构建服务器和版本控制软件。这与我的观点不符,因为我只知道一家公司制造过认真的软件,却没有一家。但是,我的经验仅限于少数公司。 有谁知道有一家从事软件业务并且不使用这些工具的真实公司(超过3个程序员)?如果存在这样的公司,是否有充分的理由让他们不这样做?


2
带有大型公司通讯,配置管理和测试要求的Mercurial存储库结构
我还是另一个Subversion用户,他在分布式版本控制的Tao中苦苦地对其自身进行重新教育。 使用Subversion时,我非常喜欢次项目方法,并且与大多数以前的雇主一样,我们将构建存储库分支;标签和主干如下: branches-+ +-personal-+ | +-alice-+ | | +-shinyNewFeature | | +-AUTOMATED-+ | | +-shinyNewFeature | +-bob-+ | +-AUTOMATED-+ | +-bespokeCustomerProject +-project-+ +-shinyNewFeature +-fixStinkyBug tags-+ +-m20110401_releaseCandidate_0_1 +-m20110505_release_0_1 +-m20110602_milestone trunk 在实际的源代码树本身中,我们将使用(类似)以下结构: (src)-+ +-developmentAutomation-+ | +-testAutomation | +-deploymentAutomation | +-docGeneration | +-staticAnalysis | +-systemTest | +-performanceMeasurement | +-configurationManagement | +-utilities +-libraries-+ | …

6
“自动构建”是什么意思?
我正在尝试将持续集成添加到项目中。 根据Wikipedia的介绍,CI的一项主要内容是自动构建。但是,由于CI和构建自动化文章似乎不同意,我对确切的含义感到困惑。 特定的混淆点:在以下情况下, “自动构建”是什么意思: 使用解释性语言(例如Python或Perl)的项目? 在最终用户的计算机上从源代码构建? 具有不能简单地预编译和分发的依赖项的应用程序,例如用户计算机本地的RDBMS中的数据库?

6
谁负责建立自动构建系统?
我是公司的项目经理。我与几个开发人员团队一起使用标准的,众所周知的CVS版本控制系统。我希望看到实施了持续集成和自动化构建,以防止构建中断和错误部署潜入生产服务器的问题。 我确定我可以自己进行设置,但是我不想自己这样做,有两个原因: 我没有时间 我有自己的职责,包括市场营销,与开发团队以外的团队成员与其他利益相关者沟通,与客户沟通以及项目规划。 最重要的是,我是项目经理。我的目的是提供领导能力,而不是微观管理开发团队。 在开发团队中找到对设置有热情的人,我可以做些什么?考虑到开发人员需要Java,Spring和Google App Engine的知识,开发人员是否适合此任务?有什么技巧可以帮助人们在害怕改变的地方促进改变?

2
在哪里推动失败的测试?
我只是更改了GitHub存储库上的分支设置,所以我的[下一个]分支需要通过pull请求传递一个CI构建。 随后与许多团队成员进行了关于测试失败的讨论。 为了上下文... 该仓库有一个[大师]分支,只有PR'd成时,有一个释放,使[大师]包含代码为的最后一个版本,无论它是否是一个重大的,未成年人,修补程序,β,α-/预发行版本。 [next]分支是“默认”分支,我们打算保留“发布就绪”代码;从技术上讲,可以随时将该分支公诸于[master]并发布。 每个fork都有自己的dev分支,并为[next]贡献者PR。 当我审阅不重要的PR时,我会将贡献者的dev分支合并到我的“ review”分支中,如果我发现可以快速修复的问题,则将提交/推送更改以及新的(有时会失败)测试和PR返回贡献者的dev分支;当他们合并我的更改时,使新的失败测试通过,然后推送,它们的PR进行同步,然后将PR合并到[next]中。 但是这个问题不是关于通过测试,而是关于失败的测试。 测试失败记录了需要解决的问题。 已知的bug应该编写测试,以便我们知道什么不起作用。 从技术上讲,GitHub 问题列表(针对错误和/或关键 标签进行了过滤)也可以做到这一点。它是一个很好的做法,也有一堆失败的测试文档的bug? 在[next]上失败的构建意味着我们还没有准备好发布……但是,“准备发布”有点像“准备好”要孩子了-您从没有为此做好充分的准备,并且某些地方(重要性不一)将不可避免地出问题。 因此,我们只是将通过测试推向[next]。那么,将失败的测试推向何处呢?我的意思是,在PR /审查流程之外? 例如,一个用户在问题列表中报告了一个新错误,我想为其编写一个失败的测试套件-以便指定需要执行的操作以及在何处进行操作,这使新贡献者更容易上手最终PR修复。 我应该在哪里推动这些失败的测试?还是将失败的测试推送到任何地方甚至是个好主意?

8
替代“通过/损坏的构建”指示器?
当在每次提交时执行测试的持续集成时,通常的最佳实践是使所有测试始终通过(也就是“不破坏构建”)。 我发现一些问题: 例如,不能通过创建与票证相对应的测试来帮助开源项目。我知道如果我向包含失败测试的开源项目提出“拉取请求”,则该构建将被标记为失败,并且该项目将不希望将其合并到其存储库中,因为这会“破坏构建”。 而且我不认为在您的仓库中测试失败是一件坏事,就像在跟踪器中遇到未解决的问题一样。这些只是等待修复的事情。 公司也是如此。如果使用TDD,则无法编写测试,提交并编写满足测试要求的逻辑代码。这意味着,如果我在笔记本电脑上编写了4-5个测试,则在休假前我无法提交它们。没有人可以收回我的工作。我什至不能与同事“共享”他们,例如通过电子邮件发送给他们。这也阻止了一个人编写测试,而另一个人编写模型。 话虽如此,我是否滥用/误解了构建过程/持续集成?在我看来,“通过” /“未通过”是一个过于狭窄的指标。 有没有办法使持续集成和TDD兼容? 也许有一个标准的解决方案/实践来区分“新测试”(可能失败)和“回归测试”(应该不会失败,因为它们曾经工作过)?


2
我应该如何选择持续集成工具?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 5年前关闭。 我在Wikipedia上找到了这个很酷的用于集成服务器的比较表,但是我不确定如何对工具进行排名以及我的需求和兴趣。图表本身似乎有很多标记为未知的框,因此,如果您愿意在Wikipedia上进行更新,那也可能很棒。 是否有一些性能最好的产品,所以我可以迅速缩小到四个或五个选项? 哪些产品似乎拥有最大的用户群体,以及最新的增强功能以​​及与新工具的集成? 开源产品是最好的吗?或者是否有高质量的工具对家里的单个用户来说可以是很多东西? 使用多个系统(主台式机,仅限本地局域网的家庭服务器,个人和工作笔记本,分布在所有主机上的多个虚拟机)是否会造成问题,以及如何对其进行管理?


3
多存储库环境中的打包和版本策略
我们是一家小型公司,拥有多个团队管理自己的git存储库。这是一个Web平台,每个团队的工件都在一天结束时部署以进行夜间测试。我们正在尝试使围绕版本控制和打包的过程正式化。 每个团队都有一个主分支,负责日常开发。每个团队的质量保证成员都希望将他们团队变更中的工件部署到测试台中,由厨师将所有组件组合在一起。工件是压缩包,但我想将其转换为RPM,以便我们可以正确思考和推理版本。 发布过程涉及从每个git存储库的开发分支(在大多数情况下为master)切断发布分支。然后将其提供给质量保证,由质量保证对一组工件进行测试和签核。 例如,这是一个典型的git存储库及其相关的发行分支: 0-0-0-0-0-0-0-0-0-0 (master) | | 0 0 (rel-1) | 0 (rel-2) 我一直在试图找出一种方案来执行来自开发分支的软件包的版本控制。我们不想过多地标记每个仓库的主分支,并限制标签仅释放分支。但是我们应该能够使用标准的yum / rpm语义查询测试机器中已部署的软件包。当master分支没有标签时,开发版本会是什么样?我知道这git describe可以为我提供构建版本的有用表示,但是当标记分支上的各个发行点时,它可以很好地工作。 编辑1:响应@ Urban48的答案 我认为我应该多解释一下发布过程。为了便于讨论,我们假设master在所有存储库中都有分支。该master分支被视为开发分支,并且已部署到支持CI-CD的自动化QA环境。这是每晚测试的子集,用于确保主服务器的稳定性。在削减发行分支之前,我们先看一下这一系列工作。我们的发行分支是短暂的。假设(从稳定的主服务器上)剪切了一个发布分支之后,将运行完全回归,进行修复并将其部署到生产中。这大约需要一周的时间。我们几乎每两周发布一次产品。 我们的功能分支总是从母版中剪切下来的,并在与母版合并之前经过一定量的开发人员测试,然后对它们进行CI-CD稳定性检查。 修补程序是在修补程序分支(从发行版分支切下的)上进行的,并以最小的影响测试将其部署到生产环境中。 以下是我们针对发行版和修补程序分支的版本控制策略。在质量检查周期中,发行分支会经历的版本v2.0.0-rc1,v2.0.0-rc2最后在质量检查批准后变为v2.0.0。 有时,我们会针对一些小功能进行点发布,这些小功能会合并到版本变为的版本分支(然后合并到母版)中v2.1.0。修补程序采用该v2.1.1模式。 但是,问题不在于对这些分支进行版本控制。我不希望完全更改此版本控制方案。唯一的变化来自开发部门。主。如何在CI-CD环境中可靠地指示在生产中的先前发行版中存在哪个版本。理想情况下,这可以通过智能git标记完成,但最好不要过度标记master分支。

5
奇怪的公司发布周期:进行分布式源代码控制吗?
抱歉,这篇文章很长,但我认为值得。 我刚从一家小型.NET商店开始,其运作方式与我工作过的其他地方有很大不同。与我以前任职的职位不同,此处编写的软件针对多个客户,并且并非每个客户都同时获得最新版本的软件。因此,没有“当前生产版本”。当客户确实获得更新时,他们还将获得自上次更新以来可能已添加到软件中的所有功能,而这可能是很久以前的事了。该软件是高度可配置的,并且可以打开和关闭功能:所谓的“功能切换”。此处的发布周期非常紧张,实际上它们没有按计划进行:功能完成后,软件便部署到了相关客户。 该团队仅在去年从Visual Source Safe迁移到Team Foundation Server。问题是他们仍然像使用VSS一样继续使用TFS,并在单个代码分支上强制执行Checkout锁定。每当将错误修复发布到现场时(甚至对于单个客户),他们都只需构建TFS中的内容,测试该错误是否已修复并部署给客户!(我自己来自制药和医疗设备软件背景,这真是难以置信!)。结果是半熟的开发人员代码甚至未经测试就投入生产。Bug总是会渗入发行版中,但是如果刚获得构建的客户通常不使用该bug所在的功能,他们将不会看到这些bug。主管知道这是一个问题,因为该公司正在逐渐发展壮大突然之间有一些大客户加入,而一些小客户也加入了。 有人要求我查看源代码控制选项,以消除错误的代码或未完成的代码的部署,但又不牺牲团队发行版的某种异步特性。在我的职业生涯中,我曾使用过VSS,TFS,SVN和Bazaar,但是TFS是我大部分经验的去处。 以前与我合作的大多数团队都使用Dev-Test-Prod的两个或三个分支解决方案,其中一个月的开发人员直接在Dev中工作,然后将更改合并到Test然后是Prod,或者在“完成时”升级,而不是在一个固定的周期。使用定速巡航或团队构建的自动化构建。在我之前的工作中,Bazaar被使用在SVN之上:开发人员在自己的小型功能分支中工作,然后将其更改推送到SVN(与TeamCity绑定)。很好,因为很容易隔离更改并与其他人的分支机构共享。 在这两种模型中,都有一个中央的dev和prod(有时是测试)分支,通过该分支推送了代码(标签被用来标记生产该版本的prod中的构建...这些都被制成了分支以修复错误。发布并合并回开发人员)。但是,这确实不适合此处的工作方式:没有命令何时发布各种功能,何时完成将它们推入。 有了这个要求,我看到的“持续集成”方法就失效了。为了获得与持续集成的新功能,必须通过dev-test-prod来推送它,这将捕获开发中所有未完成的工作。 我认为,要解决此问题,我们应该使用没有开发测试prod分支的大量功能分支模型,而是将源作为一系列功能分支存在,当开发工作完成时,这些功能分支将被锁定,测试,固定,锁定,经过测试然后发布。其他功能分支可以在需要/想要时从其他分支获取更改,因此最终所有更改都会被其他人吸收。这完全符合我上一份工作所经历的纯粹的Bazaar模型。 听起来如此灵活,但似乎没有某个开发主干或prod分支似乎很奇怪,我担心分支无法进行重新集成,或者后期的微小更改永远不会被其他分支和开发人员所抱怨。合并灾难... 人们对此有何想法? 第二个最后一个问题:我对分布式源代码控制的确切定义有些困惑:有些人似乎暗示它只是没有像TFS或SVN这样的中央存储库,有人说这是关于断开连接的(SVN断开了90%并且TFS具有功能完善的离线模式),其他人则说这与功能分支和分支之间没有父子关系的合并的简便性有关(TFS也具有无基础的合并!)。也许这是第二个问题!

4
发布版本与每晚版本
一个典型的解决方案是在构建服务器上运行CI(连续集成)构建:它将分析源代码,进行构建(在调试中)并运行测试,测量测试覆盖率等。 现在,另一种通常称为“夜间构建”的构建类型:做一些缓慢的工作,例如创建代码文档,制作安装程序包,部署到测试环境以及针对测试环境运行自动(烟熏或接受)测试等。 现在,问题是: 拥有第三个单独的“发布版本”作为发行版本更好吗? 还是在发布模式下“立即构建”并将其用作发布? 您在公司中使用什么? (发行版本还应在潜在产品版本的源代码控制中添加某种标签。)

2
在GitLab的同一服务器上运行CI?
我在公司中设置了一个GitLab服务器,现在向它添加了GitLab CI。 在开始此任务之前,我想了解在GitLab和GitLab CI使用的同一服务器上运行运行程序是否有任何不利之处。 我读过有安全性问题,但我们仅在内部使用它,因此我认为这可能不是问题。 我想念什么吗?

4
如何学习实现一半功能的正确方法?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我领导一个开发团队,我想尽可能多地发布我们的产品(连续交付)。 在许多情况下,我们必须实施比发布之间的时间花费更长的时间才能实现的功能。我仍然希望人们每天提交他们的代码(持续集成)。 很多时候,实现新功能需要更改现有功能,并且即使新功能尚未完成,现有功能当然仍然需要工作。 如果开发人员使用正确的方法,则他们可以仔细调整现有功能,而上述所有都不是问题。 但是,正确的方法实际上是什么?我自己的编程知识告诉我如何处理每个案例,但是我需要了解更多信息,还需要一些阅读材料,我可以阅读并推荐团队成员阅读。或任何其他学习正确方法的方法都可以。 这就是问题所在。如何确保团队成员学习实现一半功能的正确方法? 我搜寻了自称对此有策略的人,但还没有找到,只是人们对此主题写了一些随机的想法。也许我没有使用正确的搜索词,或者也许没有人对此做出任何权威性的指导。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.