Develop
Initialization
Install dependencies
Currently we use yarn to manage project dependencies, so you need to install yarn correctly before you start.
If you haven't installed yarn, you can find detailed installation methods in yarn installation guide.
yarn
Code generation
After installing the dependencies, we need to generate some necessary type files so that test, typecheck and code style check can work correctly.
yarn codegen
Start development server
Start development server manually
If you choose to start the development server manually, you need to refer to the project architecture section for the following dependencies to be installed correctly and in a usable state:
Perfsee is composed of many components and services, but in the daily development process, the most common ones are these three:
- Server: Main backend service
- Frontend: Frontend code
- Job Runner: Analysis task executor service
You can choose the service you need to develop, and then start it independently:
- Server
- Frontend
- Job Runner
# Start backend service, default listening to port 3000, access through http://localhost:3000
yarn dev -p @perfsee/platform-server
# Start frontend service, default listening to port 8080, access through http://localhost:8080
# Depends on the backend service, all backend requests will be proxied to http://localhost:3000
yarn dev -p @perfsee/platform
# Start job runner service, will not listen to any port
# Depends on the backend service. if you want the job system work properly job service need to be started
yarn dev -p @perfsee/job-runner
Docker compose
If you prefer to use tools like Docker to manage the development environment, we have already configured a docker-compose.yml file for you, you can easily start the entire development environment without worrying about system dependencies:
# Since docker compose v2 does not follow the `depends_on` dependency relationship to sequentially build images, you need to build all the images you need separately.
# See: https://github.com/docker/compose/issues/9686
docker compose build
docker compose up
Test
We choose ava as the test framework. You can refer to its documentation to learn how to write test cases.
All test cases should be placed in the __tests__ folder next to the component or function being tested, and use .spec.ts or .spec.e2e.ts as the suffix to facilitate searching.
If the test case has unpredictable side effects when running in parallel, such as reading and writing databases, then it should use
.spec.e2e.tsor.spec.serial.tsas the suffix, and mark it as a test case that can only be run serially.
# Run all test cases
yarn test
# Only run test cases with `.spec.ts` suffix
yarn ava
# Only run test cases with `.spec.{e2e,serial}.ts` suffix
yarn ava -s
Code style
We use ESLint and Prettier to enforce code style:
yarn lint
And use TypeScript to perform strong type checking:
yarn typecheck
Commit
We use commitlint to enforce commit message format, please refer to its documentation for details.
In general, all commit messages should follow the following format:
type(scope?): subject
type depends on the content of the commit, such as feat for adding new features, fix for fixing bugs, ci for CI related changes, etc. You can find a complete list in commitlint.
scope can be a package name or a folder name, used to summarize the package involved in the commit.
subject is a short description of the commit content.
Here are some real world examples:
feat(platform): add a retry button on failed job
fix(job-runner): random panic when spawning workers
chore: bump up dependencies
We strongly recommend that each commit only includes the changes of on simple thing, and do not mix unrelated modifications together.
Versioning
Thanks to conventional-changelog, we can easily generate changelogs and select appropriate version numbers for the next package release based on readable commit messages.
yarn release
Deployment
Since the deployment progress is quite complicated, we will describe in detail how to deploy the Perfsee to the production environment in a separate deployment document.