プログラマーは怠け者であるため、複数回行われることはすべてスクリプト化する必要があります。
私はしばらくの間
TDDを選択してきましたが、一定の品質管理のタスクは私にとってますます緊急になっています。 特に、新しい開発者をチームに追加する場合。
まず、手でテストを実行しました:save、switch、$ nosetests。 次に、コード品質チェックがテストに追加され、すべてをスクリプトに入れる必要がありました。
pyflakes *.py
pep8 *.py
pylint *.py
nosetests
毎回スクリプトを実行するのは非常に面倒なので、inotifywaitの小さなシェルは各保存後にテストとチェックを実行し始めました。
while true; do
inotifywait -e modify project/*.py -qq; clear
./do_tests
done
その後、私は多かれ少なかれ何が起こっているかに満足し、しばらくリラックスさえしました。 しかし、プログラマーは怠け者であることに加えて誇りに思っているので、結果を誰かに見せたいです。 何が起こっているのかを保持するために(上司が来て、「さて、先月は何をしていましたか?」と尋ねるときに非常に役立ちます)、すでにバージョン管理システムがあります。 しかし、それは何が行われたかを示すだけであり、各改訂の成功の概要を示していません。 コードが存在することがわかりますが、それがどのような状態であり、他に何をする必要があるかは明らかではありません。
さらに、何かを行うことができ、テストの実行を忘れる可能性のある同僚を追跡することは非常に困難です。その結果、リポジトリにはコードレビューに合格していない壊れたコードが含まれ、次のプルでclusterfuckが突然開始される可能性があります。
そして、やがて、kmmbvnr @ ljが
スクリーンキャストをリリースし、ジェンキンス(以前のハドソン)を題材にしたジャンゴプロジェクトのテスト統合を実証しました。 私はこれらすべての美しさ、グラフ、レポートを見て、すべてが歌い、演奏することも望んでいました。 しかし、彼のdjango-jenkinsは、その名前が示すように、jungaに埋め込まれ、トリッキーなシステムを使用してレポートを生成します。 私のプロジェクトはdzhangaに成長しておらず、おそらく成長しません-それは、かなり些細なWSGIアプリケーションであり、真実は急速に成長しています。 すべてをゼロから持ち上げなければなりませんでした。
日曜日に私はそれを殺したが、一般的にはすべてが非常に簡単であり、今ではいいレポートがあります:
中身は?0)カブから最新バージョンを自動的に取得します。 このシステムは水銀と非常に緊密に統合されているため、すべての編集とコミットが表示され、アクセス可能です。
1)プロジェクトを戦闘サーバーに展開するかのように、ゼロから組み立てます。 環境が作成され、モジュールがポンプで送られてインストールされます。 システム自体は、戦闘に近い条件の開発者のサーバー上にあります:揚げ物、Pythonプロジェクトの分離、インストールのがらくた。
2)テストが実行されます。 それらと共に、コードテストのテストカバレッジがすぐに発生します。 その結果、失敗したテストとカバレッジに関するレポートファイルが作成されます。 上部の緑のグラフ-失敗したテストの数が赤で表示されます。 一番下のグラフはカバレッジを示しています。 カバレッジは、未検証の行を強調表示してファイルで直接表示できます。
3)品質チェックが実行されます。pep8とpylintは、開発者の頭脳を慎重に押して、コード、変数名などの順序を整えます。 すでに何らかの形でごみを取り出す時間であることを常に示唆する赤い破線。
4)壊れたコードをコミットした開発者は、システムによって電子メールとジャバー(個人およびMUC)で自動的にoldられ、次にリードプログラマーも同様の苦情を受け取ります。 誰もスペインの異端審問を期待していないからです!
その結果、一度に数人のルーチンの大部分を占めるシステムができました。
ちょうだい!システム自体は、
java / warパッケージとして提供され
ます 。 何もインストールする必要はありませんが、JREが必要になります(無料でDiablo-1.6をインストールしました)。 この
サイトでは、リンクを突いてすぐに
サイトで起動できます。 単純に始まります:java -jar jenkins.war。 ポートなどを指定するためのオプションがまだあります。 ローカルホストにバインドし、nginxでラップすることをお勧めします。 あなたは何を知っていることはありません。 ルートから実行することは強くお勧めします。
ひそかに、それは悪魔化されることを拒否したので、私は
監督者を入れました。 それからそれは重宝しました。 単純にインストール-pip install Supervisord。
すべての設定は、Jenkinsの管理メニューを開始した後、ブラウザーから行われます。
最初に行うことは、プラグインをプラグインすることです。 彼らはスイングして自分自身を設定します。ボックスをチェックするだけです。
- Jenkins Coberturaプラグイン-テストカバレッジレポート
- Hudsonインスタントメッセージングプラグイン-通知。 ジャバーに必要です。 まあ、またはあなたがそれを入れていない場合は必要ありません。
- Hudson Jabber notifierプラグイン-実際のえら。
- Hudson Mercurialプラグイン-リポジトリ統合。
- Hudson Violationsプラグイン-Pylintハンドラー
nefigなので、既にインストールされている残りの部分はオフにしました。
再起動のない一部のプラグインは設定に表示されません。
設定セキュリティをすぐに有効にし、適切な認証方法を選択する必要があります。 プロジェクトベースのマトリックス承認戦略を採用しました。 ユーザーを作成する必要はありませんが、再起動する必要があります。 再入力すると、すぐに管理者を作成するように求められます。 それを管理者と呼ぶ方が良いです。 そうしないと、プロジェクトの参加者のリストにコミットで指摘された参加者のリストが保持されるため、誰が誰であるかについて混乱する可能性があります。
「クロスサイトリクエストフォージェリのエクスプロイトを防止する」ことは良いことですが、それは私と一緒には機能しませんでした。含める必要はありませんでした。
JDKおよびその他の「インストール」を構成する必要はありません。すべてがこのように機能します。
シェル実行可能ファイルは、/ usr / local / bashまたは/ usr / bin / bashに設定する必要があります。 要するに、シェルへの完全なパス、そしてそこからどのように起動するのか決してわかりません...望むなら、Pythonを割り当てることもできますが、これは不便です。
JabberおよびEmailセクションは、CapおよびAdvancedボタンの設定に役立ちます。
プロジェクトのセットアップここではジョブと呼ばれます。 ジョブ名を指定し、「フリースタイル」をマークします。 それから私は週末の半分を殺した最もおいしい。
私は多くのビルドを持っていますが、頻繁にそれを行うので、10個/ 30日間のストレージ制限を設定することは論理的に思えました。 その場合-いつでも[今すぐビルド]をクリックできます。
ビットバケツのプライベートカブにコードを置いたのは、それらが無料で非常に機能しているからです。 嫌いなGit 頭全体のpythonistとgithubには無料のプライベートラップはありません。
リポジトリのURLは次のようになります(はい、認証を転送する必要があります。そのため、ジェンキンスのインストールをすぐにパスワードで保護する必要があります):[code] https:// username:password@bitbucket.org/username/uniproxy [/ code]
リポジトリブラウザ-bitbucket。
トリガーの作成-SCMをポーリングします。 Cron形式のスケジュール:[コード] * / 5 * * * * [/コード]
おそらくリモートでトリガーを実行することもできますが、私は面倒です。 まあ、それはすべての開発者のためでなければならず、このトリガーで設定をドラッグします...そしてバスケットは常に1か所にあり、どこからでもアクセスできます。
執行の審問ステッププロジェクトファイルは次のように構成されています。
.
buildenv.sh
pip-reqs.txt
pylint.rc
project/*.py
reports/*
venv/*
最後の2つはスクリプトによって作成されます。 主なもの
をgithubにレイアウトしました。
スクリーンキャストでは、すべてが1つのステップにあることがわかりましたが、3つの論理的なもの、つまりビルド、チェック、テストに分割することにしました。
1つ目は非常に簡単です。「./ buildenv.sh」はプロジェクト内にあり、virtualenvを準備します。 ここにコピーすることは可能ですが、これは労働乾燥ではありません。 同じものの複製を保持する必要があります。
2番目はより困難です。
#!/usr/local/bin/bash
venv/bin/pep8 --repeat --ignore=E501,W391 project | perl -ple 's/: ([WE]\d+)/: [$1]/' > reports/pylint.report
venv/bin/pylint --rcfile pylint.rc project/*.py >> reports/pylint.report
echo "pylint complete"
最初と最後の行は、pylintが文句を言う何かを見つけた場合、ステップ全体が散らかったと見なされるという事実に関連しています。 そして、ピリントは最も邪悪な教師よりも悪いです、常に文句を言う何かを見つけます。 構成では、彼はいくつかのエラーが私にとって面白くないことを登録しました。 pep8はpylintを補完しますが、設計により注意を払っています。 一部の警告は無効になっています(pylintは行の長さをチェックし、構成で設定されます)。
すべてのスクリプトは前のステップでインストールされたvenvから実行されることに注意してください。 何かがバラバラになった場合、他のすべてが崩壊し、大きな赤いボールが恥のボードにぶら下がっています。
3番目はテストを実行し、カバレッジを収集します。
venv/bin/coverage run --include 'project/*.py' project/tests.py --with-xunit --xunit-file=reports/tests.xml --where=project
venv/bin/coverage xml -o reports/coverage.xml
ここでは、パスに非常に注意する必要があります。 リポジトリのルートからではなく、プロジェクトからのものである場合、行ごとのカバレッジの表示は機能しません。 ソースを見つけることができなくなります。 思慮深いオプションの喫煙、グーグル、コメントの後、私はまだ有効なオプションを選びました。
報告書メトリックが収集されたので、ダウンロードして表示する必要があります。 そこにはまだ多くの便利な機能がありますが、今のところは単純に美しいグラフのためにそれを悪用しています。 最初のアセンブリの前に、そのようなレポートファイルは存在しないと言われますが、これは怖いことではありません。
「Publish JUnit test result report」を含めます。JUnitではありませんが、nosetests ** / reports / tests.xmlを示します。これは、「reportsディレクトリのカブ/ジョブのルートから」という意味です。
次の項目は「違反の報告」であり、そこにはパイリントがあります。 フィールドの名前が「XMLファイル名パターン」であり、pylintが非xmlを生成しないという事実にもかかわらず、私たちはまた、個人レコードでずさんな開発者のコードを批判するあらゆる方法でpep8とペアリングするファイル** / reports / pylint.reportを示します。 昨日書いたものを覚えていたとしても、朝になって仕事に取り掛かるのに大いに役立ちます。私は来て、違反のスケジュールを見て、修正しました。
さて、最後。 「** / reports / coverage.xml」の「Cobertura Coverage Reportの公開」。 Coberturaが何であるかはわかりませんが、Pythonカバレッジの形式を正しく理解しています。
パイリントとカバレッジを使用すると、「天気」の境界を設定できます。これはプロジェクトの全体的な状態に影響します。 デフォルト値が適合するようです。
コーダーは誇り高い鳥です-蹴らないで、飛びません最後に、電子メールとジャバーによる通知があり、好みに合わせてカスタマイズできます。 統合サーバーのメイン構成サーバーで最初に構成する必要があるのは、それ以外の場合は機能しません。
行きましょう設定が記録され、アセンブリに送信できます。 [今すぐビルド]ボタンを使用して手動で実行するか、コミットしてカブに何かをプッシュします。 ビルド履歴のサイドバーの下部に、新しいタスクと進行状況スライダーが表示されます。クリックすると、現在のビルドの「コンソール出力」セクションに移動し、ライブを見ることができます。 すべてが終了すると、ステータスにあらゆる種類のものが表示されます。
ボーナス!venvを再作成するたびに、pypiを使用してすべてのモジュールがダウンロードされ、非常に長時間実行されます。 また、交通です。 少し検索した後、pypi
Collective.eggproxyで、pypi.python.org / simpleを模倣したキャッシュプロキシリポジトリを見つけました。 `eggproxy_run`のように始まります。 助けがなく、デフォルトでは、すべてを/ var / wwwに入れますが、これは良くありません。 サイトのドックを読んだ後、設定ファイルを作成してパスとポートを設定する方法を学習できます。 また、悪魔にされたくなかったので、ジェンキンスが監督者の腕に送られた後。
buildenv.shは、このプロキシの存在/不在に適応するようにすでにトレーニングされています。そこではすべてが簡単です。
クレジットkmmbvnr @ lj:テストを開始して楽しむ方法 。 Jenkinsとの統合に加えて、
django-anyも説明されています。 すべてのdzhangistsを読んで使用することを強くお勧めします。
Hudsonを使用してpython CIサーバーをセットアップすることは、正しい解釈をベースにした最新の投稿であり、この解釈に基づいています。
プロジェクトのテストでも、
WSGIアプリケーションの単純なラッパーが使用されました 。これにより、
WSGIコンテナーなしでテストとデバッグが可能になり、不必要なhemoのないブラウザーでの手動作業が可能になりました。