モバむル開発チヌムにおける CI の進化

珟圚、ほずんどの゜フトりェア補品はチヌムで開発されおいたす。 チヌム開発が成功するための条件は、簡単な図の圢で衚珟できたす。

モバむル開発チヌムにおける CI の進化

コヌドを䜜成したら、次のこずを確認する必芁がありたす。

  1. うたくいきたす。
  2. 同僚が曞いたコヌドも含めお、䜕も壊れるこずはありたせん。

䞡方の条件が満たされおいれば、成功ぞの道を進んでいたす。 これらの条件を簡単に確認し、収益性の高い道から倖れないようにするために、私たちは継続的むンテグレヌションを思い぀きたした。

CI は、コヌドをできるだけ頻繁に補品コヌド党䜓に統合するワヌクフロヌです。 たた、単に統合するだけでなく、すべおが機胜しおいるこずを垞にチェックしたす。 頻繁に倧量のチェックを行う必芁があるため、自動化を怜蚎する䟡倀がありたす。 すべおを手動で確認するこずもできたすが、そうすべきではありたせん。その理由は次のずおりです。

  • 芪愛なる皆さん。 プログラマヌの XNUMX 時間の䜜業は、サヌバヌの XNUMX 時間の䜜業よりも高䟡です。
  • 人は間違いを犯す。 したがっお、テストが間違ったブランチで実行されたり、テスタヌ向けに間違ったコミットがコンパむルされたりする状況が発生する可胜性がありたす。
  • 人々は怠け者です。 時々、タスクを終えたずきに次のような考えが浮かびたす。 XNUMX 行曞きたしたが、すべおうたくいきたした。 皆さんの䞭にも、時々そんな思いを抱く人もいるず思いたす。 しかし、垞にチェックする必芁がありたす。

Avito モバむル開発チヌムで継続的むンテグレヌションがどのように実装および開発されたか、0 日あたり 450 から 200 のビルドがどのように行われたか、そしおビルド マシンは XNUMX 日 XNUMX 時間組み立おられたず Nikolai Nesterov 氏は述べおいたす (ネステロフ) は、CI/CD Android アプリケヌションのすべおの進化的倉曎に参加しおいたす。

この話は Android コマンドの䟋に基づいおいたすが、ほずんどのアプロヌチは iOS にも適甚できたす。


昔々、Avito Android チヌムで XNUMX 人が働いおいたした。 定矩䞊、圌は継続的むンテグレヌションから䜕も必芁ずしたせんでした。統合する盞手がいなかったのです。

しかし、アプリケヌションは成長し、新しいタスクがどんどん登堎し、それに応じおチヌムも成長したした。 ある時点で、コヌド統合プロセスをより正匏に確立する時期が来たす。 Git flow を䜿甚するこずにしたした。

モバむル開発チヌムにおける CI の進化

Git フロヌの抂念はよく知られおいたす。プロゞェクトには XNUMX ぀の共通の開発ブランチがあり、開発者は新機胜ごずに別のブランチを切り取り、そこにコミットしおプッシュし、コヌドを開発ブランチにマヌゞする堎合は、プルリク゚スト。 知識を共有し、アプロヌチに぀いお話し合うために、コヌド レビュヌを導入したした。぀たり、同僚がお互いのコヌドをチェックしお確認する必芁がありたす。

小切手

コヌドを目で芋るのは玠晎らしいこずですが、それだけではありたせん。 したがっお、自動チェックが導入されおいたす。

  • たず最初に確認したす ARKアセンブリ.
  • たくさん Junit テスト.
  • コヌドカバレッゞを考慮したす、テストを実行しおいるためです。

これらのチェックをどのように実行するかを理解するために、Avito の開発プロセスを芋おみたしょう。

これは次のように図匏的に衚すこずができたす。

  • 開発者はラップトップでコヌドを曞きたす。 ここで統合チェックを実行できたす。コミットフックを䜿甚するか、バックグラりンドでチェックを実行するだけです。
  • 開発者はコヌドをプッシュした埌、プル リク゚ストを開きたす。 そのコヌドを開発ブランチに含めるためには、コヌドレビュヌを通過し、必芁な数の確認を収集する必芁がありたす。 ここでチェックずビルドを有効にできたす。すべおのビルドが成功するたで、プル リク゚ストはマヌゞできたせん。
  • プル リク゚ストがマヌゞされ、コヌドが開発に組み蟌たれた埌は、すべおのサヌバヌが空いおいる倜間など、郜合のよい時間を遞択しお、奜きなだけチェックを実行できたす。

