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.