專欄文章 質量保障系統的落地實踐 (二) 專案管理設計 - 程式碼資訊設計

亦攸發表於2024-05-06

前言

專欄文章 質量保障系統的落地實踐 (一) 概覽篇
專欄文章 質量保障系統的落地實踐 (二) 專案管理設計 - 基礎資訊與缺陷資訊設計
大家好,以上兩篇文章,先從大體上介紹了質量保障平臺的概況,而後談了談專案管理板塊如何對接三方缺陷管理平臺,裡面包含了賬戶體系的對映設計,從而將缺陷資訊沉澱至質量保障平臺。
那麼本篇文章我們將開始介紹專案管理 - 程式碼資訊設計的內容,相信有了上一篇文章的底子,這篇文章的閱讀將更清晰明瞭。

程式碼資訊資料庫設計

現在主流的程式碼管理平臺有很多,大多數管理平臺均能提供一定的開放能力,我們可以透過這些開放能力嘗試得到一些我們想要的資料,本篇文章以 git 為例,介紹如何收集專案提交的程式碼資訊。
那麼我們先來看看 git 平臺 api 能夠提供的資料:

# 獲取程式碼提交資訊
url = f"{CODE_SERVER_HOST}/api/v4/projects/{code_project_id}/repository/commits"  # git獲取一定時間範圍內的提交記錄
params = {
                "ref_name": branch_name,      # 分支名
                "since": since,      # 統計開始時間
                "until": until,      # 統計結束時間
                "page": page,
                "per_page": page_size,
                "order": "default"
            }
# 介面響應
[{
    'id': 'a4a18684d2f35ceb*****2fe360cbaad0285888',
    'short_id': 'a4a1****',
    'created_at': '2024-04-15T17:26:26.000+08:00',
    'parent_ids': ['e4f3afb3b3cf28eff****28436dc5f1463654'],
    'title': '提交title',
    'message': '提交內容',
    'author_name': 'author_name',
    'author_email': 'author_email',
    'authored_date': '2024-04-15T17:26:26.000+08:00',
    'committer_name': 'committer_name',
    'committer_email': 'committer_email',
    'committed_date': '2024-04-15T17:26:26.000+08:00'
},
{....}
]

從上述 git 介面可以看出,想要獲取一段時間內的程式碼提交情況,需要幾個引數:code_project_id,ref_name、since、until,那麼結合到質量保障平臺中,該如何設計呢?在實際專案迭代中,往往存在專案 1 涉及程式碼應用 1、程式碼應用 2,專案 2 設計程式碼應用 2、程式碼應用 3 的情況。而程式碼應用可以歸屬到某一組織節點,所以我們可以得出專案、程式碼應用、組織結構之間的關係:

結合 git 介面請求的必要引數,那麼資料表的設計自然而然可以得到:

# 服務應用管理-服務應用資訊
class ApplicationInfo(BaseModel):
    department_id = models.IntegerField(verbose_name=u"歸屬組織節點")
    app_code = models.CharField(max_length=150, verbose_name=u"服務code")
    code_project_id = models.IntegerField(null=True, blank=True, verbose_name=u"應用專案id")
    is_available = models.BooleanField(default=True, verbose_name=u"是否有效")

    class Meta:
        db_table = 'Application_Info'
        verbose_name = "服務應用管理-服務應用資訊"
        verbose_name_plural = verbose_name

# 服務應用管理-專案服務管理
class ProjectApplicationInfo(BaseModel):
    department_id = models.IntegerField(verbose_name=u"歸屬組織節點")
    project_id = models.IntegerField(verbose_name=u"專案id")
    app_code = models.CharField(max_length=150, verbose_name=u"服務code")
    code_project_id = models.IntegerField(verbose_name=u"應用專案id")
    branch = models.CharField(max_length=50, verbose_name=u"程式碼分支")
    since_time = models.CharField(max_length=30, verbose_name=u"開始統計時間")
    until_time = models.CharField(max_length=30, verbose_name=u"結束統計時間")
    is_available = models.BooleanField(default=True, verbose_name=u"是否有效")

    class Meta:
        db_table = "Project_Application_Info"
        verbose_name = "服務應用管理-專案服務管理"
        verbose_name_plural = verbose_name

接下來我們來看介面的返回值,裡面有幾個關鍵欄位:short_id、committer_name、committer_email,透過 short_id 可以訪問 git 的檢視詳情:

url = f"{CODE_SERVER_HOST}/api/v4/projects/{code_project_id}/repository/commits/{commit_short_id}"