ラップトップでスキャンを実行するのが奜きな人は誰もいたせんでした。 開発者は、機胜が完成したら、すぐにプッシュしおプル リク゚ストをオヌプンしたいず考えたす。 この時点で長いチェックが開始されるず、これはあたり快適ではないだけでなく、開発の速床も䜎䞋したす。ラップトップが䜕かをチェックしおいる間、通垞どおりに䜜業するこずは䞍可胜です。

倜間にチェックを実行するのがずおも気に入りたした。時間もサヌバヌもたくさんあるので、歩き回るこずができるからです。 しかし、残念ながら、機胜コヌドが開発に入るず、開発者は CI で芋぀かった゚ラヌを修正する意欲が倧幅に䜎䞋したす。 朝のレポヌトで芋぀かったすべおの゚ラヌを芋お、い぀かそれらを修正するだろうず定期的に考えおいたした。Jira には今すぐ始めたい玠晎らしい新しいタスクがあるからです。

チェックがプル リク゚ストをブロックする堎合は、十分なモチベヌションが埗られたす。ビルドが緑色になるたでコヌドは開発に入らないため、タスクは完了したせん。

その結果、私たちは次の戊略を遞択したした。倜間に可胜な限り最倧限のチェック セットを実行し、その䞭で最も重芁なもの、そしお最も重芁なこずに、プル リク゚ストで最も高速なものを起動したす。 しかし、そこで止たるわけではありたせん。䞊行しお、チェックの速床を最適化しお、チェックを倜間モヌドからプル リク゚スト チェックに転送したす。

その時点では、すべおのビルドが非垞に早く完了したため、プル リク゚ストのブロッカヌずしお ARK ビルド、Junit テスト、コヌド カバレッゞの蚈算を含めるだけでした。 私たちはコヌド カバレッゞをオンにし、怜蚎したしたが、コヌド カバレッゞは必芁ないず考えたため、コヌド カバレッゞを攟棄したした。

基本的な CI を完党にセットアップするのに XNUMX 日かかりたした (以䞋、掚定時間は抂算であり、スケヌルに必芁です)。

その埌、私たちはさらに考え始めたした。正しくチェックしおいるだろうか プル リク゚ストでビルドを正しく実行しおいたすか?

プル リク゚ストが開かれたブランチの最埌のコミットでビルドを開始したした。 ただし、このコミットのテストでは、開発者が䜜成したコヌドが機胜するこずのみを確認できたす。 しかし、圌らは圌が䜕も壊さなかったこずを蚌明したせん。 実際、機胜が開発ブランチにマヌゞされた埌、開発ブランチの状態を確認する必芁がありたす。

モバむル開発チヌムにおける CI の進化

これを行うために、単玔な bash スクリプトを䜜成したした。 プリマヌゞ.sh:

#!/usr/bin/env bash

set -e

git fetch origin develop

git merge origin/develop

ここでは、開発からのすべおの最新の倉曎が単玔にプルアップされ、珟圚のブランチにマヌゞされたす。 すべおのビルドの最初のステップずしお premerge.sh スクリプトを远加し、必芁なものを正確にチェックし始めたした。 統合.

問題の堎所を特定し、解決策を芋぀けお、このスクリプトを䜜成するのに XNUMX 日かかりたした。

アプリケヌションが開発され、たすたす倚くのタスクが発生し、チヌムが成長し、premerge.sh が時々私たちを倱望させ始めたした。 矛盟する倉曎が開発に入り、ビルドが䞭断されたした。

これがどのように起こるかの䟋:

モバむル開発チヌムにおける CI の進化

XNUMX 人の開発者が同時に機胜 A ず B の䜜業を開始したす。機胜 A の開発者は、プロゞェクト内で未䜿甚の機胜を発芋したした。 answer() そしお、優秀なボヌむスカりトのように、それを取り陀きたす。 同時に、機胜 B の開発者は、ブランチ内のこの関数ぞの新しい呌び出しを远加したす。

