This is an automated email from the ASF dual-hosted git repository.
zky pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake-website.git
The following commit(s) were added to refs/heads/main by this push:
new 3b1743c6b Project framework (#308)
3b1743c6b is described below
commit 3b1743c6b9ddb10a6e40e0031631bd2408d32a9a
Author: mappjzc <[email protected]>
AuthorDate: Fri Jan 6 10:09:38 2023 +0800
Project framework (#308)
* docs: project
Add project doc.
Nddtfjiang <[email protected]>
* fix: add how to use
Nddtfjiang <[email protected]>
* docs: add table data
Add table data
Nddtfjiang <[email protected]>
* docs: fix for review
Nddtfjiang <[email protected]>
* docs: fix for review
Nddtfjiang <[email protected]>
* docs: fix for review
Nddtfjiang <[email protected]>
* docs: changed to english
changed to english.
Nddtfjiang <[email protected]>
* docs: fix for review
fix for reivew
Nddtfjiang <[email protected]>
* docs: fix for review
Nddtfjiang <[email protected]>
* fix: fix for hezhengs review
Nddtfjiang <[email protected]>
---
docs/DeveloperManuals/Project.md | 251 +++++++++++++++++++++++++++++++++++++++
1 file changed, 251 insertions(+)
diff --git a/docs/DeveloperManuals/Project.md b/docs/DeveloperManuals/Project.md
new file mode 100644
index 000000000..bd1cc85c0
--- /dev/null
+++ b/docs/DeveloperManuals/Project.md
@@ -0,0 +1,251 @@
+---
+title: "Project"
+sidebar_position: 5
+description: >
+ `Project` is **a set of [Scope](../Overview/KeyConcepts.md#data-scope) from
different domains**, a way to group different resources, and it is crucial for
some metric calculations like `Dora`.
+---
+
+# Summary
+
+For some metric calculations such as the `DORA` metric, we often encounter
situations requiring comprehensive calculations based on data from multiple
data sources.
+
+For example, we may use `GitLab` for code hosting, `Jenkins` for CI/CD, to
calculate PR deployment cycle time, we need to know which `GitLab Projects` and
`Jenkins Jobs` are related for correctness and performance reasons.
+
+However, in most cases, we have multiple `GitLab Projects` / `Jenkins Jobs`
that belong to different teams in our Apache DevLake database.
+
+To distinguish them into different groups. The `Project` is introduced in
v0.15. Essentially, a `project` consists of a set of
[Scopes](../Overview/KeyConcepts.md#data-scope), i.e., a couple of `GitLab
Projects`, `Jira Boards` or `Jenkins Jobs`, etc.
+
+`Project` is **a set of [Scope](../Overview/KeyConcepts.md#data-scope) from
different domains**, a way to group different resources, and it is crucial for
some metric calculation like `Dora`.
+
+Next, let us introduce `Project` in the following order:
+- `Project` related models
+- Related APIs that can be used to manipulate `Project` models
+- The interface that needs to be implemented when developing various plugins
to support the `Project`.
+ - The interface that needs to be implemented to develop the `Data
Source Plugin`
+ - The interface that needs to be implemented to develop the `Metric
Plugins`
+
+# Models
+
+To support project we contains the following three models:
+ - `projects` describes a project object, including its name, creation and
update time and other basic information
+ - `project_metric_settings` describes what metric plugins a project had
enabled.
+ - `project_mapping` describes the mapping relationship of project and scope,
including the name of the project、the table name of
[Scope](../Overview/KeyConcepts.md#data-scope) and the row_id in the
[Scope](../Overview/KeyConcepts.md#data-scope) table.
+
+## projects
+
+| **field** | **type** | **length** | **description** |
**key** |
+| ------------- | -------- | ---------- | ----------------------------- |
------- |
+| `name` | varchar | 255 | name for project | PK
|
+| `description` | longtext | | description of the project |
|
+| `created_at` | datetime | 3 | created time of project |
|
+| `updated_at` | datetime | 3 | last updated time of project |
|
+
+### example
+
+| **name** | **describe** | **created_at** |
**updated_at** |
+| --------- | ------------------------------------ | ----------------------- |
------------------------|
+| project_1 | this is one of the test projects | 2022-11-01 01:22:13.000 |
2022-11-01 02:24:15.000 |
+| project_2 | this is another project test project | 2022-11-01 01:23:29.000 |
2022-11-01 02:27:24.000 |
+
+## project_metric_settings
+
+| **field** | **type** | **length** | **description**
| **key** |
+| --------------- | -------- | ---------- |
---------------------------------------------------------- | ------- |
+| `project_name` | varchar | 255 | name for project
| PK |
+| `plugin_name` | varchar | 255 | name for plugin
| PK |
+| `plugin_option` | longtext | | check if metric plugins have been
enabled by the project | |
+| `enable` | tinyint | 1 | if the metric plugins is enabled
| |
+
+### example
+
+| **project_name** | **plugin_name** | **plugin_option** | **enable** |
+| ---------------- | --------------- | ----------------- | ---------- |
+| project_1 | dora | {} | true |
+| project_2 | dora | {} | false |
+
+## project_mapping
+
+| **field** | **type** | **length** | **description**
| **key** |
+| -------------- | -------- | ---------- |
------------------------------------------------------------- | ------- |
+| `project_name` | varchar | 255 | name for project
| PK |
+| `table` | varchar | 255 | the table name of
[Scope](../Overview/KeyConcepts.md#data-scope) | PK |
+| `row_id` | varchar | 255 | the row_id in the
[Scope](../Overview/KeyConcepts.md#data-scope) table | PK |
+
+### example
+
+| **project_name** | **table** | **row_id** |
+| ---------------- | --------- | ------------------------ |
+| project_1 | Repo | gitlab:GithubRepo:1:lake |
+| project_1 | Board | jira:JiraBoard:1:lake |
+| project_2 | Repo | github:GithubRepo:1:lake |
+
+# How to manage project via API
+
+For API specification, please check the swagger doc(by visiting `[Your
Config-UI Host]/api/swagger/index.html`).
+Related endpoints:
+
+1. /projects
+2. /projects/:projectName/metrics
+3. /plugins
+
+# The interface that needs to be implemented
+
+We divide plugins into two categories
+- The first category is `Data Source Plugin`, such as `GitLab` `GitHub` `Jira`
`Jenkins`, etc. These plugins collect data from various data sources
+- The second category is `Metric Plugin`, such as `Dora`, etc. These plugins
do not directly contact the data source but do secondary calculations based on
the collected data after the `Data Source Plugin` works
+
+## Data Source Plugin
+
+For example `GitLab` `GitHub` `Jira` `Jenkins` etc.
+
+These plugins, from various data sources, extract data into the database and
store them, they deal directly with the data source, so we classify them as
`Data Source Plugin`.
+
+## the DataSourcePluginBlueprintV200 interface
+
+`Data Source Plugin` needs to implement `DataSourcePluginBlueprintV200`
interface to support `project`
+
+The interface definition for this interface is as follows
+
+```go
+// DataSourcePluginBlueprintV200 extends the V100 to provide support for
+// Project, so that complex metrics like DORA can be implemented based on a set
+// of Data Scopes
+type DataSourcePluginBlueprintV200 interface {
+ MakeDataSourcePipelinePlanV200(
+ connectionId uint64,
+ scopes []*BlueprintScopeV200,
+ syncPolicy BlueprintSyncPolicy,
+ ) (PipelinePlan, []Scope, errors.Error)
+}
+```
+
+`scopes` in input parameters is a set of arrays containing IDs, Names, and
Entities.
+
+The input data format is as follows:
+
+```go
+[]*core.BlueprintScopeV200{
+ {
+ Entities: []string{"CODE", "TICKET", "CICD"},
+ Id: "37",
+ Name: "test",
+ },
+}
+```
+
+`syncPolicy` in input parameters contains some option settings, whose
structure is defined as follows:
+
+```go
+type BlueprintSyncPolicy struct {
+ Version string `json:"version"
validate:"required,semver,oneof=1.0.0"`
+ SkipOnFail bool `json:"skipOnFail"`
+ CreatedDateAfter *time.Time `json:"createdDateAfter"`
+}
+```
+
+`PipelinePlan` in output is a part of blueprint JSON:
+
+The input data format is as follows:(Take GitLab plugin as an example)
+
+```go
+core.PipelinePlan{
+ {
+ {
+ Plugin: "gitlab",
+ Subtasks: []string{
+ tasks.ConvertProjectMeta.Name,
+ tasks.CollectApiIssuesMeta.Name,
+ tasks.ExtractApiIssuesMeta.Name,
+ tasks.ConvertIssuesMeta.Name,
+ tasks.ConvertIssueLabelsMeta.Name,
+ tasks.CollectApiJobsMeta.Name,
+ tasks.ExtractApiJobsMeta.Name,
+ tasks.CollectApiPipelinesMeta.Name,
+ tasks.ExtractApiPipelinesMeta.Name,
+ },
+ Options: map[string]interface{}{
+ "connectionId": uint64(1),
+ "projectId": testID,
+ },
+ },
+ {
+ Plugin: "gitextractor",
+ Options: map[string]interface{}{
+ "proxy": "",
+ "repoId": repoId,
+ "url": "https://git:nddtf@this_is_cloneUrl",
+ },
+ },
+ },
+ {
+ {
+ Plugin: "refdiff",
+ Options: map[string]interface{}{
+ "tagsLimit": 10,
+ "tagsOrder": "reverse semver",
+ "tagsPattern": "pattern",
+ },
+ },
+ },
+}
+```
+
+`project` needs to provide a specific set of
[Scopes](../Overview/KeyConcepts.md#data-scope) for a specific `connection` to
the plugin through this interface, and then obtain the plugin involved in the
`PipelineTask` All `plugins` and corresponding parameter information. At the
same time, the plugin needs to convert entities like `repo` and `board` in the
data source into a `scope interface` that `project` can understand
+
+The corresponding `scope interface` has been implemented at following files of
in the framework layer:
+- `models/domainlayer/devops/cicd_scope.go`
+- `models/domainlayer/ticket/board.go`
+- `models/domainlayer/code/repo.go`
+
+In the `plugins/gitlab/impl/impl.go` file, there is a `GitLab` plugin
implementation of the above interface, which can be used as a reference.
+
+And the `plugins/gitlab/api/blueprint_v200.go` contains implementation
details.
+
+The following files contain the models that the relevant implementations
depend on for reference:
+- `plugins/gitlab/models/project.go`
+- `plugins/gitlab/models/transformation_rule.go`
+
+## Metric Plugins
+
+For example `Dora`, and `Refdff` plugins belong to the `Metric Plugins`
+
+These plugins are mainly for calculating various metrics, they do not directly
contact the data source, so we classify them as `Metric Plugins`.
+
+## The PluginMetric Interface
+
+`Metric Plugins` needs to implement the `PluginMetric` interface to support
`project`
+
+The interface definition for this interface looks like this:
+
+```go
+type PluginMetric interface {
+ // returns a list of required data entities and expected features.
+ // [{ "model": "cicd_tasks", "requiredFields": {"column": "type",
"execptedValue": "Deployment"}}, ...]
+ RequiredDataEntities() (data []map[string]interface{}, err errors.Error)
+
+ // returns if the metric depends on Project for calculation.
+ // Currently, only dora would return true.
+ IsProjectMetric() bool
+
+ // indicates which plugins must be executed before executing this one.
+ // declare a set of dependencies with this
+ RunAfter() ([]string, errors.Error)
+
+ // returns an empty pointer of the plugin setting struct.
+ // (no concrete usage at this point)
+ Settings() (p interface{})
+}
+
+```
+
+`Project` needs `PluginMetric` to know whether a `Metric Plugin` is dependent
on `project`, and the tables and fields required in its calculation process.
+
+In the `plugins/dora/impl/impl.go` file, there is a `Dora` plugin
implementation of the above interface, which can be used as a sample
reference.You can find it by searching the following fields:
+- `func (plugin Dora) RequiredDataEntities() (data []map[string]interface{},
err errors.Error)`
+- `func (plugin Dora) IsProjectMetric() bool`
+- `func (plugin Dora) RunAfter() ([]string, errors.Error)`
+- `func (plugin Dora) Settings() interface{}`
+
+## References
+
+To dig deeper into developing and utilizing our built-in functions and have a
better developer experience, feel free to dive into our
[godoc](https://pkg.go.dev/github.com/apache/incubator-devlake) reference.
\ No newline at end of file