diff --git a/pipeline_service/deploy_capability.py b/pipeline_service/deploy_capability.py index 5f34c09..d526743 100644 --- a/pipeline_service/deploy_capability.py +++ b/pipeline_service/deploy_capability.py @@ -102,7 +102,6 @@ async def configure_env(project_id, env_type, host, user, deploy_path, return False, "缺少 deploy_path" db, dbname = _get_db() async with db.sqlorContext(dbname) as sor: - eid = getID() try: port = int(port) except (TypeError, ValueError): @@ -111,15 +110,17 @@ async def configure_env(project_id, env_type, host, user, deploy_path, db_port = int(db_port) except (TypeError, ValueError): db_port = 3306 - await sor.C(TABLE, { - 'id': eid, + # sudo_enabled 归一化:字段 VARCHAR(1),'false'/'0'/'no'/'n' → 'N','true'/'1'/'yes'/'y' → 'Y' + _se = str(sudo_enabled).strip().lower() if sudo_enabled else '' + se_val = 'Y' if _se in ('1', 'true', 'yes', 'y', '是') else 'N' + data = { 'project_id': project_id, 'env_type': env_type.strip(), 'host': host.strip(), 'port': port, 'user': user.strip(), 'ssh_key_path': ssh_key_path or '', - 'sudo_enabled': sudo_enabled or '', + 'sudo_enabled': se_val, 'deploy_path': deploy_path.strip(), 'python_path': python_path or '', 'db_host': db_host or '', @@ -128,11 +129,24 @@ async def configure_env(project_id, env_type, host, user, deploy_path, 'db_user': db_user or '', 'db_password': db_password or '', 'status': S_CONFIGURED, - }) + } + # upsert:按 (project_id, env_type) 查已存在(UNIQUE 约束),存在则 UPDATE,否则 INSERT + existing = await sor.sqlExe( + "SELECT id FROM sd_deploy_envs WHERE project_id=${pid}$ AND env_type=${et}$", + {"pid": project_id, "et": env_type.strip()}) + await sor.sqlExe("COMMIT", {}) + if existing: + eid = existing[0].id + data['id'] = eid + await sor.U(TABLE, data) + else: + eid = getID() + data['id'] = eid + await sor.C(TABLE, data) await record_audit(project_id, TABLE, eid, 'configure', to_state=S_CONFIGURED, who=_normalize_role(who), agent_id=agent_id, sor=sor) - logger.info("configure_env: %s project=%s type=%s", eid, project_id, env_type.strip()) + logger.info("configure_env: %s project=%s type=%s (upsert)", eid, project_id, env_type.strip()) return True, eid