as open source maintainer:
I like normal "Merge" the most.
- It keeps git history of the author.
- It works great when multiple authors work on a PR.
- git blame shows a smaller commit. More likely to understand what's the change intent.
- git bisect finds bugs easier.
- Easier to remove a part of the PR.
Author should feel free to squash logical related commits in her/his PR.
- You lose information.
- Difficult to fix a PR based this PR or a intermediate state of it.
- You rewrite commits.
- Difficult to fix a PR based this PR or a intermediate state of it.
I don't like to have commit messages in a specific format.
- It should be easy to write the message.
- A PR author probably don't know how about your format.
- Asking her/him to rewrite the commit message could be difficult. Not everybody is a git expert.
- Commit message can't be wrong, because it's not relevant for the process
- You don't need an extra tool to make a commit
- Relevant information can be put into the PR. It's easily editable and can have a template. It also includes discussion.
- Minimium work required to write and merge PRs.
I like github reviews.
I don't think an extra tooling is needed here.
I don't like to use a separate tool for releasing.
I like this command: npm version patch && git push && git push --tags && npm publish
- It's simple. No setup needed. Works on every repo.
- It creates tags in git and npm.
- It fails if your local branch is not up-to-date.
- It fails if you have uncommited changes.
- You can manually fix-up every part of the process. Custom version, npm tag, etc.
- You have to check CI manually before cutting a release. But probably you already have a notification in place if CI on master fails.
I don't like automatic publish to npm.
I think it's not nessecary (at least for npm packages).
Just use webpack/webpack#master
in your package.json
dependencies
to get the bleeding edge version.
I don't like to leak my npm credentials to github or travis.
I like to publish static sites automatically to gh-pages.
I think it's only relevant if you expect many commits.
I like to write the change manually.
I don't like a CHANGELOG.md file.
I like github releases.
I like to write the changelog in one go.
- You can omit unimportant messages
- You can merge multiple commits (i. e. a PR fixing another PR)
- You can add details to important stuff, i. e. steps for migration, links to documentation
- You can edit the changelog if there was a typo in it
- You don't have to rewrite git history to fix the changelog
- Less context switching for interleaving changelog writing with coding. Only changelog work on release.
- Fewest duplications
- CHANGELOG.md would duplicate github releases
- generating changelog from git history would duplicate git history in changelog
- Details history: git history
- Summarized changelog: github releases
I like integration tests over unit tests.
- You get more for your time!
- Refactoring is easier.
- While refactoring it's less likely that you have to change the tests.
- It's more likely to write correct integration tests than unit tests.
- Integration tests can be used as examples for users.
I think they are useless.
I like using labels and milestones instead.
- Too many clicks
- Duplicated information
I don't like to add many labels.
If issues have more the 3 labels I think that something is wrong. Remove labels!
In my opinion most useful labels:
bug
it's a bugmerge it
PR is fine, could be merged if CI passesbreaking change
PR that as breaking changestests needed
PR that need tests- Label for PRs another Contributor should take care of
- Labels for issue where everybody can do a PR (easy one)
I like to assign important issues to the next milestone.
I like to assign important PRs to the next milestone.
I like to close issue if issue template is ignored.
I don't like trying to solve problems when information is incomplete.
I don't like to answer questions that many other people could answer. -> Stack Overflow
I don't like to write node.js code that need to be transpiled before use.
- Extra step, extra source of errors
- Slows down development
- Debugging is more diffcult
- Coverage is more difficult
- People that want to contribute may not know your transpiled language
- Don't assume everybody knows or likes Typescript or ES2021
It's fine if you need to bundle anyway, i. e. when writing code for the browser.
I like CI.
- Travis is great to linux test and general tests
- Travis is slow for OSX build. Don't do more than 1 OSX build per commit.
- Configure travis to only build master branch and PRs to reduce travis load.
- Appveyor is great to Windows test. But it's also slow, because it only does one build at a time. Not as slow as travis for OSX.
- Configure appveyor to only build master branch and PRs to reduce appveyor load.
- CircleCI cannot replace travis, because it doesn't support matrix builds.
- CircleCI can be used to fast feedback for PRs.
I think people don't read CI results for their PRs.
I like to copy relevant CI log seqment into the PR comments.
I like code coverage.
- codecov.io great, very detailed info
- Can be configured to require 90% coverage on PR diffs
- coveralls.io great, less detailed but fine
- It breaks when doing too many builds in short time (you get no result)
I don't like github teams.
I like contributors on the repo settings.
I like teams only if they affect multiple repos that are connected.
I like if only one person is responsible for release and publish.
I like to assign only one person for merging PRs. (not always possible)
- Teams need too many click to configure for each repo
- Similar structure of repos and teams is an antipattern
- Teams can't be moved between orgs
I like to enable master as protected branch.
I like required status checks: travis, appveyor, coverage (patch > 90%).
Note: If it is also enforced for admins your can't push a new release commit
I like to disable "Squash to merge" and "Rebase to merge".
I like most of what you've got in here! I hope you don't mind me sharing my preferences/perspective too!
For context, I have 76 packages on npm (currently), most of which I'm actively maintaining, and I like to spend as little time maintining them as possible :)
Merge PR
I prefer
Squash and merge
because I feel like it keeps the git history clean and I've yet to wish that I had each commit individually. It's also nice because I can change the commit message when I merge (more on that next).Commit messages
I like to standardize the format my commit messages. It allows for a great deal of automation (which saves me time in the long run). I use validate-commit-msg + husky + opt-cli. And if someone doesn't follow the format, that's fine because when I
Squash and merge
I can change the commit message anyway.Release
I appreciate the simplicity of your release process. And your arguments are great. However, because saving time maintaining packages is paramount for me, I definitely automate my releases with semantic-release. It's been incredibly useful for me. There are many packages I have which I'm not actively developing (they're "done"), but I can continue to maintain them because when someone makes a PR, I can merge it (even on my phone) and it's automatically released. I often never think about releases. I really like not thinking about my version number too.
Changelog
I also don't like using CHANGELOG.md and prefer github releases. Because I use conventional-changelog commit message conventions, I can automatically generate this changelog and I think it looks pretty good. Not perfect, but again, because saving time is paramount, I think that this is an acceptable trade-off.
Testing
I agree that integration testing is better. I find it harder for me to get good code coverage with it. Also, it's more rewarding to write unit tests (even if they're less valuable). So I agree with you, and I should do it more, but I don't :-( Maybe I will!
Transpiling
I have a yeoman generator to initialize all my OSS projects. So the tooling setup is automatic, quick, and easy. And ever since I stopped committing generated files, I've never really had any trouble with contributions (note: I don't use TypeScript, just modern JavaScript). It's really nice to have all the latest stuff and not worry about Node/Browser version support and with the automatic tooling setup there's little reason to not.
Contributors
I've not had a ton of experience with GitHub teams. My angular-formly project is part of the formly-js org that I manage and teams haven't really been much of a problem. I thought I would mention in addition that all my projects use all-contributors. Not sure that would scale very well to a highly contributed project such as webpack (the community is huge), but it works great for my projects (and some have quite a few contributors).
Thanks for your thoughts! It's giving me some things to think about! I appreciate your perspective!