「逐次統合のシステム」、翻訳が正しいかどうかわからない-継続的統合のシステムと呼ぶ方が良い。
5-7人のプログラマーがコードとテストを集中的に記述し、構成ファイルを変更し、すべての結果をトランク/マスターに注ぎ込んだとき、私が仕事の始めに初めて出会いました。 その結果、かなり頻繁に(非常に頻繁に既に激怒していた)動作不能なものがメインブランチに現れました。 さらに、これはテストベンチを展開する必要があるときに明らかになり、テストグループ(修正待ち)と開発者(それぞれ修正済み)の作業が大幅に遅くなりました。 すなわち コードの状態は、リポジトリに配置された後は制御されませんでした。
その後、 ハドソン(http://hudson-ci.org/)が助けになりました(現在はJenkins(https://jenkins.io/)として知られています)が 、正式にはハドソン自体が残っていましたが、あまり人気がなく、あまり積極的に開発されていませんでした)-彼は多くのことをしました:
- 各コミット後にユニットテストをビルドして実行する
- リリースブランチにコミットした後、彼は古いものを殺し、テスターチームのために新しいテストスタンドを立ち上げました。
- ソースコードに関するレポートの生成(テストカバレッジ、テスト標準への準拠の指標)。
- wikiの生成されたドキュメント。
- さらに、そのインターフェイスを介して、誰がコミットしたか、テストカバレッジが時間とともにどのように変化したか、テストがビルドおよび実行されていた時間、そして最も重要なのはビルドが壊れた原因を追跡することができました。
これは、開発チームの品質と透明性を改善するという点で大きな前進でした(マスター/トランクの混乱の可能性を最小限に抑えることについては話していません)。
- バージョン管理システムで作業しているときに、典型的な間違いが何であったかを知ることができました(誰かが処罰され、誰かが訓練されました)。
- 構成を持つ1つの大きなファイルの共同編集を防ぐために、その分離が実行され、アセンブリロジックが変更されました。
- ブランチを操作するためのルールが開発され、修正されました(以前は「誰もが理解する...」という原則に基づいていました。つまり、公式のルールはありませんでした)。
しかし、それはすべて以前のものです。 質問は次のとおりです。単独で作業する場合、継続的インテグレーションシステムを使用する意味は何ですか
ある時点まで、本当に意味がありませんでした。 プロジェクトが成長し(1人の開発者の参加があっても)、統合サーバーの存在がその真の価値を示すまで:
- 統合テストを起動するためのスタンドは、他のコンポーネントのバージョンを含む構成ファイルを使用して形成され、既成のアーティファクト(Nexus Sonatypeに基づく)のストレージシステムによってプルアップされるため、コンポーネントバージョンの正しい指示とそれらのジョイントのチェックはかなり重要な問題になりました健康。 ただし、このチェックには時間がかかります(成果物のダウンロード、スタンドの構築、起動、統合テストの実行にかかる時間)。 そのため、統合サーバーで、作業ブランチにタスクを構成しました。作業ブランチには、作業オプションをマージして作業を続行する場合があります。 しばらくすると、作業能力の仮定が正しいかどうかを確認できます。
- Apache Stormでローカルクラスタのユニットテストを実行すると、スタブ/モックの依存性注入を介してすべてのコンポーネントを置き換えても、かなりの時間がかかり、すべてを実行するのを忘れることがあります。 CIの存在、これは「git push」の直後に検出されます。
- (体系的ではありませんが、数回)、gitのコードだけでなく、構成ファイルとデータファイルの存在を考慮して、「。gitignore」を修正するときに、必要なファイルが不要なファイルとともにリポジトリから除外される場合がありました。 同時に、それらは私のマシンに保存され、テストは機能しましたが、CIサーバーでは、この事実が即座に監視されました。
Jenkinsの追加の興味深い機能は、そのインターフェイスです。
- パイプラインとそのステージのランタイム
; - 作業/不合格/作業テストの数のグラフィカルな反映
; - 作業済み/未実施/作業済みテストの数の表形式の反映
; - ビルドの原因となった最新のコミットに関する詳細データ
; - 変更の詳細な調査のために同じGitHubに切り替える可能性がある特定のアセンブリを引き起こしたコミットに関する詳細データ
。
パイプライン
しばらく使用しなかったJenkinsの最も重要な機能改善は、Pipelineプラグインの登場でした 。これにより、Jenkinsインターフェイス自体またはプロジェクト自体の個別の構成ファイル(
Jenkinsfile
ファイル)を介して実行/起動/チェックの対象を決定できますプロジェクト/モジュールのコードを受信する際のCIサーバー。
このアプローチにより、リポジトリポーリング(Jenkinsインターフェースで実行)の設定手順とテスト/統合手順自体(
Jenkinsfile
ファイル)の設定手順を分離できるため、開発者またはデプロイメントの責任者は、Jenkinsにアクセスすることなく、必要なテスト/統合段階を構成/変更/追加できます。
たとえば、私のサブプロジェクトの1
Jenkinsfile
、
Jenkinsfile
内容は次のとおりです。
#!groovy node { def projectName = 'glr_parser' def gradleHome = tool name: 'gradle', type: 'gradle' stage('Checkout') { // for display purposes // Get some code from a GitHub repository // parent directory checkout changelog: true, poll: false, scm: [$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CleanBeforeCheckout']], submoduleCfg: [], userRemoteConfigs: [[url: 'story_line2_build.github.com:fedor-malyshkin/story_line2_build.git']]] // project itself checkout changelog: true, poll: true, scm: [$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: "${projectName}"]], submoduleCfg: [], userRemoteConfigs: [[url: "story_line2_${projectName}.github.com:fedor-malyshkin/story_line2_${projectName}.git"]]] // deployment // checkout changelog: true, poll: false, scm: [$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'deployment']], submoduleCfg: [], userRemoteConfigs: [[url: 'story_line2_deployment.github.com:fedor-malyshkin/story_line2_deployment.git']]] } stage('Assemble') { dir(projectName) { // Run the maven build sh "'${gradleHome}/bin/gradle' -Pstand_type=test assemble" } } stage('Test') { dir(projectName) { try { sh "'${gradleHome}/bin/gradle' -Pstand_type=test test" } finally { junit "build/test-results/test/TEST-*.xml" } } } }
ご覧のとおり、これは実際には多少近代化されたグルーヴィーです(JenkinsのDSL)。 Pilpelineは、ステップ、ステップ、およびノードで構成されています。 ステージはステージビュープラグインに反映され、誰もがプレゼンテーションやその他のパフォーマンスで表示するのが大好きです。
同時に、開発者は、検証フェーズ中に自分が何に制限するかを決定する権利を持っています:単体テストの開始、コーディング標準の確認、統合テストの開始、または本番環境でテストされた成果物の配置(したがって、継続的配信の原則の実現)。
ヒント
- 私のためにJenkinsタスクを設定するときの問題は、閉じたGitHubリポジトリへの読み取りアクセスを提供する必要があることでした(同時に、設定内のアカウントでパスワードをスコアリングするわずかな欲求もありませんでした)、これはGitHub Deploy Keysを使用して解決しました( 以前の記事を参照してください )
- モバイルデバイス(Android)のタスクのステータスを追跡するには、 Jenkinsという名前の驚くほど優れたクライアントを使用します。
いくつかのスクリーンショット:
- CatLightのビルドステータスを追跡するPC用の興味深いシッククライアントもあります(ただし、使用経験はありません)。
現時点では、Jenkinsのマイナス面は製品の不十分なドキュメントのみであることに注意してください。多くの場合、開発者のサイトのドキュメントセクションに「これはまだ進行中の作業です」という碑文があります。 ただし、これは真に柔軟で強力な製品から押し出すべきではありません。
ご清聴ありがとうございました!