スライシングとダイシング人形偽造利用データ


人形偽造コンテンツ生態系は大きく複雑です.他のモジュールからリソースを使用するモジュールやモジュールがたくさんあります.開発リソースを投資する方法を決めるとき、これらの関係をナビゲートするのは難しいです.例えば、私たちがそれを廃止するべきであるかどうかを決定するとき、多くのモジュールが関数を呼ぶのを知っているのは役に立ちます.
これらの決定を支援するために、生態系プログラムは、これらの決定のいくつかのコストを量るのを助けることができる公的にアクセス可能なデータベースを維持します.データを直接使用することができますBigQuery console , または、あなたの必要が単に「forgeモジュールが私が働いているものを使う」ならば、あなたは我々のコマンドラインを使うことができますRangefinder ツール.

測距儀


より簡単で最も一般的なユースケースから始めましょう.まず、ツールをインストールします
$ gem install puppet-community-rangefinder

RangeFinderは、あなたが働いているコンポーネントのソースファイルを、人形のクラスか、定義されたタイプか、関数であるかネイティブなタイプであるかを検査します.これはモジュール内で動作します.
$ rangefinder lib/puppet/functions/translate.rb
[translate] is a _function_
==================================
The enclosing module is declared in 8 of 575 indexed public Puppetfiles

Breaking changes to this file WILL impact these modules:
  * puppetlabs-apt (https://github.com/puppetlabs/puppetlabs-apt)
  * puppetlabs-mysql (git://github.com/puppetlabs/puppetlabs-mysql)
  * puppetlabs-docker (git://github.com/puppetlabs/puppetlabs-docker)
  * puppetlabs-kubernetes (https://github.com/puppetlabs/puppetlabs-kubernetes)
  * puppetlabs-concat (https://github.com/puppetlabs/puppetlabs-concat)
  * eputnam-i18ndemo (https://github.com/eputnam/eputnam-i18ndemo)
  * puppetlabs-motd (https://github.com/puppetlabs/puppetlabs-motd)
  * puppetlabs-helm (https://github.com/puppetlabs/puppetlabs-helm)
  * puppetlabs-accounts (https://github.com/puppetlabs/puppetlabs-accounts)
  * albatrossflavour-os_patching (https://github.com/albatrossflavour/puppet_os_patching)

Breaking changes to this file MAY impact these modules:
  * tomkrieger-sshkeymgmt (https://github.com/tom-krieger/sshkeymgmt.git)

間の違いWILL and MAY このリストでは、あなたが取り組んでいるモジュールが依存モジュールで適切に宣言されているかどうかに基づいて、信頼性のツールのレベルですmetadata.json ファイル.そして、あなたがわかるように、知られているソース・リポジトリがあるならば、それはまた、必要に応じて下流のプル要求をすることができるように、印刷されるでしょう.

コンソール


レンジファインダーで使用されるデータはpublic BigQuery dataset . 主に使用するテーブルはforge_itemized 表.このテーブルは、フォージ上のすべてのモジュールをすべての関数、型、クラスなどに分解することで、毎週再生されます.これは静的解析を使用するので、すべてのコードパスで宣言されたすべての要素を識別しますが、実行時に動的に決定された名前で宣言された要素を識別できないことを意味します.

コラム
説明module要素を宣言または使用するモジュールの名前です.versionモジュールのバージョンが検査されました.source要素が存在するモジュール、あるいは定義されたモジュール.kindこれはどんな要素ですかリソース型、関数、クラスなど.element宣言された要素の名前.count何回そのモジュールで宣言されました.
それで、使用しているモジュールのリストを得るためにtranslate() 関数は、前述のRange Finderコマンドのように、このSQLクエリを使用できます.
SELECT module
FROM `dataops-puppet-public-data.community.forge_itemized`
WHERE kind = "function" AND element = "translate"
LIMIT 1000

それから、それらのモジュールのそれぞれのソースURLを取得するにはforge_modules 表.
SELECT i.module, m.source
FROM `dataops-puppet-public-data.community.forge_itemized` AS i
JOIN `dataops-puppet-public-data.community.forge_modules` AS m
    ON m.slug = i.module
WHERE i.kind = "function" AND i.element = "translate"
LIMIT 1000

または別の例として、forgeモジュールで使用されるすべての関数の一覧を取得できます.
SELECT element, SUM(count) as count
FROM `dataops-puppet-public-data.community.forge_itemized`
WHERE kind = "function"
GROUP BY element
ORDER BY count DESC
LIMIT 1000

The forge_modules テーブルは、存在するすべての偽造モジュールを記録し、それらに関するいくつかの情報を表面化します.しかし興味深いデータのいくつかはForgeCountリリーステーブルにあります.各モジュールの各バージョンまたはリリースに関するメタデータを示します.これは、メタデータの生のコンテンツだけでなく、各リリースで時間をかけて変更することができます任意の情報です.JSONファイル、ハッシュにパースされます.
データセットには、パブリックGithubテーブルから複製されたテーブルとビューのセットも含まれます.これにより、パペットモジュールのソースツリーのパスや内容を調べるような興味深いことができます.たとえば、あなたはまだ人形3を定義するGithub宇宙のすべての操り人形モジュールを見つけることができました.X関数.
SELECT DISTINCT f.repo_name
FROM `bto-dataops-datalake-prod.community.github_ruby_files` f
WHERE STARTS_WITH(f.path, 'lib/puppet/parser/functions')

そして、forgeとgithubデータソースに参加するのはかなり簡単です.このクエリは、カスタムのネイティブリソース型を定義するForgeの186個の人形モジュールを識別します.
SELECT DISTINCT g.repo_name, f.slug
FROM `dataops-puppet-public-data.community.github_ruby_files` g
JOIN `dataops-puppet-public-data.community.forge_modules` f
    ON g.repo_name = REGEXP_EXTRACT(f.source, r'^(?:https?:\/\/github.com\/)?(.*?)(?:.git)?$')
WHERE STARTS_WITH(g.path, 'lib/puppet/type')
LIMIT 1000

他の楽しいものは、このデータを行うことができますか?おそらく、あなたは人々がどのようにあなたの公表されたForgeモジュールから機能とタイプを使用しているかを追跡するために、使用方法ダッシュボードを構築することができます、あるいは、あなたがあなたのモジュールに変化を壊す前に著者に通知することができるように、あなたはあなたのコードを使用して川下モジュールを特定することができます.
何か面白いものを構築する場合は、私たちのスラックでshoutoutを与える!