# 介面響應
{
    'id': '993b76f0c97031195****51f04a5025fb8d',
    'short_id': '993****6f0',
    'created_at': '2024-04-07T14:54:10.000+08:00',
    'parent_ids': ['dee5f****a13c31d1651cbcc995ce2e882f'],
    'title': 'title',
    'message': 'message',
    'author_name': 'author_name',
    'author_email': 'author_email',
    'authored_date': '2024-04-07T14:54:10.000+08:00',
    'committer_name': 'committer_name',
    'committer_email': 'committer_email',
    'committed_date': '2024-04-07T14:54:10.000+08:00',
    'stats': {      # 程式碼變更資訊
        'additions': 34,
        'deletions': 0,
        'total': 34
    },
    'status': None,
    'project_id': 20**4,      # project_id即傳參中的code_project_id
    'last_pipeline': None
}

以上關於程式碼提交資訊的詳情,特別是變更程式碼的數量就是我們需要採集的重點資料,那麼設計資料表:

class ProjectCodeCommitInfo(BaseModel):
    department_id = models.IntegerField(verbose_name=u"歸屬組織節點")
    project_id = models.IntegerField(verbose_name=u"專案id")
    app_code = models.CharField(max_length=150, verbose_name=u"服務code")
    code_project_id = models.IntegerField(verbose_name=u"應用專案id")
    branch = models.CharField(max_length=80, verbose_name=u"程式碼分支")
    title = models.TextField(verbose_name=u"commit提交標題")
    committer_name = models.CharField(max_length=80, verbose_name=u"提交人姓名")
    committer_email = models.CharField(max_length=100, verbose_name=u"提交人郵箱")
    committed_time = models.CharField(max_length=30, verbose_name=u"提交時間")
    additions = models.IntegerField(verbose_name=u"新增程式碼")
    deletions = models.IntegerField(verbose_name=u"移除程式碼")
    total = models.IntegerField(verbose_name=u"變更程式碼總數")

    class Meta:
        db_table = "Project_Code_Commit_Info"
        verbose_name = "服務應用管理-專案應用分支程式碼提交記錄"
        verbose_name_plural = verbose_name

程式碼資訊與賬戶體系關聯

到目前為止,我們已經設計了儲存專案程式碼提交資訊的資料表,接下來只需要依據介面需要的傳參,訪問對應 open api 獲取到對應的程式碼提交資訊即可,這樣我們就將三方平臺的原始資料進行了採集。那麼到了這一步,又碰到了和缺陷管理板塊類似的問題 - 賬戶體系的關聯,我們可以看到程式碼提交列表、程式碼提交詳情中均有一個 committer_email 欄位,這個欄位為研發本地提交程式碼至 git 服務時,本地設定的郵箱,所以說這個郵箱和質量保障平臺的賬戶體系中的郵箱是沒有直接關聯的,那麼該怎麼做,才能將二者關聯起來?答案也如同缺陷管理板塊的一樣,透過對映表進行轉換,同樣的我司大部分人的提交郵箱如果沒有自定義設定過的話也是有統一字尾的,那麼處理邏輯與缺陷對映處理邏輯類似:


# 依據程式碼提交郵箱獲取對映後的使用者郵箱
def fetchCodeTargetEmail(department_id, committer_email):
    email_mapping_record = CodeEmailMappingInfo.objects.filter(
        department_id=department_id, source_email=committer_email, date_delete=None
    )
    target_email = None
    if email_mapping_record:
        email_mapping_info = email_mapping_record[0]
        target_email = email_mapping_info.target_email

    return target_email

# 提交郵箱進行資料對映,關聯到對應使用者郵箱,儲存時進行替換
target_email = fetchCodeTargetEmail(department_id, committer_email)
if target_email:
    committer_email = target_email

千行程式碼缺陷率

透過第二篇文章的實現思路,我們已經能夠獲取到專案提交的缺陷資訊,而透過這篇文章的實現思路,又可以得到專案的變更程式碼資訊,那麼就可以得到一個側面反饋研發質量的一個指標:千行程式碼缺陷率,統計歸於 A 研發的缺陷數量,歸於 A 研發的變更程式碼數量,計算可得。除此之外,變更程式碼數量也可以從側面反饋出每個研發開發工作量的大小:

總結

本篇文章的處理思路與第二篇文章類似,故此只提如何依據程式碼管理平臺 open api 返回值設計資料庫以及賬戶體系關聯邏輯,希望大家多留言交流,謝謝。

相關文章