過去のブログでは,CircleCIで反应本地相机のビルドを最適化する方法について説明しました。この取り組みで得た教訓は,メンテナンスの担当者が最適化できることも認識していなかったことです。私のすべての説明は,CircleCIドキュメントで参照できますが,何を知らないかを知っていないことには,何も始めることはできません。このブログでは,CircleCIのあらゆるプロジェクトで利用できる多くの最适化机能について说明します。

ビルドの时间は贵重です。特に,予算が限られているオープンソースプロジェクトであれば尚更です.CircleCIのドキュメントでも最適化について詳しく説明していますが,競合他社とは一線を画するCircleCIプラットフォームのさまざまな機能を知っていただくために,ブログを書くことにしました。

次のほぼすべての機能は,プライベートプロジェクトでもパブリックプロジェクトでも,すべてのユーザーが無料で利用いただけます。有償プランで利用できる機能はマークされています。できるだけ多くのプロジェクトに対して公关(プルリク)を開きたいと思っていますが,それは実用的ではないかもしれません。次善の策は,皆さんが自分で実行できるようにする知識とリソースを身に付けてもらうことだと思います。

最适化机能

CircleCIには,开発者がビルドとデプロイを高速化するために使用できる多くの机能があります。

依存関係のキャッシュ

Diagram-v3-Cache.png

CircleCIシステムのすべてのジョブは,新しいフレッシュな環境でスピンアップされます。これは,過去のジョブや予期しない動作による影響を避けるためです。しかし,このため、同じジョブをその後で実行する場合でも、同じ依存関係を再度ダウンロードする必要があります。

この问题を解决するため,依存関係のキャッシュ機能が提供されています。プロジェクトの依存关系をキャッシュして,ビルドプロセスを剧的に高速化できます。

たとえば,Node.js的アプリケーションをビルドする场合,node_modulesをキャッシュします。キャッシュをキーとして保存すると,キーに使用できるテンプレートをいくつも利用できます。

次の例では,package_jsonのSHA256を含むキーにnode_modulesフォルダをキャッシュしています。このように,依存関係が変更されるとキャッシュキーも変更され,その後,新しい依存関係には新しいキャッシュが作成されます。package.lockまたはyarn.lockファイルのチェックサムを使用することを選択する場合があります。

