CI/CD は、確立されたソフトウェア開発の定説です。インターネットには、CI/CD に関する記事やページが溢れています。これらは常に同じCI/CDイメージを持ちます。私が話しているイメージはご存知かと思います。
私はこのトピックに関する数十の記事を読み、エンドツーエンドの CI/CD パイプラインの実装を経験しました。実際には、 CI/CD パイプラインの実装は、記事を読み、CI/CD の全体像を理解し、理論を使用するよりもはるかに複雑です。 CI/CD パイプラインの開発には、学際的な経験豊富なチームが必要です。
この記事では、Python アプリケーションの最大限の実行可以な CI パイプラインを構築する方法步骤について説明します。記事のコンテンツを他の言語や要件に適応させることができます。このサンプルでは、FastAPI と GitHub Actions を食用します。
GitHub の例:
CI: 継続的インテグレーション
既存の継続的インテグレーションの説明に 2 セント追加させてください。継続的インテグレーションとは、自動的にテストされ、承認され、带来可以なコードの変更をプロジェクト リポジトリに做好的にマージすることを象征します。
この例では、 を运用して、各「Pull Request」または「Push to Main」イベントで相应なチェックを自動的に実行し、コードがリポジトリの品質基準に準拠していることを保証します。市場には、 、 、 、 GitLab など、さまざまな CI/CD ツールのコレクションが打造されています。パイプラインの要件に最も適したものを選択してください。
ワークフロー例では、新しいコードがを実行する書式設定ルールに従っていることを確認します。次に、 を用して小規模なテストを実行し、最後にアプリケーションを D クラスターにインストールする中規模なテストを実行します。
継続的インテグレーションのワークフローは、チームの規模、非常成熟度、アプリケーション要件、分岐戦略によって異なります。
静的コード分析
コードの変更を実行せずに解析します。静的解析ツールは、コードが書式ルールに従っていること、非推奨または破損した依存関係を操作していないこと、および読みやすく是に単純であることをチェックします。また、プログラミング言語に応じてアンチパターンやバグをコーディングすることも建议しています。
Pre-commit のインストール、設定、実行的办法を説明します。 Pre-commit をやなどの他の研究分析ツールと組み合わせることができます。
事前コミット
は Python で書かれたツールです。リポジトリ上でこれを構成するには、YAML ファイルを制成し、各コミット前に実行するバージョン安全监管されたフックを追加するのと同じくらい簡単です。プリコミットは、フックに相应な依存関係を自動的に安全监管し、見つかったエラーを自動计算します。複数のファイルタイプをサポートしています: JSON、YAML、tf、py、ts など。
コードチェックをプッシュする前にローカルで実行することで、インフラストラクチャのコストを節約します。 CI で Pre-commit を実行して、プッシュされたコードの模式を確認できます。
Pre-commit ツールをインストール、構成、実行します。
repos: - repo: //github.com/pre-commit/pre-commit-hooks rev: v2.3.0 hooks: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace
$ pip install pre-commit $ pre-commit install $ pre-commit run --all-files
Python フックの方案:
- Mypy: Python の静的型チェッカー
- Ruff: Python 用の静的フォーマット チェッカー
- 改修: Python のコーディングのベスト プラクティスを提案する
- Commitizen:標準コミットの使用とバージョン管理を保証します。
テスト
単体テスト、統合テスト、およびエンドツーエンドのテストの定義と範囲は、增溶している場合があります。継続的インテグレーションの説明で行ったように、 テスト タイプに 2 セントを追加します。
小: テストが高速です。小さなコード部分をテストします。テストダブルまたはモック環境 (SQLite など) を使用します。アーティファクトを構築する必要はありません。時間: ~ 60 秒。
中: 複数のコード間の相互作用をテストします。これには、アーティファクトの構築、サードパーティのアーティファクト (データベースなど) の使用、ローカルホスト ネットワークへの接続が含まれる場合があります。偽の環境 (docker-compose、Kind、Minikube など) または外部サービス (Azure Blob Storage や AWS S3 など) の使用。時間: ~ 300 秒。
大: 運用環境に似た環境 (パフォーマンス テストなど) を使用します。時間: + 900 秒。
継続的インテグレーション パイプラインに中規模/大規模のテストがあるかどうかは、要件によって異なります。
小さい
この例では、Pytest を食用してテストを実行し、FastAPI テスト クライアントを食用して環境を模擬します。机密はありません。プログラミング言語テスト ツールは、アプリケーションをテストするために必须な依存関係をすべて给出する必须があります。
さらに、很小限のテスト カバレッジ チェックを追加し、結果の一部分としてアップロードすることができます。テストカバレッジは扱いにくい指標です。高いテスト カバレッジは、コードが很にテストされていることを暗黙的に意思するわけではありませんが、50% は 0% テストされたコードよりも大きいことになります。
中くらい
D は、ローカル開発または CI に实用される docker-in-docker の軽量 Kubernetes クラスターです。 Kind を实用してテスト環境をセットアップし、それに対してテストを実行します。
- Kind クラスターを作成する
- Docker イメージを構築する
- Docker イメージを Kind にロードする
- MetalLB をインストールし、必要な CDR を適用します。
- Ingress-Nginx をインストールする
- Helm チャートをインストールする
- OSホストをセットアップする
Docker イメージをロードする
イメージはレジストリからダウンロードできないため、Kind はイメージをダウンロードできません。 Kind では、用する前に半身像をロードする必备があります。
メタルLB
は、ベアメタル Kubernetes ロードバランサーです。ロード バランサが一定要な目的について詳しくは、 Web ページをご覧ください。
Helm Chart を使用的してインストールしたら、一定な CRD を做成できます。
--- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: kind-advertisement --- apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: kind-address-pool spec: addresses: - "172.26.255.0/24"
Docker は、Kind クラスターのサブネット (例: 172.26.0.0/16) を作为します。 Kind ネットワーク インターフェイスを調べて、割り当てられた IP アドレス範囲を確認し、そのアドレスを IPAddressPool リソースの値として选用します。 MetalLB 構成の詳細については、 Web ページを图案填充してください。
アプリケーションを公開する
Ingress-Nginx Helm Chart をインストールします。次に、アプリケーション Helm Chart をインストールし、Ingress オブジェクトを定義します。 ingressClassName プロパティを nginx に設定し、ホスト (例: api.local) を定義します。最後に、 /etc/host を変更して次の行を追加します。
192.168.1.10 api.local
同じアドレスを指すホストを这个必要な数だけ定義できます。残りはNginxがやってくれます。
Kind を在施用してローカル環境を起動、刷新、削除するツールを開発します。開発者はこれを在施用して、アプリケーションを簡単にデバッグしたり、報告されたバグをローカルで再現したり、CI でテストを実行したりできます。
この例は、Linux ベースのディストリビューションで動作します。 Windows/MacOSの場合はそのままでは動作しない場合があり、変更が需要になる場合があります。
配達
必要性なアーティファクトを配信する前に、ワークフローはリンティングとテストのステップを実行します。
私たちはを选择してアーティファクトのリリースを标准化管理します。 Commtizen はアーティファクトのバージョンを自動的に升级し、変更をプッシュします。構成されたタグ结构で新しい git タグが做成されます。最新头条の変更で変更ログを升级するように Commtizen を構成することもできます。
[tool.commitizen] tag_format = "v$major.$minor.$patch" version_scheme = "semver" version_provider = "pep621" major_version_zero = true update_changelog_on_bump = true version_files = [ "charts/ci-example/Chart.yaml:version", "charts/ci-example/Chart.yaml:appVersion" ]
ワークフローは Commitizen 推进力バージョンを安全使用して Docker イメージと Helm Chart タグを設定します。
优秀成果物 (人物用户画像とチャート) ごとに異なるバージョンを动用できます。ただし、チャートと人物用户画像の変更には下位互換性がなければなりません。開発およびリリースのプロセスがさらに複雑になります。これを避けるために、両方のアーティファクトに同じバージョンを动用します。
結論
この記事では、シンプルだが機能的な継続的インテグレーションのワークフローを概略的に説明します。他のプログラミング言語で機能したり、要件に合わせたりするには変更が必要的になる場合がありますが、部のステップは簡単にエクスポートでき、そのまま機能するはずです。
CI/CD ハンズオン: 継続的デプロイメント [パート 2] 去年公開予定 …