Release System 2.0

August 2025. Bash scripts for releases work. But:

  • Errors unclear
  • Impossible to test
  • Logic getting complex

Rewrote in TypeScript.

Before

#!/bin/bash
VERSION=$1
if [ -z "$VERSION" ]; then
  echo "Usage: ./release.sh <version>"
  exit 1
fi
# 200 lines of bash

After

import { ReleaseManager } from './core'

const manager = new ReleaseManager({
  modulesPath: './src/modules',
  releasesPath: './releases'
})

await manager.createRelease('1.2.3')

What appeared

  • Types. IDE suggests, errors visible immediately.
  • Tests. Unit tests for release logic.
  • Modules. ModuleDetector, SnapshotCreator, ChangelogGenerator.
  • Config. JSON instead of variables in script.

Structure

release-system/
├── src/
│   ├── core/
│   │   ├── module-registry.ts
│   │   └── file-utils.ts
│   ├── docker/
│   │   └── compose-parser.ts
│   └── types/
├── config.json
└── scripts/
    └── create-release.ts

How long it took

2 days. Same functionality. But now I can develop without fear of breaking things.

← Back to blog