開発者は䜜業を完了するず同時にプルリク゚ストをオヌプンしたす。 ビルドが起動され、premerge.sh が最新の開発状態に関する䞡方のプル リク゚ストをチェックしたす。すべおのチェックは緑色です。 その埌、フィヌチャヌ A のプル リク゚ストがマヌゞされ、フィヌチャヌ B のプル リク゚ストがマヌゞされたす...ドヌン 開発コヌドに存圚しない関数の呌び出しが含たれおいるため、開発が䞭断されたす。

モバむル開発チヌムにおける CI の進化

発展しないずきは、 地元の灜害。 チヌム党䜓が䜕かを収集しおテストに提出するこずはできたせん。

たたたた、私は分析、ネットワヌク、デヌタベヌスなどのむンフラストラクチャのタスクに取り組むこずが最も倚かったです。 ぀たり、他の開発者が䜿甚する関数やクラスを䜜成したのは私です。 このため、私も同じような状況に頻繁に遭遇したした。 この写真もしばらく食っおありたした。

モバむル開発チヌムにおける CI の進化

これは私たちには合わなかったため、これを防ぐ方法を怜蚎し始めたした。

開発を䞭断しない方法

最初のオプション 開発を曎新するずきにすべおのプルリク゚ストを再構築したす。 この䟋では、機胜 A のプル リク゚ストが最初に開発に含たれる堎合、機胜 B のプル リク゚ストが再構築されるため、コンパむル ゚ラヌによりチェックが倱敗したす。

これにどれくらいの時間がかかるかを理解するために、2 ぀の PR がある䟋を考えおみたしょう。 1 ぀の PR を開きたす。3 ぀のビルドず XNUMX ぀のチェックの実行です。 最初の PR を開発にマヌゞした埌、XNUMX 番目の PR を再構築する必芁がありたす。 合蚈で、XNUMX ぀の PR には XNUMX 回のチェック実行が必芁です (XNUMX + XNUMX = XNUMX)。

原則的には倧䞈倫です。 しかし、統蚈を芋おみるず、私たちのチヌムの兞型的な状況は 10 個のオヌプン PR であり、チェックの数は進行の合蚈である 10 + 9 +... + 1 = 55 です。぀たり、10 個を受け入れるこずになりたす。 PR の堎合、55 回再構築する必芁がありたす。 そしお、これは理想的な状況であり、最初にすべおのチェックに合栌し、これらの数十件が凊理されおいる間、誰も远加のプル リク゚ストをオヌプンしないずきです。

自分が開発者で、最初に「マヌゞ」ボタンをクリックする必芁があるず想像しおください。隣人がこれを行うず、すべおのビルドが再床完了するたで埅たなければなりたせん...いいえ、それは機胜したせん。 、開発が倧幅に遅くなりたす。

XNUMX 番目に考えられる方法: コヌドレビュヌ埌にプルリク゚ストを収集したす。 ぀たり、プル リク゚ストを開き、同僚から必芁な数の承認を集め、必芁なものを修正しお、ビルドを開始したす。 成功するず、プル リク゚ストは開発にマヌゞされたす。 この堎合、远加の再起動はありたせんが、フィヌドバックは倧幅に遅くなりたす。 開発者ずしお、プル リク゚ストを開いたら、それが機胜するかどうかをすぐに確認したいず思いたす。 たずえば、テストが倱敗した堎合は、すぐに修正する必芁がありたす。 ビルドが遅れるず、フィヌドバックが遅くなり、開発党䜓が遅くなりたす。 これも私たちには合わなかった。

その結果、残ったのは XNUMX 番目の遞択肢だけでした - サむクリング。 すべおのコヌド、すべおの゜ヌスは Bitbucket サヌバヌ䞊のリポゞトリに保存されたす。 したがっお、Bitbucket 甚のプラグむンを開発する必芁がありたした。

モバむル開発チヌムにおける CI の進化

このプラグむンは、プル リク゚ストのマヌゞ メカニズムをオヌバヌラむドしたす。 始たりは暙準です。PR が開き、すべおのアセンブリが起動され、コヌド レビュヌが完了したす。 ただし、コヌド レビュヌが完了し、開発者が「マヌゞ」をクリックするず、プラグむンはどの開発状態に察しおチェックが実行されたかをチェックしたす。 ビルド埌に開発が曎新された堎合、プラグむンはそのようなプル リク゚ストをメむン ブランチにマヌゞするこずを蚱可したせん。 比范的最近の開発のビルドを再開するだけです。

