最後の 365 日、私たちは 1 週間本番環境への変更を展開し続けるという苦渋の決断を下しました.
それがBasecampにあるかどうかにかかわらず、正確に行われている.
発行の大意で、1週間はそれほど長くはありません。 それにもかかわらず、私たちにとっては、それは崇拝され、目に見える殺害を使用していないと感じました。 私たちは継続的に繰り返し、毎日の基盤にいくつかの変更を加えています。 実際には、純粋に管理されたプロバイダーを使用することの利点の 1 つです。 私たちは製品の更新ライフサイクルを処理しますが、ユーザーにとっては非常に明確です。 修正や改善を 1 週間プッシュしないと… 不自然に感じました.
では、なぜ Web を作成したのでしょうか? 簡単に言うと、CI が信頼できなくなりました。 ゆったりとした、非決定論的で、不安定で、不機嫌です。 それがのろのろした子供を崇拝するなら、それはそれが感じた地図についてです. 私たちの CI パイプラインはその重みに耐えられず、信頼を失いつつありました.
Tinybird チームは大きく成長しました (そして無関心は – )私たちの一員になりましょう!)。 チームはより多くのコードを作成しており、コードベースが成長したため、テスト スイートも成長しました。 Tinybird の立ち上がりは、この進行をさらに加速させます。 そして、自分が構築したものをそのようなライフスタイルで好むものを見つけようとしてプラグインする可能性は低いと思われますが、悲しいことに、それには技術的負債が伴います。
スイッチを本番環境にデプロイするのに何時間もかかるようになりました。 CI の実行はそれほど長くはありませんでした。 延期された基盤を追跡するのに何時間も費やし、最も注目を集めて、障害がコードの切り替えに関連付けられなくなったことを理解しましたが、CI 環境によって引き起こされたランダムな障害でした。 これにより膨大な量の時間 (および正気!) が無駄になりました
。
迅速に反復したい場合、これを崇拝することはできませんでした.
「CI を修正してから出荷します」
そこで、1 週間、 「CI を修復してから出荷する」という変わったマントラがありました
間違いなく、答えは少しぎらぎらしたものになりましたが、適切な形式ですか?
」少数のプロセス/スレッド/スタッフを備えた少数のコンテナーを備えた少数のマシンで、いくつかのジョブを並行して実行できる CI プロバイダーを実行してください。”
一般的なマップは…
地図が古くなることはありません.
だから私たちは:
テスト: pytest-xdist または pytest-parallel 仕事 : いくつかのジョブを並行して実行できるようにする CI プロバイダーを実行します。 ここで、switch の形式を考慮してジョブを回収します: ui、backend、docs など。 試験の形式: 統合、単元、e2e など。 環境の形: Python、ClickHouse などのさまざまなバリエーションをテストします パイプライン : 「自動スケーラブル」ジョブランナーを実行します
並列化も可能なクラスに試験をグループ化しました。
CI の方向性がやや規則的になりました: MR のすべてのコミットは、多数のジョブで構成される GitLab パイプラインをもたらしました。 これらのジョブは、最大 21 ノードの自動スケーリング Kubernetes クラスターで連続して発生し、オーケストレーターは、ジョブごとの必須リソースを考慮して異常なノードを連続して発生させます。
GitLab での CI の方向性. の CI 方向がわずかに規則的になりました。 自動スケーリングの k8s クラスターと、リソースを割り当てるオーケストレーターで動作する大量のジョブを含む GitLab パイプライン。中程度で不安定な試験の分数は、ほぼずっと前でした.
仕事を達成しました.
/endblog
「CI パイプラインは、時間の経過とともに最も注目を集めるものが劣化する可能性があります。」
それほど速くはありません.
数か月後、私たちは振り出しに近づいていました。
チーム、コードベース、およびテスト スイートは開発を続けました。 ロケット船を愛で離陸する商品になりました。 私たちはより多くのデータを処理し、より高度なテル状況に対応し、驚異的な側面を送り続けていました。
CI を修復する以前の試みでは、根底にある誠実さを処理できなかったことが明らかになりました。
成功した CI ストリークの実行時間は、前の 12 分間上昇傾向にありました。そして、仕事の成功は、やはり非決定論的になりました。 10回の実行のうち約4回は失敗し、その後は単にジョブをやり直した後に勝利を収めました.
CI パイプラインの修復に失敗しました。 テストはまたもや怠惰で、10回のうち4回は失敗しました。時間。
まじめに、ボブ。私たちの CI で、正直者の先延ばしにされた基盤を作り上げます。
それにもかかわらず、ここに消費があります。
私たちの CI は 数十億 を生産するようになりました*) 丸太の系統。 そのすべてを手動でトロールするつもりはまったくありませんでした.
私たちは有名なデータです.
私たちの三原則 あなたが必要とする支配的なもの何があっても、データだけを赤くすることができるようにします。 データがなければ、あなたは完全に盲目です。 第二のことそのデータに対する可観測性が必要になります。 さらにデータをサルベージすることもできますが、サルベージを正確に調べていないため、無関心であり、完全に盲目です (さらに悪いことに、誤解されています)。
最後に、データは高速であることが望まれます。 データがクエリ可能になるまでに 5 分かかる場合、またはクエリが Web よりも数分かかる場合は、マップの開発者の時間を無駄にしているだけです.
Tinybirdの活用CI パイプラインを半分に減らします
幸いなことに、Tinybird で構築している製品は、スケーラブルで正確な時間分析プラットフォームです。つまり、この仕事に最も注目を集める可能性のあるフォーム ツールがあったということです。
うーん、
ペットフード。
ステップ 1: CI テレメトリ データを Tinybird に送信する
まず、すべての事実を収集することから始めます。 上で説明したように、私たちの CI ジョブは膨大な量の Web を使用しています。 この量を維持したいと考えていましたが、より多くのインフラストラクチャを整理して管理すること (すべての要素にもかかわらずサーバーレス製品を構築している) や、ロギング エージェントを崇拝するガジェットを追加して CI 環境をさらに複雑にすることに魅力を感じていませんでした。またはライブラリ。
そこでTinybirdを利用しました機会 API 。これは、POST 要求から高頻度で JSON データを取り込む履歴 HTTP エンドポイントです。 Pythonを使っているので、組み立てるスキルはすでにあります JSON ペイロード および送信 異常な依存関係を導入することなく POST リクエスト
Tinybird の機会 API – 歴史的な HTTP エンドポイント – 高頻度の CI テレメトリ ログを Tinybird に送信します。
pytest から Tinybird へのデータの送信が簡単になりました。 Pytest はいくつかのフックを提供していますが、実際にはそのうちの 1 つが です。 pytest_terminal_summary. そのフックのオーバーライドを作成しただけですこのコードを崇拝しますスニペット . 簡単で効率的。 これにより、パイプラインがスリムに保たれ、顕著なレイテンシが追加されることはなくなります.
ステップ 2: 事実を調査するための SQL を記述します
Tinybird での CI テレメトリ データのタッチダウンにより、さまざまな形式の予測と視覚化の実験を開始しました。 ビジュアライゼーションを Grafana で作成しました。これは、既に説明済みであるためです Tinybird API と適切に統合されます.
私たちのチームは、Tinybird の事実を分析して SQLパイプ
、そして、「何を表示するか」と「どのように表現できるか」についての予備的な仮定が、特に適切な形式ではないことに出くわしました。 さまざまなクエリのプロトタイプを作成し、さまざまなグラフを使用して最終的に Grafana に到達することを視覚化するさまざまな方法を検討しました。 株はパイになり、バーはテーブルになりました.このソリューションの素晴らしさは、私たちが協力して迅速に反復できることです. SQL は Tinybird に組み込まれていたため、同じ適切な判断を再利用してさまざまなグラフを作成し、重複を作成する必要はありません。 事実は現代的になり (現在、CI の実行からクイズの準備までの全体のレイテンシは最大 1 2d ではありません)、クエリは瞬時に実行されました (<100 ミリ秒)。
私たちは古い顕微鏡𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