feat: implement rubygems registry [CM-1241]#4322
Conversation
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
|
|
There was a problem hiding this comment.
Pull request overview
This PR adds a new RubyGems registry ingestion capability to the packages_worker service, following the established multi-entry-point worker pattern (most closely mirroring the existing NuGet worker). It introduces an API client for rubygems.org, normalization utilities, two Temporal batch loops (a "core" metadata/downloads pass and a "critical" versions/maintainers pass), their activities/workflows/schedules, a dev/prod Docker Compose file, and supporting data-access-layer helpers.
Changes:
- New
rubygems/worker module:client.ts,normalize.ts,types.ts,runRubyGemsCoreLoop.ts,runRubyGemsCriticalLoop.ts,activities.ts,workflows.ts,schedule.ts, andbin/rubygems-worker.ts, wired intoactivities.ts,workflows/index.ts, andgetRubyGemsConfig. - New DAL helpers:
osspckgs/rubygems.ts(package selection queries) and a genericosspckgs/downloads.ts(recordDownloadSnapshot), plus new root exports. - Ops wiring:
scripts/services/rubygems-worker.yamlandpackage.jsonstart/dev scripts (inspect port9244).
Reviewed changes
Copilot reviewed 16 out of 17 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
services/libs/data-access-layer/src/osspckgs/rubygems.ts |
Keyset/priority selection queries for core and critical RubyGems packages. |
services/libs/data-access-layer/src/osspckgs/downloads.ts |
Generic download-snapshot recorder (duplicate of the NuGet variant). |
services/libs/data-access-layer/src/index.ts |
Exports new osspckgs/types, downloads, rubygems modules. |
services/apps/packages_worker/src/workflows/index.ts |
Exports RubyGems workflows. |
services/apps/packages_worker/src/rubygems/workflows.ts |
Core/critical continue-as-new workflows. |
services/apps/packages_worker/src/rubygems/types.ts |
Fetch/normalized RubyGems type definitions. |
services/apps/packages_worker/src/rubygems/schedule.ts |
Daily cron schedules for both workflows. |
services/apps/packages_worker/src/rubygems/runRubyGemsCriticalLoop.ts |
Versions/maintainers batch loop (non-draining on skip/error). |
services/apps/packages_worker/src/rubygems/runRubyGemsCoreLoop.ts |
Metadata/downloads batch loop with error marking. |
services/apps/packages_worker/src/rubygems/normalize.ts |
Pure normalization helpers (untested). |
services/apps/packages_worker/src/rubygems/client.ts |
Axios client with 404/429 error classification. |
services/apps/packages_worker/src/rubygems/activities.ts |
Activity wrappers over the two loops. |
services/apps/packages_worker/src/config.ts |
Adds getRubyGemsConfig (used only by the core loop). |
services/apps/packages_worker/src/bin/rubygems-worker.ts |
Worker entrypoint registering both schedules. |
services/apps/packages_worker/src/activities.ts |
Registers the new RubyGems activities. |
services/apps/packages_worker/package.json |
start/dev scripts for the RubyGems worker. |
scripts/services/rubygems-worker.yaml |
Compose service (omits CROWD_TEMPORAL_NAMESPACE). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
…l loop Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
| if (isRubyGemsFetchError(versionsResult)) { | ||
| if (versionsResult.kind === 'NOT_FOUND') { | ||
| log.warn({ purl: pkg.purl }, 'Package not found on RubyGems versions endpoint — skipping') | ||
| return 'skipped' | ||
| } | ||
| if (versionsResult.kind === 'RATE_LIMIT') { | ||
| log.warn({ purl: pkg.purl }, 'Rate limited fetching RubyGems versions — will retry next pass') | ||
| return 'error' | ||
| } | ||
| throw new Error(`Transient error fetching versions for ${pkg.purl}: ${versionsResult.message}`) | ||
| } | ||
|
|
||
| const normalizedVersions = normalizeRubyGemsVersions(versionsResult) | ||
| const latest = pickLatestRubyGemsVersion(normalizedVersions) | ||
| const ownersFetchFailed = isRubyGemsFetchError(ownersResult) | ||
| const owners = ownersFetchFailed ? [] : normalizeRubyGemsOwners(ownersResult) |
| export async function recordDownloadSnapshot( | ||
| qx: QueryExecutor, | ||
| params: { | ||
| packageId: number | ||
| purl: string | ||
| totalDownloads: number | ||
| today: string // YYYY-MM-DD | ||
| }, | ||
| ): Promise<string[]> { |
This pull request introduces a new RubyGems worker to the
packages_workerservice, adding support for ingesting and processing RubyGems package data. The main changes include Docker Compose and script updates for the new worker, as well as the implementation of RubyGems batch processing logic for both core and critical packages. The code adds API clients, data normalization, and database integration for RubyGems packages, versions, and maintainers.RubyGems Worker Integration:
rubygems-worker.yaml) to run and develop the new RubyGems worker service with appropriate environment variables, volumes, and network settings.package.jsonscripts to support starting and developing the RubyGems worker locally and in Docker.RubyGems Batch Processing Implementation:
processRubyGemsCoreBatchandprocessRubyGemsCriticalBatchactivities, which handle batch processing for core and critical RubyGems packages, respectively. [1] [2]runRubyGemsCoreLoop.tsandrunRubyGemsCriticalLoop.tsfor fetching, normalizing, and upserting package, version, and maintainer data into the database, including error handling and retry logic. [1] [2]RubyGems Registry Integration:
Configuration:
getRubyGemsConfigto manage batch size, concurrency, and delay settings for RubyGems batch processing, with environment variable support.