モバむル開発チヌムにおける CI の進化

競合する倉曎を含むこの䟋では、そのようなビルドはコンパむル ゚ラヌにより倱敗したす。 したがっお、機胜 B の開発者はコヌドを修正し、チェックを再開する必芁がありたす。その埌、プラグむンが自動的にプル リク゚ストを適甚したす。

このプラグむンを実装する前は、プル リク゚ストあたり平均 2,7 回のレビュヌを実行しおいたした。 プラグむンでは 3,6 が起動されたした。 これは私たちにぎったりでした。

このプラグむンには欠点があるこずに泚意しおください。それは、ビルドを XNUMX 回しか再起動しないこずです。 ぀たり、競合する倉曎が開発に入る可胜性がある小さなりィンドりがただ存圚したす。 しかし、その可胜性は䜎いため、開始回数ず倱敗の可胜性の間でトレヌドオフを蚭定したした。 XNUMX幎間で点火したのはXNUMX回だけだったので、おそらく無駄では​​なかったでしょう。

Bitbucket プラグむンの最初のバヌゞョンを䜜成するのに XNUMX 週間かかりたした。

新しい小切手

その間、私たちのチヌムは成長を続けたした。 新しいチェックが远加されたした。

私たちは、「防げるのなら、なぜ間違いを犯すのか」ず考えたした。 そしおそれが圌らが実装した理由です 静的コヌド分析。 たずは Android SDK に含たれる lint から始めたした。 しかし、圓時圌は Kotlin コヌドの操䜜方法をたったく知りたせんでした。たた、アプリケヌションの 75% はすでに Kotlin で曞かれおいたした。 したがっお、組み蟌みのものはlintに远加されたした Android Studio のチェック。

これを行うには、倚くの倒錯を行う必芁がありたした。Android Studio を取埗し、Docker にパッケヌゞ化し、仮想モニタヌを䜿甚しお CI 䞊で実行するこずで、Android Studio が実際のラップトップ䞊で実行されおいるず思わせるようにしたした。 しかし、それはうたくいきたした。

私たちがたくさんのこずを曞き始めたのもこの時期でした 蚈枬テスト そしお実装されたした スクリヌンショットのテスト。 これは、別の小さなビュヌに察しお参照スクリヌンショットが生成される堎合であり、テストはビュヌからスクリヌンショットを取埗し、それをピクセルごずに暙準ず盎接比范するこずで構成されたす。 矛盟がある堎合は、どこかでレむアりトが間違っおいるか、スタむルに問題があるこずを意味したす。

ただし、むンストルメンテヌション テストずスクリヌンショット テストは、デバむス (゚ミュレヌタたたは実際のデバむス) 䞊で実行する必芁がありたす。 テストが倚数あり、頻繁に実行されるこずを考慮するず、ファヌム党䜓が必芁になりたす。 独自のファヌムを立ち䞊げるのは劎力がかかりすぎるため、既補のオプションである Firebase Test Lab を芋぀けたした。

Firebase テスト ラボ

これが遞ばれたのは、Firebase が Google 補品であるため、぀たり信頌性が高く、停止する可胜性が䜎いずいう意味です。 䟡栌は手頃です。実際のデバむスの操䜜は 5 時間あたり 1 ドル、゚ミュレヌタの操䜜は XNUMX 時間あたり XNUMX ドルです。

Firebase Test Lab を CI に実装するのに玄 XNUMX 週間かかりたした。

しかし、チヌムは成長を続け、残念ながら Firebase は私たちを倱望させ始めたした。 圓時、圌には SLA がありたせんでした。 Firebase では、テストに必芁な数のデバむスが空くたで埅たされ、垌望どおりにすぐにテストの実行が開始されないこずがありたした。 列に䞊んで埅぀のは最倧XNUMX分かかり、非垞に長い時間でした。 すべおの PR でむンストルメンテヌション テストが実行され、遅延により開発が倧幅に遅れ、その埌、月々の請求額が合蚈額で請求されたした。 䞀般的に、チヌムが十分に成長したため、Firebase を攟棄しお瀟内で䜜業するこずが決定されたした。

ドッカヌ + Python + バッシュ

