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:
grunt dev into client and server commandsgrunt dev can't be run simultaneously with the client testsSubtasks:
npm stderr output for npm scripts so that it's easier to see actual error output and we get useful error reports, refs #8231 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 an npm run dev-update command (naming TBD, an alternative might be npm run dev-master) that works through the commands that we're currently using to update manually:
git checkout mastergit pull upstream masternpm installcd core/clientgit checkout mastergit pull upstream masternpm installbower installcd ../../knex-migrator healthThis 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 called upstream--provider=yarn - for users who have switched from npm to yarn (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 the package.json, yarn.lock, or bower.json files have changed after running git pullcore/client changes (e.g. https://github.com/TryGhost/Ghost/pull/8217#issuecomment-289193299)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 a githooks directory for example and installed via one of our init scripts.
(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 npm run init it says something at the end like:
Ghost is installed and up to date with
origin/master, Ghost-Admin is a git-submodule and is located in/core/client, it is also up to date withorigin/master.
rungrunt devto start ghost and automatically update ghost-admin on change (slower) orgrunt dev-serverto start ghost without updating ghost-admin.
When a user does an update and the node version has changed it could say something like:
Ghost has binary dependencies that you installed with node 4.4.6, you're currently running node 6.10.6, please switch to node 4.4.6 or run
npm rebuild
If we try and do a upgrade but you're not actually on origin/master it could say:
Your
/ghost/adminis on the branchyour-feature-branch-nameand cannot be automatically upgraded, it is 7 commits ahead and 6 commits behind origin/master
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?
Still I am interested to hear the reasoning behind using an npm script instead of grunt?
I think this mostly stemmed from looking at it from a contributors view where npm run will work even when global deps are missing so that we can output useful error messages if the environment isn't quite right. Other than that I'm not too sure - whichever route we choose between npm/grunt we still have the problem that the locally available tools are tied to the version of ghost that you currently have checked out. The only way around that I can see would be to have an external cli-like tool that can auto-update.
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 ./sqlite3/lib/binding/ but other binary deps don't. Seeing as sqlite3 is the most likely problem it still seems worthwhile to check that dependency within our scripts.
We can figure out the version of node that sqlite3 was compiled against from the library name, the naming convention appears to go node-{ABI}-{OS}.node. We can figure out the node version that's required from the ABI with the node-abi package.
In my opinion, grunt master should set Ghost-Admin to master, not the latest commit tied in Ghost master - i.e. it should do the same git commands, not use submodule update --init.
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?
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 1.0 in this task 馃帄
I've moved the last subtasks to our 1.0 documentation issue. I would like to collect all tasks for 1.0 documentation in one true place. Closing.
Most helpful comment
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.