ArtifactoryでCargoリポジトリを使用する方法
RustはStackoverflowが実施した最も好きなプログラミング言語の調査で5年連続で首位を獲得しました。C/C++の次のステップとして注目されているこの言語は組込み機器の開発者やIoT向けの堅牢なシステムによって急速に普及しています。
JFrogではRustの開発者を歓迎し、堅牢なバイナリ管理と継続的インテグレーションにどのように貢献するかを紹介したいと思います。私たちはRustプログラミング言語のパッケージ管理システムであるCargoをArtifactoryでサポートするリポジトリに加えました。
86%以上の開発者が熱狂的に支持したRustの特徴とは?また、ソフトウェア開発のライフサイクルを加速するために、ArtifactoryのCargoリポジトリをどのように利用できるのでしょうか?
なぜRustなのか?
Mozilla ResearchはRustを「スピード、メモリの安全性、並列性に重点を置いたシステムプログラミング言語」と表現しています。これらの重要な機能はそのビジョンを支えるものです。
- 自動ガベージコレクション – RustはRAII (Resource Acquisition Is Initialization) を強制することでリソースリークバグを防ぎ、リソースを所有するオブジェクトがスコープ外に出たときには必ずリソースを解放します。
- 強力な並列処理のサポート – Rustは並列処理するマルチスレッドプログラミングを安全で効率的に扱えるように設計されています。強力な型、SendとSyncの特性は同期したスレッドセーフな動作を保証し、標準的なスレッドライブラリはRustコードの並列処理を可能にしています。
- セーフティチェック – Rustのコンパイラはメモリーセーフティーなどのチェックを行い、クリーンで堅牢なコードを実現します。
- 再利用可能パッケージ – Rustは開発者が再利用可能なコードユニットをプロジェクト内でプライベートに共有したり、他の人とパブリックに共有することもできるクレートを作成できる強力なシステムを提供しています。
- 依存関係の管理 – Rust用のCargoパッケージマネージャはパッケージの依存関係をダウンロードしてコンパイルする機能を備えています。
これらの機能は他の人気のある構文機能(複雑なデータ型、mutable/immutableの借用、回復可能/回復不可能なエラー処理など)と合わせて開発者には喜ばしいことです。
リモートCargoリポジトリ
フレンドリーで活発なRustコミュニティはオープンソースのパッケージを配布するためにcrates.ioパッケージレジストリを管理しています。Rustプログラマはアプリケーションのコアサービスの大半は、このパブリックライブラリを利用することになります。
チーム間でのRustビルドのスピードと一貫性を担保するために、Artifactoryのリモートリポジトリを使用してcrates.ioをプロキシします。
ArtifactoryのリモートリポジトリはリモートURLで管理されているリポジトリやレジストリのキャッシングプロキシとして機能します。リモートリポジトリのコンテンツとネイティブソースの間に違いはありません。
このDevOpsベストプラクティスを実践することで、あなたとチームは利益を得ることができます。
- スピードのためのローカル化 — プロキシは頻繁に使用するパッケージをクラウドでもオンプレミスでも、ビルドが行われる環境に保持することで、ネットワークのレイテンシーを最小限に抑えます。
- 接続保護 — crates.ioプロキシは接続不良や中断によりcrates.ioサーバが利用できない場合やリモートサーバー自体に障害が発生した場合でも利用可能です。
- 不変性の確保 — いったんパッケージのバージョンがプロキシの登録後、それは不変で、それを使用する全てのビルドで同じものになります。これによって、パブリックリポジトリへの不適切な強制プッシュによってビルドに何かが入り込むことを防ぎます。
crates.ioのリモートリポジトリプロキシを簡単に設定できます。
- Artifactoryで新規のCargoリモートリポジトリを作成
- リモートリポジトリに名前を付け、crates.ioのURLを割り当て
- アプリケーションパッケージの
config.toml
マニフェストファイルでcrates.ioの代わりにArtifactoryのリモートリポジトリにリダイレクトするように[registry]のデフォルトを設定します。
(手順はArtifactブラウザの「Set Me Up」を参照してください)
リモートリポジトリプロキシは読み取り専用ですが、ビルドのためにオープンソースの依存関係を取り込むという日常的な作業のほとんどにとっては当然のことです。crates.ioに公開する必要がある場合は[registries]
で名前を定義し、公開する際に--registry
オプションで使用することができます。(マニフェスト内のpackage.publish
キーでレジストリ名を指定することでレジストリへの公開が可能になります)# Makes artifactory the default registry and saves passing --registry parameter [registry] default = "art-crates-remote" [registries] # Remote repository proxy in Artifactory (read-only) art-crates-remote index = { index = "https://artprod.mycompany/artifactory/git/cargo-remote.git" } # Optional, use with --registry to publish to crates.io crates-io = { index = “https://github.com/rust-lang/crates.io-index” }
ローカルCargoリポジトリ
チームや部門内でのみ作成、共有するクレートについてはプライベートCargoレジストリを維持する必要があります。ArtifactoryではローカルCargoリポジトリで必要な数のレジストリを作成することができます。
以下は「プロジェクトX」に取り組んでいるチームがローカルcargoリポジトリをセットアップして使用する方法です。
- Artifactoryに「cargo-local-projectx」という名前のローカルcargoリポジトリを作成する
config.toml
ファイルでローカルリポジトリ用のregistries
定義を構成し、package.publish
キーを設定後、そのレジストリへの公開を許可します[registries] projectx = { index = "https://artprod.mycompany/artifactory/git/cargo-local_projectx.git" } [package] publish = “projectx”
cargo publish
でArtifactoryのローカルリポジトリにクレートを公開する場合は--registry
オプションを指定します$ crate publish --registry “projectx”
- ローカルリポジトリにあるクレートをProjectXアプリケーションのソースコードに依存して使用するには、
version
と一緒にregistry
を指定します[dependencies] some-crate = { version = "1.0", registry = "projectx" }
まとめ
ArtifactoryのCargo用リモートリポジトリとローカルリポジトリの両方を使用することで、SDLCでベストプラクティスを実践し、DevOpsの成功を実現できます。すべてのRust開発者チームの依存関係やパッケージの一貫性をCargoのネイティブサポートで担保できます。また、Artifactoryの詳細なパーミッションにより、チーム間のアクセスを管理できます。
ArtifactoryのCargoリポジトリをご自身でご確認ください。 JFrog クラウドの無料版で、これらの方法をご活用してみませんか。
関連リソース:
- Cargo Rustチートシート
- CargoでRustパッケージを構築・管理する方法
- ArtifactoryをCargo Registryとして活用