-
-
Notifications
You must be signed in to change notification settings - Fork 10.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Tools & Docs Improvements #8235
Comments
(copied verbatim from slack) I think another thing is to be extremely verbose with any messages explaining what is going on. So when you first do
When a user does an update and the node version has changed it could say something like:
If we try and do a upgrade but you're not actually on origin/master it could say:
Etc, the point is our workflows are basically the same and there will be known and common issues that we can't automatically get around without stashing or losing work, and without doing massive rebuilds, if we capture those cases and check for them we can prompt ourselves on how to fix the issues if we come back to it after working on something else for a few months. |
Issue content updated with a section on git hooks. |
The points in this issue seem to cover everything, in short I think we need a 3 step approach to improving our tooling, in order of priority:
When it comes to the new tool for resetting an env, it seems there is some uncertainty about what the tool should look and work like, that I think we can only get clarity on by trying a few things out. Still I am interested to hear the reasoning behind using an npm script instead of grunt? Also - I like the idea of the flags, I think that there is a way to make npm scripts use env vars, and grunt definitely can, so perhaps that's a better option? |
I think this mostly stemmed from looking at it from a contributors view where |
I had a quick look around and it doesn't seem like there is a useful way to figure out the node version that a binary dependency was compiled against. Fortunately sqlite3 seems to have it in the name of the library in We can figure out the version of node that sqlite3 was compiled against from the library name, the naming convention appears to go |
refs TryGhost#8235 - adds `grunt dev --server` which will start the express server and restart on server changes but will not rebuild or watch any client files (if client files are missing or out of date you can run `grunt build` first) - adds `grunt dev --client` which will only start the client server and rebuilding/livereload - useful if you are experiencing issues with one or the other crashing because you can run server/client in separate tabs
refs #8235 - adds `grunt dev --server` which will start the express server and restart on server changes but will not rebuild or watch any client files (if client files are missing or out of date you can run `grunt build` first) - adds `grunt dev --client` which will only start the client server and rebuilding/livereload - useful if you are experiencing issues with one or the other crashing because you can run server/client in separate tabs
refs TryGhost#8235 - users share the general npm error log, which won't help - so it's better to hide this log
refs #8235 - users share the general npm error log, which won't help - so it's better to hide this log
refs TryGhost#8235 - add a new grunt command `dev-master` - this command will bring back your working directory to latest master - plus it will update your dependencies and checks your database health - it won't build the client (!)
refs #8235 - add a new grunt command `dev-master` - this command will bring back your working directory to latest master - plus it will update your dependencies and checks your database health - it won't build the client (!) * 🛠 ✨ grunt dev-master * fix jscs 💣 * change to grunt master
In my opinion, I have been using it since it was introduced, and keep getting confused by bugs that are fixed in master, but since the commit ref was updated. As a dev, I always want the latest changes. Does anyone disagree? Is it ok for me to make this change? |
refs TryGhost#8235 Usage: In the root of your repo run `cp .github/hooks/pre-commit ./git/hooks/pre-commit` `chmod ugo+x .git/hooks/pre-commit` - Checks to see if there are any submodules about to be committed - Output matches closely to `git st` to make it easy to read - Requires interaction from the committer to accept that this really should be committed
refs TryGhost#8235 - Use yarn to install top-level dependencies - Change to use git submodule update --remote to update submodules to master rather than the pinned commit - Clarify that the existing submodule update will update to the pinned commits by naming it 'pinned' - Use `upstream` as default remote - Support --upstream= or GHOST_UPSTEAM env var - Output a log line telling the user where master was pulled from
refs #8235 - Use yarn to install top-level dependencies - Change to use git submodule update --remote to update submodules to master rather than the pinned commit - Clarify that the existing submodule update will update to the pinned commits by naming it 'pinned' - Use `upstream` as default remote - Support --upstream= or GHOST_UPSTEAM env var - Output a log line telling the user where master was pulled from
refs TryGhost#8235 - Grunt symlink will make a link to the pre-commit hook - It ONLY does this if there isn't already a pre-commit hook, so won't overwrite anything - It does this as part of npm run init, not grunt init, because a release repo would NEVER want this - This is a dev tool, that configures the repo for development
refs #8235 Usage: - for existing development setups: `grunt symlink` (will create the pre-commit symlink) - for fresh development setups: `npm run init` (symlinking happens as part of the typical set up) - ✨ Added pre-commit hook to handle submodules - Checks to see if there are any submodules about to be committed - Output matches closely to `git st` to make it easy to read - Requires interaction from the committer to accept that this really should be committed - ✨ Use grunt symlink to register githooks - Grunt symlink will make a link to the pre-commit hook - It ONLY does this if there isn't already a pre-commit hook, so won't overwrite anything - It does this as part of npm run init, not grunt init, because a release repo would NEVER want this - This is a dev tool, that configures the repo for development
I've been looking at a pre-commit hook that runs ESLint (or JSHint/JSCS for the server side) on only the changed files when committing - I thought it might help with the annoying situation where you push to a PR only to realise some time later that Travis has failed on a minor linting error. This script looks like a good start but I think it could be adapted to have a similar yes/no approach to our current submodules script https://github.com/tryghost/ghost#ghost-10-alpha-developer-install It may be possible to do this in a pre-push hook to cut down on any local dev pain it could introduce but some more research is needed into how to grab the changed files. Does this sound like something that would be useful? Personally I try to never commit with linting errors (Atom does a pretty good job of highlighting them) but I wonder how disruptive it could be to the workflows of everyone else. |
Mebbe a pre-push rather than a precommit, but that's probably an optimisation. One thing I can speak to - we should just have one defacto eslint ruleset that we use everywhere IMO. |
We have optimised our tooling for I've moved the last subtasks to our 1.0 documentation issue. I would like to collect all tasks for |
Issue Summary
Core team members and contributors have been experiencing varying levels of pain keeping Ghost up to date and with day-to-day development between server/client work. The underlying issues for this pain appear to be:
Action Plan
[ ] update working-with-ghost as a top level guide(moved to Ghost 1.0.0 Documentation #7421)[ ] rework main contributing guide(moved to Ghost 1.0.0 Documentation #7421 as optional)grunt dev
into client and server commands[ ] documentation to explain when/why to use the individual commands(moved to Ghost 1.0.0 Documentation #7421)grunt dev
admin livereload #8176 & ✨grunt dev
admin livereload Admin#590)grunt dev
can't be run simultaneously with the client testsclean up gruntfile(moved to Ghost 1.0.0 Documentation #7421)npm run init on feature branches - warning?(moved to Ghost 1.0.0 Documentation #7421)Subtasks:
npm
stderr output for npm scripts so that it's easier to see actual error output and we get useful error reports, refs Mac 10.12/node 6.10/ ghost master init fail #8231Potential tooling improvements
npm run dev-update
One of the noted pain points was taking an old development setup and getting it up to date with
master
for both client and server. For this there's a proposal to add annpm run dev-update
command (naming TBD, an alternative might benpm run dev-master
) that works through the commands that we're currently using to update manually:git checkout master
git pull upstream master
npm install
cd core/client
git checkout master
git pull upstream master
npm install
bower install
cd ../../
knex-migrator health
This should initially check to see if there is an
upstream
remote and where it is pointing to, if it doesn't exist it should be added, if it does exist and doesn't point to Ghost's core repos then we should print an error with instructions to provide a flag or a link to tooling documentation.The
knex-migrator health
command run after updating everything to master checks the database setup and will instruct you if you need to initialise the database or run migrations.There are two proposed flags to this command based upon current team members preferred workflows:
--upstream=theirs
- for users who have a different remote name for what is traditionally calledupstream
--provider=yarn
- for users who have switched fromnpm
toyarn
(this will also be at least 4x faster from initial testing)Git hooks
We've floated the idea of using git hooks to help avoid some common pitfalls during development, so far two concrete use cases have been identified:
npm/yarn/bower install
when thepackage.json
,yarn.lock
, orbower.json
files have changed after runninggit pull
core/client
changes (e.g. Remove default template dependency on client side CSS #8217 (comment))One problem with client-side git hooks is how to distribute them and ensure that they are installed in the project's
.git/hooks
directory. This needs some further research, it may require them to be distributed in agithooks
directory for example and installed via one of ourinit
scripts.The text was updated successfully, but these errors were encountered: