Sharding Utility for CI Services
ShardyMcShardFace is a JavaScript/TypeScript utility library designed to efficiently shard arrays of items across multiple parallel processes, primarily for Continuous Integration (CI) environments. It leverages standard CI environment variables like `CI_NODE_INDEX` and `CI_NODE_TOTAL` (via the `ci-parallel-vars` dependency) to determine the current shard and total shard count, distributing items as evenly as possible. The current stable version is 2.1.0, released in November 2019. Since then, the project appears to be in a maintenance-only state, with no new releases in over five years. Key features include stable, random-seeded item distribution, graceful handling of scenarios where the item count is less than the total shard count, and full TypeScript support, ensuring type safety. It offers both a programmatic API for direct integration into JavaScript/TypeScript applications and a command-line interface for simple shell scripting. Its primary differentiator is its direct, opinionated integration with common CI parallelization parameters, simplifying the setup for distributed test suites or build steps.
Common errors
-
TypeError: Expected options to be an object, but got string.
cause Attempting to pass a seed string directly as the last argument to the `shard` function in versions 2.0.0 or later.fixWrap the seed string in an options object: `shard(items, { seed: 'your-seed' });` -
Items are not being sharded; all items are returned in every execution.
cause The `CI_NODE_INDEX` or `CI_NODE_TOTAL` environment variables are not correctly set or are missing, causing the library to assume a single execution node.fixVerify that your CI environment or local setup correctly defines `CI_NODE_INDEX` and `CI_NODE_TOTAL` (e.g., `process.env.CI_NODE_INDEX = '0'; process.env.CI_NODE_TOTAL = '2';`). The library uses `ci-parallel-vars` to detect these.
Warnings
- breaking The `shard` function's last parameter changed from a string to an options map.
- gotcha This package relies heavily on CI environment variables (`CI_NODE_INDEX`, `CI_NODE_TOTAL`, etc.) to determine sharding parameters. If these are not set, it will default to a single shard (index 0 of 1).
- gotcha The project has not seen a new release since November 2019. While functional, active development and rapid bug fixes are unlikely.
Install
-
npm install shardy-mc-shard-face -
yarn add shardy-mc-shard-face -
pnpm add shardy-mc-shard-face
Imports
- shard
import shardyMcShardFace from 'shardy-mc-shard-face';
import { shard } from 'shardy-mc-shard-face'; - shard (CommonJS)
const { shard } = require('shardy-mc-shard-face'); - shardy (CLI)
cat items.txt | shardy shard
Quickstart
import { shard as shardyMcShardFace } from 'shardy-mc-shard-face';
// Simulate CI environment variables for local testing
process.env.CI_NODE_INDEX = '0'; // Current shard index (0-based)
process.env.CI_NODE_TOTAL = '2'; // Total number of shards
const allItems = [
'test_file_A.spec.ts',
'test_file_B.spec.ts',
'test_file_C.spec.ts',
'test_file_D.spec.ts',
'test_file_E.spec.ts',
'test_file_F.spec.ts'
];
// Basic sharding, options are optional
const myShard = shardyMcShardFace(allItems);
console.log(`Running on CI node ${process.env.CI_NODE_INDEX} of ${process.env.CI_NODE_TOTAL}`);
console.log('My assigned shard:', myShard);
// Example with custom options and seed for stable distribution
const customShard = shardyMcShardFace(allItems, {
throwOnEmpty: false, // Don't throw if shard is empty
seed: 'my-stable-seed' // Ensures same items always go to same shard
});
console.log('My assigned shard with custom seed:', customShard);