Skip to content

Commit 7dbe3c6

Browse files
committed
feat(release): add release command group and CI finalization
Add `sentry release` command group with 8 subcommands for full release lifecycle management, plus a CI post-release script for automated finalization. Commands: list, view, create, finalize, delete, deploy, set-commits, propose-version. Supports --auto (repo integration) and --local (git history) modes for commit association via simple-git. CI integration: script/finalize-release.ts runs in .craft.yml postReleaseCommand before version bump to create, set commits, finalize, and deploy releases automatically. Ref: #600
1 parent 8e8973d commit 7dbe3c6

File tree

32 files changed

+3393
-7
lines changed

32 files changed

+3393
-7
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: Sentry Release
2+
on:
3+
release:
4+
types: [published]
5+
6+
permissions:
7+
contents: read
8+
9+
jobs:
10+
finalize:
11+
name: Finalize Sentry Release
12+
runs-on: ubuntu-latest
13+
# Skip pre-releases (nightlies, dev versions)
14+
if: "!github.event.release.prerelease"
15+
env:
16+
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
17+
VERSION: ${{ github.event.release.tag_name }}
18+
steps:
19+
- name: Install CLI
20+
run: npm install -g "sentry@${VERSION}"
21+
22+
- name: Create release
23+
run: sentry release create "sentry/${VERSION}" --project cli
24+
25+
- name: Set commits
26+
run: sentry release set-commits "sentry/${VERSION}" --auto
27+
28+
- name: Finalize release
29+
run: sentry release finalize "sentry/${VERSION}"
30+
31+
- name: Create deploy
32+
run: sentry release deploy "sentry/${VERSION}" production

