Bối cảnh
Plugin azuredevops_go hiện đã hỗ trợ Repository (code, PR) và Pipeline (CI/CD) ở mức ~95%. Phần Board (quản lý ticket / work items) chưa được implement — chỉ có stub đăng ký ticket.Board gắn nhầm vào repo domain ID trong api/blueprint_v200.go.
Mục tiêu: implement đầy đủ Boards theo pattern Jira plugin, để các dashboard chung (Engineering Overview, DORA, Throughput) và azure-dev-ops.json hoạt động với Azure DevOps giống Jira — không cần sửa SQL cross-dashboard.
Tham chiếu: backend/plugins/jira/, grafana/dashboards/mysql/Jira.json
Kiến trúc mục tiêu
Azure DevOps Cloud (WIQL, workitemsbatch, teams, iterations, updates)
↓
azuredevops_go (scope = AzuredevopsBoard / Team)
↓
_tool_azuredevops_go_* → Domain: boards, issues, board_issues, sprints, issue_changelogs, ...
↓
project_mapping (table=boards) → Grafana / DORA
Scope model: Board/Team độc lập với Git Repository (không gắn ticket.Board vào repo ID như stub hiện tại).
Domain ID: azuredevops_go:AzuredevopsBoard:{connectionId}:{teamId} (theo didgen).
Phạm vi implement
1. Models & migrations
2. API client (api/azuredevops/client.go)
PAT scope: vso.work (read work items, boards, iterations)
3. Remote scopes & API
4. Subtasks (collect → extract → convert)
Mirror Jira pipeline:
| Subtask |
Reference Jira |
collect/extract/convert WorkItems (WIQL incremental qua [System.ChangedDate]) |
issue_collector.go, issue_extractor.go, issue_convertor.go |
| convertBoard |
board_convertor.go |
| collect/extract/convert Iterations |
sprint_collector.go, sprint_convertor.go |
| convertSprintIssues |
sprint_issues_convertor.go |
| collect/extract/convert WorkItemUpdates |
issue_changelog_*.go |
| collect/extract/convert WorkItemComments (optional) |
issue_comment_*.go |
| convertIssueCommits + convertIssueRepoCommits |
artifact links |
| convertPullRequestIssues (ADO native WI↔PR) |
mới — chưa có trong Jira |
Domain tables bắt buộc:
boards, issues, board_issues
sprints, board_sprints, sprint_issues
issue_changelogs — normalize System.IterationPath → field_name = 'Sprint' (engineering-overview yêu cầu)
issue_commits, issue_repo_commits, pull_request_issues
Type/status mapping (scope config):
| ADO Work Item Type |
issues.type |
| Bug |
BUG |
| User Story, PBI, Feature, Epic |
REQUIREMENT |
| Task |
TASK |
| Production Incident |
INCIDENT (cho DORA) |
| ADO State |
issues.status |
| New, To Do |
TODO |
| Active, In Progress |
IN_PROGRESS |
| Done, Closed, Resolved |
DONE |
Fields bắt buộc: issue_key, title, type, status, priority, created_date, resolution_date, updated_date, lead_time_minutes, story_point, epic_key, creator_id, assignee_id
5. Blueprint (api/blueprint_v200.go)
6. Config UI
7. Grafana
8. Tests & Docs
Incremental collection
SELECT [System.Id] FROM WorkItems
WHERE [System.TeamProject] = '{project}'
AND [System.ChangedDate] >= '{last_sync_time}'
ORDER BY [System.ChangedDate] ASC
Giới hạn: WIQL max ~20K items/query; batch API max 200 items/request.
Acceptance Criteria
Ước lượng
~3–5 tuần
Bối cảnh
Plugin
azuredevops_gohiện đã hỗ trợ Repository (code, PR) và Pipeline (CI/CD) ở mức ~95%. Phần Board (quản lý ticket / work items) chưa được implement — chỉ có stub đăng kýticket.Boardgắn nhầm vào repo domain ID trongapi/blueprint_v200.go.Mục tiêu: implement đầy đủ Boards theo pattern Jira plugin, để các dashboard chung (Engineering Overview, DORA, Throughput) và
azure-dev-ops.jsonhoạt động với Azure DevOps giống Jira — không cần sửa SQL cross-dashboard.Tham chiếu:
backend/plugins/jira/,grafana/dashboards/mysql/Jira.jsonKiến trúc mục tiêu
Scope model: Board/Team độc lập với Git Repository (không gắn
ticket.Boardvào repo ID như stub hiện tại).Domain ID:
azuredevops_go:AzuredevopsBoard:{connectionId}:{teamId}(theodidgen).Phạm vi implement
1. Models & migrations
models/board.go—AzuredevopsBoardimplementsplugin.ToolLayerScopemodels/work_item.go— tool-layer work itemmodels/board_work_item.go— junction board ↔ work item (tạo lúc extract, giống_tool_jira_board_issues)models/iteration.go— iterations/sprintsmodels/scope_config.go:TypeMappings(giốngJiraScopeConfig)StoryPointField(optional)migrationscripts/register.goGetTablesInfo()trongimpl/impl.go2. API client (
api/azuredevops/client.go)POST {org}/{project}/{team}/_apis/wit/wiql?api-version=7.1POST {org}/_apis/wit/workitemsbatch(batch tối đa 200 IDs)GET .../_apis/work/teamsGET .../teamsettings/iterationsGET .../iterations/{id}/workitemsGET .../wit/workitems/{id}/updates(changelog)GET .../wit/workitems/{id}?$expand=relations(PR/commit links)PAT scope:
vso.work(read work items, boards, iterations)3. Remote scopes & API
org/projectapi/remote_helper.go)DsHelper(pattern Jiraapi/init.go,api/scope_api.go)PrepareTaskData— task options{connectionId, boardId}4. Subtasks (collect → extract → convert)
Mirror Jira pipeline:
[System.ChangedDate])issue_collector.go,issue_extractor.go,issue_convertor.goboard_convertor.gosprint_collector.go,sprint_convertor.gosprint_issues_convertor.goissue_changelog_*.goissue_comment_*.goDomain tables bắt buộc:
boards,issues,board_issuessprints,board_sprints,sprint_issuesissue_changelogs— normalizeSystem.IterationPath→field_name = 'Sprint'(engineering-overview yêu cầu)issue_commits,issue_repo_commits,pull_request_issuesType/status mapping (scope config):
issues.typeBUGREQUIREMENTTASKINCIDENT(cho DORA)issues.statusTODOIN_PROGRESSDONEFields bắt buộc:
issue_key,title,type,status,priority,created_date,resolution_date,updated_date,lead_time_minutes,story_point,epic_key,creator_id,assignee_id5. Blueprint (
api/blueprint_v200.go)ticket.NewBoard(repoId, ...)trên repo scopeticket.Boardkhi entityTICKETbậtDOMAIN_TYPE_TICKET6. Config UI
AzureGoConfig.scopeConfig.entities— thêmTICKETdataScope— hỗ trợ chọn Boards/Teamsjira/transformation.tsx(typeMappings)scope-config-formnếu cần7. Grafana
mysql/azure-dev-ops.json— variableboard_id:boards WHERE id LIKE 'azuredevops_go%'Jira.jsonpostgresql/azure-dev-ops.json8. Tests & Docs
board_test.go,work_item_test.goblueprint_v200_test.go— board scope pipelineREADME.md— PAT scopes, Board setup, blueprintproject_mappingIncremental collection
Giới hạn: WIQL max ~20K items/query; batch API max 200 items/request.
Acceptance Criteria
boards,issues,board_issues(prefixazuredevops_go:)typeMappingschuẩn hóatype/statusđúng enum DevLakeissue_changelogs.field_name = 'Sprint'cho Engineering Overviewtype = INCIDENT→ DORA tạoincidents(sau khi map board vào project)azure-dev-ops.jsonhiển thị issue panelsƯớc lượng
~3–5 tuần