这是一个略有..白白的问题,但BuildBot的产出并不是特别好看..

例如,比较。

..和其他人, BuildBot 看起来而不是..古老

目前,我正在玩哈德逊,但它是非常Java为中心的(虽然与 这导, 我发现更容易安装于BuildBot,并产生更多信息)

基本上:是否有任何连续的一体化系统,旨在蟒蛇,这产生很多闪亮的曲线图和该喜欢?


更新: 由于这个时候詹金斯项目已取代了哈德逊的社会版本的软件包。原作者已经转移到这个项目。詹金斯现在是一个标准包Ubuntu/Debian,RedHat/软呢/CentOS和其他人。以下更新本质上仍然是正确的。起始点到这样做 詹金斯 是不同的。

更新: 尝试后几个备选方案,我认为我坚持下哈德森。 完整性 很简单,但相当有限。我认为 Buildbot 更适合于有众多的建立奴隶,而不是一切都运行在单个机器好像我是使用它。

设定哈德森了一个Python项目是相当简单:

  • 下载从哈得逊 http://hudson-ci.org/
  • 运行它 java -jar hudson.war
  • 开放式网络界面上的默认地址的 http://localhost:8080
  • 去管理Hudson,插件,点击"更新"或者类似的
  • 安装从初插件(我不得不设置的 git 路径,在哈得逊全球的偏好)
  • 创建一个新的项目,进入储存库,SCM投票的时间间隔等等
  • 安装 nosetests 通过 easy_install 如果它是不是已经
  • 在一个建设步骤,加 nosetests --with-xunit --verbose
  • 检查"发布JUnit测试结果报告"和"试验报告Xml", **/nosetests.xml

这就是所有的需要。你可以安装电子邮件通知,和 插件 值得一看。几目前,我正在使用为蟒蛇项目:

  • SLOCCount插件 算代码行(和图表!) -你需要安装 sloccount 单独
  • 侵犯 分析PyLint输出(你可以设置警告的阈值,图违规事件的数量超过每个建立)
  • Cobertura 可以分析coverage.py 输出。Nosetest可以收集的复盖范围,同时运行测试,利用 nosetests --with-coverage (这写出来 **/coverage.xml)
有帮助吗?

解决方案

你可能想看看 鼻子该来完成输出插件.你可以把它运行单位测试和检查的复盖范围与这种命令:

nosetests --with-xunit --enable-cover

那将是有益的,如果你想要去詹金斯的路线,或者如果你想要用的另一个CI服务器支持JUnit测试报告。

同样你可以捕获的输出pylint使用 侵权行为的插件对詹金斯

其他提示

不知道,如果它将这样做: 咬伤 由谁写核心预算资源调拨目标(Trac)和与核心预算资源调拨目标(Trac). Apache甘正传 是的CI的工具使用Apache.它是写在蟒蛇。

我们已经取得了巨大成功与 TeamCity 作为我们的CI服务器和使用鼻子作为我们的测试运行程序。 Teamcity插件nosetests 给你算的通过/未通过,可读显示的失败试验(即,可以电子邮件).你甚至可以看到详细的测试失败的话你堆在运行。

如果当然支持的东西喜欢多台机器上运行,它是更简单的建立和维护比buildbot.

Buildbot的瀑布页可以大大着美化.这里有一个很好的例子 http://build.chromium.org/buildbot/waterfall/waterfall

讨论大多数集中的 也是肯定值得检查。整个讨论大多数集中的套房(吉拉,汇合,鱼眼,等等)是漂亮的甜蜜。

我想这线是很老但这里是我把它与哈德森:

我决定去点,并设置了一个仓库(痛苦的,获得工作但是好看的eggbasket),其中哈德森自动上传到一个成功的试验。这里是我的粗略和现成的脚本用于与hudson config执行脚本,如:/var/lib/hudson/venv/main/bin/hudson_script.py -w$工作空间-p我的。包-v$BUILD_NUMBER,只是把**/coverage.xml,pylint.txt 和nosetests.xml 在配置位:

#!/var/lib/hudson/venv/main/bin/python
import os
import re
import subprocess
import logging
import optparse

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(levelname)s %(message)s')

#venvDir = "/var/lib/hudson/venv/main/bin/"

UPLOAD_REPO = "http://ldndev01:3442"

def call_command(command, cwd, ignore_error_code=False):
    try:
        logging.info("Running: %s" % command)
        status = subprocess.call(command, cwd=cwd, shell=True)
        if not ignore_error_code and status != 0:
            raise Exception("Last command failed")

        return status

    except:
        logging.exception("Could not run command %s" % command)
        raise

