publish-release
Skill22k starsChanged 2 days agoApache-2.0View on GitHub
Publish a NetBox core (this repository, not a plugin) release after its "Release vX.Y.Z" PR has merged — check the publishing prerequisites, create the GitHub release and tag, watch the PyPI publishing workflow, verify and smoke-test the published package, and close out the milestone. Use when a maintainer asks to publish, tag, or ship a NetBox release whose release PR is merged.
- Installs packages
- Commits and pushes
We split this skill into the rules it gives an agent
6 rules. 0 are common, 2 are distinctive, and 4 are very specific to this project.
0
Common
Most of the 10 edited versions we read keep these.
2
Distinctive
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 12
Run commands from the repository root.
- Distinctive: line 29
If the tag already exists, stop: the release has been created, at least in part.
- Very specific: line 90
When Publish package to PyPI is waiting on the pypi environment, tell the user that a colleague must approve the deployment in the Actions …
- Distinctive: line 92
If any job fails, stop and follow pypi-recovery.md.
- Very specific: line 135
If milestone vX.Y.Z still has open issues, list them and ask whether to move them to the next milestone (gh issue edit N --milestone …
- Very specific: line 137
If milestone vX.Y.(Z+1) doesn't exist yet, create it, due two weeks after this release (patch releases ship every two weeks):
“Common” is measured: kept by at least 6 in 10 of the 10 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Publish a NetBox Release
This skill automates the checklist's steps from Confirm Package Publishing Prerequisites onward, after the release PR (prepared with the prepare-release skill) has merged. The checklist remains the authoritative process.
Creating the GitHub release pushes the vX.Y.Z tag, and the tag push starts .github/workflows/release.yml, which publishes to PyPI. Files uploaded to PyPI can never be replaced, so check everything before step 3, and confirm with the user before every outward-facing action.
Run commands from the repository root. Write temporary files to the session scratchpad ($SCRATCH below).
1. Verify the Merge
git status --porcelain # must be empty
git fetch origin --tags
gh repo set-default --view # must be netbox-community/netbox
gh pr list --repo netbox-community/netbox --head release-vX.Y.Z --state merged --json number,mergeCommit
git checkout --detach <merge commit SHA>
grep '^version:' netbox/release.yaml # must be "X.Y.Z"
git ls-remote --tags origin vX.Y.Z # must print nothing
gh run list --repo netbox-community/netbox --workflow ci.yml --commit <merge commit SHA> --json status,conclusion- The release PR must be merged. Its merge commit is the release commit, and every remaining step uses it rather than
mainHEAD. Automated commits (source translation strings, the VOUCHED list) can land onmainafter the PR merges, and they must not end up in the tag. netbox/release.yamlmust hold the version being released. The published package version comes from this file, not from the tag.- If the tag already exists, stop: the release has been created, at least in part.
- The CI run for the release commit must have succeeded.
2. Check the Publishing Prerequisites
These checks are read-only. Never change repository or environment settings yourself; report what's missing and let the user decide.
The pypi environment's approval gate. The checklist requires the pypi environment to have required reviewers with Prevent self-review enabled, and deployments restricted to v* tags:
gh api repos/netbox-community/netbox/environments/pypi \
--jq '{rules: [.protection_rules[] | {type, prevent_self_review, reviewers: [.reviewers[]?.reviewer | .login // .slug]}], policy: .deployment_branch_policy}'
gh api repos/netbox-community/netbox/environments/pypi/deployment-branch-policies \
--jq '[.branch_policies[] | {name, type}]'Expect a required_reviewers rule with prevent_self_review: true and at least one reviewer, a policy with custom_branch_policies: true, and a {"name": "v*", "type": "tag"} branch policy. (The second command returns 404 when no custom policy is configured.)
If any of these is missing, stop. Explain that creating the release will publish to PyPI immediately, with no approval step, and ask whether to fix the environment first (under Settings → Environments → pypi) or to proceed regardless.
The PyPI trusted publisher. Its configuration on PyPI can't be queried. Treat it as confirmed if the previous release's publish job succeeded and the workflow's publish jobs haven't changed since:
PREV=$(git describe --tags --abbrev=0 HEAD^)
gh run list --workflow release.yml --event push --branch $PREV --json databaseId,conclusion,url
git diff $PREV..HEAD -- .github/workflows/release.ymlOtherwise, ask the user to confirm that the trusted publisher on PyPI still matches this repository, release.yml, and the pypi environment name.
3. Create the Release
Render the release body from the merged release notes:
python3 .claude/skills/draft-release-notes/render_release_notes.py X.Y.Z --format release > $SCRATCH/release-body.mdShow the user the title and body, and state plainly that creating the release pushes the tag and starts publishing to PyPI. Only after they confirm:
gh release create vX.Y.Z --repo netbox-community/netbox \
--target <release commit SHA> \
--title "vX.Y.Z - YYYY-MM-DD" \
--notes-file $SCRATCH/release-body.mdThe date in the title is published from netbox/release.yaml. The checklist targets main. Targeting the release commit's SHA instead keeps out anything pushed to main after the release PR merged.
4. Watch the Workflow
The tag push starts a release.yml run within a minute or so:
gh run list --repo netbox-community/netbox --workflow release.yml --event push --branch vX.Y.Z --json databaseId,status,url
gh run watch <run id> --repo netbox-community/netbox --exit-status # in the background
gh run view <run id> --repo netbox-community/netbox --json jobs --jq '.jobs[] | "\(.databaseId) \(.name): \(.status) \(.conclusion)"'Report the results of the build and verification jobs: Build package artifacts, Verify dependency pins are in sync, Verify the sdist builds a wheel, Smoke test wheel CLI (no dependencies), and Smoke test wheel install.
When Publish package to PyPI is waiting on the pypi environment, tell the user that a colleague must approve the deployment in the Actions UI (the environment prevents self-review). Never approve a deployment yourself, for example through the pending_deployments API.
If any job fails, stop and follow pypi-recovery.md. Never re-run the whole workflow.
5. Verify the Publication
The publish job deployed to the
pypienvironment:gh api "repos/netbox-community/netbox/deployments?environment=pypi&ref=vX.Y.Z" --jq '.[] | {id, environment, created_at}'PyPI lists exactly one wheel and one sdist for the version:
curl -sf https://pypi.org/pypi/netbox/X.Y.Z/json | python3 -c 'import json, sys for f in json.load(sys.stdin)["urls"]: print(f["packagetype"], f["filename"], f["digests"]["sha256"])'Smoke-test the published wheel, following Test-installing the wheel but installing from PyPI. It builds
psycopg[c], which needs the PostgreSQL client headers (libpq-dev) and a compiler. If pip can't find the new version yet, wait a minute and retry.python3 -m venv $SCRATCH/netbox-wheel-test $SCRATCH/netbox-wheel-test/bin/python -m pip install --upgrade pip $SCRATCH/netbox-wheel-test/bin/python -m pip install --no-cache-dir "netbox==X.Y.Z" $SCRATCH/netbox-wheel-test/bin/netbox --version PYTHONPATH=$PWD/scripts \ NETBOX_CONFIGURATION=smoketest_configuration \ NETBOX_ROOT=$SCRATCH/netbox-wheel-root \ NETBOX_SMOKETEST_BASE=$SCRATCH/netbox-wheel-root \ $SCRATCH/netbox-wheel-test/bin/netbox checknetbox --versionmust reportX.Y.Z, andnetbox checkmust report no issues.
6. Close Out the Milestone
Confirm each change with the user before making it.
gh api 'repos/netbox-community/netbox/milestones?state=open&per_page=100' \
--jq '.[] | {number, title, due_on, open_issues}'- If milestone
vX.Y.Zstill has open issues, list them and ask whether to move them to the next milestone (gh issue edit N --milestone vX.Y.(Z+1)). - Close it:
gh api -X PATCH repos/netbox-community/netbox/milestones/<number> -f state=closed If milestone
vX.Y.(Z+1)doesn't exist yet, create it, due two weeks after this release (patch releases ship every two weeks):gh api repos/netbox-community/netbox/milestones -f title=vX.Y.(Z+1) -f due_on=YYYY-MM-DDT00:00:00Z
7. Hand Off
Give the user:
- The release URL, the PyPI project URL (
https://pypi.org/project/netbox/X.Y.Z/), and the workflow run URL - The milestone changes made
- Remaining tasks for them: merging
mainintofeature
Finally, return the checkout to main (git checkout main), since step 1 left it on the detached release commit.
Why These Choices
- Stop on a missing approval gate. Without one, the tag push uploads straight to PyPI, where a mistake can only be corrected by publishing a new version. The checklist depends on the gate as the final review point.
- Never approve or re-run publishing automatically. Approval is deliberately a second person's decision, and re-running the wrong jobs rebuilds distributions that PyPI may already have accepted.
- Render the body from the merged docs. The release notes in
docs/release-notes/are the reviewed text; rendering from them avoids copying the PR body by hand.
References
docs/development/release-checklist.md: The authoritative release processdocs/development/building-the-package.md: Building and test-installing the package.github/workflows/release.yml: The publishing workflow- pypi-recovery.md: What to do when publishing fails
Trending
Quiet since June.about the whole repository
Who's talking about netbox-community/netbox
- netbox-community/netbox-topology-views“Use new version identifier from Netbox”GitHub · Feb 11, 2025 · 17 reactions
- Onemind-Services-LLC/netbox-secrets“Netbox 4.0 Support”GitHub · May 7, 2024 · 12 reactions
- netbox-community/ansible_modules“Inventory plugin broken after upgrading Netbox to 2.11.x”GitHub · Apr 20, 2021 · 10 reactions
- scaleway/python-netboxapi“Support endpoints choices/options in Netbox 2.8”GitHub · Apr 16, 2020 · 10 reactions
- vatesfr/xen-orchestra“Netbox 4.4+ support”GitHub · Sep 9, 2025 · 8 reactions
The biggest 5 of 41 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 41
Talked about on GitHub, Hacker News, Bluesky, Stack Overflow and the web (41 times).
On GitHub · 33
- Feb 11, 2025Use new version identifier from Netbox — netbox-community/netbox-topology-views17 reactions · 4 comments
- May 7, 2024Netbox 4.0 Support — Onemind-Services-LLC/netbox-secrets12 reactions · 12 comments
- Apr 20, 2021Inventory plugin broken after upgrading Netbox to 2.11.x — netbox-community/ansible_modules10 reactions · 7 comments
- Apr 16, 2020Support endpoints choices/options in Netbox 2.8 — scaleway/python-netboxapi10 reactions · 12 comments
- Sep 9, 2025Netbox 4.4+ support — vatesfr/xen-orchestra8 reactions · 8 comments
28 more on GitHub
- Mar 30, 2024Netbox 4.0 compatibility — netbox-community/netbox-bgp6 reactions · 5 comments
- Sep 1, 2023fields.E300 error after upgrading Netbox from v3.5.x to v3.6 — iDebugAll/nextbox-ui-plugin6 reactions · 6 comments
- Aug 30, 2023[Feature]: Add support for NetBox v3.6 — netbox-community/netbox-acls6 reactions · 4 comments
- Jul 21, 2021Porting of Provider Network Model — nautobot/nautobot6 reactions · 7 comments
- Apr 16, 2021Release 1.2.0 — netbox-community/netbox-docker6 reactions · 6 comments
- Jan 29, 2026netbox_4_5: init at 4.5.5 — NixOS/nixpkgs5 reactions · 3 comments
- Feb 28, 2024add support for virtual-disk data from netbox as ressource and data source — e-breuninger/terraform-provider-netbox5 reactions · 4 comments
- Apr 8, 2022Package incompatible with NetBox v3.2.0 — netbox-community/go-netbox5 reactions · 2 comments
- Apr 7, 2022[Add]: Netbox — trueforge-org/truecharts5 reactions · 6 comments
- May 15, 2021Cache the openapi schema — netbox-community/ansible_modules5 reactions · 3 comments
- Nov 24, 2025[Feature]: Supply 4.4.0's new "Changelog message" — netbox-community/ansible_modules4 reactions · 1 comment
- Sep 4, 2024Netbox 4.1.0 compatibility — k1nky/netbox-otp-plugin4 reactions · 3 comments
- Aug 30, 2023[Feature]: Add support for NetBox v3.6 — Onemind-Services-LLC/netbox-metatype-importer4 reactions · 7 comments
- Jul 26, 2022Model Chassis Switches (Module support) — nautobot/nautobot4 reactions · 12 comments
- Oct 19, 2025netbox_4_4: 4.4.2 -> 4.4.6 — NixOS/nixpkgs3 reactions · 1 comment
- May 8, 2025Fix PluginTemplateExtension compatibility with NetBox 4.3.0 — NetTech2001/netbox-interface-synchronization3 reactions · 2 comments
- Jun 9, 2026netbox_4_6: init at 4.6.8 — NixOS/nixpkgs2 reactions · 25 comments
- Aug 18, 2025Housekeeping — netbox-community/netbox-docker2 reactions
- Sep 27, 2024fix: handle netbox migration to disk set in MB — e-breuninger/terraform-provider-netbox2 reactions · 7 comments
- Sep 14, 2022Netbox 3.3 — e-breuninger/terraform-provider-netbox2 reactions · 1 comment
- Sep 10, 2021Upgrade go-netbox to Netbox version 3.0.2 — netbox-community/go-netbox2 reactions · 5 comments
- Dec 18, 2020Netbox now call validate() with a 3rd arg. — jeremyschulman/netbox-plugin-auth-saml22 reactions · 5 comments
- Sep 4, 2020RemoteUserBackend class has been moved in Netbox 2.9 — jeremyschulman/netbox-plugin-auth-saml22 reactions · 3 comments
- Jan 26, 2020Update configmap for v2.7 REDIS changes — netbox-community/netbox-chart2 reactions · 2 comments
- Apr 28, 2026netbox: 4.5.7 -> 4.7.9 — NixOS/nixpkgs1 reaction
- Apr 4, 2026netbox_4_5: 4.5.5 -> 4.5.7 — NixOS/nixpkgs1 reaction · 1 comment
- Apr 2, 2026feat: Netbox 4.5.6 compatibility — 1.6TE interface types + CI update — ctrl-alt-automate/PowerNetbox1 reaction
- Dec 10, 2025netbox_4_4: 4.4.6 -> 4.4.8 — NixOS/nixpkgs1 reaction · 1 comment
On Hacker News · 3
- Feb 16, 2022Netbox: Infrastructure resource modeling for network automation8 points · 2 comments
- Jan 18, 2025Netbox – Network Infrastructure Resource Modeling for Automation1 point
- Apr 4, 2020Netbox, the free and open source IPAM and DCIM solution1 point
On Bluesky · 3
- Feb 24, 2024I like diagrams.net if you’re doing it by hand or github.com/netbox-commu... netbox if you want to go full doco — @bossett.social4 likes and reposts
- Dec 15, 2025@vees Netbox, maybe? https://github.com/netbox-community/netbox — @fritzadalis.infosec.exchange.ap.brid.gy0 likes and reposts · 1 reply
- Feb 7, 2024🔥 Hot Repo! 🔥 (100+ new stars) 📦 netbox-community / netbox ⭐ 14,101 (+190) 🗒 Python The premier source of truth powering network… — @github-trending.bsky.social0 likes and reposts · 1 reply
On Stack Overflow · 1
- Dec 17, 2021Wher to look for custom teplate tag in django0 votes
On the web · 1
- Aug 2, 2023github.com-netbox-community-netbox_-_2023-08-02_08- ... — archive.org
Other versions12 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 12
- pybind/pybind11★ 18ksame name
- rikkahub/rikkahub★ 8.6ksame name
- modelcontextprotocol/csharp-sdk★ 4.6ksame name
- Ayuilos/Miffan★ 311same name
- molefrog/moi★ 189same name
- threadnote/threadnote★ 29same name
- alexjbarnes/cockpit★ 16same name
- nesnilnehc/ai-cortex★ 8same name
- ralphkrauss/agent-orchestrator★ 4same name
- psousa50/claude-code-chats★ 2same name
2 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository11 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- add-config-paramSkill
- add-model-fieldSkill
- add-modelSkill
- draft-release-notesSkill
- prepare-releaseSkill
- remove-config-paramSkill
- remove-model-fieldSkill
- remove-modelSkill
- run-testsSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

