@jira-deploy/core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/constants/defaults.js +111 -0
- package/constants/environments.js +37 -0
- package/constants/field-ids.js +63 -0
- package/constants/index.js +53 -0
- package/constants/issue-types.js +23 -0
- package/constants/modules.js +55 -0
- package/constants/repos.js +55 -0
- package/constants/server.js +100 -0
- package/constants/system-codes.js +79 -0
- package/constants/users.js +47 -0
- package/dry-run.js +691 -0
- package/index.js +6 -0
- package/jira-client.js +313 -0
- package/notifier.js +56 -0
- package/package.json +34 -0
- package/platform-config.js +64 -0
- package/poller.js +64 -0
- package/tools/cd.js +666 -0
- package/tools/ci.js +204 -0
- package/tools/ci.test.js +154 -0
- package/tools/grayrelease.js +296 -0
- package/tools/helpers.js +78 -0
- package/tools/index.js +1119 -0
- package/tools/jabber.js +97 -0
- package/tools/library.js +225 -0
- package/tools/release.js +320 -0
- package/tools/release.test.js +137 -0
- package/tools.test.js +1711 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jira Issue 建立的預設值及模板
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/** 簽核欄位預設值 */
|
|
6
|
+
export const SIGN_VALUES = {
|
|
7
|
+
deptManagerSign: '電子表單呈核',
|
|
8
|
+
authManagerSign: '電子表單呈核',
|
|
9
|
+
releaseInfo:
|
|
10
|
+
'上版步驟:依 Jira 流程上版\n退版步驟:依 Jira 流程退版\n上版程式清單:如 Jira ticket 連結',
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/** Jira 預設值 */
|
|
14
|
+
export const JIRA_DEFAULTS = {
|
|
15
|
+
jenkinsBranch: 'master',
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/** 欄位值選項 */
|
|
19
|
+
export const FIELD_OPTIONS = {
|
|
20
|
+
// Fortify Scan 選項
|
|
21
|
+
fortifyScan: {
|
|
22
|
+
scanned: '14602',
|
|
23
|
+
notScanned: '14603',
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
// 重啟選項
|
|
27
|
+
restartOnly: {
|
|
28
|
+
false: '14901',
|
|
29
|
+
true: '14902',
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
// 集群部署選項
|
|
33
|
+
clusterDeploy: {
|
|
34
|
+
false: '15505',
|
|
35
|
+
true: '15506',
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
// 防毒掃描選項
|
|
39
|
+
antiScan: {
|
|
40
|
+
true: '14606',
|
|
41
|
+
false: '14607',
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
// 發佈操作類型
|
|
45
|
+
releaseOpType: {
|
|
46
|
+
main: '15200',
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
// 系統模組 (CI 用)
|
|
50
|
+
systemModule: {
|
|
51
|
+
assembly: '14369',
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/** Issue 預設值 */
|
|
56
|
+
export const ASSIGNEE_DEFAULTS = {
|
|
57
|
+
automatic: '-1',
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// ============ Issue Type 範本及說明 ============
|
|
61
|
+
|
|
62
|
+
export const NOTES_TEMPLATES = {
|
|
63
|
+
cd: `1. CD 目的在於透過整合完成程式自動化執行。
|
|
64
|
+
2. CD 單目前有兩個功能 :
|
|
65
|
+
2-1. 程式上版作業 : 佈署 CI 的版本或對應版本的設定檔。
|
|
66
|
+
2-2. 程式重啟作業 : 執行服務重啟,CID_restart_only 請設為 true。
|
|
67
|
+
3. CD 將自動建立表單,請就表單提供資訊,此表單即為作業申請單,無須再檢附檔案於附件中。
|
|
68
|
+
4. 有任何額外參數請以 json 格式填入 CID_extra_vars 欄位。
|
|
69
|
+
5. 請於 CID_server_list 填入欲佈署的目標機器清單後切至 "PREPARE FOR DEPLOY" 狀態下點擊 "Prepare to create deployment ticket" 自動開立 Deployment 單
|
|
70
|
+
並於佈署前完成簽核流程並將狀態切換至 "WAIT DEPLOY"。
|
|
71
|
+
UAT/PRD 只能由資管部級主管與代理完成許可。
|
|
72
|
+
資管主管請記得在 "WAIT APPROVAL" 狀態下點擊 "Approved"。
|
|
73
|
+
6. CD 單已整合 email 作業通知,請設定 CID_預計執行時間 後於作業前在 "WAIT FOR SEND NOTICE EMAIL" 狀態下點擊 "Send maintenance notification email"。
|
|
74
|
+
7. CID_ansible_tags 與 CID_ansible_skip_tags 欄位現階段尚不開放使用,請先忽略。
|
|
75
|
+
8. CID_system_submodule 欄位為彈性設計給獨立 playbook 的系統子模組使用,無子模組系統可忽略。
|
|
76
|
+
9. 配合 CI 單中 增補模組發佈作業,CD 單 CID_extra_vars 中會自動帶入 {"install_mode":"patch"},後續 deploy 將執行 patch 的差異上版。
|
|
77
|
+
10. PRD 簽核完成後請記得至資管 wiki - 資訊單位PRD上版彙總表 進行登記
|
|
78
|
+
11. PRD 簽核前請務必確認關聯的 CI 單中已執行完 Upload to prd-release.
|
|
79
|
+
12. 已支援 cluster 集群佈署,勾選 CID_cluster_deploy 為 True 即可使用,將以 CD 單中 CID_server_list 的內容設定至 Deployment 單中的 CID_cluster ,按下佈署後將依序佈署完成,並更新佈署結果於 CID_deploy_results 中。
|
|
80
|
+
13. 請注意集群佈署僅支援相同環境與相同 CID_extra_vars 佈署,PRD/DR 請各自開成 PRD 與 DR 的 Deployment 單。
|
|
81
|
+
14. 自動驗證確實完善前請謹慎考慮是否使用集群佈署。`,
|
|
82
|
+
|
|
83
|
+
ci: `1. CI 目的在於透過定義好的版本管理流程讓系統 PIC 能更專注於準備上版檔案(Golden image)。
|
|
84
|
+
2. CI 中預設版號取自 pom.xml 的 version 欄位,會於發佈完成後將尾數自動加 1。
|
|
85
|
+
3. CI 中禁止相同版號重複 release 。CI 可重複執行 release ,但版本號將自動增加。
|
|
86
|
+
4. 切 branch 後記得調整 pom.xml 內預設版號。
|
|
87
|
+
5. CI 流程搭配環境管理,可確認該版本的佈署情況。
|
|
88
|
+
6. 因防毒軟體限制,目前暫時無法自動掃毒,release 成功後請從 CID_repo_url 中下載檔案掃毒後附上掃毒結果截圖,並調整 CID_antivirus_passed 欄位為 True。
|
|
89
|
+
7. CID_diff 欄位為 bitbucket 比對機制,將比對兩版 tag 版本,請確認比對版本號是否正確。
|
|
90
|
+
8. 上 PRD/DR 前請於 "WAIT FOR UPLOAD" 狀態下點擊 "Upload to prd-release"。
|
|
91
|
+
9. CI 單可從上方 "More" 選擇 "CI Create linked CD" 建立搭配環境的 CD 單。
|
|
92
|
+
10. CID_dept_code 與 CID_system_code 已完成連動。
|
|
93
|
+
11. CI 單可分為 主程式發佈作業 與 增補模組發佈作業,設計上為共用 CID_system_module 欄位。
|
|
94
|
+
12. 增補模組為依附於主程式下的差異上版,故請記得於 PRD 佈署完成後將所有增補模組差異 merge 回主程式並完成發佈。`,
|
|
95
|
+
|
|
96
|
+
grayRelease: `1. GrayRelease 為灰度發佈,適用於單一 module 開發與測試佈署。
|
|
97
|
+
2. GrayRelease 流程為開發流程中一環,完成後請再接續完成正式 release。
|
|
98
|
+
3. GrayRelease 佈署方式為集群佈署,將以 CID_grayrelease_version 為版本依據,佈署至目標 cluster 中所有機器。
|
|
99
|
+
4. GrayRelease 限制為開發使用,不應存在 PRD/DR 環境。
|
|
100
|
+
5. 若需搭配不同分支的 Jenkins pipeline 執行,請設定 CID_jenkinsfile_branch,預設為 master。
|
|
101
|
+
6. 有任何額外參數請以 json 格式填入 CID_extra_vars 欄位。
|
|
102
|
+
7. 集群佈署僅支援相同環境與相同 CID_extra_vars 佈署。
|
|
103
|
+
8. 集群佈署時,CID_deploy_result 代表整個佈署流程的開始或成功與否。
|
|
104
|
+
9. 若佈署時出現任一失敗則將終止整個集群佈署。
|
|
105
|
+
10. CID_grayrelease_version 版本號不支援 '/',請務必注意以 '-' 取代。`,
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/** CD Issue Type 專用選項 */
|
|
109
|
+
export const CD_OPTIONS = {
|
|
110
|
+
linkType: { containedIn: 'is contained in' },
|
|
111
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 環境設定及其代碼映射
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/** 共用環境代碼 */
|
|
6
|
+
export const ENV_CODES = {
|
|
7
|
+
dev: '14355',
|
|
8
|
+
stg: '14356',
|
|
9
|
+
uat: '14357',
|
|
10
|
+
prd: '14358',
|
|
11
|
+
dr: '14359',
|
|
12
|
+
'prd/dr': '14360',
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/** 部門代碼 */
|
|
16
|
+
export const DEPT_CODES = {
|
|
17
|
+
CH014: '14520',
|
|
18
|
+
CH015: '14521',
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** 各 Issue Type 支援的環境列表 */
|
|
22
|
+
export const SUPPORTED_ENVS = {
|
|
23
|
+
library: ['dev', 'stg', 'uat', 'prd'],
|
|
24
|
+
ci: ['dev', 'stg'],
|
|
25
|
+
cd: ['stg', 'uat', 'prd/dr', 'prd', 'dr'],
|
|
26
|
+
grayRelease: ['dev', 'stg', 'uat'],
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/** 環境對應的簡短標籤 */
|
|
30
|
+
export const ENV_LABELS = {
|
|
31
|
+
dev: '開發',
|
|
32
|
+
stg: '測試',
|
|
33
|
+
uat: '驗收',
|
|
34
|
+
prd: '正式',
|
|
35
|
+
dr: '災備',
|
|
36
|
+
'prd/dr': '正式+災備',
|
|
37
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jira Custom Field ID 映射表
|
|
3
|
+
* 所有 customfield_XXXXX 在這裡集中管理
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {ASSIGNEE_DEFAULTS} from './defaults.js';
|
|
7
|
+
|
|
8
|
+
// ============ 共用欄位 (所有 Issue Type 都用) ============
|
|
9
|
+
export const SHARED_FIELD_IDS = {
|
|
10
|
+
summary: 'summary',
|
|
11
|
+
dueDate: 'duedate',
|
|
12
|
+
description: 'description',
|
|
13
|
+
assignee: ASSIGNEE_DEFAULTS,
|
|
14
|
+
env: 'customfield_13436',
|
|
15
|
+
deptCode: 'customfield_13434',
|
|
16
|
+
systemCode: 'customfield_13443',
|
|
17
|
+
systemModule: 'customfield_13444',
|
|
18
|
+
gitBranch: 'customfield_13431',
|
|
19
|
+
jenkinsBranch: 'customfield_14702',
|
|
20
|
+
extraVars: 'customfield_13437',
|
|
21
|
+
clusterDeploy: 'customfield_14704',
|
|
22
|
+
expectedStartTime: 'customfield_13446',
|
|
23
|
+
deptManagerSign: 'customfield_13903',
|
|
24
|
+
authManagerSign: 'customfield_13904',
|
|
25
|
+
releaseInfo: 'customfield_13906',
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// ============ CD 專用欄位 ============
|
|
29
|
+
export const CD_FIELD_IDS = {
|
|
30
|
+
...SHARED_FIELD_IDS,
|
|
31
|
+
systemSubmodule: 'customfield_14500',
|
|
32
|
+
serverList: 'customfield_13442',
|
|
33
|
+
restartOnly: 'customfield_14102',
|
|
34
|
+
linkType: 'issuelinks-linktype',
|
|
35
|
+
linkIssuesTextarea: 'issuelinks-issues-textarea',
|
|
36
|
+
linkIssuesSelect: 'issuelinks-issues',
|
|
37
|
+
cdNotes: 'customfield_14108',
|
|
38
|
+
deployVersion: 'customfield_14101', // CID_deploy_version:CD 單的佈署版本號(JSON 格式,如 {"ibk_ap_version":"0.0.11"})
|
|
39
|
+
};
|
|
40
|
+
// ============ Library 專用欄位 ============
|
|
41
|
+
export const LIBRARY_FIELD_IDS = {
|
|
42
|
+
...SHARED_FIELD_IDS,
|
|
43
|
+
libModuleParent: 'customfield_13702',
|
|
44
|
+
libModuleChild: 'customfield_13702:1',
|
|
45
|
+
fortifyScan: 'customfield_13807',
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// ============ CI 專用欄位 ============
|
|
49
|
+
export const CI_FIELD_IDS = {
|
|
50
|
+
...SHARED_FIELD_IDS,
|
|
51
|
+
releaseOpType: 'customfield_14400',
|
|
52
|
+
antiScanRequired: 'customfield_13812',
|
|
53
|
+
ciNotes: 'customfield_14107',
|
|
54
|
+
releaseVersion: 'customfield_13438', // CID_deploy_version:Jenkins build 後寫入的版本號 JSON(如 {"cwa_ap_version":"0.0.12"})
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// ============ GrayRelease 專用欄位 ============
|
|
58
|
+
export const GRAY_RELEASE_FIELD_IDS = {
|
|
59
|
+
...SHARED_FIELD_IDS,
|
|
60
|
+
grayReleaseVersion: 'customfield_14700',
|
|
61
|
+
clusterList: 'customfield_14701',
|
|
62
|
+
grayReleaseNotes: 'customfield_14511',
|
|
63
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants 統一匯出
|
|
3
|
+
* 這個檔案是所有 constants 的入口
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// Field IDs
|
|
7
|
+
export {
|
|
8
|
+
SHARED_FIELD_IDS,
|
|
9
|
+
CD_FIELD_IDS,
|
|
10
|
+
LIBRARY_FIELD_IDS,
|
|
11
|
+
CI_FIELD_IDS,
|
|
12
|
+
GRAY_RELEASE_FIELD_IDS,
|
|
13
|
+
} from './field-ids.js';
|
|
14
|
+
|
|
15
|
+
// System Codes
|
|
16
|
+
export {
|
|
17
|
+
SYSTEM_CODES,
|
|
18
|
+
SYSTEM_TO_DEPT_MAP,
|
|
19
|
+
SYSTEM_CODE_JIRA_IDS,
|
|
20
|
+
SYSTEM_MODULES,
|
|
21
|
+
MODULE_TO_REPO_MAP,
|
|
22
|
+
SYSTEM_TO_CI_REPO_MAP,
|
|
23
|
+
} from './system-codes.js';
|
|
24
|
+
|
|
25
|
+
// Environments
|
|
26
|
+
export {ENV_CODES, DEPT_CODES, SUPPORTED_ENVS, ENV_LABELS} from './environments.js';
|
|
27
|
+
|
|
28
|
+
// Servers
|
|
29
|
+
export {SERVERS, SERVER_MODULE_MAP} from './server.js';
|
|
30
|
+
|
|
31
|
+
// Issue Types
|
|
32
|
+
export {ISSUE_TYPES, ISSUE_TYPE_IDS, JIRA_PROJECT_ID} from './issue-types.js';
|
|
33
|
+
|
|
34
|
+
// Modules
|
|
35
|
+
export {LIBRARY_MODULE_IDS, GRAY_RELEASE_MODULE_IDS, getModuleId} from './modules.js';
|
|
36
|
+
|
|
37
|
+
// Defaults
|
|
38
|
+
export {
|
|
39
|
+
SIGN_VALUES,
|
|
40
|
+
JIRA_DEFAULTS,
|
|
41
|
+
FIELD_OPTIONS,
|
|
42
|
+
ASSIGNEE_DEFAULTS,
|
|
43
|
+
NOTES_TEMPLATES,
|
|
44
|
+
CD_OPTIONS,
|
|
45
|
+
} from './defaults.js';
|
|
46
|
+
|
|
47
|
+
// Users
|
|
48
|
+
export {USER_MAP, resolveAccountId} from './users.js';
|
|
49
|
+
|
|
50
|
+
// Repos
|
|
51
|
+
export {REPO_MAPS, MODULE_MAP, REPO_LABEL_MAP} from './repos.js';
|
|
52
|
+
|
|
53
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jira Issue Type 定義及 ID
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export const ISSUE_TYPES = {
|
|
6
|
+
LIBRARY: 'Library',
|
|
7
|
+
CI: 'CI',
|
|
8
|
+
CD: 'CD',
|
|
9
|
+
GRAY_RELEASE: 'GrayRelease',
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const ISSUE_TYPE_IDS = {
|
|
13
|
+
Library: '12501',
|
|
14
|
+
GrayRelease: '12601',
|
|
15
|
+
CI: '12305',
|
|
16
|
+
CD: '12306',
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/** Jira Project ID(數字)*/
|
|
20
|
+
export const JIRA_PROJECT_ID_NUMERIC = 13305;
|
|
21
|
+
|
|
22
|
+
/** Jira Project Key(用於 API)*/
|
|
23
|
+
export const JIRA_PROJECT_ID = 'CID';
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模組 ID 映射
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/** Library 中的模組 ID */
|
|
6
|
+
export const LIBRARY_MODULE_IDS = {
|
|
7
|
+
EVT: {
|
|
8
|
+
evt005: '15609',
|
|
9
|
+
evt007: '15610',
|
|
10
|
+
evt009: '15510',
|
|
11
|
+
nextjs_web: '15511',
|
|
12
|
+
},
|
|
13
|
+
IBK: {
|
|
14
|
+
ibk: '15601',
|
|
15
|
+
a11y: '15602',
|
|
16
|
+
landing: '15603',
|
|
17
|
+
ssr: '15604',
|
|
18
|
+
wealth: '15605',
|
|
19
|
+
},
|
|
20
|
+
CWA: {cwa: '15514'},
|
|
21
|
+
BOF: {web: '15801'},
|
|
22
|
+
EIB: {web_cust: '15804', web_agnt: '15805'},
|
|
23
|
+
NPM: {utils: '15808'},
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/** GrayRelease 中的模組 ID */
|
|
27
|
+
export const GRAY_RELEASE_MODULE_IDS = {
|
|
28
|
+
ibk: '15500',
|
|
29
|
+
a11y: '15501',
|
|
30
|
+
ssr: '15503',
|
|
31
|
+
wealth: '15507',
|
|
32
|
+
cwa: '15515',
|
|
33
|
+
web: '15809',
|
|
34
|
+
web_cust: '15810',
|
|
35
|
+
web_agnt: '15811',
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 取得模組的 Jira ID
|
|
40
|
+
* @param {string} issueType - Issue 類型 ('Library', 'GrayRelease' 等)
|
|
41
|
+
* @param {string} systemCode - 系統代碼
|
|
42
|
+
* @param {string} moduleName - 模組名稱
|
|
43
|
+
* @returns {string} 模組 ID
|
|
44
|
+
*/
|
|
45
|
+
export function getModuleId(issueType, systemCode, moduleName) {
|
|
46
|
+
if (issueType === 'GrayRelease') {
|
|
47
|
+
return GRAY_RELEASE_MODULE_IDS[moduleName];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (issueType === 'Library') {
|
|
51
|
+
return LIBRARY_MODULE_IDS[systemCode]?.[moduleName];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bitbucket repo 相關對應表
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/** Bitbucket repo metadata(也供 CD release notes 使用) */
|
|
6
|
+
export const REPO_MAPS = {
|
|
7
|
+
'tw-bank-web': {project: 'CHANNEL', repoId: '110'},
|
|
8
|
+
'tw-bank-web-ssr': {project: 'CHANNEL', repoId: '787'},
|
|
9
|
+
'tw-bank-web-wealth': {project: 'CHANNEL', repoId: '1403'},
|
|
10
|
+
'tw-bank-web-a11y': {project: 'CHANNEL', repoId: '690'},
|
|
11
|
+
'tw-bank-webapp': {project: 'CHANNEL', repoId: '36'},
|
|
12
|
+
'tw-bank-admin-web': {project: 'CHANNEL', repoId: '1042'},
|
|
13
|
+
'tw-bank-enterprise-cust': {project: 'CHANNEL', repoId: '836'},
|
|
14
|
+
'tw-bank-enterprise-agent': {project: 'CHANNEL', repoId: '850'},
|
|
15
|
+
'tw-bank-evt': {project: 'CHANNEL', repoId: '827'},
|
|
16
|
+
'tw-bank-web-evt': {project: 'CHANNEL', repoId: '937'},
|
|
17
|
+
'tw-bank-npm': {project: 'CHANNEL', repoId: '1274'},
|
|
18
|
+
'ch014.ibk.assembly': {project: 'LBTWGOL', repoId: '1241'},
|
|
19
|
+
'ch014.cwa.assembly': {project: 'LBTWGOL', repoId: '1460'},
|
|
20
|
+
'ch015.bof.assembly': {project: 'LBTWGOL', repoId: '1514'},
|
|
21
|
+
'ch015.eib.assembly': {project: 'LBTWGOL', repoId: '1516'},
|
|
22
|
+
'ch015.evt.assembly': {project: 'LBTWGOL', repoId: '1412'},
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/** moduleChild → repo name 對應 */
|
|
26
|
+
export const MODULE_MAP = {
|
|
27
|
+
ibk: 'tw-bank-web',
|
|
28
|
+
ssr: 'tw-bank-web-ssr',
|
|
29
|
+
wealth: 'tw-bank-web-wealth',
|
|
30
|
+
a11y: 'tw-bank-web-a11y',
|
|
31
|
+
cwa: 'tw-bank-webapp',
|
|
32
|
+
web: 'tw-bank-admin-web',
|
|
33
|
+
web_cust: 'tw-bank-enterprise-cust',
|
|
34
|
+
web_agnt: 'tw-bank-enterprise-agent',
|
|
35
|
+
evt007: 'tw-bank-evt',
|
|
36
|
+
evt009: 'tw-bank-evt',
|
|
37
|
+
evt005: 'tw-bank-evt',
|
|
38
|
+
nextjs_web: 'tw-bank-web-evt',
|
|
39
|
+
utils: 'tw-bank-npm',
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/** repo name → 顯示標籤 */
|
|
43
|
+
export const REPO_LABEL_MAP = {
|
|
44
|
+
'tw-bank-web': 'IBK',
|
|
45
|
+
'tw-bank-web-ssr': 'SSR',
|
|
46
|
+
'tw-bank-web-wealth': 'Wealth',
|
|
47
|
+
'tw-bank-web-a11y': 'A11y',
|
|
48
|
+
'tw-bank-webapp': 'CWA',
|
|
49
|
+
'tw-bank-admin-web': 'BOF Web',
|
|
50
|
+
'tw-bank-enterprise-cust': 'EIB Cust',
|
|
51
|
+
'tw-bank-enterprise-agent': 'EIB Agent',
|
|
52
|
+
'tw-bank-evt': 'EVT',
|
|
53
|
+
'tw-bank-web-evt': 'EVT Next',
|
|
54
|
+
'tw-bank-npm': 'NPM',
|
|
55
|
+
};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server 配置及部署列表
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export const SERVERS = {
|
|
6
|
+
IBK: {
|
|
7
|
+
dev: ['tvdev-ibk-web01'],
|
|
8
|
+
stg: ['tvstg-ibk-web01', 'tvstg-ibk-web02'],
|
|
9
|
+
uat: ['tvuat-ibk-web01', 'tvuat-ibk-web02'],
|
|
10
|
+
prd: [
|
|
11
|
+
'tvprd-ibk-web01',
|
|
12
|
+
'tvprd-ibk-web02',
|
|
13
|
+
'tvprd-ibk-web03',
|
|
14
|
+
'tvprd-ibk-web04',
|
|
15
|
+
'tvprd-ibk-web05',
|
|
16
|
+
],
|
|
17
|
+
dr: ['lvprd-ibk-web01', 'lvprd-ibk-web02'],
|
|
18
|
+
'prd/dr': [
|
|
19
|
+
'tvprd-ibk-web01',
|
|
20
|
+
'tvprd-ibk-web02',
|
|
21
|
+
'tvprd-ibk-web03',
|
|
22
|
+
'tvprd-ibk-web04',
|
|
23
|
+
'tvprd-ibk-web05',
|
|
24
|
+
'lvprd-ibk-web01',
|
|
25
|
+
'lvprd-ibk-web02',
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
CWA: {
|
|
30
|
+
dev: ['tvdev-cwa-web01'],
|
|
31
|
+
stg: ['tvstg-cwa-web01', 'tvstg-cwa-web02'],
|
|
32
|
+
uat: ['tvuat-cwa-web01', 'tvuat-cwa-web02'],
|
|
33
|
+
prd: [
|
|
34
|
+
'tvprd-cwa-web01',
|
|
35
|
+
'tvprd-cwa-web02',
|
|
36
|
+
'tvprd-cwa-web03',
|
|
37
|
+
'tvprd-cwa-web04',
|
|
38
|
+
'tvprd-cwa-web05',
|
|
39
|
+
],
|
|
40
|
+
dr: ['lvprd-cwa-web01', 'lvprd-cwa-web02'],
|
|
41
|
+
'prd/dr': [
|
|
42
|
+
'tvprd-cwa-web01',
|
|
43
|
+
'tvprd-cwa-web02',
|
|
44
|
+
'tvprd-cwa-web03',
|
|
45
|
+
'tvprd-cwa-web04',
|
|
46
|
+
'tvprd-cwa-web05',
|
|
47
|
+
'lvprd-cwa-web01',
|
|
48
|
+
'lvprd-cwa-web02',
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
BOF: {
|
|
53
|
+
dev: ['tvdev-bof-was01'],
|
|
54
|
+
stg: ['tvstg-bof-was01'],
|
|
55
|
+
uat: ['tvuat-bof-was01'],
|
|
56
|
+
prd: ['tvprd-bof-was01'],
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
EIB: {
|
|
60
|
+
dev: {was: ['tvdev-eib-was01'], web: ['tvdev-eib-web01']},
|
|
61
|
+
stg: {was: ['tvstg-eib-was01'], web: ['tvstg-eib-web01']},
|
|
62
|
+
uat: {
|
|
63
|
+
was: ['tvuat-eib-was01', 'tvuat-eib-was02'],
|
|
64
|
+
web: ['tvuat-eib-web01', 'tvuat-eib-web02'],
|
|
65
|
+
},
|
|
66
|
+
prd: {
|
|
67
|
+
was: ['tvprd-eib-was01', 'tvprd-eib-was02'],
|
|
68
|
+
web: ['tvprd-eib-web01', 'tvprd-eib-web02'],
|
|
69
|
+
},
|
|
70
|
+
dr: {
|
|
71
|
+
was: ['lvprd-eib-was01', 'lvprd-eib-was02'],
|
|
72
|
+
web: ['lvprd-eib-web01', 'lvprd-eib-web02'],
|
|
73
|
+
},
|
|
74
|
+
'prd/dr': {
|
|
75
|
+
was: ['tvprd-eib-was01', 'tvprd-eib-was02', 'lvprd-eib-was01', 'lvprd-eib-was02'],
|
|
76
|
+
web: ['tvprd-eib-web01', 'tvprd-eib-web02', 'lvprd-eib-web01', 'lvprd-eib-web02'],
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
EVT: {
|
|
81
|
+
stg: {web: ['tvstg-evt-web01'], was: ['tvstg-evt-was01']},
|
|
82
|
+
uat: {
|
|
83
|
+
web: ['tvuat-evt-web01', 'tvuat-evt-web02'],
|
|
84
|
+
was: ['tvuat-evt-was01', 'tvuat-evt-was02'],
|
|
85
|
+
},
|
|
86
|
+
prd: {
|
|
87
|
+
web: ['tvprd-evt-web01', 'tvprd-evt-web02'],
|
|
88
|
+
was: ['tvprd-evt-was01', 'tvprd-evt-was02'],
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export const SERVER_MODULE_MAP = {
|
|
94
|
+
web_cust: 'web',
|
|
95
|
+
web_agnt: 'was',
|
|
96
|
+
evt005: 'was',
|
|
97
|
+
evt007: 'was',
|
|
98
|
+
evt009: 'web',
|
|
99
|
+
nextjs_web: 'was',
|
|
100
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 系統代碼及其映射
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export const SYSTEM_CODES = {
|
|
6
|
+
IBK: 'IBK',
|
|
7
|
+
CWA: 'CWA',
|
|
8
|
+
EIB: 'EIB',
|
|
9
|
+
EVT: 'EVT',
|
|
10
|
+
NPM: 'NPM',
|
|
11
|
+
BOF: 'BOF',
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/** 系統 → 部門代碼映射 */
|
|
15
|
+
export const SYSTEM_TO_DEPT_MAP = {
|
|
16
|
+
IBK: 'CH014',
|
|
17
|
+
CWA: 'CH014',
|
|
18
|
+
NPM: 'CH014',
|
|
19
|
+
EVT: 'CH015',
|
|
20
|
+
EIB: 'CH015',
|
|
21
|
+
BOF: 'CH015',
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/** 系統代碼的 Jira ID */
|
|
25
|
+
export const SYSTEM_CODE_JIRA_IDS = {
|
|
26
|
+
// Library 中的系統代碼 ID
|
|
27
|
+
library: {
|
|
28
|
+
IBK: '15600',
|
|
29
|
+
EVT: '15509',
|
|
30
|
+
CWA: '15513',
|
|
31
|
+
BOF: '15800',
|
|
32
|
+
EIB: '15803',
|
|
33
|
+
NPM: '15807',
|
|
34
|
+
},
|
|
35
|
+
// CI 中的系統代碼 ID
|
|
36
|
+
ci: {
|
|
37
|
+
EVT: '15508',
|
|
38
|
+
BOF: '15802',
|
|
39
|
+
EIB: '15806',
|
|
40
|
+
IBK: '14800',
|
|
41
|
+
CWA: '15516',
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/** 各系統支援的模組 */
|
|
46
|
+
export const SYSTEM_MODULES = {
|
|
47
|
+
IBK: ['ibk', 'wealth', 'ssr', 'a11y'],
|
|
48
|
+
CWA: ['cwa'],
|
|
49
|
+
BOF: ['web'],
|
|
50
|
+
EIB: ['web_cust', 'web_agnt'],
|
|
51
|
+
EVT: ['evt007', 'evt009', 'evt005', 'nextjs_web'],
|
|
52
|
+
NPM: ['utils'],
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/** 模組名稱 → Git Repo 映射 */
|
|
56
|
+
export const MODULE_TO_REPO_MAP = {
|
|
57
|
+
ibk: 'tw-bank-web',
|
|
58
|
+
ssr: 'tw-bank-web-ssr',
|
|
59
|
+
wealth: 'tw-bank-web-wealth',
|
|
60
|
+
a11y: 'tw-bank-web-a11y',
|
|
61
|
+
cwa: 'tw-bank-webapp',
|
|
62
|
+
web: 'tw-bank-admin-web',
|
|
63
|
+
web_cust: 'tw-bank-enterprise-cust',
|
|
64
|
+
web_agnt: 'tw-bank-enterprise-agent',
|
|
65
|
+
evt007: 'tw-bank-evt',
|
|
66
|
+
evt009: 'tw-bank-evt',
|
|
67
|
+
evt005: 'tw-bank-evt',
|
|
68
|
+
nextjs_web: 'tw-bank-web-evt',
|
|
69
|
+
utils: 'tw-bank-npm',
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/** 系統代碼 → CI 倉庫映射 */
|
|
73
|
+
export const SYSTEM_TO_CI_REPO_MAP = {
|
|
74
|
+
IBK: 'ch014.ibk.assembly',
|
|
75
|
+
CWA: 'ch014.cwa.assembly',
|
|
76
|
+
BOF: 'ch015.bof.assembly',
|
|
77
|
+
EIB: 'ch015.eib.assembly',
|
|
78
|
+
EVT: 'ch015.evt.assembly',
|
|
79
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 使用者名稱 → Jira accountId 對應表
|
|
3
|
+
* 支援中英文名稱、暱稱等多種別名
|
|
4
|
+
* 使用方式:resolveAccountId('Solar') → 'BK00129'
|
|
5
|
+
*/
|
|
6
|
+
export const USER_MAP = {
|
|
7
|
+
// 格式:'名稱/暱稱(不分大小寫)': 'accountId'
|
|
8
|
+
'Solar Chen': 'BK00619',
|
|
9
|
+
'Rex Li': 'BK00619',
|
|
10
|
+
'James Yu': 'BK00619',
|
|
11
|
+
'Alvin Wang': 'BK00619',
|
|
12
|
+
'Chester Kuo': 'BK00619',
|
|
13
|
+
'Riemann Tseng': 'BK00619',
|
|
14
|
+
// 'Solar Chen': 'BK00129',
|
|
15
|
+
// 'Rex Li': 'BK00136',
|
|
16
|
+
// 'James Yu': 'BK00178',
|
|
17
|
+
// 'Alvin Wang': 'BK00236',
|
|
18
|
+
// 'Chester Kuo': 'BK00172',
|
|
19
|
+
// 'Riemann Tseng': 'BK00003',
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 依名稱模糊查找 accountId(不分大小寫)
|
|
24
|
+
* 優先順序:完全相符 → key 包含輸入 → 輸入包含 key
|
|
25
|
+
* @param {string} name - 顯示名稱或暱稱(例如 "Solar"、"Solar Chen")
|
|
26
|
+
* @returns {string|null} accountId 或 null(查無此人)
|
|
27
|
+
*/
|
|
28
|
+
export function resolveAccountId(name) {
|
|
29
|
+
if (!name) return null;
|
|
30
|
+
const query = name.toLowerCase();
|
|
31
|
+
|
|
32
|
+
// 1. 完全相符
|
|
33
|
+
const exact = USER_MAP[query];
|
|
34
|
+
if (exact) return exact;
|
|
35
|
+
|
|
36
|
+
const entries = Object.entries(USER_MAP);
|
|
37
|
+
|
|
38
|
+
// 2. key 包含輸入(例如 "solar chen" 包含 "solar")
|
|
39
|
+
const keyContains = entries.find(([k]) => k.toLowerCase().includes(query));
|
|
40
|
+
if (keyContains) return keyContains[1];
|
|
41
|
+
|
|
42
|
+
// 3. 輸入包含 key(例如 "solar chen" 被輸入,key 是 "solar")
|
|
43
|
+
const inputContains = entries.find(([k]) => query.includes(k.toLowerCase()));
|
|
44
|
+
if (inputContains) return inputContains[1];
|
|
45
|
+
|
|
46
|
+
return null;
|
|
47
|
+
}
|