web-dev-qa-db-ja.com

Pythonの「きれいな」連続的統合

これはちょっとした無駄な質問ですが、BuildBotの出力は特に見た目が良いわけではありません。

たとえば、..と比較.

..その他、 BuildBot むしろ見えます。

私は現在、Hudsonで遊んでいますが、非常にJava中心です(ただし、 このガイド の場合、BuildBotよりもセットアップが簡単であり、より多くの情報が生成されます)

基本的には、Python向けの継続的インテグレーションシステムがあり、光沢のあるグラフなどを大量に生成しますか?


更新:この時以来、JenkinsプロジェクトはHudsonをパッケージのコミュニティバージョンとして置き換えました。元の作者もこのプロジェクトに移動しました。 JenkinsはUbuntu/Debian、RedHat/Fedora/CentOSなどの標準パッケージになりました。次の更新は依然として本質的に正しいです。 Jenkins でこれを行う開始点は異なります。

Update:いくつかの代替案を試した後、私はハドソンに固執すると思います。 Integrity は素晴らしくシンプルでしたが、かなり制限されていました。 Buildbot は、私が使用していたようにすべてを単一のマシンで実行するのではなく、多数のビルドスレーブを持つのに適しています。

PythonプロジェクトのHudsonの設定は非常に簡単でした:

  • http://hudson-ci.org/ からハドソンをダウンロード
  • Java -jar hudson.warで実行します
  • http://localhost:8080のデフォルトアドレスでWebインターフェースを開きます
  • Hudsonの管理、プラグインに移動し、[更新]または同様のボタンをクリックします
  • Gitプラグインをインストールします(Hudsonグローバル設定でgitパスを設定する必要がありました)
  • 新しいプロジェクトの作成、リポジトリの入力、SCMポーリング間隔など
  • まだインストールされていない場合は、easy_install経由でnosetestsをインストールします
  • ビルドステップで、nosetests --with-xunit --verboseを追加します
  • 「JUnitテスト結果レポートを発行する」をチェックし、「テストレポートXML」を**/nosetests.xmlに設定します

必要なのはそれだけです。メール通知を設定できます。 プラグイン は一見の価値があります。現在、Pythonプロジェクトに使用しているもの:

  • SLOCCountプラグイン コードの行数を数える(そしてグラフ化する)-別途インストールする必要があります sloccount
  • 違反 PyLint出力を解析します(警告しきい値を設定し、各ビルドの違反数をグラフ化できます)
  • Cobertura coverage.pyの出力を解析できます。 Nosetestは、nosetests --with-coverageを使用してテストの実行中にカバレッジを収集できます(これにより、出力が**/coverage.xmlに書き込まれます)
116
dbr

Nose および Xunit出力プラグイン をチェックアウトすることをお勧めします。単体テストを実行して、このコマンドでカバレッジチェックを実行できます。

nosetests --with-xunit --enable-cover

Jenkinsルートを利用する場合、またはJUnitテストレポートをサポートする別のCIサーバーを使用する場合に役立ちます。

同様に、 Jenkinsの違反プラグイン を使用して、pylintの出力をキャプチャできます

41
Jason Baker

Bitten は、Tracを作成し、Tracと統合されている人によって作成されます。 Apache Gump は、Apacheが使用するCIツールです。 Pythonで書かれています。

10
edomaur

CIサーバーとして TeamCity を使用し、テストランナーとしてnoseを使用して大成功を収めました。 nosetestsのTeamcityプラグイン は、失敗したテスト(電子メールで送信可能)のカウント/成功、読み取り可能な表示を提供します。スタックの実行中にテストの失敗の詳細を確認することもできます。

もちろん、複数のマシンでの実行などをサポートし、ビルドボットよりもセットアップと保守がはるかに簡単な場合。

9
Kozyarchuk

Buildbotのウォーターフォールページはかなりきれいにすることができます。これがいい例です http://build.chromium.org/buildbot/waterfall/waterfall

8
Noufal Ibrahim

このスレッドはかなり古いと思いますが、ハドソンとの私の見解は次のとおりです。

Pipを使用してレポ(作業に苦労しますが、見栄えの良い卵のバスケット)を設定することにしました。ハドソンはテストが成功すると自動アップロードします。ここに、次のようなhudson config実行スクリプトで使用するための大まかな準備スクリプトを示します。/var/lib/hudson/venv/main/bin/hudson_script.py -w $ WORKSPACE -p my.package -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 __== "__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と依存関係がすべて設定されたパッケージごとのリポジトリ構造を持っていることを前提としているので、トランクをチェックアウトして実行するだけです。

これが誰かの助けになることを願っています。

- - - 更新 - - - - -

ハドソンと非常にうまく適合するepydocを追加しました。 htmlフォルダを使用してjavadocを設定に追加するだけです

最近、pipは-Eフラグを適切にサポートしていないため、venvを個別に作成する必要があります。

6
Nick Holden

アトラシアンの Bamboo もチェックする価値があります。 Atlassianスイート全体(JIRA、Confluence、FishEyeなど)は非常に甘いです。

6
Russ

別のもの: Shining Panda はpythonのホストされたツールです

3
edomaur

ホスト型CIソリューションを検討していて、オープンソースを使用している場合は、 Travis CI も検討する必要があります。GitHubとの統合が非常に優れています。 Rubyツールとして開始されましたが、彼らは added Python support 少し前に持っています。

3
Alex Dupuy

信号は別のオプションです。あなたはそれについてもっと知り、ビデオも見ることができます こちら

2
Diego Carrion

CircleCi -素晴らしいPythonサポートがあり、非常にきれいな出力があります。

2
Paul Biggar

continuumの binstar はgithubからビルドをトリガーでき、linux、osx、windows(32/64)用にコンパイルできます。すてきなことは、配布と継続的インテグレーションを密接に結合できることです。それはtを超え、Iを統合する点です。サイト、ワークフロー、およびツールは非常に洗練されており、AFAIK condaは複雑なpythonモジュールを配布するための最も堅牢でPython的な方法であり、ラップand C/C++/Fotranライブラリを配布します。

1
Jelle

rultor.com を確認してください。 この記事 で説明しているように、ビルドごとにDockerを使用します。そのおかげで、Pythonなど、Dockerイメージ内で好きなように構成できます。

0
yegor256

少しの免責事項、私は実際にgit Pushでanyコードを自動的にテストおよびデプロイする方法が必要なクライアントのためにこのようなソリューションを構築する必要がありましたさらに、git notesを介して発行チケットを管理します。これは AIMSプロジェクト での私の仕事にもつながります。

ビルドユーザーがいるベアノードシステムを簡単にセットアップし、make(1)expect(1)crontab(1)/systemd.unit(5)でビルドを管理できます。 、およびincrontab(1)。さらに一歩進んで、grisfs/nfsファイルストアを使用した分散ビルドにansibleとceleryを使用することもできます。

とはいえ、Graybeard UNIXの人やPrincipleレベルのエンジニア/アーキテクト以外の人が実際にここまで行くとは思わないでしょう。ビルドサーバーは、スクリプト化されたタスクを自動化された方法で勝手に実行する方法にすぎないため、素晴らしいアイデアと潜在的な学習体験を実現します。

0
Dwight Spencer

かみ傷をかなり使用しました。それはきれいで、Tracとうまく統合できますが、非標準のワークフローがある場合はカスタマイズするのが面倒です。また、より一般的なツール用のプラグインほど多くはありません。現在、ハドソンを代替品として評価しています。

0
Allen