草庐IT

c# - 我如何以及为什么要设置 C# 构建机器?

coder 2023-04-23 原文

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

5年前关闭。



Improve this question




我正在与一个 C# 项目的小型(4 人)开发团队合作。我建议设置一台构建机器,它会在每晚进行项目的构建和测试,因为我知道这是一件好事。问题是,我们这里没有很多预算,所以我必须证明这笔费用的合理性。所以我想知道:

  • 我需要什么样的工具/许可证?现在,我们使用 Visual Studio 和 Smart Assembly 进行构建,并使用 Perforce 进行源代码控制。我是否需要其他东西,或者是否有相当于运行自动化脚本的 cron 作业?
  • 除了一个损坏的构建的迹象之外,这到底会给我带来什么?我是否应该在此解决方案(sln 文件)中设置将由这些脚本运行的测试项目,以便我可以测试特定的功能?目前,我们有两个这样的测试,因为我们没有时间(或者坦率地说,没有经验)进行良好的单元测试。
  • 为此,我需要什么样的硬件?
  • 一旦构建完成并经过测试,将构建放在 ftp 站点上或通过其他方式进行内部访问是一种常见的做法吗?这个想法是这台机器进行构建,我们都去它,但如果需要,可以进行调试构建。
  • 我们应该多久进行一次这种构建?
  • 空间是如何管理的?如果我们每晚进行构建,我们应该保留所有旧构建,还是在大约一周左右后开始放弃它们?
  • 还有什么我在这里没有看到的吗?

    我意识到这是一个非常大的话题,我才刚刚开始。我在这里找不到这个问题的副本,如果有一本我应该得到的书,请告诉我。

    编辑:我终于让它工作了! Hudson 非常棒,FxCop 表明我们认为已实现的某些功能实际上并不完整。我们还必须将安装程序类型从 Old-And-Busted vdproj 更改为 New Hotness WiX。

    基本上,对于那些正在关注的人来说,如果您可以从命令行运行您的构建,那么您就可以将其放入 hudson。通过 MSBuild 从命令行运行构建本身就是一个有用的练习,因为它强制您的工具是最新的。
  • 最佳答案

    更新:Jenkins是最新版本的 hudson 。现在每个人都应该使用 Jenkins。我会相应地更新链接。

    Hudson是免费的并且非常容易配置,并且可以轻松地在 VM 上运行。

    部分来自我的旧帖子:

    我们用它来

  • 部署 Windows 服务
  • 部署 Web 服务
  • 运行 MSTests 并显示与任何 junit 测试一样多的信息
  • 跟踪低、中、高任务
  • 趋势图警告和错误

  • 以下是 Hudson 支持的一些内置 .net 内容
  • MSBuild
  • NAnt
  • MSTest
  • Nunit
  • Team Foundation Server
  • fxcop
  • stylecop
  • compiler warnings
  • code tasks

  • 另外,上帝保佑你使用的是安全的视觉源,it supports that as well .我建议你看看 Redsolo's article on building .net projects using Hudson

    您的问题
  • :我需要什么样的工具/许可证?现在,我们使用 Visual Studio 和 Smart Assembly 进行构建,并使用 Perforce 进行源代码控制。我是否需要其他东西,或者是否有相当于运行自动化脚本的 cron 作业?
  • 答:我刚刚在运行 Windows 服务器操作系统的全新、修补安装的 VM 的全新副本上安装了 Visual Studio。所以你需要许可证来处理它。 Hudson 将自己安装为 Windows 服务并在端口 8080 上运行,您将配置您希望它扫描代码存储库以获取更新代码的频率,或者您可以告诉它在特定时间构建。所有可通过浏览器配置。
  • 问:除了一个损坏的构建的迹象之外,这到底会给我带来什么?我是否应该在此解决方案(sln 文件)中设置将由这些脚本运行的测试项目,以便我可以测试特定的功能?目前,我们有两个这样的测试,因为我们没有时间(或者坦率地说,没有经验)进行良好的单元测试。

    答:第一次构建失败或变得不稳定时,您会收到一封电子邮件。如果单元测试失败或者可以通过您设置的任意数量的标准将其标记为不稳定,则构建是不稳定的。当单元测试或构建失败时,您将收到电子邮件,它会告诉您失败的位置、原因和方式。通过我的配置,我们得到:
  • 自上次工作构建以来的所有提交列表
  • 提交这些提交的注释
  • 提交中更改的文件列表
  • 构建本身的控制台输出,显示错误或测试失败
  • 问:为此,我需要什么样的硬件?

    答:一个 VM 就足够了
  • 问:一旦构建完成并经过测试,将构建放在 ftp 站点上或通过其他方式进行内部访问是一种常见的做法吗?这个想法是这台机器进行构建,我们都去它,但如果我们需要,可以进行调试构建。

    答: Hudson 可以用它做任何你想做的事情,包括通过 md5 哈希对其进行标识、上传、复制、存档等。它会自动执行此操作,并为您提供长期运行的构建工件历史记录。
  • 问:我们应该多久进行一次这种构建?

    答:我们每小时轮询 SVN,查找代码更改,然后运行构建。 Nightly 还可以,但 IMO 有点无用,因为您昨天所做的工作在您进入的早晨不会在您的脑海中浮现。
  • 问:空间是如何管理的?如果我们每晚进行构建,我们应该保留所有旧构建,还是在大约一周左右后开始放弃它们?

    答:这取决于你,经过这么长时间,我将我们的构建工件移动到长期存储或删除它们,但是所有存储在我保留的文本文件/xml 文件中的数据,这让我可以存储变更日志、趋势图等服务器占用的空间很小。您也可以将 Hudson 设置为仅保留来自尾随构建的工件
  • 问:还有什么我在这里没有看到的吗?

    答:不,现在就去找 hudson ,你不会失望的!
  • 关于c# - 我如何以及为什么要设置 C# 构建机器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/616149/

    有关c# - 我如何以及为什么要设置 C# 构建机器?的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    3. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

      我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

    4. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    5. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    6. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

      给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

    7. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

      我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

    8. ruby-openid:执行发现时未设置@socket - 2

      我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

    9. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

      我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

    10. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

      我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

    随机推荐