私たちは Docker を導入し、そこに゚ミュレヌタを詰め蟌み、Python で簡単なプログラムを曞きたした。これは、適切なタむミングで、必芁なバヌゞョンの必芁な数の゚ミュレヌタを起動し、必芁に応じお停止したす。 そしおもちろん、いく぀かの bash スクリプトも必芁です。これらがなければどうなるでしょうか?

独自のテスト環境を䜜成するのに XNUMX 週間かかりたした。

その結果、すべおのプル リク゚ストに察しお、広範なチェックのマヌゞ ブロック リストが存圚したした。

  • ARK アセンブリ。
  • Junit テスト。
  • 糞くず;
  • Android Studio のチェック。
  • 蚈装テスト。
  • スクリヌンショットのテスト。

これにより、起こり埗る倚くの故障が防止されたした。 技術的にはすべおうたくいきたしたが、開発者は結果を埅぀時間が長すぎるず䞍満を蚀いたした。

長すぎるっおどれくらいですか Bitbucket ず TeamCity からのデヌタを分析システムにアップロヌドしたずころ、次のこずがわかりたした。 平均埅ち時間45分。 ぀たり、開発者はプル リク゚ストを開くず、ビルド結果が埗られるたで平均 45 分埅機したす。 私の意芋では、これは倧倉なこずであり、そのように働くこずはできたせん。

もちろん、すべおのビルドを高速化するこずにしたした。

スピヌドアップしたしょう

ビルドがキュヌで埅機しおいるこずが倚いため、最初に行うこずは次のずおりです。 さらにハヌドりェアを賌入したした — 倧芏暡な開発が最も簡単です。 ビルドのキュヌは停止したしたが、䞀郚のチェック自䜓に非垞に長い時間がかかるため、埅ち時間はわずかに枛少したした。

時間がかかりすぎるチェックの削陀

圓瀟の継続的むンテグレヌションは、この皮の゚ラヌや問題を怜出できたす。

  • 行かない。 倉曎の競合により䜕かがビルドされない堎合、CI はコンパむル ゚ラヌを怜出するこずがありたす。 すでに述べたように、そうなるず誰も䜕も組み立おるこずができなくなり、開発が停止し、誰もが䞍安になりたす。
  • 動䜜のバグ。 たずえば、アプリケヌションは構築されたが、ボタンを抌すずクラッシュするか、ボタンがたったく抌されない堎合です。 このようなバグがナヌザヌに届く可胜性があるため、これは問題です。
  • レむアりトのバグ。 たずえば、ボタンをクリックしたが、巊に 10 ピクセル移動したずしたす。
  • 技術的負債の増加.

このリストを芋た埌、最初の XNUMX ぀の点だけが重芁であるこずがわかりたした。 そういった問題をたずは捉えおいきたいず思っおいたす。 レむアりトのバグはデザむンレビュヌの段階で発芋され、その埌簡単に修正できたす。 技術的負債に察凊するには別のプロセスず蚈画が必芁なため、プル リク゚ストではテストしないこずにしたした。

この分類に基づいお、チェックのリスト党䜓を芋盎したした。 糞くずに取り消し線を付けた そしおプロゞェクトの立ち䞊げを䞀晩延期したした。それは、プロゞェクトにどれだけの問題があったのかに぀いおのレポヌトを䜜成するためでした。 私たちは技術的負債に぀いおは別々に取り組むこずに同意したした。 Android Studio のチェックは完党に攟棄されたした。 Docker で Android Studio を䜿甚しおむンスペクションを実行するのは面癜そうですが、サポヌトでは倚くの問題が発生したす。 Android Studio のバヌゞョンを曎新するず、理解できないバグずの戊いが必芁になりたす。 たた、ラむブラリがあたり安定しおおらず、誀怜知があったため、スクリヌンショット テストをサポヌトするこずも困難でした。 スクリヌンショット テストがチェック リストから削陀されたした.

その結果、次のものが残りたした。

  • ARK アセンブリ。
  • Junit テスト。
  • 蚈装テスト。

Gradleリモヌトキャッシュ

厳しいチェックがなければ、すべおが改善されたした。 しかし、完璧には限界がありたせん。

私たちのアプリケヌションはすでに玄 150 の Gradle モゞュヌルに分割されおいたす。 通垞、この堎合は Gradle リモヌト キャッシュがうたく機胜するため、それを詊しおみるこずにしたした。

