improved the README.md, especially regarding the JHipster workflow

This commit is contained in:
Michael Hoennig 2019-05-01 14:37:22 +02:00
parent f40a574ec3
commit d182637f41

246
README.md
View File

@ -1,11 +1,33 @@
# hsadminNg Development # hsadminNg Development
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents** _generated with [DocToc](https://github.com/thlorenz/doctoc)_
- [Setting up the Development Environment](#setting-up-the-development-environment)
- [Frequent Tasks](#frequent-tasks)
- [Building the Application with Test Execution](#building-the-application-with-test-execution)
- [Starting the Application](#starting-the-application)
- [Running JUnit tests with branch coverage](#running-junit-tests-with-branch-coverage)
- [HOWTO Commits](#howto-commits)
- [Creating HOWTO Commits](#creating-howto-commits)
- [Special Build Tasks](#special-build-tasks)
- [Spotless Formatting](#spotless-formatting)
- [Mutation Testing PiTest](#mutation-testing-pitest)
- [Git Workflow for JHipster Generator](#git-workflow-for-jhipster-generator)
- [Generating the Table of Contents for Markdown](#generating-the-table-of-contents-for-markdown)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
## Setting up the Development Environment ## Setting up the Development Environment
You'll often need to execute `./gradlew`, therefore we suggest to define this alias: You'll often need to execute `./gradlew`, therefore we suggest to define this alias:
alias gw='./gradlew' alias gw='./gradlew'
TODO: Instructions for setting up the dev environment from scratch.
## Frequent Tasks ## Frequent Tasks
### Building the Application with Test Execution ### Building the Application with Test Execution
@ -31,45 +53,82 @@ see: https://confluence.jetbrains.com/display/IDEADEV/IDEA+Coverage+Runner
Either apply it to specific test configurations or, Either apply it to specific test configurations or,
better, delete the previous test configurations and amend the JUnit template. better, delete the previous test configurations and amend the JUnit template.
## Git Workflow for JHipster Generator ## HOWTO Commits
The jhipster-generated git branch tracks the history of the JDL model file There are git tags on some commits which show how to add certain features.
and the generated source code. The project has to be resetted to a clean state
(without any generated entities) before changes to the JDL file can be imported.
| WARNING: This is just a guideline. You should understand what you are doing! | Find all of such tags with:
| ---------------------------------------------------------------------------- |
git tag | grep HOWTO
git checkout jhipster-generated ### Creating HOWTO Commits
git pull
git tag REAL-HEAD
git reset --hard jdl-base
git clean -f -d
git cherry-pick -n spotless
git reset --soft REAL-HEAD
git checkout REAL-HEAD src/main/jdl/customer.jdl # AND OTHERS!
git tag -d REAL-HEAD
# MANUAL STEP: Apply changes to the jdl file! If you want to add such a commit, make sure that it contains no clutter
(no changes which are not necessary for whatever the commit is about to explain),
and is complete with all unit tests, code coverage, pitest and other checks.
Otherwise the next developer would run into the same problems again.
# (Re-) Importing One way to keep the commit clean, is to develop it on a local branch.
jhipster import-jdl src/main/jdl/customer.jdl If any other changes (e.g. bugfixes, API extensions etc.) are necessary,
jhipster import-jdl src/main/jdl/accessrights.jdl apply these only to the master or cherry-pick just these to the master,
# AND OTHERS, if applicable! then rebase your local branch. Do not forget to run all checks locally:
gw clean check pitest # might need over an hour
(Check the PiTest section for speeding up mutation testing.)
To create and push a new tag use:
git tag HOWTO-... master
git push origin HOWTO-...
After you've moved an existing the tag to another commit, you can use:
git push --force origin HOWTO-...
## Special Build Tasks
Besides common build tasks like `build`, `test` or `bootRun` this projects has some not so common tasks which are explained in this section.
### Spotless Formatting
To make sure that no IDE auto-formatter destroys the git history of any file and
especially to avoid merge conflicts from JHipster generated files after these had been changed,
we are using a standard formatter enforced by _spotless_, which is based on the standard Eclipse formatter.
The rules can be checked and applied with these commands:
gw spotlessCheck
gw spotlessApply gw spotlessApply
git add .
git commit -m"..."
# MANUAL STEP: The spotlessCheck task is included as an early step in our Jenkins build pipeline.
# - if you've renamed any identifiers, use refactoring to rename in master as well BEFORE MERGING! Therefore wrong formatting is automatically detected.
# Merge changeset into master branch Our configuration can be found under the directory `cfg/spotless`.
git checkout master Currently we only have specific rules for _\*.java_-files and their import-order.
git merge jhipster-generated
### Amending the spotless commit #### Our Changes to the Standard Eclipse Formatter
We amended the Standard Eclipse Formatter in these respects:
- Lines of code are never joined, thus the developer has control about linebreaks,
which is important for readability in some implementations like toString().
- Lines in comments are never joined either, because that often destroys readable stucture.
- Parts of files can be excluded from getting formatted, by using `@formatter:off` and `@formatter:on` in a comment.
See for example in class `SecurityConfiguration`.
#### Pre-Commit Hook
If you like, you could add this code to the _pre-commit or \_pre_push_ hook\_ in your `.git/hooks` directory:
if ! ./gradlew spotlessCheck; then
exit 1
fi
#### The Tagged Spotless Commit
The commit which introduces the spotless configuration is tagged.
Through this tag it can easily be cherry-picked in the JHipster workflow.
If you need to amend the commit tagged 'spotless', e.g. to change the spotless configuration, If you need to amend the commit tagged 'spotless', e.g. to change the spotless configuration,
it can be done with these steps: it can be done with these steps:
@ -87,43 +146,6 @@ it can be done with these steps:
git reset --hard REAL-HEAD git reset --hard REAL-HEAD
git tag -d REAL-HEAD git tag -d REAL-HEAD
## HOWTO do This and That
There are git tags on some commits which show how to add certian features.
Find all of such tags with:
git tag | grep HOWTO
### creating HOWTO commits
If you want to add such a commit, make sure that it contains no clutter
(no changes which are not necessary for whatever the commit is about to explain),
and is complete with all unit tests, code coverage, pitest and other checks.
Otherwise the next developer would run into the same problems again.
One way to keep the commit clean, is to develop it on a local branch.
If any other changes (e.g. bugfixes, API extensions etc.) are necessary,
apply these only to the master or cherry-pick just these to the master,
then rebase your local branch. Do not forget to run all checks locally:
gw clean check pitest # might need over an hour
(Check the pitest section for speeding up pitest.)
To create and push a new tag use:
git tag HOWTO-... master
git push origin HOWTO-...
After you've moved an existing the tag to another commit, you can use:
git push origin HOWTO-... --force
## Special Build Tasks
Besides common build tasks like `build`, `test` or `bootRun` this projects has some not so common tasks which are explained in this section.
### Mutation Testing PiTest ### Mutation Testing PiTest
./gradlew pitest ./gradlew pitest
@ -168,3 +190,97 @@ If you want to spend more CPU threads on your local system, you can change that
gw pitest -Doverride.pitest.threads=7 gw pitest -Doverride.pitest.threads=7
I suggest to leave one CPU thread for other tasks or your might lag extremely. I suggest to leave one CPU thread for other tasks or your might lag extremely.
### Git Workflow for JHipster Generator
The following workflow steps make sure that
- JHipster re-imports work properly,
- the git history of changes to the JDL-files, the generated code and the master is comprehensible,
- and merging newly generated code to the master branch is smooth.
It uses a git branch `jhipster-generated` to track the history of the JDL model file and the generated source code.
Applying commits which contain non-generated changes to that branch breaks the normal git history for generated files.
Therefore, this documentation is also not available in that branch.
Thus:
**MANUAL STEP before starting:** Copy this workflow documentation, because this file will be gone once you switched the branch.
| WARNING: The following steps are just a guideline. You should understand what you are doing! |
| -------------------------------------------------------------------------------------------- |
#### 1. Preparing the `jhipster-generated` git Branch
This step assumes that the latest `*.jdl` files are on the `HEAD` of the `jhipster-generated` git branch.
On a re-import of a JDL-file, JHipster does not remove any generated classes which belong to entities deleted from the JDL-file.
Therefore, the project has to be reset to a clean state before changes to the JDL file can be re-imported.
We have not yet finally tested a simplified workflow for just adding new entities or properties.
A git tag `jdl-base` is assumed to sit on the base commit after the application was generated, but before any entities were imported.
git checkout jhipster-generated
git pull
git tag REAL-HEAD
git reset --hard jdl-base
git clean -f -d
git cherry-pick -n spotless
git reset --soft REAL-HEAD
git checkout REAL-HEAD src/main/jdl/customer.jdl # AND OTHERS!
git tag -d REAL-HEAD
#### 2. Amending and Re-Importing the JDL
**MANUAL STEP:** First apply all necessary changes to the JDL files.
Then re-import like this:
# (Re-) Importing
jhipster import-jdl src/main/jdl/customer.jdl
jhipster import-jdl src/main/jdl/accessrights.jdl
jhipster import-jdl src/main/jdl/... # once there are more
For smoothly being able to merge, we need the same formatting in the generated code as on the master:
gw spotlessApply
#### 3. Committing our Changes
git add .
git commit -m"..."
#### 4. Merging our Changes to the `master` Branch
git checkout master
git pull
**MANUAL STEP:** If you've renamed any identifiers, use the refactoring feature of your IDE to rename in master as well.
To avoid oodles of merge-conflicts, you need to do that **BEFORE MERGING!**
Commit any of such changes, if any.
Now we can finally merge our changes to master.
git merge jhipster-generated
It's a good idea doing this step in an IDE because it makes conflict resolving much easier.
Typical merge conflicts stem from:
- Random numbers in test data of `*IntTest.java` files.
- Timestamps in Liquibase-xml-Files.
Now, I suggest to run all tests locally:
gw clean test
Once everything works again, we can push our new version:
git push
### Generating the Table of Contents for Markdown
This README file contains a table of contents generated by _doctoc_.
It's quite simple to use:
npm install -g doctoc
doctoc --maxlevel 3 README.md
Further information can be found [https://github.com/thlorenz/doctoc/blob/master/README.md](on the _doctoc_ github page).