Batel Zohar
JFrog Developer AdvocateBatel Zohar is a Developer Advocate for JFrog and has a background in DevOps support engineering, web development, and embedded software engineering. Prior to this, Batel served as an Enterprise Solutions Lead on a dedicated team that accompanies and assists large customers through the architectural implementation of the JFrog platform. She loves her dogs, plays guitar, and is a fan of Marvel’s movies. (edited)
The Latest From Batel Zohar
-
JFrog PlatformをGitHub環境に接続してシームレスな統合を作成する方法
| < 1 min readGitHubとの最新のJFrogコラボレーションにより、ソースコードとバイナリのお気に入りのソリューションをシームレスな統合で簡単に組み合わせることができます。つまり、これにより、ソフトウェアプロジェクトをサポートする、統合された包括的でセキュアなエンドツーエンドのエクスペリエンスが得られます。 この統合は、オープンソースパッケージのキュレーションからコーディング、CI、リリース管理、デプロイ、本番環境まで、すべてをカバーしています。これには、開発者エクスペリエンスに対する3つの大きな改善が含まれます。 統一された認証と認可 - GitHubワークフローアクションと、JFrogとGitHub間のシームレスなSSO認証について統一が図られます。 双方向のコードとパッケージのリンク - コードとパッケージは両方のプラットフォームでリンクされます。 統合セキュリティ - JFrog Advanced Securityの調査結果はGitHubダッシュボードから直接入手でき、マージ時にプルリクエストのチェックが実行されます。 コードからパッケージまで、統合されたエンドツーエンドのJFrogとGitHubエクスペリエンス このブログ記事では、統合のデモを行うための詳細な手順を含めた、ユースケースの流れについて説明します。 それでは始めましょう。 はじめに 事前に準備しておくものは以下の通りです。 JFrog Platform Cloud CodeNinjas_AIと呼ばれるJFrogプロジェクトを作成します。 GitHubのサンプルリポジトリ このサンプルリポジトリをフォークして、自分自身のコピーで試せるようにします。 1.認証と認可 両方のプラットフォームで認証と認可を行うには、次の構成が必要です。 Github変数 OAuth OIDC GitHub Actions Github変数 GitHub変数は、機密性の高い認証を格納するために使用されます。JFrogを指す次の2つの変数をGitHubで定義します。Settings > Secrets and variables > Actionsに移動し、変数を追加します。 JF_URL - JFrogサーバーへのベースURLを表します。 JF_PROJECT - GitHubリポジトリに接続するJFrogプロジェクトキーを表します GitHub Actionsのシークレットと変数 トップに戻る > OAuth GitHub認証であるGitHub OAuthに基づいてJFrog PlatformにログインするようにOAuthを構成します。 JFrog PlatformへのGitHub…
さらに見る -
プライベート、リモート、バーチャルGoレジストリの設定方法について
| < 1 min readGoパッケージの依存関係を管理および整理する最も簡単な方法は、Go repositoryを使用することです。チーム全体で共有されている依存関係に対して、信頼性が高く、安全で、一貫性があり、効率的なアクセスを中央で行う必要があります。Goクライアントと透過的に動作する複数のレジストリを設定する場所が含まれます。 JFrog Artifactory、Xray、Pipelinesを含むJFrog無料クラウドサブスクリプションを使えば、無料のローカル、リモート、バーチャルGoレジストリを数分でセットアップできます。このブログ記事では、手順について説明します。 開始する前に 事前準備として必要な作業は以下の通りです。 Goのインストール JFrogセルフホスト版サブスクリプションまたはJFrogクラウドサブスクリプションの加入 JFrog CLIのインストール 手順1:使用する環境にログインする デフォルトのユーザー名「admin」および、パスワード:オンプレミスのインストール用のパスワード「password」、またはクラウドインストール用に電子メールで提供された認証情報を使用してログインする。 手順2:ローカルGo repositoryを追加する 後の手順で作成するカスタマイズされたGoパッケージの依存関係を格納するために使用します。Administrationモジュールに移動します。「Repositories」メニューを展開し、メニュー項目「Repositories」をクリックします。 Goパッケージタイプの新しいローカルリポジトリを追加します。Repository Keyに [Go-challenge-local] を入力し、残りの設定はデフォルトのままにします。 手順3:リモートGo repositoryを追加する キャッシュプロキシとして使用されるように、http://proxy.golang.org/からサードパーティの依存関係を格納します。 リポジトリページの「Remote」タブをクリックして、新規のリモートリポジトリをGoパッケージタイプで追加します。Repository Keyに [Go-challenge-remote] を入力し、残りの設定はデフォルトのままにします。 手順4:バーチャルGo repositoryを追加する 最初のGoプロジェクトを作成するときに使用します。 リポジトリページの「Virtual」タブをクリックして、新規のバーチャルリポジトリをGoパッケージタイプで追加します。Repository Keyに [Go-challenge] を入力し、手順2および3で作成したローカルおよびリモートのGo repositoryを追加します(矢印ボタンを使用して、[Available Items] から [Included Items] に移動します)。リスト内のリポジトリの順序によって、Goプロジェクトの構築に必要な依存関係の解決に使用される順序が決まります。手順2で作成したローカルリポジトリをデフォルトのデプロイリポジトリ(Default Deployment Repository)として選択します。デフォルトのデプロイリポジトリは、ビルドするGoパッケージの依存関係がプッシュされるリポジトリです。残りの設定はデフォルトのままにしておきます。 手順5:JFrog GitHubのリポジトリをフォークし、Goのサンプルを取得する このリポジトリには、プロジェクトの構築に使用する簡単なサンプルが含まれています。 手順6:JFrog CLIを構成する 自動化スクリプトを簡素化するJFrog製品へのアクセスを自動化する、単純なインタフェースを提供するスマートクライアントであるJFrog CLIを構成します。 JFrog Platformを構成します。 $ jfrog config add 次の手順を使用して、Goでプロジェクトをビルドし、Artifactoryからプロジェクトの依存関係を解決します。…
さらに見る -
インターネットが使えない?問題ありません。JFrog Artifactoryをエアギャップで使用する – パート1
| < 1 min read事実上、すべての開発組織はビルドに必要な依存関係をダウンロードするために、Maven Central、NuGet Gallery、npmjs.org、Docker Hubなどの外部のパブリックリソースにアクセスする必要があります。Artifactoryを使用する大きな利点の1つは、これらのリモートリソースをプロキシし、ダウンロードされたアーティファクトをキャッシュするリモートリポジトリです。これにより、初めてアーティファクトを要求した開発者やCIサーバがあれば、そのアーティファクトはキャッシュされ、内部ネットワーク上のArtifactoryのリモートリポジトリから直接利用できるようになります。これがArtifactoryを使ってリモートリソースを操作する通常の方法です。 しかし、金融機関や軍事施設など、より厳しいセキュリティ要件を持つ組織では業務をインターネットに公開するような設定は禁止されています。 エアギャップを利用する このようなケースに対応するためには、少なくとも2つのArtifactoryインスタンスを用意することをお勧めします。1つはDMZ上、もう1つはエアギャップ上です。 通常、2つのシナリオがあります。 ネットワークに未接続 一方通行の接続 ネットワークに未接続 このシナリオでは2つのArtifactoryインスタンス間にはネットワーク接続がありません。インターネットから依存関係を取得するためには外部インスタンスが依存関係をダウンロードし、それを外部デバイス(ハードドライブやUSBフラッシュドライブなど)にエクスポートし、内部インスタンスが開発者やCIサーバーで使用するためにそれをインポートする必要があります。 依存関係の取得 ここではリモートリポジトリから依存関係を取得する2つの方法をご紹介します。 依存関係の宣言 コードから依存関係の宣言だけを残します。宣言されたコードを実行に必要なツールを備えたDMZ上の仮想マシンにインストールします。 例えば、npmパッケージを開発している場合はDMZマシンにnpmクライアントをインストールする必要があります。 対応するクライアントは必要な依存関係をArtifactoryに要求して再帰的にnレベルの依存関係もダウンロードします。 専用スクリプト 必要なすべてのパッケージを繰り返し検索し、Artifactoryに「ヘッドリクエスト」を送信して、リモートリソースからそれらのパッケージをダウンロードするスクリプトまたはメカニズムを実装します。 例えば、次のbashの例ではキーがmaven centralのアーティファクトパスを表し、値がキャッシュされる必要のあるアーティファクトファイルのバージョンであるハッシュマップを維持します。 declare -A dependencies=( ['junit/junit']="4.13.2/junit-4.13.2.pom 4.13.2/junit-4.13.2.jar" ['org/webjars/jquery']="2.1.1/jquery-2.1.1.jar 3.6.0/jquery-3.6.0.jar 2.1.3/jquery-2.1.3.jar" ) for d in "${!dependencies[@]}" do echo -e "caching dependency : $d, based on versions: ${dependencies[$d]}" for v in ${dependencies[$d]} do curl -s -o…
さらに見る -
プライベート、リモート、バーチャルnpmレジストリの設定方法について
| < 1 min readNodeの依存関係を管理および整理する最も簡単な方法は、npmリポジトリを使用することです。チーム全体で共有されている依存関係に対して、信頼性が高く、安全で、一貫性があり、効率的なアクセスを中央で行う必要があります。npmクライアントと透過的に動作する複数のレジストリを設定する場所が含まれます。 JFrog Artifactory、Xray、Pipelinesを含むJFrog無料クラウドサブスクリプションを使えば、無料のローカル、リモート、バーチャルnpmレジストリを数分でセットアップできます。このブログ記事では、手順について説明します。 npmリポジトリ の設定を開始する前に 事前準備として必要な作業は以下の通りです。 npmクライアントのインストール JFrogセルフホスト版サブスクリプションまたはJFrogクラウドサブスクリプションの加入 JFrog CLIのインストール 手順1:使用する環境にログインする デフォルトのユーザー名「admin」および、オンプレミスのインストール用のパスワード、またはクラウドインストール用に電子メールで提供された認証情報を使用してログインする。 手順2:ローカルnpmリポジトリを追加する 後の手順で作成するカスタマイズされたnpmパッケージの依存関係を格納するために使用します。Administrationモジュールに移動します。「Repositories」メニューを展開し、メニュー項目「Repositories」をクリックします。 npmパッケージタイプの新しいローカルリポジトリを追加します。Repository Keyに [npm-challenge-local] を入力し、残りの設定はデフォルトのままにします。 手順3:リモートnpmリポジトリを追加する キャッシュプロキシとして使用されるように、https://registry.npmjs.org からサードパーティの依存関係のあるパッケージを格納します。 リポジトリページの「Remote」タブをクリックして、新規のリモートリポジトリをNpmパッケージタイプで追加します。Repository Keyに [npm-challenge-remote] を入力し、残りの設定はデフォルトのままにします。 手順4:バーチャルnpmリポジトリを追加する リポジトリページの「Virtual」タブをクリックして、新規のバーチャルリポジトリをnpmパッケージタイプで追加します。 リポジトリキー [npm] を入力し、手順2および3で作成したローカルおよびリモートのnpmリポジトリを追加します(矢印ボタンを使用して、[Available Items] から [Included Items] に移動します)。リスト内のリポジトリの順序によって、npmパッケージの構築に必要な依存関係の解決に使用される順序が決まります。 手順2で作成したローカルリポジトリをデフォルトのデプロイリポジトリとして選択します。デフォルトのデプロイリポジトリ(Default Deployment Repository)は、ビルドするnpmパッケージの依存関係がプッシュされるリポジトリです。残りの設定はデフォルトのままにしておきます。 手順5:JFrog GitHubのリポジトリをフォークし、npmのサンプルを取得する このリポジトリには、プロジェクトの構築に使用する簡単なnpmのサンプルが含まれています。 手順6:JFrog CLIを構成する 自動化スクリプトを簡素化するJFrog製品へのアクセスを自動化する、単純なインタフェースを提供するスマートクライアントであるJFrog CLIを構成します。 Artifactoryサーバーを設定します。 $ jfrog config add 次の手順を使用して、npmでプロジェクトをビルドし、Artifactoryからプロジェクトの依存関係を解決します。 ルートプロジェクトディレクトリに移動する プロジェクトのリポジトリを構成します。 $ jfrog…
さらに見る -
Maven/Gradle用プライベート、リモート、バーチャルレジストリを設定する方法
| < 1 min readJavaの依存関係を管理・整理する最もシンプルな方法はMavenやGradleリポジトリを利用することです。チーム内で共有されている依存関係を一元的に管理するためには信頼性、安全性、一貫性、効率性の高いアクセスが必要です。MavenやGradleクライアントと透過的に動作する複数のレジストリをセットアップする場所も含まれます。 JFrog Artifactory、Xray、Pipelinesを含むJFrog無料クラウドサブスクリプションでは数分で無料のローカル、リモート、バーチャルのMaven/Gradleレジストリをセットアップすることができます。ここでは、その手順をご紹介します。 始める前に 必要なものは以下の通りです。 MavenのインストールまたはGradleのインストール JFrogセルフホステッド・サブスクリプションまたはJFrogクラウド・サブスクリプション JFrog CLIのインストール ステップ1: ご自身の環境にログイン オンプレミス版の場合はデフォルトのユーザ名:admin、パスワード:password、クラウド版の場合はメールで送られてきた認証情報を使ってログインします。 ステップ2: ローカルMaven/Gradleリポジトリの作成 後述のステップで作成するカスタムMaven/Gradleを保存するために使用します。Adminモジュールに移動し、Repositoriesメニューを開き、Repositoriesメニュー項目をクリックします。 Maven/Gradleパッケージタイプで新しいローカルリポジトリを作成します。リポジトリキーとして「maven-challenge-local」または「gradle-challenge-local」を入力し、残りのデフォルト設定はそのままにします。 ステップ3: リモートMaven/Gradleリポジトリの作成 サードパーティのhttps://mvnrepository.com/をキャッシュプロキシとして使用し、データを保存します。 RepositoriesページのRemoteタブをクリックし、Maven/Gradleパッケージタイプの新しいリモートリポジトリを作成します。リポジトリキーとして「maven-challenge-remote」または「gradle-challenge-local」を入力し、残りのデフォルト設定はそのままにします。 ステップ4: バーチャルMaven/Gradleリポジトリの作成 Maven/Gradleのカスタムイメージを作成する際に使用します。 RepositoriesページのVirtualタブをクリックし、Maven/Gradleパッケージタイプの新しいバーチャルリポジトリを作成します。リポジトリキー「Maven/ Gradle」を入力し、ステップ2と3で作成したローカルとリモートMaven/Gradleリポジトリを追加します(矢印ボタンで「Available Repositories」から「Selected Repositories」に移動させます)。リスト内のリポジトリの順序はMaven/Gradleイメージの構築に必要な依存関係を解決するために使用される順序を決定します。ステップ2で作成したローカルリポジトリをDefault Deployment Repositoryとして選択します。Default Deployment RepositoryはビルドしたMaven/Gradleの依存関係がプッシュされるリポジトリです。残りのデフォルト設定はそのままにします。 ステップ5: JFrog Maven/GradleサンプルGitHub リポジトリのフォーク このリポジトリにはプロジェクトのビルドで使用するシンプルなものが含まれています。 ステップ6: JFrog CLIの設定 JFrog製品へのアクセスを自動化するシンプルなインターフェースを提供し、自動化スクリプトを簡素化するスマートクライアントのJFrog CLIを設定します。 Artifactoryサーバの設定を行います。 $ jfrog rt c 以下の手順でMaven/Gradleでプロジェクトをビルドし、Artifactoryからプロジェクトの依存関係を解決します。 プロジェクトのルートディレクトリに移動します。(cd) プロジェクトのリポジトリ設定を行います。 $ jfrog rt mvn-config または $…
さらに見る -
どのようにしてDB同期のパフォーマンスを改善したか | JFrog Xray
| < 1 min read要約 私たちは皆、すべてを超高速で開発したいと思っています。そのため、「単純な」データベースの同期処理などに時間がかかる場合は既成概念にとらわれずに考え直す必要があります。ここではDBのパフォーマンスを向上し、同期時間を16時間から2時間に短縮するために、JFrog Xrayに実装したソリューションをご紹介します。 JFrog Xrayとは まず、課題とソリューションをご説明する前に、JFrog Xrayとは何かをおさらいしましょう。JFrog XrayはDevSecOpsチームのためのツールでソフトウェア・アプリケーションのオープンソース・コンポーネントを得るために使用します。JFrog Artifactoryのリポジトリに保存されているアーティファクトを再帰的にスキャンすることで、Xrayはセキュリティの脆弱性を特定し、組織のために定義されたポリシーに沿ったライセンスのコンプライアンスを保証するのに役立ちます。 現在のXrayの仕組み 脆弱性をスキャンし、ライセンスのコンプライアンスを確認するためにXrayは多くの公開されているコンポーネント、脆弱性、ライセンスを含む大きなデータベースを使用しています。初めてXrayをインストールする際、最初にDBの同期が行われ、Xrayで知られているすべての公開データをダウンロードして保存しますが、これは公開情報の中心となるナレッジベースです。 現在、このデータベースの圧縮サイズは約6GBで日々増え続けています。ダウンロードしたデータをXrayのデータベースに保存した場合、45GBのディスクスペースが必要です。このデータをPostgresデータベースに保存するために、Xrayは100MBのzipファイルを展開し、zipファイルの中にあるjsonファイルの2000個のオブジェクトを分析します。この作業には最小のシステム要件では15時間近く要していました。 * Image credit 考えられるソリューション この課題に取り組むために、Xrayチームは似たような動作をするいくつかの異なるソリューションを検討しました。1つ目のソリューションはユーザー側でデータを再作成するのではなく、既にあるデータをデータベースのテーブルとして配布することでした。この場合、ソフトウェアの一部として配布するデータの数が多くなってしまいます。もう一つの方法はコンポーネントや脆弱性に関する情報を得るためにオンラインサーバーを使用することでしたが、これには多くの時間がかかりました。3つ目の選択肢はハイブリッドなもので、余り使用されていないコンポーネントの中央データベースを用意し、共通のコンポーネントを配布するというものでした。そこで私たちは3つのソリューションを組み合わせることにしました。 調査ステップからスタート 現状を調査する為、pprofツールを使用しました。pprofはGoogleが開発したマルチスレッドアプリケーションを分析するためのgperftoolsの一部であるcpuプロファイラです。pprofにはプログラムのコールグラフを可視化するgraphvizを生成する機能が備わっています。その結果、Xrayはデータベースの操作に多くの時間を費やしていることが分かりました。以下はpprofのグラフの例です: pprofグラフの例 バッチではなく以下のようなシングルエントリーのINSERTステートメントが多数ありました: INSERT INTO table VALUES (a,b,c) 以下のように複数エントリーを一度に実施可能にも関わらず: INSERT INTO table VALUES (a,b,c), (d,e,f), (g,h,i)... 改善点1: 大きな課題はこの改善点をコードに集約することでした。そこで特定の期間やサイズを処理するための小さなキューを作成しました。 集約 goチャンネルのオブジェクトを内部で集約し、500ミリ秒毎または100オブジェクトを排除しました。 これは私たちが行った主要な改善の一つです。これまでの変更点と今回の変更点を合わせると、当初よりも約60%のパフォーマンス向上が計測されました。 初期DB同期と日次DB同期 初期DB同期を改善することが重要でした。初期状態ではDBは空で、99%のオブジェクトが追加されても更新されないことが分かっています。 改善点2: オブジェクトを検索して処理するのではなく、単純にデータを挿入する楽観的アプローチを採用しました。これにより更に数時間短縮し、パフォーマンスが少し向上しました。 しかし、日次同期は話が異なります。というのも、コンポーネントや脆弱性に関する情報を含むDBをすでに保持しており(初めて実行するわけではありません)、新しい脆弱性があれば、このDBを自動または手動で更新されるようにしたいのです。 ワーカーを利用 現在、Xrayでは以下の異なる3ワーカーが実行されています: Zipファイル・ワーカー Jsonファイル・ワーカー コンポーネント/脆弱性・ワーカー(jsonファイルのエンティティ) 改善点3: Xrayでは1つのファイル上のコンポーネントを並行して読み取るのではなく、ワーカーを使って生ファイルを並行して読み取るようにしています。ZIPファイルには2000個のエンティティをjsonで保持する100MBのファイルです。 インデックス化の削減 大量データの挿入に楽観的アプローチ(初期DB同期の為だけに追加)を採用しましたが最後に一番大きなテーブルに対して以下の方法を適用しました。 改良点4: 最大のテーブルを作成するには、コピーを使ってテーブルのデータを一括で読み込んだ後、テーブルに必要なインデックスを作成します。ご存知かも知れませんが既存のデータにインデックスを作成する方が各行の読み込み毎に更新するよりも迅速です。…
さらに見る -
Artifactoryの5つの特別なリポジトリについて
| < 1 min readアーティファクトリポジトリとしてJFrog Artifactoryで管理されているさまざまなタイプのバイナリリポジトリの中に、あまり知られていない非常に有用な5つのリポジトリがあります。他のリポジトリと同様に、これらもArtifactoryでバイナリを格納するメリットがありますが、使用方法が少し異なります。どのように使用するのか見てみましょう。 1. 汎用リポジトリ このタイプのリポジトリには特別な形式はなく、あらゆる形式のパッケージをアップロードできます。汎用リポジトリは、どのパッケージ形式にも属さないためパッケージインデックスは管理しません。サポートされていないパッケージ形式、インストーラやナビゲーションファイル、オーディオファイルなどを格納したい場合に便利です。 たとえば、Homebrewのアーティファクトをプロキシ処理してキャッシュする汎用リモートリポジトリを作成できます。URLにhttps://homebrew.bintray.com/を指定し、Homebrewリポジトリを設定するだけです。 デフォルトのHomebrewソースリポジトリをバイパスするには、以下のコマンドで環境変数HOMEBREW_BOTTLE_DOMAINを追加してください。 export HOMEBREW_BOTTLE_DOMAIN=https://ART_URL:8081/artifactory/homebrew/ その後、任意のパッケージ名でinstallコマンドを実行します。 brew install wget HomebrewはArtifactoryを経由してインストールし、インストールするすべてのアーティファクトをキャッシュします。 2. Build Infoリポジトリ デフォルトのartifactory-build-infoリポジトリ はArtifactoryのバージョン6.6で導入され、「build-info」ファイルをバイナリ・ラージ・オブジェクトとしてArtifactoryデータベースに格納するための新しいメカニズムになりました。このartifactory-build-infoリポジトリには、Artifactory JenkinsプラグインやJFrog CLI、Build Upload REST APIやArtifactory UIを直接経由して、さまざまなCIサーバープラグインでArtifactoryにアップロードされたすべてのビルド情報ファイルが格納されます。ビルド情報はREST APIとBuildsページから入手できます。 この新しいリポジトリはbuild-infoファイルへのアクセスを定義する新しいユーザやグループのパーミッションセットを導入しました。build-infoリポジトリ内のJSONパスを使用してリポジトリの権限を管理できます。「Create or Replace Permission Target」REST APIを使用してパーミッションを自動化することができます。build-infoパーミッションの新しいセクションを持つV2 JSONを使用するようになりました。 たとえば、次のcURLとbuild-info-permission.jsonは、test-mavenというビルドに対してjava-developersという新しいパーミッションを定義します。 cURLコマンド curl -uadmin:password -XPUT "https://localhost:8081/artifactory/api/v2/security/permissions/java-developers" -H "Content-type: application/json" -T build-info-permission.json build-info-permission.json { "name": "java-developers", "repo": { "include-patterns": ["**"] (default), "exclude-patterns": [""] (default),…
さらに見る