Gradle リモヌト キャッシュは、個々のモゞュヌル内の個々のタスクのビルド アヌティファクトをキャッシュできるサヌビスです。 Gradle は、実際にコヌドをコンパむルする代わりに、HTTP を䜿甚しおリモヌト キャッシュをノックし、誰かがすでにこのタスクを実行したかどうかを尋ねたす。 「はい」の堎合、結果をダりンロヌドするだけです。

Gradle は Docker むメヌゞを提䟛するため、Gradle リモヌト キャッシュの実行は簡単です。 なんずかXNUMX時間でこれを終えるこずができたした。

Docker を起動しおプロゞェクトに XNUMX 行蚘述するだけで枈みたした。 ただし、すぐに起動できおも、すべおがうたく機胜するたでにはかなりの時間がかかりたす。

以䞋はキャッシュミスのグラフです。

モバむル開発チヌムにおける CI の進化

圓初、キャッシュ ミスの割合は玄 65 でした。20 週間埌、この倀を XNUMX% たで増やすこずができたした。 Android アプリケヌションが収集するタスクには、Gradle がキャッシュを逃したため、奇劙な掚移的な䟝存関係があるこずが刀明したした。

キャッシュを接続するこずで、ビルドが倧幅に高速化されたした。 しかし、組み立おに加えお蚈装テストもあり、それには長い時間がかかりたす。 おそらく、すべおのプル リク゚ストに察しおすべおのテストを実行する必芁があるわけではありたせん。 これを調べるために、圱響分析を䜿甚したす。

圱響分析

プル リク゚ストでは、git diff を収集し、倉曎された Gradle モゞュヌルを芋぀けたす。

モバむル開発チヌムにおける CI の進化

倉曎されたモゞュヌルずそれに䟝存するすべおのモゞュヌルをチェックするむンストルメンテヌション テストのみを実行するのが合理的です。 隣接するモゞュヌルのテストを実行するこずに意味はありたせん。そこにあるコヌドは倉曎されおおらず、䜕も壊れるこずはありたせん。

むンストルメンテヌション テストは、最䞊䜍のアプリケヌション モゞュヌルに配眮する必芁があるため、それほど単玔ではありたせん。 各テストがどのモゞュヌルに属しおいるかを理解するために、バむトコヌド分析によるヒュヌリスティックを䜿甚したした。

関連するモゞュヌルのみをテストするようにむンストルメンテヌション テストの動䜜をアップグレヌドするには、玄 XNUMX 週間かかりたした。

怜査を迅速化するための措眮が奏功した。 45 分から 15 分くらいたで䌞びたした。ビルドに XNUMX 分埅぀のはすでに普通のこずです。

しかし珟圚、開発者たちは、どのビルドが起動されおいるのか、ログはどこで確認できるのか、なぜビルドが赀色なのか、どのテストが倱敗したのかなどがわからないず䞍満を挏らし始めおいたす。

モバむル開発チヌムにおける CI の進化

フィヌドバックに関する問題は開発の速床を䜎䞋させるため、各 PR ずビルドに぀いおできるだけ明確で詳现な情報を提䟛するように努めたした。 たずは Bitbucket で PR にコメントし、倱敗したビルドずその理由を瀺し、タヌゲットを絞ったメッセヌゞを Slack に曞きたした。 最終的に、珟圚実行䞭のすべおのビルドずそのステヌタス (キュヌに入れられおいる、実行䞭、クラッシュたたは完了) のリストを含むペヌゞの PR ダッシュボヌドを䜜成したした。 ビルドをクリックするず、そのログにアクセスできたす。

モバむル開発チヌムにおける CI の進化

詳现なフィヌドバックに XNUMX 週間を費やしたした。

予定

最近の歎史に移りたしょう。 フィヌドバックの問題を解決したこずで、私たちは新たなレベルに到達したした。独自の゚ミュレヌタ ファヌムを構築するこずにしたした。 テストや゚ミュレヌタが倚数あるず、管理が難しくなりたす。 その結果、すべおの゚ミュレヌタヌは柔軟なリ゜ヌス管理を備えた k8s クラスタヌに移行されたした。

この他にも䌁画がございたす。

  • 糞くずを返す (およびその他の静的分析)。 私たちはすでにこの方向に取り組んでいたす。
  • PR ブロッカヌですべおを実行する ゚ンドツヌ゚ンドのテスト すべおの SDK バヌゞョンで。

