This checklist ensures consistent and high-quality releases for ExLLM.
-
Run all tests
mix test- All tests pass
- No skipped tests without justification
-
Check code quality
mix format --check-formatted mix credo --strict mix compile --warnings-as-errors
- No formatting issues
- No Credo warnings
- No compilation warnings
-
Run Dialyzer
mix dialyzer
- Address any new warnings
- Update .dialyzer_ignore.exs if needed
-
Security audit
mix deps.audit
- No vulnerable dependencies
-
Update version numbers
-
mix.exs- Update@version -
README.md- Update version badge and installation instructions -
docs/QUICKSTART.md- Update dependency version -
docs/USER_GUIDE.md- Update dependency version - Check for any hardcoded version references
-
-
Update CHANGELOG.md
- Add new version section with date
- Move items from
[Unreleased]to new version - Categorize changes: Added, Changed, Fixed, Removed
- Mark any breaking changes with BREAKING:
- Add migration notes for breaking changes
-
Review and update docs
- API documentation is current
- Examples work with new version
- Migration guide updated (if needed)
- New features are documented
-
Generate and review ExDoc
mix docs open doc/index.html
- All modules have documentation
- All public functions have @doc
- @moduledoc explains purpose clearly
- Examples are correct and helpful
-
Run tests with all providers
# With API keys loaded source scripts/run_with_env.sh mix test --include integration
-
Test critical paths manually
- Basic chat with major providers (OpenAI, Anthropic, Gemini)
- Streaming works correctly
- Error handling behaves as expected
- New features work as documented
-
Check backward compatibility
- Previous version's examples still work
- No unexpected breaking changes
- Deprecation warnings are clear
-
Update dependencies
mix deps.update --all mix deps.compile
- Test with updated dependencies
- Lock file is committed
-
Check dependency constraints
- Version constraints in mix.exs are appropriate
- No overly restrictive constraints
- Compatible with latest Elixir/Erlang
-
Determine version number
- MAJOR: Breaking changes
- MINOR: New features, backward compatible
- PATCH: Bug fixes only
- Follow Semantic Versioning
-
Create version commit
git add -A git commit -m "chore: bump version to X.Y.Z"
-
Create annotated tag
git tag -a vX.Y.Z -m "Release vX.Y.Z" -
Push commits and tags
git push origin main git push origin vX.Y.Z
- Create GitHub release
- Go to Releases → New Release
- Select the version tag
- Title:
vX.Y.Z - Copy CHANGELOG entries to description
- Highlight major features/fixes
- Add migration notes if applicable
-
Publish to Hex
mix hex.publish
- Review package contents
- Confirm version is correct
- Enter Hex credentials
-
Verify publication
- Check https://hex.pm/packages/ex_llm
- Documentation is generated
- Installation instructions work
-
Update project references
- Update README with new version info
- Update any example repositories
- Update integration guides
-
Announce release (if major/minor)
- Twitter/X announcement
- Elixir Forum post
- Discord/Slack communities
- Include highlights and thanks
-
Watch for issues
- GitHub issues for problems
- Hex.pm download stats
- Community feedback
-
Be ready to patch
- Keep PR ready for hotfixes
- Document any found issues
-
Update project boards
- Close completed milestone
- Create next milestone
- Move unfinished issues
-
Start CHANGELOG for next version
- Add
[Unreleased]section - Begin tracking changes
- Add
If critical issues are found:
-
Revert on Hex (within 24 hours)
mix hex.publish revert X.Y.Z
-
Communicate
- GitHub issue explaining the problem
- Announcement in same channels
- Clear timeline for fix
-
Fix and Re-release
- Create patch version
- Extra thorough testing
- Clear communication about fix
For critical security/bug fixes:
-
Create hotfix branch
git checkout -b hotfix/X.Y.Z main
-
Minimal changes only
- Fix the specific issue
- Add regression test
- Update CHANGELOG
-
Fast-track release
- Abbreviated testing (focus on fix)
- Immediate version bump
- Priority announcement
Consider automating these checks with GitHub Actions:
# .github/workflows/release.yml
name: Release Checklist
on:
push:
tags:
- 'v*'
jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: erlef/setup-beam@v1
- run: mix deps.get
- run: mix format --check-formatted
- run: mix credo --strict
- run: mix compile --warnings-as-errors
- run: mix test
- run: mix docs- v1.0.0-rc1 - First release candidate
- Major architectural improvements
- Module extraction
- Provider delegation system
- Zero breaking changes
Remember: Quality over speed. It's better to delay a release than to ship broken code.