版本:2.1作业:my-job: executor: my-executor步骤:- checkout - restore_cache: keys: - v1-dependencies-{{checksum”包。json"}} - v1-dependencies- #回退缓存- run: yarn - save_cache: key: v1-dependencies-{{checksum "包。路径:- node_modules

詳細と例については,CircleCIのドキュメントを参照してください。

ワークスペース

Diagram-v3-Workspaces.png

上记のセクションで述べたように,システム内のすべてのジョブは,新しいフレッシュな环境でスピンアップされます。ワークフローのジョブ间でファイルとアーティファクトを共有する场合,ワークスペースを使用できます。ワークスペースを使用すると、作業を 1 つのジョブから次のジョブに簡単に転送して、重複作業を回避できます。

次の例では,バイナリビルドと码头工人イメージビルドを別のジョブに分けています。リポジトリのクローンを再作成したり,ビルドをやり直したりするのを避けるために,ワークスペースから必要なファイルを転送しています。

版本:2.1工作:我-集结工作:执行人:我的执行人步骤: - 结帐 - 运行:去构建-o APP_NAME CMD / ** / *去 -  persist_to_workspace:根:。路径: -  Dockerfile  -  CMD  - 内 -  go.mod  -  go.sum我-搬运工岗位:执行:我,其他执行人步骤: -  attach_workspace:在:- 运行:搬运工构建-t TAG_NAME。

詳細と例については,CircleCIのドキュメントを参照してください。

以前に作成した码头工人イメージを再利用する

とりわけ,ワークスペースは,ビルドした码头工人イメージをジョブ間で転送するときに役立ちます。多くのお客様がCircleCIプラットフォームで码头工人のビルドを行っており,码头工人イメージのビルドとテストを別々のジョブに分けている場合もあります。

码头工人保存および码头工人负载コマンドを使用して,保存したイメージを転送できます。

この例では,最初のジョブで泊坞イメージをビルドし,ワークスペースに保存する前にdocker-cache / image.tarに书き込んでいます。次のジョブはそのワークスペースをアタッチし,イメージとテストスイートの両方を実行する前にイメージをロードします。

步骤:- checkout - setup_remote_docker - run: name: Build and Save Docker Image命令:| Docker Build -t MY_APP:MY_TAGMY_APP:MY_TAG - persist_to_workspace: root:。步骤:- attach_workspace: at:。- run: name: Load, run Docker Image and Tests命令:| Docker Load < Docker -cache/ Image .tar Docker run -d -p 8080:80 MY_APP:MY_TAG mvn test - dhost =http://localhost:8080

カスタム码头工人イメージの执行人

自Dockerfile

CircleCIのプラットフォームはさまざまな実行環境を提供していますが,そのうちの1つが码头工人です。さまざまなフレームワークと言語に対応し,すぐに使えるイメージをCircleCIは提供しています。多くの場合,これらのイメージをスタートポイントとしてご利用いただけます。ただし,非常に高度で複雑なユースケースの場合,遗嘱执行人として使用する独自のカスタム泊坞窗イメージを簡単に作成できます。

カスタムイメージを使用することにより,必要なすべての依存関係と必要なその他の設定を組み込んで環境を事前に構築できます。码头工人中心デフォルトではからイメージを取得しますが,他のソースから(認証して)取得する必要がある場合は,コンフィグで簡単に変更できます。完全修飾のURLを必ず指定してください。

版本:2.1工作:构建:docker: -图像:码头。标签验证:用户名:$QUAY_USER密码:$QUAY_PASS

詳細と例については,CircleCIのドキュメントを参照してください。

テストの分割と並列処理(性能プランとオープンソースLinux)

测试并行化

また,CircleCIのプラットフォームでは,テストを分割して並列処理することもできます。テストを分割し、異なるワークロードを並行実行することにより、テスト全体に要する時間を劇的に削減できます。組織で並列処理できるワークロードが 1 倍以上であれば、並列処理する意味があります。Free プランのオープンソース組織は、Linux/Docker ビルドで最大 4 倍の並行処理を実行でき、Performance プランのお客様は、多くのリソースを使用するため、すべての Executor の並行実行をスケーリングできます。チームで使用できるリソースを増強することを検討されている場合には、CircleCIの担当者にお問い合わせください

詳細と例については,CircleCIのドキュメントを参照してください。

構成可能なリソース(性能プラン)

泊坞窗执行人尺寸

デフォルトでは,すべての実行環境は,ミディアムサイズで実行されますが,遗嘱执行人のタイプによってこれは異なります。ただし,CircleCIプラットフォームを使用すると,ユーザーは自分のビルドにさまざまなリソース(个vCPUとRAM)を柔軟に構成できます。

多くのリソースを必要としないジョブもあるため,小規模な码头工人コンテナを選択し,コンピュートとクレジットを節約できます。しかし,2超大以上のコンテナを使用する利点のあるジョブもあります。どのような场合であっても,ワークロードの需要を満たすようにCircleCIを构成できます。

この例では,ビルドで超大リソースクラスを使用するように指定しており,8つの个vCPUと16 GB的RAMのを自由に使用できます。コンフィグを1行変更するだけでこの指定は完了します。

版本:2.1 jobs: build: docker: - image: circleci/node:10.15.1-browser resource_class: xlarge steps: #…这里的步骤

码头工人レイヤーキャッシュ(性能プラン)

Docker层缓存输出

码头工人イメージをビルドされる場合,码头工人レイヤーキャッシュと呼ばれる優れた機能を利用できます。アプリケーションの依存関係をキャッシュするのと同じように,码头工人イメージレイヤーをキャッシュして,その後の码头工人イメージのビルドを高速化できます。

この机能を最大限に活用するには,常に変化する项目(たとえば,ソースコードのCOPYやADDなど)をDockerfileの下部に配置し,最も変化しない项目を上部に配置します。

このキャッシュ機能は,YAMLにキーを追加するのと同じくらい簡単に使用できます。リモート码头工人で码头工人执行人を使用する場合には,以下のようになります。

工作:构建:执行人:我的执行人步骤: - 结帐 -  setup_remote_docker:docker_layer_caching:真#...这里的其他步骤

また,遗嘱执行人を使用する場合には,以下のようになります。

工作:构建:机器:真正的docker_layer_caching:真正的步骤:#…这里的步骤

詳細と例については,CircleCIのドキュメントを参照してください。

便利な機能

ビルド時間を最適化する機能に加えて,生産性を高め,開発者の全体的なエクスペリエンスを向上させるのに役立つ多くの便利な機能も利用できます。

再利用可能なコンフィグとorb(パラメーター付き)

1年前に,CircleCIでは圆球と再利用可能なコンフィグをリリースしました。新しい2.1のコンフィグを使用すると,再利用可能なジョブ,执行程序,コマンドをパラメーターにして,プロジェクト内だけでなくプロジェクト间や组织全体で定义して利用できます。これには,いくつか利点があります。

  • 一度定義したコンフィグを再利用できます。これは,执行程序,ジョブ,およびコマンドを定义または确立して,共有し,信頼できる唯一のソースとして圆球で管理するチームにとって最适です。パラメーターを使用すると,さまざまな入力を同じジョブまたはコマンドロジックで利用して,再利用性を最大限に高めることができます。
  • 車輪を再発明が不要になります。たとえば,AWSは広く使用されているクラウドサービスプロバイダーです。たとえば,AWS ECSにデプロイしているのであえば,他のユーザーも同じような操作を実行しているのです。同じコンフィグであるのに再度記述するのは,合理的ではなく,不要であることに気が付くでしょう。
  • orbはコードと同じように維持できます。orbはYAMLにパッケージングされているため,他のコードと同様にバージョン管理,テスト,およびリリースできます。つまり,開発者はこのプロセス全体を自動化して追跡でき,orbを利用するために新しい言語やフレームワークを習得する必要はありません。

次の例では,ファイルをAWS S3にデプロイしています.AWS CLIを更新するため,コンフィグで多くのコード行を记述し,これを构成し実行する代わりに,5行だけで済むようになりました.Orbsを「インポート」するために2行を记述し,次に,圆球を使用するために3行(引数付き)を记述するだけです。

宝珠:# “导入” 宝珠AWS-S3:circleci/aws-s3@1.0.8工作:部署:泊坞窗: - 图像:circleci / Python的:2.7的步骤: -  attach_workspace:在:-  AWS-S3 /同步:#使用来自上述球体。于:my_awesome_bucket

詳細と例については,CircleCIのドキュメントを参照してください。

データベースとサービス

自分のテストでデータベースをスピンアップできることを知っていますか吗?また,他のサービスイメージもスピンアップできることを知っていますか吗?码头工人の下にある最初のイメージの后で指定される任意のイメージは,サービスイメージとみなされます。プライマリ実行コンテナと同じネットワークでスピンアップされます。

次の例では,プライマリコンテナでアプリケーションをテストするためにPostgres的データベースをスピンアップしています。デフォルトでは,名前を指定しなければ,本地主机からコンテナにアクセスできますが,ホスト名前を指定して,使用することもできます。

工作:构建:泊坞窗:#主要实施者 - 图片:circleci / OpenJDK的:11.0.3-jdk的拉伸#依存服务(S) - 图片:Postgres的:10.8名称:Postgres的#可以通过Postgres的访问:5432环境:POSTGRES_USER:Postgres的POSTGRES_PASSWORD:Postgres的POSTGRES_DB:Postgres的

リソースにフルアクセスできる执行人を使用している场合は,他の仮想マシンと同様に単纯に扱い,多克尔コンテナのネットワークをスピンアップできます。

工作:构建:机:真正的步骤: - 运行:码头工人,组成了#或 - 运行:运行搬运工-d -p 5432:5432 -e POSTGRES_USER = Postgres的Postgres的 - 运行:运行搬运工-p -d 8080:80 my_app应用:MY_TAG#...等。

詳細と例については,CircleCIのドキュメントを参照してください。

インサイトとテストサマリー

大規模なテスト群を実行していますか吗?JUnit XML形式のファイルを解析してデータを保存するテストサマリー機能をCircleCIは提供しています。これにより,以下を確認できます。

  • テストサマリー:工作细节ページの上部に,実行したテストの数とすべてのテストにパスしたかどうかの概要が表示されます。いずれかのテストに失敗すると場合,失敗したテストが表示され,すぐに出力を参照できます。重要な情報に迅速にアクセスでき,便利性が高くなっています。
  • インサイト: CircleCIではこれらのテストサマリーを収集しており,各テストの平均所要時間を追跡しています。最も時間を要しているテスト,最も頻繁に失敗するテスト,およびプロジェクトとブランチ全体における平均ビルド時間の長さを表示できます。この情報は,CircleCIダッシュボードの別の的见解タブで確認できます。

この機能を実装するには,結果をJUnit XML形式でファイルに出力するようにテストを構成する必要があります。次に,そのファイルをフォルダに保存し,store_test_resultsYAMLキーを使用します。

jobs: build: executor: my-executor步骤:#其他构建步骤- run: name: run TestCafe tests命令:| yarn runTests—${TESTFILES} #输出> /tmp/test-results/results.xml - store_test_results: path: /tmp/test-results #…

ビルドを表示し自分のコンフィグを表示します

詳細と例については,CircleCIのドキュメントを参照してください。

アーティファクト

工件选项卡

CircleCIのジョブは,毎回新しい,クリーンで分離されたビルド環境で実行されます。その後,ファイルやビルドアーティファクトを外部からアクセスできるようにする場合は,アーティファクト机能。を使用できます。ファイルをアーティファクトにすると,工作细节页面详细ページの文物タブで利用できるようになります。AWS S3を使用しているため,参照パスが正しい限り,静的にホストされているようにファイルをプレビューできます。

この例は上記と同じです。テストスイートを実行し、結果を/ tmp /测试结果/ results.xmlに出力しました。次に,store_artifactsキーを使用してこれらのファイルをアーティファクトにし,文物タブで表示できるようになりました。

ビルドを表示し自分のコンフィグを表示します

工作:建立:遗嘱执行人:my-executor步骤:#其它生成步骤-:名称:运行TestCafe测试命令:|纱线运行测试——${TESTFILES}-store_artifacts:路径:/ tmp /测试结果目的地:#等。

詳細と例については,CircleCIのドキュメントを参照してください。

ビルドのSSH接続

テスト出力は明解ですか吗?ビルドが失敗し,その理由を特定できない場合がありますか吗?CircleCIプラットフォームでは,SSHを使用してテストを再実行できます。この場合,同じビルドが再実行されますが,SSHポートが開きます。GitHubまたはBitbucket アカウントと同じ SSH キーを使用して、実行中のビルド環境にログインして認証し、ビルドを実行中に、デバッグできます。環境に直接アクセスすることで、実際に環境を調査したり、ログを追跡したり、他の項目を確認して、ビルドが失敗する原因を調査できます。

環境の外部から原因究明に試行錯誤するのではなく,デバッグを生産的な実行できる非常に便利な機能です。

詳細と例については,CircleCIのドキュメントを参照してください。

結論

上記のすべての機能のうち,有償または一部が有償となっている機能は3つだけです。開発者はCircleCIの多くの機能を利用して,ビルド速度を向上させ,生産性を高めることができます。多くのユーザーの方がCircleCI製品とその機能を愛用し,活用されています。CircleCIでは皆様からのご意見を元に,今後も製品の改善を行っていきます。