そこで、Avito における継続的むンテグレヌションの開発の歎史をたどっおきたした。 ここで、経隓豊富な芳点からいく぀かのアドバむスをしたいず思いたす。

СПветы

䞀぀だけアドバむスできるずしたら、次のようになりたす。

シェルスクリプトには気を぀けおください

Bash は非垞に柔軟で匷力なツヌルであり、スクリプトを䜜成するのが非垞に䟿利で高速です。 しかし、それは眠にはたる可胜性があり、残念ながら私たちはその眠に陥っおしたいたした。

すべおは、ビルド マシン䞊で実行される単玔なスクリプトから始たりたした。

#!/usr/bin/env bash
./gradlew assembleDebug

しかし、ご存知のずおり、時間の経過ずずもにすべおが発展し、より耇雑になっおいきたす。あるスクリプトを別のスクリプトから実行しお、そこにいく぀かのパラメヌタヌを枡したしょう。最終的には、珟圚 bash のネストがどのレベルにあるのかを決定する関数を曞かなければなりたせんでした。必芁な匕甚笊を挿入しお、すべおを開始したす。

モバむル開発チヌムにおける CI の進化

このようなスクリプトの開発にかかる人件費は想像できるでしょう。 この眠に陥らないようにアドバむスしたす。

䜕が眮き換えられたすか?

  • 任意のスクリプト蚀語。 曞き蟌み先 Python たたは Kotlin スクリプト スクリプトではなくプログラミングであるため、より䟿利です。
  • たたは、すべおのビルドロゞックをフォヌムに蚘述したす カスタムgradleタスク あなたのプロゞェクトのために。

私たちは XNUMX 番目のオプションを遞択するこずに決め、珟圚、すべおの bash スクリプトを䜓系的に削陀し、倚くのカスタム Gradle タスクを䜜成しおいたす。

ヒント #2: むンフラストラクチャをコヌドに保存したす。

継続的むンテグレヌション蚭定は、Jenkins や TeamCity などの UI むンタヌフェむスではなく、テキスト ファむルの圢匏でプロゞェクト リポゞトリに盎接保存される堎合に䟿利です。 これによりバヌゞョン管理が可胜になりたす。 コヌドをロヌルバックしたり、別のブランチにビルドしたりするこずは難しくありたせん。

スクリプトはプロゞェクトに保存できたす。 環境をどうするか

ヒント #3: Docker は環境を敎えるのに圹立ちたす。

Android 開発者にずっおは間違いなく圹立ちたすが、残念ながら iOS にはただありたせん。

これは、jdk ず android-sdk を含む単玔な docker ファむルの䟋です。

FROM openjdk:8

ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip" 
    ANDROID_HOME="/usr/local/android-sdk" 
    ANDROID_VERSION=26 
    ANDROID_BUILD_TOOLS_VERSION=26.0.2

# Download Android SDK
RUN mkdir "$ANDROID_HOME" .android 
    && cd "$ANDROID_HOME" 
    && curl -o sdk.zip $SDK_URL 
    && unzip sdk.zip 
    && rm sdk.zip 
    && yes | $ANDROID_HOME/tools/bin/sdkmanager --licenses

# Install Android Build Tool and Libraries
RUN $ANDROID_HOME/tools/bin/sdkmanager --update
RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" 
    "platforms;android-${ANDROID_VERSION}" 
    "platform-tools"

RUN mkdir /application
WORKDIR /application

この Docker ファむルを䜜成し (秘密をお教えしたす。䜜成する必芁はありたせんが、既成のファむルを GitHub からプルするだけです)、むメヌゞをアセンブルするず、アプリケヌションを構築できる仮想マシンが埗られたす。そしお Junit テストを実行したす。

これが理にかなっおいる䞻な理由は、スケヌラビリティず再珟性の XNUMX ぀です。 docker を䜿甚するず、以前のものずたったく同じ環境を持぀ XNUMX 個のビルド ゚ヌゞェントをすばやく起動できたす。 これにより、CI ゚ンゞニアの䜜業が倧幅に楜になりたす。 android-sdk を docker にプッシュするのは非垞に簡単ですが、゚ミュレヌタの堎合は少し難しくなりたす。少し苊劎する必芁がありたす (たたは、完成したものを GitHub から再床ダりンロヌドする必芁がありたす)。

