Laying the foundation for release automation: Git skills, CI/CD basics, and familiarity with Node.js as the semantic-release runtime. Then installing Node.js, VS Code with the GitHub extension, and GitHub CLI so the environment is ready to write Conventional Commits from day one.

Welcome to the Learn Semantic Release series! This series covers modern release automation: versions, changelogs, and tags are derived automatically from commit history instead of being guessed manually by humans. But before touching your first release.config.cjs file, there are four foundations you must master: Git & GitHub, commit and changelog structure, CI/CD basics, and Node.js — because semantic-release is a Node.js-based tool.
Episode 0 is the foundation layer. We'll dig into all four skills, then set up a complete working environment: Git installed, Node.js and npm, VS Code with the GitHub/GitLens extensions, and an authenticated GitHub CLI (gh). By the end of the episode, your machine will be ready to run real release automation.
Semantic-release works by reading commit history and creating version tags in the repository. Without Git mastery, this whole series would be like reading a cookbook without ever stepping into the kitchen.
| Concept | Explanation | Key Commands |
|---|---|---|
| Branch | A development path separate from the main line | git branch, git checkout |
| Merge | Combining the history of two branches | git merge |
| Rebase | Rewriting history to make it linear | git rebase |
| Push | Uploading commits to a remote | git push |
| Pull Request | Reviewing and merging between branches on GitHub | git push + GitHub UI |
git branch feature/login
git checkout feature/login
git add .
git commit -m "feat: add login page"
git checkout main
git merge feature/login
git push origin mainThe most important mental model: a commit is a checkpoint, and a branch is a way to develop without breaking the main line. In this series, commit history is not just a record — it is the source of truth that determines whether a new release is created and how large the version bump is.
Before automation, changelogs were written by hand: collecting the list of changes, tidying up categories, then assembling release notes. The problem is that this process forces someone to remember everything that changed since the last release.
Tip
Build the habit of writing commit messages that explain the reason, not just the action. A coherent git log --oneline is excellent raw material for a changelog.
$ git log --oneline -5
e7b2c9d fix: fix login email validation
a31f8b0 feat: add login page
5c9d1a4 chore: update security dependencies
2b4f0e1 feat: dashboard pageSemantic-release usually runs from a CI pipeline, most commonly GitHub Actions. You don't need to be a YAML master, but you must understand the core concepts: a workflow is triggered by events (a commit pushed, a pull request opened), contains jobs, and each job contains steps that execute shell commands.
The learn-github-actions series on this blog is a highly recommended companion before moving on to episode 6.
Semantic-release is a Node.js CLI tool. That means you need Node.js (version 18 or higher, stable at 20 or 22) and one of the package managers: npm, yarn, pnpm, or Bun. You don't need to be skilled at JavaScript programming — you just need to understand how to install dependencies and run CLIs via npx.
Make sure Git is installed and the repository is ready. Use a new learning repository — ideally not a production repository that is actually used.
git --version
mkdir belajar-semantic-release
cd belajar-semantic-release
git init
git remote add origin git@github.com:kalian/belajar-semantic-release.gitDownload Node.js LTS from nodejs.org or use your favorite package manager. Make sure the Node version is at least 18:
$ node --version
v22.22.0
$ npm --version
10.9.4A comfortable editor speeds up your workflow. In VS Code, install the two most useful extensions for this series:
To install them: open VS Code, press Ctrl+Shift+X, search for the extension name, then click Install. These two extensions won't write commits for you, but they give visual context to the history that semantic-release will later read.
gh makes authentication and repository operations faster from the terminal.
gh auth login
gh auth statusThe gh auth login command guides you through choosing a host (GitHub.com), an HTTPS or SSH protocol, then logging in through the browser with a one-time code. The expected output:
$ gh auth status
github.com
✓ Logged in to github.com as arman-dp
✓ Git operations for github.com configured to use sshFrequently used gh commands:
| Command | Function |
|---|---|
gh repo clone owner/repo | Clone a repository |
gh pr create | Create a pull request |
gh run list | head -5 | List workflow runs |
gh release list | List releases created by semantic-release |
The blog you are reading right now (the devvnull.vercel.app repository) is a real-world example of semantic-release in action. Its configuration lives in the release.config.cjs file at the repository root, with:
main branch for stable releases.staging branch as a prerelease with an rc suffix.tagFormat of v followed by the semver version.commit-analyzer through github.We'll dig into this file in more depth in episode 5.
Warning
Never commit a .env.local file or any token to git. GitHub Actions and semantic-release take secrets from repository secrets, not from files that are versioned.
In episode 0 you set up a complete foundation:
Your environment is now ready. In episode 1 we'll pause for a moment to understand the history and why semantic-release was born — from the error-prone problems of manual release, to how Conventional Commits make commit history machine-analyzable. See you in episode 1!