def main():
    usage = "usage: %prog [options]"
    parser = optparse.OptionParser(usage)
    parser.add_option("-w", "--workspace", dest="workspace",
                      help="workspace folder for the job")
    parser.add_option("-p", "--package", dest="package",
                      help="the package name i.e., back_office.reconciler")
    parser.add_option("-v", "--build_number", dest="build_number",
                      help="the build number, which will get put at the end of the package version")
    options, args = parser.parse_args()

    if not options.workspace or not options.package:
        raise Exception("Need both args, do --help for info")

    venvDir = options.package + "_venv/"

    #find out if venv is there
    if not os.path.exists(venvDir):
        #make it
        call_command("virtualenv %s --no-site-packages" % venvDir,
                     options.workspace)

    #install the venv/make sure its there plus install the local package
    call_command("%sbin/pip install -e ./ --extra-index %s" % (venvDir, UPLOAD_REPO),
                 options.workspace)

    #make sure pylint, nose and coverage are installed
    call_command("%sbin/pip install nose pylint coverage epydoc" % venvDir,
                 options.workspace)

    #make sure we have an __init__.py
    #this shouldn't be needed if the packages are set up correctly
    #modules = options.package.split(".")
    #if len(modules) > 1: 
    #    call_command("touch '%s/__init__.py'" % modules[0], 
    #                 options.workspace)
    #do the nosetests
    test_status = call_command("%sbin/nosetests %s --with-xunit --with-coverage --cover-package %s --cover-erase" % (venvDir,
                                                                                     options.package.replace(".", "/"),
                                                                                     options.package),
                 options.workspace, True)
    #produce coverage report -i for ignore weird missing file errors
    call_command("%sbin/coverage xml -i" % venvDir,
                 options.workspace)
    #move it so that the code coverage plugin can find it
    call_command("mv coverage.xml %s" % (options.package.replace(".", "/")),
                 options.workspace)
    #run pylint
    call_command("%sbin/pylint --rcfile ~/pylint.rc -f parseable %s > pylint.txt" % (venvDir, 
                                                                                     options.package),
                 options.workspace, True)

    #remove old dists so we only have the newest at the end
    call_command("rm -rfv %s" % (options.workspace + "/dist"),
                 options.workspace)

    #if the build passes upload the result to the egg_basket
    if test_status == 0:
        logging.info("Success - uploading egg")
        upload_bit = "upload -r %s/upload" % UPLOAD_REPO
    else:
        logging.info("Failure - not uploading egg")
        upload_bit = ""

    #create egg
    call_command("%sbin/python setup.py egg_info --tag-build=.0.%s --tag-svn-revision --tag-date sdist %s" % (venvDir,
                                                                                                              options.build_number,
                                                                                                              upload_bit),
                 options.workspace)

    call_command("%sbin/epydoc --html --graph all %s" % (venvDir, options.package),
                 options.workspace)

    logging.info("Complete")

if __name__ == "__main__":
    main()

当涉及到部署东西,你可以做一些事情,如:

pip -E /location/of/my/venv/ install my_package==X.Y.Z --extra-index http://my_repo

然后人们可以发展东西使用:

pip -E /location/of/my/venv/ install -e ./ --extra-index http://my_repo

这种东西假定你有一个仓库的结构,每包有一个setup.py 和依赖性都设立了然后你可以检查出来的躯干和运行这些东西。

我希望这可以帮助别人。

------update---------

我已经加入epydoc其适合在真的很好哈德森。只是添加如果是的话,为什么不试你的配置与html文件夹

注意pip不会支持-E标志的正确这些天来,所以你必须为你venv分开

另一: 闪亮的熊猫 被托管的工具,为蟒蛇

如果你在考虑托管CI方案,并开放源码,你应该看看 特拉维斯CI 作为以及它有非常好的整合。.同时,它开始作为一个红宝石的工具,他们有 加蟒蛇的支持 一段时间以前。

信号是另一种选择。你可以知道更多关于它和观看视频还 在这里,.

我会考虑 CircleCi -它有伟大的蟒蛇的支持,并非常漂亮的输出。

连续的 binstar 现在是能够触发生,从审查和编译for linux,os x和windows(32/64).整件事情是,它真的可以让你密切夫妇分布和连续的一体化。这是穿越t和遍布着我的整合。该网站、工作流程和工具是真的抛光据我所知和康达就是最强大的和功能已大大增强的方式来分配的复杂python模块,在这里你需要的包裹 分发C/C++/Fotran库。

我们已经用咬了相当多的。它是漂亮,整合以及与核心预算资源调拨目标(Trac)的,但它是一个痛苦的屁股自定义,如果你有任何的非标准工作流程。还有不多的插件为有更加普遍的工具。目前我们正在评估Hudson作为替代。

检查 rultor.com.作为 这篇文章 解释说,它使用Docker为每一个建设。由于这一点,可以配置任何你喜欢的内部Docker图像,包括蟒蛇。

小声明,我们实际上必须建立一个解决方案这样的一个客户想要方式的自动试验和部署 任何 代码个混推加管理问题票通过git笔记。这还导致我的工作 项目的目的是.

一个可以很容易地仅仅是建立一个裸露的节点系统,该系统具有一个建立用户和管理他们建立通过 make(1), expect(1), crontab(1)/systemd.unit(5), , incrontab(1).一个甚至可以更进一步和使用需求和芹菜布建立一个gridfs/nfs文件存储。

虽然,我也不期望任何人比其他一Graybeard UNIX人或原则级工程师/建筑师的实际走这么远。只是让一个不错的想法和潜力的学习经验,因为建立服务器是不是一种任意执行的脚本任务自动化方式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top