AGENTS.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ bun run test:unit # Run unit tests only
6161
bun run test:e2e # Run e2e tests only
6262
```
6363

64+
## Rules: No Runtime Dependencies
65+
66+
**CRITICAL**: All packages must be in `devDependencies`, never `dependencies`. Everything is bundled at build time via esbuild. CI enforces this with `bun run check:deps`.
67+
68+
When adding a package, always use `bun add -d <package>` (the `-d` flag).
69+
70+
When the `@sentry/api` SDK provides types for an API response, import them directly from `@sentry/api` instead of creating redundant Zod schemas in `src/types/sentry.ts`.
71+
6472
## Rules: Use Bun APIs
6573

6674
**CRITICAL**: This project uses Bun as runtime. Always prefer Bun-native APIs over Node.js equivalents.

docs/public/.well-known/skills/index.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"references/logs.md",
1414
"references/organizations.md",
1515
"references/projects.md",
16+
"references/release.md",
1617
"references/setup.md",
1718
"references/sourcemap.md",
1819
"references/teams.md",
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
---
2+
title: release
3+
description: Release commands for the Sentry CLI
4+
---
5+
6+
Work with Sentry releases
7+
8+
## Commands
9+
10+
### `sentry release list <org/project>`
11+
12+
List releases
13+
14+
### `sentry release view <org/version>`
15+
16+
View release details
17+
18+
### `sentry release create <org/version>`
19+
20+
Create a release
21+
22+
### `sentry release finalize <org/version>`
23+
24+
Finalize a release
25+
26+
### `sentry release delete <org/version>`
27+
28+
Delete a release
29+
30+
### `sentry release deploy <org/version> <environment> [name]`
31+
32+
Create a deploy for a release
33+
34+
### `sentry release set-commits <org/version>`
35+
36+
Set commits for a release
37+
38+
### `sentry release propose-version`
39+
40+
Propose a release version (outputs the current git HEAD SHA)
41+
42+
All commands support `--json` for machine-readable output and `--fields` to select specific JSON fields.
43+
44+
<!-- GENERATED:END -->
45+
46+
## Examples
47+
48+
```bash
49+
# List releases (auto-detect org)
50+
sentry release list
51+
52+
# List releases in a specific org
53+
sentry release list my-org/
54+
55+
# View release details
56+
sentry release view 1.0.0
57+
sentry release view my-org/1.0.0
58+
59+
# Create and finalize a release
60+
sentry release create 1.0.0 --finalize
61+
62+
# Create a release, then finalize separately
63+
sentry release create 1.0.0
64+
sentry release set-commits 1.0.0 --auto
65+
sentry release finalize 1.0.0
66+
67+
# Set commits from local git history
68+
sentry release set-commits 1.0.0 --local
69+
70+
# Create a deploy
71+
sentry release deploy 1.0.0 production
72+
sentry release deploy 1.0.0 staging "Deploy #42"
73+
74+
# Propose a version from git HEAD
75+
sentry release create $(sentry release propose-version)
76+
77+
# Output as JSON
78+
sentry release list --json
79+
sentry release view 1.0.0 --json
80+
```

package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"type": "git",
66
"url": "git+https://github.com/getsentry/cli.git"
77
},
8+
"main": "./dist/index.cjs",
89
"devDependencies": {
910
"@anthropic-ai/sdk": "^0.39.0",
1011
"@biomejs/biome": "2.3.8",
@@ -43,18 +44,16 @@
4344
"wrap-ansi": "^10.0.0",
4445
"zod": "^3.24.0"
4546
},
46-
"bin": {
47-
"sentry": "./dist/bin.cjs"
48-
},
49-
"main": "./dist/index.cjs",
50-
"types": "./dist/index.d.cts",
5147
"exports": {
5248
".": {
5349
"types": "./dist/index.d.cts",
5450
"require": "./dist/index.cjs",
5551
"default": "./dist/index.cjs"
5652
}
5753
},
54+
"bin": {
55+
"sentry": "./dist/bin.cjs"
56+
},
5857
"description": "Sentry CLI - A command-line interface for using Sentry built by robots and humans for robots and humans",
5958
"engines": {
6059
"node": ">=22"
@@ -94,5 +93,6 @@
9493
"check:deps": "bun run script/check-no-deps.ts",
9594
"check:errors": "bun run script/check-error-patterns.ts"
9695
},
97-
"type": "module"
96+
"type": "module",
97+
"types": "./dist/index.d.cts"
9898
}

plugins/sentry-cli/skills/sentry-cli/SKILL.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,22 @@ Manage Sentry dashboards
315315

316316
→ Full flags and examples: `references/dashboards.md`
317317

318+
### Release
319+
320+
Work with Sentry releases
321+
322+
- `sentry release list <org/project>` — List releases
323+
- `sentry release view <org/version...>` — View release details
324+
- `sentry release create <org/version...>` — Create a release
325+
- `sentry release finalize <org/version...>` — Finalize a release
326+
- `sentry release delete <org/version...>` — Delete a release
327+
- `sentry release deploy <org/version environment name...>` — Create a deploy for a release
328+
- `sentry release deploys <org/version...>` — List deploys for a release
329+
- `sentry release set-commits <org/version...>` — Set commits for a release
330+
- `sentry release propose-version` — Propose a release version
331+
332+
→ Full flags and examples: `references/release.md`
333+
318334
### Repo
319335

320336
Work with Sentry repositories
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
---
2+
name: sentry-cli-release
3+
version: 0.24.0-dev.0
4+
description: Sentry CLI release commands
5+
requires:
6+
bins: ["sentry"]
7+
auth: true
8+
---
9+
10+
# release Commands
11+
12+
Work with Sentry releases
13+
14+
### `sentry release list <org/project>`
15+
16+
List releases
17+
18+
**Flags:**
19+
- `-n, --limit <value> - Maximum number of releases to list - (default: "30")`
20+
- `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data`
21+
- `-c, --cursor <value> - Navigate pages: "next", "prev", "first" (or raw cursor string)`
22+
23+
### `sentry release view <org/version...>`
24+
25+
View release details
26+
27+
**Flags:**
28+
- `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data`
29+
30+
### `sentry release create <org/version...>`
31+
32+
Create a release
33+
34+
**Flags:**
35+
- `-p, --project <value> - Associate with project(s), comma-separated`
36+
- `--finalize - Immediately finalize the release (set dateReleased)`
37+
- `--ref <value> - Git ref (branch or tag name)`
38+
- `--url <value> - URL to the release source`
39+
40+
### `sentry release finalize <org/version...>`
41+
42+
Finalize a release
43+
44+
**Flags:**
45+
- `--released <value> - Custom release timestamp (ISO 8601). Defaults to now.`
46+
- `--url <value> - URL for the release`
47+
48+
### `sentry release delete <org/version...>`
49+
50+
Delete a release
51+
52+
**Flags:**
53+
- `-y, --yes - Skip confirmation prompt`
54+
55+
### `sentry release deploy <org/version environment name...>`
56+
57+
Create a deploy for a release
58+
59+
**Flags:**
60+
- `--url <value> - URL for the deploy`
61+
- `--started <value> - Deploy start time (ISO 8601)`
62+
- `--finished <value> - Deploy finish time (ISO 8601)`
63+
- `-t, --time <value> - Deploy duration in seconds (sets started = now - time, finished = now)`
64+
65+
### `sentry release deploys <org/version...>`
66+
67+
List deploys for a release
68+
69+
### `sentry release set-commits <org/version...>`
70+
71+
Set commits for a release
72+
73+
**Flags:**
74+
- `--auto - Use repository integration to auto-discover commits`
75+
- `--local - Read commits from local git history`
76+
- `--clear - Clear all commits from the release`
77+
- `--commit <value> - Explicit commit in REPO@SHA format (can be comma-separated)`
78+
- `--initial-depth <value> - Number of commits to read with --local - (default: "20")`
79+
80+
### `sentry release propose-version`
81+
82+
Propose a release version
83+
84+
**Examples:**
85+
86+
```bash
87+
# List releases (auto-detect org)
88+
sentry release list
89+
90+
# List releases in a specific org
91+
sentry release list my-org/
92+
93+
# View release details
94+
sentry release view 1.0.0
95+
sentry release view my-org/1.0.0
96+
97+
# Create and finalize a release
98+
sentry release create 1.0.0 --finalize
99+
100+
# Create a release, then finalize separately
101+
sentry release create 1.0.0
102+
sentry release set-commits 1.0.0 --auto
103+
sentry release finalize 1.0.0
104+
105+
# Set commits from local git history
106+
sentry release set-commits 1.0.0 --local
107+
108+
# Create a deploy
109+
sentry release deploy 1.0.0 production
110+
sentry release deploy 1.0.0 staging "Deploy #42"
111+
112+
# Propose a version from git HEAD
113+
sentry release create $(sentry release propose-version)
114+
115+
# Output as JSON
116+
sentry release list --json
117+
sentry release view 1.0.0 --json
118+
```
119+
120+
All commands also support `--json`, `--fields`, `--help`, `--log-level`, and `--verbose` flags.

script/generate-sdk.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,8 @@ for (const { path, command } of allCommands) {
556556
let body: string;
557557

558558
const brief = command.brief || path.join(" ");
559-
const methodName = path.at(-1) ?? path[0];
559+
const rawName = path.at(-1) ?? path[0];
560+
const methodName = needsQuoting(rawName) ? `"${rawName}"` : rawName;
560561
const indent = " ".repeat(path.length - 1);
561562

562563
if (hasVariadicPositional) {

src/app.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import { orgRoute } from "./commands/org/index.js";
2424
import { listCommand as orgListCommand } from "./commands/org/list.js";
2525
import { projectRoute } from "./commands/project/index.js";
2626
import { listCommand as projectListCommand } from "./commands/project/list.js";
27+
import { releaseRoute } from "./commands/release/index.js";
28+
import { listCommand as releaseListCommand } from "./commands/release/list.js";
2729
import { repoRoute } from "./commands/repo/index.js";
2830
import { listCommand as repoListCommand } from "./commands/repo/list.js";
2931
import { schemaCommand } from "./commands/schema.js";
@@ -55,6 +57,7 @@ const PLURAL_TO_SINGULAR: Record<string, string> = {
5557
issues: "issue",
5658
orgs: "org",
5759
projects: "project",
60+
releases: "release",
5861
repos: "repo",
5962
teams: "team",
6063
logs: "log",
@@ -73,6 +76,7 @@ export const routes = buildRouteMap({
7376
dashboard: dashboardRoute,
7477
org: orgRoute,
7578
project: projectRoute,
79+
release: releaseRoute,
7680
repo: repoRoute,
7781
team: teamRoute,
7882
issue: issueRoute,
@@ -90,6 +94,7 @@ export const routes = buildRouteMap({
9094
issues: issueListCommand,
9195
orgs: orgListCommand,
9296
projects: projectListCommand,
97+
releases: releaseListCommand,
9398
repos: repoListCommand,
9499
teams: teamListCommand,
95100
logs: logListCommand,
@@ -109,6 +114,7 @@ export const routes = buildRouteMap({
109114
issues: true,
110115
orgs: true,
111116
projects: true,
117+
releases: true,
112118
repos: true,
113119
teams: true,
114120
logs: true,

0 commit comments

Comments
 (0)