技术提取器MCP服务器
一个轻量级的MCP(模型上下文协议)服务器,从职位描述中提取所需的技术 以及恢复文件 并提供具有替代方案的难度评级。
特性
- 技术检测:自动检测文本或简历文件中提到的技术
- 简历文件支持:解析.txt、.docx、.pdf和.doc简历文件
- 难度评级:为每种技术提供难度分数(1-10分)
- 体验追踪:三级经验验证:
- experience_mentioned_in_prompt:工作要求中规定的年限 - experience_accounted_for_in_resume:从简历中提取的年份 - experience_validated_via_github:基于GitHub的验证(未来的占位符)
- 智能替代方案:建议具有难度等级的替代技术
- 简单架构:返回干净、结构化的JSON,没有开销
- 请求日志记录:自动记录每个请求的时间、CPU和内存指标
安装
# Clone the repository
git clone https://github.com/ajay1133/mcp-server-job-description-complexity-score.git
cd mcp-server-job-description-complexity-score
# Install dependencies (includes resume parsing libraries)
pip install -e .
# OR with uv:
uv pip install -e .恢复自动安装的解析依赖关系:
python-docx对于.docx文件PyPDF2pdf文件python-magic-bin用于Windows文件类型检测
用法
作为MCP服务器
python mcp_server/server.py自检
python mcp_server/server.py --self-test作为Python模块
from mcp_server.simple_tech_extractor import SimpleTechExtractor
extractor = SimpleTechExtractor()
result = extractor.extract_technologies("Senior Full-Stack Engineer with React and Node.js")
print(result)
# {
# "technologies": {
# "react": {
# "difficulty": 5.2,
# "experience_required": 2.5,
# "mentioned_in_prompt": true,
# "category": "frontend",
# "alternatives": {
# "vue": {"difficulty": 4.8, "experience_required": 2.0},
# "angular": {"difficulty": 6.5, "experience_required": 3.0}
# }
# },
# "node": {
# "difficulty": 5.0,
# "experience_required": 2.5,
# "mentioned_in_prompt": true,
# "category": "backend",
# "alternatives": {
# "python_fastapi": {"difficulty": 4.5, "experience_required": 2.0}
# }
# }
# }
# }响应架构
{
"technologies": {
"": {
"difficulty": 5.2, // 1-10 scale
"category": "frontend", // category
"mentioned_explicitly": true, // true if tech name appears in prompt/resume
"experience_estimate": "5 years", // Estimated from resume (priority) or prompt; can be years or a level like "senior"/"junior"
"alternatives": {
"": {
"difficulty": 4.8,
"experience_estimate": "5 years" // Propagated global estimate when present
}
},
"experience_mentioned_in_prompt": 5.0, // If explicit years for this tech in prompt (legacy compatibility)
"experience_accounted_for_in_resume": 3.0,// If explicit years for this tech in resume (legacy compatibility)
"experience_validated_via_github": null // Placeholder for future
}
}
}笔记:
experience_estimate更喜欢简历而不是提示。如果没有明确的年份,则使用“高级”、“中级”或“初级”等资历术语。- 备选方案在可用时获得全球估计值(总体年份或资历);技术特定年份不适用于替代品。
支持的技术
前端
- React、Vue、Angular、Next.js、Svelte、TypeScript
后端
- Node.js、FastAPI、Flask、Django、Golang、Java Spring、Ruby on Rails
数据库
- PostgreSQL、MySQL、MongoDB、Redis、DynamoDB、Cassandra
基础设施
- Docker、Kubernetes、AWS、Lambda
消息传递
- 卡夫卡,拉比MQ
搜索
- 弹性搜索
许可证
麻省理工学院 python active_learning_loop.py
4) (Optional) Analyze real GitHub repos for actual LOC/tech/hours
python analyze_github_repos.py
5. 合并所有来源并按文本进行重复数据消除
python merge_training_data.py --out data\merged_training_data.jsonl
6. 在合并的数据集上训练模型
python train_software_models.py --data data\merged_training_data.jsonl --out models\software
7. 验证并运行服务器
python test_new_schema.py python mcp_server\server.py --self-test python mcp_server\server.py # long-running MCP server
### 系统设计模式培训(推荐)
**新**:根据系统设计模式生成高质量的培训数据:
1. Generate training data from patterns (47 examples covering 10 major apps)
python generate_training_from_patterns.py --output data/training_from_patterns.jsonl
2. Merge with existing data
python merge_training_data.py --inputs data/training_from_patterns.jsonl data/software_training_data.jsonl --out data/merged_training_data.jsonl
3. Train models with enriched dataset
python train_software_models.py --data data/merged_training_data.jsonl --out models/software
4. Test the improved models
python run_requirements_cli.py --text "Build a Twitter clone with real-time feeds"
这种方法使用全面的系统设计知识库来生成现实的训练示例,用于:
- 推特、Instagram、YouTube、WhatsApp、优步、网飞、Airbnb、电子商务、Slack、TikTok模式
- 综合技术栈(每个示例15-22项技术)
- 生产就绪的微服务架构(10-15个服务)
- 准确的复杂性估计(平台为500-1200小时)
看 [AI_MODEL_TRAINIG_SUMMARY.md](AI_MODEL_TRAINING_SUMMARY.md) 了解完整细节。
### 当前状态
✅ **用系统设计知识训练的模型** -准备使用!
- **401训练示例** (基于模式+现有数据)
- **49个技术标签** (包括基础设施:kafka、redis、docker、cdn、监控等)
- **10种应用模式** 认可(推特、YouTube、优步等)
- **生产准备就绪** 体系结构建议
**测试系统**:
python test_software_scorer.py
MCP服务器(`server.py`)已配置为使用 `SoftwareComplexityScorer` 但在模型训练之前会失败。
### 可选:招聘vs构建分类器(二进制)
为了清晰地将职位描述的输出模式与构建要求分开,您可以训练一个小型二进制分类器:
数据集(JSONL):每行一个带字段的对象 `{ "text": str, "label": int }` 哪里 `label=1` 用于招聘/职位描述和 `label=0` 用于构建/实施。一个例子是 `data/hiring_build_training_data.example.jsonl`.
训练(PowerShell):
$env:HIRING_BUILD_DATA = "data/hiring_build_training_data.jsonl" python train_hiring_classifier.py
这写道 `models/software/hiring_build_classifier.joblib`当存在时, `SoftwareComplexityScorer` 将使用它来检测具有置信阈值的招聘提示(>=0.65→招聘,\ data\merged.jsonl
$env:HIRING_BUILD_DATA = "data\merged.jsonl"
python train_hiring_classifier.py3.调整决策阈值,以尽量减少误分类成本:
如果假阴性(招聘→ 构建)比误报(构建)更昂贵→ 招聘),调整门槛:
python tune_hiring_threshold.py --data data/hiring_build_training_data.jsonl --cost-fp 1.0 --cost-fn 2.0 --write-config这将找到最佳阈值并将其写入 config/hiring_threshold.json.更新 _predict_is_hiring 在记分员中使用新的阈值(默认招聘为0.65,构建为0.35)。
示例:如果调优建议招聘0.72,则更改:
if proba >= 0.72: # was 0.65
return True, proba, "model"迭代改进循环:
- 用~100个示例训练初始模型
- 评估并识别薄弱环节
- 使用主动学习来标记不确定的例子
- 用扩展的数据重新打印
- 调整生产成本函数的阈值
- 重复,直到达到精确/召回目标
______________________________________________________________________
传统多职业评分器(已弃用)
原版 ComplexityScorer 通过在线搜索启发式和职业分类处理软件和非软件工作。这种方法正在逐步被淘汰。
一种MCP(模型上下文协议)服务器,使用机器学习模型预测编程任务和作业要求的复杂性。分数以100为基准进行校准(大致为“Replit Agent 3”难度),并包括估计的完成时间。
功能(传统得分手)
- 基于机器学习的复杂性得分和完成时间预测
- 带有人性化难度标签的校准评分(基线100)
- 检测到的因素提示(前端、后端、数据库、实时等)
- 不确定性范围内的时间估计(小时/天/周)
- 持续时间提取:根据用户提示自动检测时间要求(例如,“几天”、“3周”)
- 智能时间计算:区分项目截止日期(8小时工作日)和持续护理(24/7)
- 职位分类:根据需求自动推断出工作类别和子类别
- 扩展职业数据库:当主要分类失败时,返回综合职业数据库(100多个职业)
- 支持MCP的助手的MCP工具集成
先决条件
- python:3.11或更高版本
- 点:Python包安装程序(通常随Python一起提供)
- 紫外线 (推荐):快速Python包安装程序和解析器
- 通过PowerShell安装: powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" - 或者通过pip: pip install uv
安装
- 克隆存储库 (如果尚未完成):
git clone https://github.com/ajay1133/mcp-server-job-description-complexity-score.git
cd mcp-server-job-description-complexity-score- 使用uv安装依赖项 (推荐):
uv pip install -e .或者使用pip:
pip install -e .用法
1) 训练模型(首次或更新数据后)
模型未提交;使用前必须在当地进行培训:
uv run train-model备选方案:
python train_model.py这将在下创建以下文件 models/:
tfidf_vectorizer.joblibscore_model.joblibtime_model.joblib
2) 运行MCP服务器
通过运行以下命令启动MCP服务器:
uv run mcp-server备选方案:
python -m mcp_server.server如果缺少模型,服务器将警告您运行 train_model.py 第一。
2b)使用MCP检查器检查服务器(推荐)
需要Node.js npx:
uv run mcp-inspect-server这将启动MCP检查器,并通过uv(stdio)生成服务器,确保它使用与uv管理的Python环境和依赖项相同的Python环境。试试 score_complexity 交互式工具。
3) 作为独立工具使用
您还可以在Python代码中导入和使用复杂性评分器:
from mcp_server.complexity_scorer import ComplexityScorer
scorer = ComplexityScorer()
result = scorer.analyze_text("Build a full-stack web application with React frontend and Django backend")
print(f"Complexity Score: {result['complexity_score']}")
print(f"Difficulty: {result['difficulty_rating']}")
print(f"Summary: {result['summary']}")4) 运行测试
运行测试套件:
python test_scoring.py5) 运行演示
查看正在运行的时间估计功能:
uv run demo这打印了几个从简单到专家级别的示例,并显示了预测的时间范围。
MCP工具: score_complexity
描述
分析编程要求或职位描述,并提供根据Replit Agent 3的能力校准的复杂性评分。
参数
requirement(string):编程要求或职位描述的文本描述
退货
包含以下内容的词典:
complexity_score:数值得分(基线参考=100)detected_factors:因素和相关性信号图(例如,匹配、相关性)task_size:简单|中等|复杂|非常复杂|专家difficulty_rating:人性化描述job_category:扣除工作类别(例如“软件开发人员”、“医生”、“管道工”)job_sub_category:推断出工作专业化(例如,“全栈开发人员(React+Node.js)”、“胃肠病学家”、“通用水管工”)category_lookup_method:如何确定类别-“primary_pattern”、“extended_database”、“online_search”或“default_fallback”estimated_completion_time:对象hours,days,weeks,best_estimate,time_range,assumptionssummary:简要总结,包括时间model_type:始终"machine_learning"对于此版本
示例请求
{
"requirement": "Create a RESTful API with PostgreSQL database, user authentication, and real-time notifications"
}示例响应
{
"complexity_score": 109.8,
"baseline_reference": 100,
"detected_factors": {
"database": {"matches": 1, "relevance": 0.22},
"api_integration": {"matches": 1, "relevance": 0.18},
"security": {"matches": 1, "relevance": 0.14}
},
"task_size": "complex",
"difficulty_rating": "Similar to Replit Agent 3 capabilities",
"job_category": "Software Developer",
"job_sub_category": "Backend Developer",
"category_lookup_method": "primary_pattern",
"estimated_completion_time": {
"hours": 9.1,
"days": 1.14,
"weeks": 0.23,
"best_estimate": "1.1 days",
"time_range": "1.1-1.4 days",
"assumptions": "Time estimate based on task complexity and typical completion times for similar requirements"
},
"summary": "Complexity score: 109.80. Complex task. Primary complexity factors: database, api integration, security. Estimated completion time: 1.1 days.",
"model_type": "machine_learning"
}复杂性因素
模型报告提示了以下因素类别(非详尽示例):
- 基础网站:HTML、CSS、静态网站
- 数据库:PostgreSQL、MySQL、MongoDB、ORM
- API集成:REST、GraphQL、webhooks、OAuth
- 前端:React、Vue、Angular、TypeScript
- 后端:Django、Flask、FastAPI、Node.js
- 实时:WebSockets、流媒体、协作功能
- AI/ML:ML管道、模型训练、OpenAI、NLP
- 部署:CI/CD、Docker、Kubernetes、云平台
- 安全:身份验证、加密、JWT、RBAC
- 测试:单元、集成、E2E、覆盖范围
- 可扩展性:缓存、队列、负载平衡、分布式系统
配置因子类别(无硬编码列表)
您可以自定义因子类别,而无需更改代码:
- 编辑
config/complexity_factors.json添加/删除类别或关键字 - 或设置
MCP_COMPLEXITY_FACTORS指向自定义JSON文件 - 或者在构建记分器时直接传递映射:
ComplexityScorer(complexity_factors=...)
如果找不到配置,则使用合理的内置默认值。
工作分类
评分员自动从需求文本中推断出工作类别和子类别。此功能适用于软件开发角色和一般职业。
支持的类别
软件开发:
- 全栈开发人员(React+Node.js、Vue.js、Angular、MERN Stack)
- 前端开发人员(React、Vue、Angular)
- 后端开发人员(Node.js、Django、Flask、FastAPI)
- 移动开发人员(React Native、Flutter、iOS、Android)
- AI/ML开发人员
- 数据科学家
- DevOps 工程师
医疗保健:
- 医生(胃肠病学家、心脏病学家、神经科医生、骨科医生、皮肤科医生、儿科医生、眼科医生、全科医生)
- 护士(注册护士、执业护士)
贸易与服务:
- 水管工(应急水管工、普通水管工)
- 电工
- 木匠
儿童和家庭护理:
- 儿童保育提供者(保姆、保姆、儿童保育专家)
- 管家
- 照顾者 (家庭健康助理、家政服务家庭健康助理)
专业服务:
- 律师(刑事辩护、公司、全科)
- 教师(数学、科学、语言艺术)
- 会计师(注册会计师、综合会计师)
- 司机(拼车、商业、个人)
延伸职业 (通过回退数据库支持100+):
- 医疗:兽医、牙医、治疗师、心理学家、药剂师、护理人员
- 创意:摄影师、摄像师、平面设计师、作家、音乐家、艺术家
- 烹饪:厨师、厨师、面包师、调酒师
- 行业:机械师、暖通空调技术员、焊工、石匠、屋顶工、油漆工
- 服务:理发师、理发师、按摩治疗师、私人教练
- 房地产:建筑师、工程师、测量师、承包商、房地产经纪人
- 业务:顾问、分析师、银行家、经纪人
- 保安:保安、消防员、警察
- 交通:飞行员、空乘、送货司机
- 农业:农民、园丁、园艺师、花店
- 还有更多。..
工作类别扣减示例
| 要求 | 职位类别 | 职位子类别 |
|---|---|---|
| “我需要一个可以用React Js和Node Js开发视频流应用程序的软件开发人员” | 软件开发人员 | 全栈开发人员(React+Node.Js) |
| “我的肝脏有问题” | 医生 | 胃肠病学家 |
| “我需要一个可以在我上班时照看我孩子的人” | 儿童保育提供者 | 儿童保育专家 |
| “寻找具有机器学习经验的数据科学家” | 数据科学家 | 机器学习专家 |
| “需要一个使用Flutter的iOS和Android移动应用程序开发人员” | 软件开发人员 | 移动开发人员(Flutter) |
| “我需要有人照顾我的爸爸,他因为糖尿病几乎不能走路,也不能做饭” | 看护人 | 家政家庭健康助理 |
类别查找方法
这 category_lookup_method 字段跟踪工作类别是如何确定的,提供透明度和可审计性。
查找方法
| 方法 | 描述 | 图标 | 示例 |
|---|---|---|---|
primary_pattern | 使用具有上下文感知子类别的常见职业的主要模式匹配进行检测 | 🎯 | 软件开发工程师→ “全栈开发人员(React+Node.js)” |
extended_database | 在包含多个领域100多个职业的扩展职业数据库中找到 | 📚 | 兽医、摄影师、厨师、机械师 |
online_search | 当主模式和扩展数据库不匹配时,通过在线关键字匹配回退检索 | 🌐 | 通过动作关键字检测到的不常见职业(维修、设计、安装等) |
default_fallback | 使用通用分类在任何数据库或联机搜索中都找不到匹配项 | ❓ | 非常不常见或模糊的要求 |
在线搜索功能
当主要模式和扩展数据库无法对职业进行分类时,系统会自动使用在线搜索逻辑:
触发器:
- 当没有主模式符合要求时
- 当
detected_factors为空(未找到技术关键字) - 在确定“普通专业人员”之前,用于默认回退情况
搜索策略:
- 主要搜索:尝试DuckDuckGo API即时答案查找(如果可用)
- 关键字回退:匹配文本中基于动作的关键字:
- 动作动词:修复、修复、安装、设计、构建、创建、组织、计划、管理、协调、帮助、服务 - 稀有职业:侍酒师、策展人、图书管理员、拍卖师、鉴定师、珠宝商、锁匠、装潢师、动物标本制作师、殡葬师、口译员、翻译、速记员、精算师、统计学家、气象学家、地质学家、天文学家、植物学家、动物学家、生态学家
示例:
- “我需要有人修理我的古董钟”→
Repair Technician(通过“修复”关键字)✅ 在线搜索 - “我的餐厅需要一个侍酒师”→
Sommelier(通过专业关键字)✅ 在线搜索 - “帮助我组织我的活动”→
Event Organizer(通过“组织”关键字)✅ 在线搜索 - “我需要设计一个标志”→
Designer(通过“设计”关键字)✅ 在线搜索
用法
这 category_lookup_method 字段可以帮助您:
- 跟踪分类性能:查看每个请求使用了哪种方法
- 找出差距:查找经常访问扩展数据库或回退的职业
- 审计准确性:验证分类逻辑是否按预期工作
- 提高覆盖率:在主要模式中添加经常要求的职业
示例
{
"job_category": "Veterinarian",
"job_sub_category": "Animal Healthcare Professional",
"category_lookup_method": "extended_database"
}这表示该职业是在扩展数据库(第2层)中找到的,而不是通过主模式匹配找到的。
持续时间提取
记分器自动检测用户提示中提到的持续时间要求,并相应地调整时间估计。
支持的持续时间模式
数字模式:
- “3小时”、“2天”、“4周”、“两个月”
基于单词的模式:
- “几天”=2天
- “几天”=3天
- “两周”=两周
- “周末”=2天
特殊情况:
- “过夜”=12小时
- “全天”/“全天”=8小时
- “半天”=4小时
项目截止日期与持续护理
该系统智能地区分:
- 项目截止日期 (8小时工作日):
- 当出现“需要完成”、“截止日期”、“完成时间”等短语时检测到 - 示例:“构建一个React应用程序,需要在3天内完成”=24个工作小时(3天×8小时)
- 持续护理 (24/7):
- 适用于护理人员、护士、儿童保育员、管家类别 - 示例:“需要有人照顾我爸爸几天”=48小时(2天×24小时)
持续时间提取示例
| 提示 | 检测到的持续时间 | 作业类别 | 时间估计 |
|---|---|---|---|
| “我需要有人照顾我的爸爸……我会离开几天” | “几天” | Caregiver | 2.0天(持续护理) |
| “构建一个React web应用程序,需要在3天内完成” | “3天” | 软件开发人员 | 3.0天 |
| “周末需要保姆” | “周末” | 儿童保育提供者 | 2.0天(持续护理) |
| “我母亲的康复需要一名护士,需要两周的帮助” | “两周” | 护士 | 2.0周(持续护理) |
评分解释
- \ 150:比Replit Agent 3的功能更具挑战性
时间估计
假设开发人员熟练使用像Replit这样的AI编码代理,则记分员根据复杂性得分提供完成时间估计。
估计逻辑
- 基线:复杂性得分为100的任务估计为8小时(1个工作日)
- 线性缩放:时间与复杂性得分成比例
- 任务大小调整:基于任务复杂性的非线性调整:
- 简单任务:0.6倍乘数(完成速度比线性快) - 中等任务:0.8倍乘数 - 复杂任务:1.0倍乘数(线性) - 非常复杂的任务:1.3倍乘数(额外的协调开销) - 专家任务:1.6倍乘数(显著的架构开销)
- 时间范围:提供一个范围(最佳估计为1.3倍)来解释不确定性
时间格式
估算会自动选择最合适的时间单位:
- 分钟:对于1小时以下的任务
- 小时:任务1-8小时
- 日子:任务1-5天(8小时工作日)
- 周:对于超过5天的任务(每周工作5天)
时间估算示例
| 复杂性得分 | 任务规模 | 估计时间 |
|---|---|---|
| 30 | 简单 | ~1.4小时 |
| 75 | 中等 | ~4.8小时 |
| 100 | 复杂 | ~8小时(1天) |
| 150 | 非常复杂 | ~2.4天 |
| 200 | 专家 | ~3.2天 |
项目结构
mcp_complexity_scorer/
├── mcp_server/
│ ├── __init__.py
│ ├── server.py # MCP server implementation
│ └── complexity_scorer.py # Core ML-based scoring logic
├── complexity_mcp_project/
│ ├── __init__.py
│ ├── settings.py # Django settings
│ ├── urls.py
│ ├── wsgi.py
│ └── asgi.py
├── models/ # Trained artifacts (created by training)
│ ├── tfidf_vectorizer.joblib
│ ├── score_model.joblib
│ └── time_model.joblib
├── train_model.py # Train TF-IDF + regressors
├── training_data.py # Labeled examples and validation ranges
├── demo_time_estimation.py # Demo runner printing examples
├── pyproject.toml # Project dependencies
├── test_scoring.py # Scripted tests (ranges)
└── README.md # This file发展
添加或细化训练数据
- 编辑
training_data.py并附加新的标记示例。 - 回缩模型:
uv run train-model- 重新运行演示/测试。
许可证
有关许可证信息,请参阅存储库。
贡献
欢迎投稿!请随时提交拉取请求。
仓库
______________________________________________________________________
Docker部署
该项目包括Docker支持MCP服务器和Flask API模式的容器化部署。
构建Docker镜像
# Build the image
docker build -t mcp-complexity-scorer:latest .
# Or build with a specific tag
docker build -t your-dockerhub-username/mcp-complexity-scorer:dev .使用Docker运行
MCP服务器模式(默认):
docker run -p 8000:8000 mcp-complexity-scorer:latest烧瓶API模式:
docker run -p 8000:8000 -e FLASK_MODE=1 mcp-complexity-scorer:latest使用自定义配置:
docker run -p 8000:8000 `
-e FLASK_MODE=1 `
-e HOST=0.0.0.0 `
-e PORT=8000 `
-v ${PWD}/logs:/app/logs `
mcp-complexity-scorer:latestDocker Compose
对于装载日志的本地开发:
docker-compose up这 docker-compose.yml 包括:
- 用于日志持久性的卷装载
- 配置的环境变量
- 端口映射到本地主机:8000
Flask API终点
在Flask模式下运行时(FLASK_MODE=1):
- 获取
/health-健康检查端点
curl http://localhost:8000/health- 发布
/score-分析复杂性
curl -X POST http://localhost:8000/score \
-H "Content-Type: application/json" \
-d '{"requirement": "Build a React dashboard with Stripe payments"}'______________________________________________________________________
CI/CD管道
该项目使用GitHub Actions在多个环境中进行持续集成和部署。
管道概述
触发器:
- 推至:
master,development,qa,uat分支 - 将请求拉到这些分支中的任何一个
职位:
- 测试 -在Python 3.10、3.11、3.12上运行
- 棉绒 -代码质量检查(flake8、黑色、isort)
- 码头工人 -构建和推送图像(仅推送)
- 部署 -特定于环境的部署(占位符)
分支→ 环境贴图
| 分支 | 环境 | Docker标签 | 描述 |
|---|---|---|---|
master | 生产 | prod-{sha}, prod-latest | 稳定的生产发布 |
development | 发展 | dev-{sha}, dev-latest | 积极发展 |
qa | QA | qa-{sha}, qa-latest | 质量保证测试 |
uat | UAT | uat-{sha}, uat-latest | 用户验收测试 |
设置CI/CD
1.配置Docker Hub密钥
将这些秘密添加到您的GitHub存储库(设置→ 秘密和变量→ 行动):
DOCKER_USERNAME:您的Docker Hub用户名DOCKER_PASSWORD:Docker Hub访问令牌(推荐)或密码
要创建Docker Hub访问令牌,请执行以下操作:
- 登录到https://hub.docker.com
- 转到帐户设置→ 安全→ 访问令牌
- 点击“新建访问令牌”
- 设置权限:读取、写入、删除
- 复制令牌并添加为
DOCKER_PASSWORD秘密
2.工作流程步骤
管道自动:
- ✅ 在Python 3.10、3.11、3.12上运行测试
- ✅ 使用flake8、黑色、isort检查代码样式
- ✅ 使用特定于环境的标签构建Docker镜像
- ✅ 成功构建后推送到Docker Hub
- ℹ️ 通知部署(根据您的基础架构进行定制)
3.本地运行
在推送之前,在本地测试CI步骤:
# Install dev dependencies
pip install pytest pytest-cov flake8 black isort
# Run tests
pytest tests/ -v --cov=mcp_server
# Check linting
flake8 mcp_server/
black --check mcp_server/
isort --check-only mcp_server/
# Build Docker
docker build -t mcp-complexity-scorer:test .部署
推送Docker镜像后,自定义 deploy 工作在 .github/workflows/ci-cd.yml 致:
- 部署到Kubernetes集群
- 更新ECS任务定义
- 触发Azure容器实例
- 或者您首选的容器编排平台
Kubernetes部署示例:
- name: Deploy to Kubernetes
run: |
kubectl set image deployment/complexity-scorer \
app=${{ secrets.DOCKER_USERNAME }}/mcp-complexity-scorer:${{ env.IMAGE_TAG }} \
--namespace=${{ env.ENV_NAME }}监控CI/CD
- 查看工作流运行:存储库→ 操作选项卡
- 检查构建日志:单击任何工作流运行
- Docker镜像:https://hub.docker.com/r/YOUR_USERNAME/mcp-complexity-scorer
______________________________________________________________________
