# Release

> Guides through the full gem release process — bump version, update CHANGELOG, tag, push to RubyGems, and create GitHub Release. Use when user asks to release a new version, cut a release, or similar.

- Skill: `bibendi/release` (Agent Skill)
- Install (CLI): `npx skillmds@latest add bibendi/release`
- Raw SKILL.md: https://api.skillmd.com/api/skills/bibendi/release/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: bibendi (https://skillmd.com/u/bibendi)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/bibendi/release

---


# Gem Release Process

## Overview

The release process for the `schked` gem involves:

1. Bump version in `lib/schked/version.rb`
2. Add new section in `CHANGELOG.md`
3. Commit and push changes to `master`
4. Create and push a git tag `vX.Y.Z`
5. CI handles the rest (push to RubyGems via Trusted Publishing + GitHub Release)

## Prerequisites

- Trusted Publisher must be configured on RubyGems.org:
  - Go to `https://rubygems.org/gems/schked/settings`
  - Add a Trusted Publisher for:
    - Repository: `bibendi/schked`
    - Workflow: `release.yml`
    - Environment: *(leave empty)*
- You must have push access to the repository
- The CI must be green on `master` before releasing (recommended)

## Step-by-step

### 1. Determine new version

Look at current version in `lib/schked/version.rb`. Follow [SemVer](https://semver.org/).

### 2. Update version file

Edit `lib/schked/version.rb` and update the `VERSION` constant:

```ruby
module Schked
  VERSION = "X.Y.Z"
end
```

### 3. Update CHANGELOG

Edit `CHANGELOG.md` and add a new section at the top (after `# Changelog`):

```markdown
## [X.Y.Z] - YYYY-MM-DD

- Description of change [#123]
```

Use the format `## [X.Y.Z] - YYYY-MM-DD` with no `v` prefix.
Prefix breaking changes with `**BREAKING**`.

### 4. Commit

```bash
git add lib/schked/version.rb CHANGELOG.md
git commit -m "chore: bump version to X.Y.Z"
```

### 5. Push to master

```bash
git push origin master
```

### 6. Tag and push the tag

```bash
git tag vX.Y.Z
git push origin vX.Y.Z
```

### 7. CI does the rest

Pushing the `vX.Y.Z` tag triggers `.github/workflows/release.yml` which:

1. Builds the gem and pushes to RubyGems via `rubygems/release-gem` action (Trusted Publishing — no API keys needed)
2. `bundle exec rake release` runs under the hood — skips tag creation since it already exists (`already_tagged?` guard)
3. Extracts changelog section via `scripts/release_notes.sh`
4. Creates a GitHub Release with the changelog as notes and `.gem` as asset

## Troubleshooting

- **`rake release` fails with "not clean"**: Ensure all changes are committed before pushing the tag
- **Trusted Publishing fails**: Verify the publisher is correctly configured on rubygems.org and the workflow name matches exactly `release.yml`
- **Tag already exists**: If you need to re-release, delete the tag locally and remotely first (`git tag -d vX.Y.Z && git push origin :refs/tags/vX.Y.Z`)

