@comate/zulu 1.2.1-beta.2 → 1.3.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/comate-engine/assets/skills/auto-commit-comate/SKILL.md +260 -0
- package/comate-engine/assets/skills/auto-commit-comate/references/data_structures.md +189 -0
- package/comate-engine/assets/skills/auto-commit-comate/references/new_version_instruction.md +209 -0
- package/comate-engine/assets/skills/auto-commit-comate/references/old_version_instruction.md +208 -0
- package/comate-engine/assets/skills/auto-commit-comate/scripts/git_diff_cli.py +196 -0
- package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/git_utils.py +20 -10
- package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/client.py +69 -40
- package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/farseer.py +8 -9
- package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/matching.py +65 -9
- package/comate-engine/assets/skills/auto-commit-comate/scripts/match_card_cli.py +37 -0
- package/comate-engine/assets/skills/cnap-comate/SKILL.md +157 -0
- package/comate-engine/assets/skills/cnap-comate/references/cases.md +198 -0
- package/comate-engine/assets/skills/cnap-comate/references/deploy-troubleshoot.md +15 -0
- package/comate-engine/assets/skills/cnap-comate/references/install.md +43 -0
- package/comate-engine/assets/skills/cnap-comate/references/kubectl.md +55 -0
- package/comate-engine/assets/skills/cnap-comate/references/login.md +125 -0
- package/comate-engine/assets/skills/cnap-comate/references/oncall.md +24 -0
- package/comate-engine/assets/skills/cnap-comate/scripts/install_cnap_cli.sh +36 -0
- package/comate-engine/assets/skills/code-security/SKILL.md +176 -0
- package/comate-engine/assets/skills/code-security/references/credential_hosting.md +102 -0
- package/comate-engine/assets/skills/code-security/references/vul_repair_sensitive.md +219 -0
- package/comate-engine/assets/skills/code-security/scripts/build_repair_info.py +0 -0
- package/comate-engine/assets/skills/code-security/scripts/credential_hosting.py +99 -0
- package/comate-engine/assets/skills/code-security/scripts/credential_poll.py +350 -0
- package/comate-engine/assets/skills/code-security/scripts/http_client.py +173 -0
- package/comate-engine/assets/skills/code-security/scripts/parse_scan_result.py +301 -0
- package/comate-engine/assets/skills/code-security/scripts/repair_vulnerability.py +261 -0
- package/comate-engine/assets/skills/code-security/scripts/report_chat.py +198 -0
- package/comate-engine/assets/skills/code-security/scripts/scan_vulnerability.py +316 -0
- package/comate-engine/assets/skills/code-security-comate/SKILL.md +219 -0
- package/comate-engine/assets/skills/code-security-comate/references/credential_hosting.md +102 -0
- package/comate-engine/assets/skills/code-security-comate/references/vul_repair-go_sql_injection.md +399 -0
- package/comate-engine/assets/skills/code-security-comate/references/vul_repair-java_sql_injection.md +591 -0
- package/comate-engine/assets/skills/code-security-comate/references/vul_repair-php_sql_injection.md +318 -0
- package/comate-engine/assets/skills/code-security-comate/references/vul_repair-python_sql_injection.md +198 -0
- package/comate-engine/assets/skills/code-security-comate/references/vul_repair_sensitive.md +219 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/credential_hosting.py +87 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/credential_poll.py +345 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/http_client.py +173 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/parse_scan_result.py +392 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/repair_vulnerability.py +245 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/report_chat.py +145 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/scan_vulnerability.py +444 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/utils.py +153 -0
- package/comate-engine/assets/skills/comate-docs-comate/SKILL.md +148 -0
- package/comate-engine/assets/skills/comate-docs-comate/references/doc-map-extended.md +78 -0
- package/comate-engine/assets/skills/comate-docs-comate/references/models-and-billing.md +51 -0
- package/comate-engine/assets/skills/comate-docs-comate/references/product-overview.md +73 -0
- package/comate-engine/assets/skills/comate-docs-comate/references/query_content.md +83 -0
- package/comate-engine/assets/skills/comate-docs-comate/references/query_repo.md +57 -0
- package/comate-engine/assets/skills/comate-docs-comate/scripts/ku_operator.py +1575 -0
- package/comate-engine/assets/skills/create-image-comate/SKILL.md +278 -0
- package/comate-engine/assets/skills/create-skill-comate/SKILL.md +308 -217
- package/comate-engine/assets/skills/create-skill-comate/agents/analyzer.md +274 -0
- package/comate-engine/assets/skills/create-skill-comate/agents/comparator.md +202 -0
- package/comate-engine/assets/skills/create-skill-comate/agents/grader.md +223 -0
- package/comate-engine/assets/skills/create-skill-comate/assets/eval_review.html +146 -0
- package/comate-engine/assets/skills/create-skill-comate/eval-viewer/generate_review.py +489 -0
- package/comate-engine/assets/skills/create-skill-comate/eval-viewer/viewer.html +1325 -0
- package/comate-engine/assets/skills/create-skill-comate/references/schemas.md +430 -0
- package/comate-engine/assets/skills/create-skill-comate/scripts/__init__.py +0 -0
- package/comate-engine/assets/skills/create-skill-comate/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- package/comate-engine/assets/skills/create-skill-comate/scripts/__pycache__/aggregate_benchmark.cpython-311.pyc +0 -0
- package/comate-engine/assets/skills/create-skill-comate/scripts/aggregate_benchmark.py +412 -0
- package/comate-engine/assets/skills/create-skill-comate/scripts/generate_report.py +334 -0
- package/comate-engine/assets/skills/create-skill-comate/scripts/package_skill.py +140 -0
- package/comate-engine/assets/skills/create-skill-comate/scripts/utils.py +53 -0
- package/comate-engine/assets/skills/find-skills-comate/SKILL.md +15 -12
- package/comate-engine/assets/skills/find-skills-comate/scripts/fetch_skills.py +32 -3
- package/comate-engine/assets/skills/get-ugate-token-comate/SKILL.md +159 -0
- package/comate-engine/assets/skills/get-ugate-token-comate/getUgateToken.py +150 -0
- package/comate-engine/assets/skills/icafe-comate/SKILL.md +240 -0
- package/comate-engine/assets/skills/icafe-comate/references/ai-workflows.md +233 -0
- package/comate-engine/assets/skills/icafe-comate/references/commands.md +1147 -0
- package/comate-engine/assets/skills/icafe-comate/references/error-handling.md +164 -0
- package/comate-engine/assets/skills/icafe-comate/references/git-auto-bindcard-workflow.md +201 -0
- package/comate-engine/assets/skills/icafe-comate/references/git-bindcard-workflow.md +327 -0
- package/comate-engine/assets/skills/icafe-comate/references/iql-syntax.md +327 -0
- package/comate-engine/assets/skills/icafe-comate/references/platform-concepts.md +317 -0
- package/comate-engine/assets/skills/icafe-comate/references/smart-create-workflow.md +171 -0
- package/comate-engine/assets/skills/icafe-comate/references/smart-find-workflow.md +127 -0
- package/comate-engine/assets/skills/icafe-comate/references/smart-update-workflow.md +118 -0
- package/comate-engine/assets/skills/icode-comate/SKILL.md +366 -0
- package/comate-engine/assets/skills/icode-comate/references/api/add_reviewers.md +44 -0
- package/comate-engine/assets/skills/icode-comate/references/api/build_fetch_command.md +89 -0
- package/comate-engine/assets/skills/icode-comate/references/api/check_repo_permission.md +89 -0
- package/comate-engine/assets/skills/icode-comate/references/api/create_branch.md +79 -0
- package/comate-engine/assets/skills/icode-comate/references/api/create_draft_comment.md +109 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_ai_cr_result.md +190 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_ai_review.md +97 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_diff_content.md +92 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_diff_file.md +88 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_machine_check.md +73 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_my_reviews.md +115 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_person_commit.md +89 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_person_repo.md +63 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_repo_branch.md +62 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_repo_config.md +91 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_repo_members.md +118 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_repo_reviews.md +91 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_review_comments.md +87 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_review_info.md +81 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_submit_settings.md +105 -0
- package/comate-engine/assets/skills/icode-comate/references/api/icode-api.md +86 -0
- package/comate-engine/assets/skills/icode-comate/references/api/publish_comments.md +72 -0
- package/comate-engine/assets/skills/icode-comate/references/api/set_review_score.md +58 -0
- package/comate-engine/assets/skills/icode-comate/references/api/start_ai_review.md +77 -0
- package/comate-engine/assets/skills/icode-comate/references/api/submit_review.md +50 -0
- package/comate-engine/assets/skills/icode-comate/references/api/trigger_ai_cr.md +63 -0
- package/comate-engine/assets/skills/icode-comate/references/feature/add-reviewer.md +92 -0
- package/comate-engine/assets/skills/icode-comate/references/feature/fix-machine-check.md +144 -0
- package/comate-engine/assets/skills/icode-comate/references/feature/merge-cr.md +100 -0
- package/comate-engine/assets/skills/icode-comate/references/feature/ssh-setup.md +106 -0
- package/comate-engine/assets/skills/icode-comate/references/feature/submit-acr.md +135 -0
- package/comate-engine/assets/skills/icode-comate/references/feature/submit-cr.md +123 -0
- package/comate-engine/assets/skills/icode-comate/references/git/clone.md +67 -0
- package/comate-engine/assets/skills/icode-comate/references/git/icode-git.md +68 -0
- package/comate-engine/assets/skills/icode-comate/references/git/push.md +64 -0
- package/comate-engine/assets/skills/icode-comate/references/git/push_cr.md +103 -0
- package/comate-engine/assets/skills/icode-comate/references/install.md +144 -0
- package/comate-engine/assets/skills/icode-comate/references/login.md +111 -0
- package/comate-engine/assets/skills/icode-comate/scripts/add-reviewer.sh +154 -0
- package/comate-engine/assets/skills/icode-comate/scripts/common.sh +145 -0
- package/comate-engine/assets/skills/icode-comate/scripts/fix-machine-check.sh +131 -0
- package/comate-engine/assets/skills/icode-comate/scripts/merge-cr.sh +105 -0
- package/comate-engine/assets/skills/icode-comate/scripts/ssh-setup.sh +159 -0
- package/comate-engine/assets/skills/icode-comate/scripts/submit-acr.sh +236 -0
- package/comate-engine/assets/skills/icode-comate/scripts/submit-cr.sh +104 -0
- package/comate-engine/assets/skills/icode-comate/scripts/test-preflight.sh +89 -0
- package/comate-engine/assets/skills/ku-operator-comate/SKILL.md +121 -0
- package/comate-engine/assets/skills/ku-operator-comate/examples.md +190 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/add_member.md +49 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/change_scope.md +38 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/copy_doc.md +50 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/create_doc.md +61 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/delete_doc.md +31 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/edit_content.md +568 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/move_doc.md +45 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/query_comment.md +79 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/query_content.md +83 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/query_flowchart.md +84 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/query_permission.md +38 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/query_recent_view.md +67 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/query_repo.md +57 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/query_user_info.md +37 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/update_member.md +41 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/upload_attachment.md +52 -0
- package/comate-engine/assets/skills/ku-operator-comate/scripts/ku_operator.py +1575 -0
- package/comate-engine/node_modules/better-sqlite3/node_modules/.bin/prebuild-install +2 -2
- package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build +2 -2
- package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build-optional +2 -2
- package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build-test +2 -2
- package/comate-engine/package.json +2 -0
- package/comate-engine/server.js +263 -79
- package/dist/bundle/index.js +3 -3
- package/package.json +1 -1
- package/comate-engine/assets/skills/figma2code-comate/codeConnect.md +0 -37
- package/comate-engine/assets/skills/figma2code-comate/designToken.md +0 -3
- package/comate-engine/assets/skills/figma2code-comate/f2cMcp.md +0 -59
- package/comate-engine/assets/skills/smart-commit/SKILL.md +0 -646
- package/comate-engine/node_modules/@comate/plugin-host/dist/index-AZIho4HV.js +0 -1
- package/comate-engine/node_modules/@comate/plugin-host/dist/user-BIpzRUfb.js +0 -44
- /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/references/issue_type_mapping.json +0 -0
- /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/references/query_reference.md +0 -0
- /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/compat.py +0 -0
- /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/create_card_cli.py +0 -0
- /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/__init__.py +0 -0
- /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/logger.py +0 -0
- /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/recognize_card_cli.py +0 -0
package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/farseer.py
RENAMED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"""Farseer API 客户端"""
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import json
|
|
4
|
+
import urllib.parse
|
|
5
|
+
import urllib.request
|
|
4
6
|
from typing import Dict, List, Any, Optional
|
|
5
7
|
|
|
6
8
|
from .client import FARSEER_BASE_URL, DEFAULT_TIMEOUT, ISSUE_TYPE_MAP
|
|
@@ -25,14 +27,11 @@ def get_binding_card_types(space_id: int, timeout: int = DEFAULT_TIMEOUT) -> Lis
|
|
|
25
27
|
"""
|
|
26
28
|
logger.info("查询 farseer 可绑定类型: space_id=%s", space_id)
|
|
27
29
|
try:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
)
|
|
34
|
-
response.raise_for_status()
|
|
35
|
-
data = response.json()
|
|
30
|
+
query_string = urllib.parse.urlencode({'icafeSpaceId': space_id})
|
|
31
|
+
url = f"{FARSEER_BASE_URL}/storyRule/getRule?{query_string}"
|
|
32
|
+
req = urllib.request.Request(url)
|
|
33
|
+
with urllib.request.urlopen(req, timeout=timeout) as resp:
|
|
34
|
+
data = json.loads(resp.read().decode("utf-8"))
|
|
36
35
|
|
|
37
36
|
rule_data = data.get('data', {}).get('data', {})
|
|
38
37
|
binding_types = rule_data.get('engineeringBindingTypes', [])
|
package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/matching.py
RENAMED
|
@@ -320,10 +320,38 @@ def resolve_space(
|
|
|
320
320
|
space_prefix = matched_space.get('prefixCode', '')
|
|
321
321
|
space_id_num = matched_space.get('id')
|
|
322
322
|
space_name = matched_space.get('name', '')
|
|
323
|
+
elif not space_code_map and git_space_ids:
|
|
324
|
+
# space_code_map 为空(API 无返回),使用 git log 最高频前缀兜底
|
|
325
|
+
# 此时没有 space_id_num,但 IQL 查询仍可通过 space_prefix 工作
|
|
326
|
+
space_prefix = git_space_ids[0]
|
|
327
|
+
logger.warning(
|
|
328
|
+
"最近访问空间列表为空,使用 git log 最高频前缀兜底: %s",
|
|
329
|
+
space_prefix,
|
|
330
|
+
)
|
|
331
|
+
# 补全 space_code_map,使 available_spaces 和 space_types_map 不为空
|
|
332
|
+
space_code_map[space_prefix.lower()] = {
|
|
333
|
+
'prefixCode': space_prefix,
|
|
334
|
+
'id': None,
|
|
335
|
+
'name': '',
|
|
336
|
+
}
|
|
323
337
|
|
|
324
338
|
if not space_prefix:
|
|
325
|
-
|
|
326
|
-
|
|
339
|
+
# 收集候选前缀信息,帮助 Agent 快速重试
|
|
340
|
+
candidates = []
|
|
341
|
+
try:
|
|
342
|
+
fallback_ids = git_log_future.result() if not git_space_ids else git_space_ids
|
|
343
|
+
candidates = fallback_ids[:5] if fallback_ids else []
|
|
344
|
+
except Exception:
|
|
345
|
+
pass
|
|
346
|
+
hint = ""
|
|
347
|
+
if candidates:
|
|
348
|
+
hint = f",git log 中发现的候选前缀: {candidates}"
|
|
349
|
+
if not space_code_map:
|
|
350
|
+
hint += "(注意:最近访问空间列表为空,可能是 API 权限问题或用户无最近访问空间)"
|
|
351
|
+
logger.error("无法自动检测空间%s", hint)
|
|
352
|
+
raise ValueError(
|
|
353
|
+
f"无法自动检测空间,请通过 space_prefix 参数指定空间前缀{hint}"
|
|
354
|
+
)
|
|
327
355
|
|
|
328
356
|
return space_prefix, space_id_num, space_name, space_code_map
|
|
329
357
|
|
|
@@ -443,30 +471,41 @@ def build_output(
|
|
|
443
471
|
Returns:
|
|
444
472
|
完整的输出字典
|
|
445
473
|
"""
|
|
474
|
+
# 默认兜底卡片类型
|
|
475
|
+
_fallback_types = [
|
|
476
|
+
{"id": "5007", "name": "Story"},
|
|
477
|
+
{"id": "54444", "name": "Task"},
|
|
478
|
+
{"id": "5009", "name": "Bug"},
|
|
479
|
+
]
|
|
480
|
+
|
|
446
481
|
# 构建可用空间列表(包含每个空间的卡片类型)
|
|
447
482
|
available_spaces = []
|
|
448
483
|
for s in space_code_map.values():
|
|
449
484
|
prefix = s.get('prefixCode', '')
|
|
485
|
+
types = space_types_map.get(prefix.lower(), [])
|
|
450
486
|
available_spaces.append({
|
|
451
487
|
"id": s.get('id'),
|
|
452
488
|
"prefix": prefix,
|
|
453
489
|
"name": s.get('name', ''),
|
|
454
|
-
"types":
|
|
490
|
+
"types": types if types else _fallback_types
|
|
455
491
|
})
|
|
456
492
|
|
|
457
493
|
# 构建默认值
|
|
458
494
|
defaults = {
|
|
459
495
|
"title": "",
|
|
460
496
|
"type_id": "",
|
|
497
|
+
"type_name": "", # 由 Agent 根据 diff 语义推断,或使用下面的默认值
|
|
461
498
|
"space_id": space_id_num
|
|
462
499
|
}
|
|
463
|
-
#
|
|
500
|
+
# 优先使用 farseer 的绑定类型(更精准,仅含绑定了代码提交流程的类型)
|
|
501
|
+
# 兜底使用 space_types_map 的全量类型
|
|
464
502
|
current_space_types = space_types_map.get(space_prefix.lower(), []) if space_prefix else []
|
|
465
|
-
if
|
|
466
|
-
defaults["type_id"] = current_space_types[0]["id"]
|
|
467
|
-
elif available_types:
|
|
468
|
-
# 兜底使用 farseer 的 available_types
|
|
503
|
+
if available_types:
|
|
469
504
|
defaults["type_id"] = available_types[0]["id"]
|
|
505
|
+
defaults["type_name"] = available_types[0]["name"]
|
|
506
|
+
elif current_space_types:
|
|
507
|
+
defaults["type_id"] = current_space_types[0]["id"]
|
|
508
|
+
defaults["type_name"] = current_space_types[0]["name"]
|
|
470
509
|
|
|
471
510
|
output: Dict[str, Any] = {
|
|
472
511
|
"cards": cards,
|
|
@@ -586,7 +625,10 @@ def find_matching_card(
|
|
|
586
625
|
"space_name": "空间名称",
|
|
587
626
|
"final_iql": "...",
|
|
588
627
|
"available_types": [{"id": "5009", "name": "Bug"}, ...],
|
|
589
|
-
"available_spaces": [
|
|
628
|
+
"available_spaces": [
|
|
629
|
+
{"id": 12345, "prefix": "dkx", "name": "空间名称",
|
|
630
|
+
"types": [{"id": "5009", "name": "Bug"}]}, ...
|
|
631
|
+
],
|
|
590
632
|
"defaults": {
|
|
591
633
|
"title": "", # 由 Agent 根据 diff 生成
|
|
592
634
|
"type_id": "5009", # 默认卡片类型 ID
|
|
@@ -634,6 +676,20 @@ def find_matching_card(
|
|
|
634
676
|
|
|
635
677
|
# ---- 阶段 3:构建 IQL 并查询卡片 ----
|
|
636
678
|
type_filter, available_types = build_type_filter(space_id_num, include_type_filter)
|
|
679
|
+
|
|
680
|
+
# farseer 获取类型失败时(如 space_id_num 为 None),从 space_types_map 兜底
|
|
681
|
+
if not available_types and space_prefix:
|
|
682
|
+
available_types = space_types_map.get(space_prefix.lower(), [])
|
|
683
|
+
|
|
684
|
+
# 最终兜底:如果仍然为空,使用默认的三种常用卡片类型
|
|
685
|
+
if not available_types:
|
|
686
|
+
available_types = [
|
|
687
|
+
{"id": "5007", "name": "Story"},
|
|
688
|
+
{"id": "5009", "name": "Bug"},
|
|
689
|
+
{"id": "54444", "name": "Task"},
|
|
690
|
+
]
|
|
691
|
+
logger.warning("可绑定卡片类型为空,使用默认兜底类型: Story, Bug, Task")
|
|
692
|
+
|
|
637
693
|
result = build_iql_and_query(client, space_prefix, space_id_num, lookback_days, type_filter, max_records)
|
|
638
694
|
logger.info("IQL 查询完成, 获得 %d 张卡片, iql=%s", len(result["cards"]), result["final_iql"])
|
|
639
695
|
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""命令行工具:查询 iCafe 匹配卡片
|
|
2
|
+
|
|
3
|
+
用法:
|
|
4
|
+
python3 match_card_cli.py --username "dongkexin01"
|
|
5
|
+
|
|
6
|
+
输出:
|
|
7
|
+
JSON 格式的匹配结果,包含 cards、space_prefix、available_types 等字段。
|
|
8
|
+
失败时输出 {"error": "错误信息"} 或 {"disabled": true, "message": "..."}。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import argparse
|
|
12
|
+
import json
|
|
13
|
+
import os
|
|
14
|
+
import sys
|
|
15
|
+
|
|
16
|
+
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
17
|
+
|
|
18
|
+
from icafe.matching import find_matching_card
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def main():
|
|
22
|
+
"""解析命令行参数并查询匹配卡片。"""
|
|
23
|
+
parser = argparse.ArgumentParser(description="查询 iCafe 匹配卡片")
|
|
24
|
+
parser.add_argument("--username", default=None, help="用户名,如 dongkexin01")
|
|
25
|
+
args = parser.parse_args()
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
username = args.username or os.environ.get("COMATE_USERNAME")
|
|
29
|
+
result = find_matching_card(current_user=username)
|
|
30
|
+
print(json.dumps(result, ensure_ascii=False))
|
|
31
|
+
except Exception as e:
|
|
32
|
+
print(json.dumps({"error": f"查询匹配卡片异常: {type(e).__name__}: {e}"}))
|
|
33
|
+
sys.exit(1)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
if __name__ == "__main__":
|
|
37
|
+
main()
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cnap
|
|
3
|
+
description: Deploy, inspect and operate K8s-based applications on CNAP (Cloud-Native Application Platform).
|
|
4
|
+
license: Apache-2.0
|
|
5
|
+
metadata:
|
|
6
|
+
author: dongshuzhao@baidu.com
|
|
7
|
+
version: "0.3"
|
|
8
|
+
enableWhen:
|
|
9
|
+
- isInternal
|
|
10
|
+
---
|
|
11
|
+
# CNAP 操作技能
|
|
12
|
+
|
|
13
|
+
CNAP(Cloud-Native Application Platform)是百度内部的云原生应用平台,用于 K8s 应用的 CI/CD。本技能帮助用户通过 CNAP CLI 进行应用部署排查、日志查看、容器操作等值班相关工作。
|
|
14
|
+
|
|
15
|
+
**核心概念**:
|
|
16
|
+
|
|
17
|
+
- **账号 (Account)**:用户或团队的业务归属单元,与百度云内部资源账号绑定
|
|
18
|
+
- **环境 (Environment)**:按照环境功能进行的隔离,如 prod、sandbox、test、dev 等环境,又分为生产和测试两个级别
|
|
19
|
+
- **应用 (App)**:具体的业务应用名称,有些用户也把它称作“服务”、“模块”等
|
|
20
|
+
- **集群 (Cluster)**:对应实际的K8s集群在CNAP的名称,通常对应地域+AZ,有些用户也把它称作“机房”等
|
|
21
|
+
|
|
22
|
+
上述4个基本概念通过组合,实现K8s资源和应用的多维度管理。
|
|
23
|
+
|
|
24
|
+
- **K8s资源三元组**:namespace为CNAP管理集群资源的单元,每个 <账号, 环境, 集群> 三元组对应一个K8s集群的namespace;一个namespace可部署多个应用。
|
|
25
|
+
- **应用环境三元组**:在应用维度,所有应用以 <账号, 环境, 应用> 三元组定义;一个应用可以部署在若干K8s集群。
|
|
26
|
+
|
|
27
|
+
CNAP CLI 会自动管理系统kubeconfig,每个用户使用过的环境,会自动建立名为 'cnap:<账号名>-<环境名>:<集群名>' 的context。
|
|
28
|
+
|
|
29
|
+
## 触发场景
|
|
30
|
+
|
|
31
|
+
当用户有以下场景时,使用此技能:
|
|
32
|
+
|
|
33
|
+
- 应用部署失败、启动失败的排查
|
|
34
|
+
- 查看应用/Pod状态、容器日志
|
|
35
|
+
- 登录容器执行命令
|
|
36
|
+
- 批量在多个Pod上执行操作
|
|
37
|
+
- 文件传输(上传/下载)
|
|
38
|
+
- 环境切换、kubeconfig上下文管理
|
|
39
|
+
- 部署管理(查看、发起、控制部署)
|
|
40
|
+
|
|
41
|
+
**触发关键词**:CNAP, appspace, 一站式, 部署, 部署单, 上线, deploy, Pod, 容器日志, K8s, EKS, WebSSH
|
|
42
|
+
|
|
43
|
+
## 前置检查:安装与登录
|
|
44
|
+
|
|
45
|
+
### 检查 CNAP CLI 是否已安装
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
which cnap || echo "NOT_INSTALLED" && cnap version --no-logo
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**当前版本要求**:0.7.1及以上。
|
|
52
|
+
|
|
53
|
+
### 自动安装或升级
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
url="http://bj.bcebos.com/appspace/cnap-cli/install_cnap_cli.sh" && cnap update --latest --quiet || ((curl -s $url || wget $url -q -O -) | sh)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
更多安装方式参考 `references/install.md` 。
|
|
60
|
+
|
|
61
|
+
### 登录
|
|
62
|
+
|
|
63
|
+
使用以下命令获取登录状态:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
cnap login status
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
登录状态无需每次检查。若需要的操作未登录,命令会提示'login required'的错误信息,需要提示用户访问 [https://uuap.baidu.com/agent/token] 获取 UGate Token,并让用户粘贴给Agent,然后Agent执行以下命令:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
cnap login ugate --token <ugate-token>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 核心命令速查
|
|
76
|
+
|
|
77
|
+
**通用要求**:
|
|
78
|
+
1. 大部分命令都支持交互式(无参数)、非交互式(有参数)两种执行方式。请在命令中将参数列全,使用有参数方式one-shot提高效率,避免进入交互式执行等待输入造成阻塞。
|
|
79
|
+
2. 以下速查中,没列举出来的参数,不要自己随便编造参数,以免失败或遇到其他非预期结果,除非你用 `cnap help` 事先确认过。
|
|
80
|
+
|
|
81
|
+
### 资源查询
|
|
82
|
+
|
|
83
|
+
- `cnap query url <URL>` - 根据CNAP平台页面URL,查询页面类型和账号、应用、部署ID等参数
|
|
84
|
+
- `cnap query pod <pod_name|pod_ip>` - 根据名称或IP查询用户有权限的 Pod
|
|
85
|
+
- `cnap query app <name|id|repo>` - 根据应用名称(可模糊查询)、应用ID或代码库(iCode)地址,查询应用信息
|
|
86
|
+
|
|
87
|
+
提示:
|
|
88
|
+
- 当用户输入了一个外部资源(如URL、代码库名、应用名)等,可以用 `query` 系列命令检索内部信息(如账号、环境、应用等),然后再调用相关命令进行处理。
|
|
89
|
+
- CNAP平台URL通常以 `console.cloud.baidu-int.com/devops/appspace` 开头,也可能在 `appspace.baidu-int.com` 域名下
|
|
90
|
+
|
|
91
|
+
### 环境管理
|
|
92
|
+
|
|
93
|
+
- `cnap env show` - 查看当前环境上下文(账号/环境/集群)
|
|
94
|
+
- `cnap env switch -A <account> -E <env> -C <cluster>` - 切换环境 **(-A、-E、-C 参数应同时存在)**
|
|
95
|
+
- `cnap env sync [--all]` - 同步当前(或所有)环境上下文的 kubeconfig(通常无需手动执行,仅在远端kubeconfig发生变化时需要重新同步)
|
|
96
|
+
|
|
97
|
+
注意:以下的命令一般都要求在对应的环境上下文上执行,所以需要先 `env switch` 切换到对应环境,记得-A/-E/-C参数不要缺失
|
|
98
|
+
|
|
99
|
+
### 资源获取
|
|
100
|
+
|
|
101
|
+
- `cnap get account` - 获取可访问账号列表
|
|
102
|
+
- `cnap get env [-A <account>]` - 获取当前账号(或指定账号<account>的)环境列表
|
|
103
|
+
- `cnap get app [-C <cluster>]` - 获取当前账号、环境(及指定集群<cluster>)的应用列表
|
|
104
|
+
- `cnap get cluster [-a <app>]` - 获取当前账号、环境(及指定应用<app>)的集群列表
|
|
105
|
+
- `cnap get pod [-a <app>] [-C <cluster>] [--all]` - 获取当前账号、环境、集群(或指定集群<cluster>/所有集群--all、指定应用<app>)的Pod列表
|
|
106
|
+
|
|
107
|
+
提示:`get` 和 `query` 系列命令支持 `[-o json|yaml]` 参数,必要时使用 `-o json` 格式输出,能够获得更结构化、更全面的信息(但输出也会更长),也可以配合 `jq` 等工具进一步处理。
|
|
108
|
+
|
|
109
|
+
### 容器操作
|
|
110
|
+
|
|
111
|
+
- `cnap ssh [pod] [-c <container>] [-r]` - 登录容器(`-r`只读模式)
|
|
112
|
+
- `cnap exec [pod] -- <cmd> [-c <container>] [-r]` - 执行命令
|
|
113
|
+
- `cnap exec [pod] -- sh -c '<cmd>'` - 执行带 Shell 语法的命令
|
|
114
|
+
- `cnap batch --app <app> [-c <container>] [-C <cluster> | --all-cluster] [-p <num>] -y -- <cmd>` - 在指定应用<app>的Pod上批量执行命令(`-p`指定并发度)
|
|
115
|
+
|
|
116
|
+
### 文件传输
|
|
117
|
+
|
|
118
|
+
- `cnap cp <pod>:<remote> <local> [-c <container>]` - 下载文件
|
|
119
|
+
- `cnap cp <local> <pod>:<remote> [-c <container>]` - 上传文件
|
|
120
|
+
|
|
121
|
+
### 部署管理
|
|
122
|
+
|
|
123
|
+
- `cnap deploy list [--app <app> | --repo-path <repo>] [-o json|yaml]` - 根据应用名或代码库地址获取部署列表
|
|
124
|
+
- `cnap deploy create --repo-path <repo> --commit-id <id> [-a <app>] [-E <env>] [--branch <branch>] [--change-type NEW_COMMIT|GERRIT_CHANGE]` - 使用指定代码库和commit发起部署
|
|
125
|
+
- `cnap deploy get <deployment-id> [-o json|yaml]` - 获取部署详情
|
|
126
|
+
- `cnap deploy abort <deployment-id>` - 终止部署
|
|
127
|
+
- `cnap deploy pause <deployment-id>` - 暂停部署
|
|
128
|
+
- `cnap deploy resume <deployment-id>` - 恢复部署
|
|
129
|
+
- `cnap deploy confirm <deployment-id> <step-id>` - 确认人工步骤
|
|
130
|
+
- `cnap deploy skip-task <deployment-id> <task-id>` - 跳过任务
|
|
131
|
+
- `cnap deploy redo-stage <deployment-id> <stage-id>` - 重做阶段
|
|
132
|
+
- `cnap deploy redo-task <deployment-id> <task-id>` - 重做任务
|
|
133
|
+
|
|
134
|
+
### 帮助
|
|
135
|
+
|
|
136
|
+
- `cnap help <command> [<subcommand>]` - 获取命令详细帮助
|
|
137
|
+
|
|
138
|
+
## 生产环境注意事项
|
|
139
|
+
|
|
140
|
+
1. **读写分离**:某些生产环境有权限限制,此时普通用户 `cnap ssh` 只能以只读模式登录容器或者无法登录
|
|
141
|
+
2. **谨慎操作**:批量操作 `batch` 会影响多个 Pod,务必先用 `--dry` 参数确认执行计划
|
|
142
|
+
3. **风险命令**:除非用户强要求,原则上不允许 Agent 执行 `rm`、`kill` 等破坏性命令
|
|
143
|
+
|
|
144
|
+
## 其他信息
|
|
145
|
+
|
|
146
|
+
### 与 kubectl 配合使用
|
|
147
|
+
|
|
148
|
+
通过 `cnap env switch` 系列命令切换context,它会管理 ~/.kube/config ,之后可以与 `kubectl` 正常交互,详见 `references/kubectl.md` 。
|
|
149
|
+
|
|
150
|
+
### 值班表
|
|
151
|
+
|
|
152
|
+
包括CNAP平台及相关的EKS、iPipe、iRegistry、iCode等平台,详见 `references/oncall.md` 。
|
|
153
|
+
|
|
154
|
+
### 典型案例
|
|
155
|
+
|
|
156
|
+
- 部署单排障的流程,详见 `references/deploy-troubleshoot.md` 。
|
|
157
|
+
- 查看日志、排查问题、文件传输等,详见 `references/cases.md` 。
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# CNAP CLI 使用案例
|
|
2
|
+
|
|
3
|
+
本文件包含 CNAP CLI 的典型使用场景和示例命令。
|
|
4
|
+
|
|
5
|
+
## 场景零:快速了解资源和环境
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 查看可访问的账号列表
|
|
9
|
+
cnap get account
|
|
10
|
+
|
|
11
|
+
# 查看当前账号下的环境列表
|
|
12
|
+
cnap get env
|
|
13
|
+
|
|
14
|
+
# 查看指定账号下的环境列表
|
|
15
|
+
cnap get env -A inf
|
|
16
|
+
|
|
17
|
+
# 查看当前环境下的集群列表
|
|
18
|
+
cnap get cluster
|
|
19
|
+
|
|
20
|
+
# 以 JSON 格式输出(便于脚本处理)
|
|
21
|
+
cnap get app -o json
|
|
22
|
+
cnap get pod -a my-app -o yaml
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 场景一:应用部署失败排查
|
|
26
|
+
|
|
27
|
+
**排查步骤:**
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# 1. 确认当前上下文所在环境
|
|
31
|
+
cnap env show
|
|
32
|
+
|
|
33
|
+
# 2. 切换到目标环境(如需要)
|
|
34
|
+
cnap switch --env <env> --cluster <cluster>
|
|
35
|
+
|
|
36
|
+
# 3. 查看应用状态
|
|
37
|
+
cnap get app -w <app> -o wide
|
|
38
|
+
|
|
39
|
+
# 4. 查看 Pod 状态
|
|
40
|
+
cnap get pod -a <app> -o wide
|
|
41
|
+
|
|
42
|
+
# 5. (配合kubectl)查看 Pod 详情(定位 Pending/ImagePullBackOff 等问题)
|
|
43
|
+
kubectl describe pod <pod>
|
|
44
|
+
|
|
45
|
+
# 6. (配合kubectl)查看事件
|
|
46
|
+
kubectl get events --sort-by='.lastTimestamp' | head -20
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 场景二:查看容器日志
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# 方式一:exec 查看单Pod日志文件
|
|
53
|
+
cnap exec <pod> -- tail -100 /app/logs/error.log
|
|
54
|
+
cnap exec <pod> -- sh -c 'cat /app/logs/*.log | grep ERROR'
|
|
55
|
+
|
|
56
|
+
# 方式二:批量查看多Pod日志
|
|
57
|
+
cnap batch --app <app> -- sh -c 'tail -50 /app/logs/error.log'
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 场景三:检查配置和进程
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# 查看容器内配置
|
|
64
|
+
cnap exec <pod> -- cat /etc/config/app.yaml
|
|
65
|
+
cnap exec <pod> -- env | grep -i db
|
|
66
|
+
|
|
67
|
+
# 查看进程状态
|
|
68
|
+
cnap exec <pod> -- ps aux
|
|
69
|
+
|
|
70
|
+
# 检查网络连通性
|
|
71
|
+
cnap exec <pod> -- curl -v http://backend-service:8080/health
|
|
72
|
+
cnap exec <pod> -- nc -zv mysql-service 3306
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 场景四:批量排查问题
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# 检查所有 Pod 的配置文件
|
|
79
|
+
cnap batch --app <app> --all-cluster -- cat /app/config/app.yaml
|
|
80
|
+
|
|
81
|
+
# 批量查找错误日志
|
|
82
|
+
cnap batch --app <app> -- sh -c 'grep ERROR /app/logs/*.log | tail -20'
|
|
83
|
+
|
|
84
|
+
# 批量检查进程
|
|
85
|
+
cnap batch --app <app> -- ps aux | grep java
|
|
86
|
+
|
|
87
|
+
# 实时监控多 Pod 日志
|
|
88
|
+
cnap batch --app <app> -p 100 -o realtime --output-options colorful --confirm -- tail -f /app/logs/service.log
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## 场景五:文件传输
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# 下载日志到本地分析
|
|
95
|
+
cnap cp <pod>:/app/logs/service.log ./service.log
|
|
96
|
+
|
|
97
|
+
# 下载整个日志目录
|
|
98
|
+
cnap cp <pod>:/app/logs ./logs/
|
|
99
|
+
|
|
100
|
+
# 上传诊断工具
|
|
101
|
+
cnap cp ./debug-tool.sh <pod>:/tmp/
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 场景六:通过 URL 快速定位资源
|
|
105
|
+
|
|
106
|
+
当从他人分享的 CNAP 控制台 URL 或告警链接中定位问题时:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# 解析 CNAP 控制台 URL,获取账号、环境、应用信息
|
|
110
|
+
cnap query url "https://console.cloud.baidu-int.com/devops/appspace/account/860/application/list"
|
|
111
|
+
|
|
112
|
+
# 解析具体应用页面
|
|
113
|
+
cnap query url "https://console.cloud.baidu-int.com/devops/appspace/account/860/application/123456/runtime/workload"
|
|
114
|
+
|
|
115
|
+
# 根据 query url 的输出结果切换到对应环境
|
|
116
|
+
cnap switch --account <account> --env <env> --cluster <cluster>
|
|
117
|
+
|
|
118
|
+
# 继续排查
|
|
119
|
+
cnap get pod -a <app>
|
|
120
|
+
cnap ssh <pod>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## 场景七:跨环境/集群定位 Pod
|
|
124
|
+
|
|
125
|
+
当只知道 Pod 名称或 IP,但不确定其在哪个环境/集群时:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
# 根据 Pod 名称查询(跨所有账号环境)
|
|
129
|
+
cnap query pod my-app-5cf65f675f-w5bck
|
|
130
|
+
|
|
131
|
+
# 根据 Pod IP 查询
|
|
132
|
+
cnap query pod 10.0.0.1
|
|
133
|
+
|
|
134
|
+
# 输出包含账号、环境、集群、应用、Namespace 等完整信息
|
|
135
|
+
# 然后根据查询结果切换到对应环境继续操作
|
|
136
|
+
cnap switch --account <account> --env <env> --cluster <cluster>
|
|
137
|
+
cnap ssh <pod>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## 场景八:部署管理
|
|
141
|
+
|
|
142
|
+
### 查看部署列表
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
# 获取当前环境下的部署列表
|
|
146
|
+
cnap deploy list --app myapp
|
|
147
|
+
|
|
148
|
+
# 根据仓库路径查询
|
|
149
|
+
cnap deploy list --repo-path=baidu/repo/path
|
|
150
|
+
|
|
151
|
+
# JSON 格式输出
|
|
152
|
+
cnap deploy list --app myapp -o json
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 发起新部署
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# 使用 commit ID 部署
|
|
159
|
+
cnap deploy create --app myapp --repo-path=baidu/repo/path --commit-id=0123456789abcdefedcba9876543210
|
|
160
|
+
|
|
161
|
+
# 使用 Gerrit Change 部署
|
|
162
|
+
cnap deploy create --app myapp --repo-path=baidu/repo/path --change-type=GERRIT_CHANGE --commit-id=xxx
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 查看部署详情
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# 查看部署详情(包括阶段和任务)
|
|
169
|
+
cnap deploy get <deployment-id>
|
|
170
|
+
|
|
171
|
+
# JSON 格式输出
|
|
172
|
+
cnap deploy get <deployment-id> -o json
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### 控制部署
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# 终止正在进行的部署
|
|
179
|
+
cnap deploy abort <deployment-id>
|
|
180
|
+
|
|
181
|
+
# 暂停部署
|
|
182
|
+
cnap deploy pause <deployment-id>
|
|
183
|
+
|
|
184
|
+
# 恢复暂停的部署
|
|
185
|
+
cnap deploy resume <deployment-id>
|
|
186
|
+
|
|
187
|
+
# 确认人工确认步骤
|
|
188
|
+
cnap deploy confirm <deployment-id> <step-id>
|
|
189
|
+
|
|
190
|
+
# 跳过失败的任务
|
|
191
|
+
cnap deploy skip-task <deployment-id> <task-id>
|
|
192
|
+
|
|
193
|
+
# 重做阶段
|
|
194
|
+
cnap deploy redo-stage <deployment-id> <stage-id>
|
|
195
|
+
|
|
196
|
+
# 重做任务
|
|
197
|
+
cnap deploy redo-task <deployment-id> <task-id>
|
|
198
|
+
```
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# 使用 CNAP CLI 对部署单进行排障
|
|
2
|
+
|
|
3
|
+
**应用场景**:用户给了一个部署单地址URL(通常为 `console.cloud.baidu-int.com/devops/appspace` 路径下,并且路径中包含'deploy'字样),并提出了相关问题。
|
|
4
|
+
|
|
5
|
+
## 典型解决思路
|
|
6
|
+
|
|
7
|
+
1. 使用 `cnap query url` 命令,通过用户给定的URL,获取到其对应的账号、环境、应用、部署单ID。
|
|
8
|
+
2. 使用 `cnap deploy get <部署单ID> -o json` 命令,获取部署单详情。
|
|
9
|
+
3. 找到有问题的步骤对应的stage和task,根据信息中带'log'的字段,获取其log文件地址。
|
|
10
|
+
4. 访问log地址,获取log文件并阅读,确认可能的问题点,特别要确认有问题的集群名。
|
|
11
|
+
5. 使用 `cnap env switch -A <账号> -C <集群名> -E <环境>` 切换到对应的环境上下文。
|
|
12
|
+
6. 根据上面分析到的问题,可选通过 `cnap exec` 去容器中执行命令,或者借助 `kubectl` 命令,进一步排查确认问题原因。
|
|
13
|
+
7. 给用户简要地解释原因,并给出解决方案。
|
|
14
|
+
- 如果是偶发问题期望可通过重试解决的,向用户确认是否重试,得到肯定回答后可通过 `cnap depoly redo-stage <deployment-id> <stage-id>` 或 `cnap depoly redo-task <deployment-id> <task-id>` 进行重试。
|
|
15
|
+
- 如果是外部平台的问题,可以引导通过 `zhiban-search` Skill,查询对应平台的值班表,提示用户找相关人员,相关平台值班信息,详见 `references/oncall.md`。
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# CNAP CLI 安装与更新
|
|
2
|
+
|
|
3
|
+
## 安装 CNAP CLI
|
|
4
|
+
|
|
5
|
+
### 方式一:一行命令安装或更新
|
|
6
|
+
|
|
7
|
+
此命令会尝试更新 CNAP CLI,如果未安装,则默认安装至 `${HOME}/.cnap/bin/cnap`。
|
|
8
|
+
建议将 `${HOME}/.cnap/bin` 添加到 `PATH` 中以方便后续使用。
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
url="http://bj.bcebos.com/appspace/cnap-cli/install_cnap_cli.sh" && cnap update -q || ((curl -s $url || wget $url -q -O -) | sh)
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### 方式二:使用系统包管理器
|
|
15
|
+
|
|
16
|
+
前提:系统上已经安装了百度内部软件源(地址前缀为 `bj.bcebos.com/baidu-packages`),需要有 root 或 sudo。
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
# Ubuntu
|
|
20
|
+
apt-get install -y cnap
|
|
21
|
+
|
|
22
|
+
# Alpine
|
|
23
|
+
apk add cnap
|
|
24
|
+
|
|
25
|
+
# CentOS
|
|
26
|
+
yum install cnap -y
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 检查安装状态
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
which cnap || echo "NOT_INSTALLED" && cnap version --no-logo
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 更新 CNAP CLI
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
cnap update --latest --quiet
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 登录认证
|
|
42
|
+
|
|
43
|
+
登录认证详细说明请参考 [auth.md](./auth.md)。
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# CNAP CLI 与 kubectl 配合使用
|
|
2
|
+
|
|
3
|
+
## kubeconfig 位置
|
|
4
|
+
|
|
5
|
+
CNAP CLI 与 kubectl 完全兼容,kubeconfig 存储在 `~/.kube/config`。
|
|
6
|
+
|
|
7
|
+
## 使用流程
|
|
8
|
+
|
|
9
|
+
1. 使用 `cnap switch` 切换环境(更新 kubeconfig context)
|
|
10
|
+
2. 使用 `kubectl` 执行更多操作
|
|
11
|
+
|
|
12
|
+
## 概念对照
|
|
13
|
+
|
|
14
|
+
### 集群与 Namespace
|
|
15
|
+
|
|
16
|
+
每个环境可对应若干个 K8s 集群。在每个集群上,应用部署在名称为 `<account>-<environment>` 的 namespace 中。
|
|
17
|
+
|
|
18
|
+
### kubeconfig 上下文
|
|
19
|
+
|
|
20
|
+
集群+namespace 是对 K8s 集群操作的基本单元。在 kubeconfig 中对应 `cnap:<account>-<environment>:<cluster>` 的 context。
|
|
21
|
+
|
|
22
|
+
## 环境切换
|
|
23
|
+
|
|
24
|
+
在对每个应用的 K8s 资源进行操作前,需要使用 `cnap env` 系列命令切换环境。具体命令请参考 SKILL.md 中的核心命令速查部分。
|
|
25
|
+
|
|
26
|
+
## 常用组合
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# 1. 使用 cnap 切换环境
|
|
30
|
+
cnap switch --account appspace-test --env sandbox --cluster nb-bjdd
|
|
31
|
+
|
|
32
|
+
# 2. 然后用 kubectl 执行更多操作
|
|
33
|
+
kubectl get pods -o wide
|
|
34
|
+
kubectl logs <pod> --tail=100
|
|
35
|
+
kubectl describe pod <pod>
|
|
36
|
+
kubectl get events --sort-by='.lastTimestamp'
|
|
37
|
+
|
|
38
|
+
# 3. 查看特定 Pod 的详细状态
|
|
39
|
+
kubectl get pod <pod> -o yaml
|
|
40
|
+
|
|
41
|
+
# 4. 查看资源限制和配置
|
|
42
|
+
kubectl get pod <pod> -o jsonpath='{.spec.containers[*].resources}'
|
|
43
|
+
|
|
44
|
+
# 5. 查看节点信息
|
|
45
|
+
kubectl get nodes
|
|
46
|
+
|
|
47
|
+
# 6. 查看 namespace 下的所有资源
|
|
48
|
+
kubectl api-resources --namespaced=true
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 注意事项
|
|
52
|
+
|
|
53
|
+
- CNAP CLI 自动管理 kubeconfig 中的 context,无需手动配置
|
|
54
|
+
- 切换环境后,kubectl 会自动使用新的 context
|
|
55
|
+
- 使用 `cnap env show` 查看当前使用的 context
|