ヒントその 4: 怜査は怜査のために行われるのではなく、人々のために行われるこずを忘れないでください。

開発者にずっお、䜕が壊れたのか、どのテストが倱敗したのか、ビルドログはどこで確認できるのかなど、迅速か぀明確なフィヌドバックが非垞に重芁です。

ヒント #5: 継続的むンテグレヌションを開発するずきは、珟実的になっおください。

どのような皮類の゚ラヌを防止したいのか、どのくらいのリ゜ヌス、時間、コンピュヌタ時間を費やしおもよいのかを明確に理解したす。 たずえば、時間がかかりすぎるチェックは䞀晩延期される可胜性がありたす。 そしお、それほど重芁ではない゚ラヌをキャッチしたものは完党に攟棄されるべきです。

ヒント #6: 既補のツヌルを䜿甚したす。

珟圚、クラりドCIを提䟛する䌁業は数倚くありたす。

モバむル開発チヌムにおける CI の進化

これは小芏暡なチヌムに適した゜リュヌションです。 䜕もサポヌトする必芁はなく、少額のお金を支払うだけでアプリケヌションを構築し、むンストルメンテヌション テストを実行するこずもできたす。

ヒント #7: 倧芏暡なチヌムでは、瀟内゜リュヌションの方が収益性が高くなりたす。

しかし、遅かれ早かれ、チヌムが成長するに぀れお、瀟内゜リュヌションの収益性はさらに高たるでしょう。 これらの決定には XNUMX ぀問題がありたす。 経枈孊には収穫逓枛の法則がありたす。どのプロゞェクトでも、その埌の改善はたすたす困難になり、より倚くの投資が必芁になりたす。

経枈孊は、継続的むンテグレヌションを含む私たちの生掻党䜓を衚したす。 継続的むンテグレヌションの開発の各段階の人件費のスケゞュヌルを䜜成したした。

モバむル開発チヌムにおける CI の進化

改善がたすたす困難になっおいるこずは明らかです。 このグラフを芋るず、チヌム芏暡の成長に応じお継続的むンテグレヌションを開発する必芁があるこずがわかりたす。 50 人のチヌムにずっお、内郚゚ミュレヌタ ファヌムの開発に XNUMX 日を費やすのは平凡なアむデアです。 しかし同時に、倧芏暡なチヌムの堎合、継続的むンテグレヌションをたったく行わないこずも悪い考えです。統合の問題やコミュニケヌションの修正などが必芁になるからです。 さらに時間がかかりたす。

私たちは、人はお金がかかり、間違いを犯し、怠け者であるため、自動化が必芁であるずいう考えから始めたした。 しかし、人々は自動化もしたす。 したがっお、すべお同じ問題が自動化にも圓おはたりたす。

  • 自動化には費甚がかかりたす。 分嚩スケゞュヌルを芚えおおいおください。
  • 自動化に関しおは、人は間違いを犯したす。
  • すべおがそのように機胜するため、自動化するのが非垞に面倒になる堎合がありたす。 なぜ他のものを改善する必芁があるのでしょうか、なぜこのような継続的むンテグレヌションを行う必芁があるのでしょうか?

しかし、統蚈があるず、アセンブリの 20% で゚ラヌが怜出されたす。 これは、開発者のコ​​ヌドの曞き方が䞋手だからではありたせん。 これは、開発者が䜕らかの間違いを犯した堎合、それは開発に終わらず、自動チェックによっお発芋されるず確信しおいるためです。 したがっお、開発者は、䜕かをロヌカルで実行しおテストするよりも、コヌドや興味深いものの䜜成により倚くの時間を費やすこずができたす。

継続的むンテグレヌションを実践したす。 ただし、ほどほどに。

ちなみに、ニコラむ・ネステロフ氏は自ら玠晎らしい報告を行うだけでなく、プログラム委員䌚のメンバヌでもありたす。 アプリカンファレンス 他の人があなたのために有意矩なスピヌチを準備できるよう支揎したす。 次回の䌚議プログラムの完党性ず有甚性は、次のトピックによっお評䟡できたす。 スケゞュヌル。 詳现に぀いおは、22 月 23  XNUMX 日に Infospace にお越しください。

出所 habr.com

コメントを远加したす