优化get-app,优先使用SSH,git全局用户名和密钥Token,支持私有库安装和公共库安装
This commit is contained in:
parent
3919eb31df
commit
4940177a5b
10
bench/app.py
10
bench/app.py
@ -35,6 +35,10 @@ from bench.utils import (
|
|||||||
log,
|
log,
|
||||||
run_jingrow_cmd,
|
run_jingrow_cmd,
|
||||||
get_file_md5,
|
get_file_md5,
|
||||||
|
GIT_SSH_USER,
|
||||||
|
GIT_SSH_HOST,
|
||||||
|
GIT_SSH_PORT,
|
||||||
|
GIT_DOMAIN,
|
||||||
)
|
)
|
||||||
from bench.utils.bench import build_assets, install_python_dev_dependencies
|
from bench.utils.bench import build_assets, install_python_dev_dependencies
|
||||||
from bench.utils.render import step
|
from bench.utils.render import step
|
||||||
@ -64,10 +68,10 @@ class AppMeta:
|
|||||||
dependencies = [{"jingrow/jerp": "~13.17.0"}]
|
dependencies = [{"jingrow/jerp": "~13.17.0"}]
|
||||||
"""
|
"""
|
||||||
self.name = name.rstrip("/")
|
self.name = name.rstrip("/")
|
||||||
self.remote_server = "git.jingrow.com"
|
self.remote_server = GIT_DOMAIN
|
||||||
self.to_clone = to_clone
|
self.to_clone = to_clone
|
||||||
self.on_disk = False
|
self.on_disk = False
|
||||||
self.use_ssh = False
|
self.use_ssh = True
|
||||||
self.from_apps = False
|
self.from_apps = False
|
||||||
self.is_url = False
|
self.is_url = False
|
||||||
self.branch = branch
|
self.branch = branch
|
||||||
@ -160,7 +164,7 @@ class AppMeta:
|
|||||||
return f"http://{self.remote_server}/{self.org}/{self.repo}.git"
|
return f"http://{self.remote_server}/{self.org}/{self.repo}.git"
|
||||||
|
|
||||||
def get_ssh_url(self):
|
def get_ssh_url(self):
|
||||||
return f"git@{self.remote_server}:{self.org}/{self.repo}.git"
|
return f"ssh://{GIT_SSH_USER}@{GIT_SSH_HOST}:{GIT_SSH_PORT}/{self.org}/{self.repo}.git"
|
||||||
|
|
||||||
|
|
||||||
@lru_cache(maxsize=None)
|
@lru_cache(maxsize=None)
|
||||||
|
|||||||
@ -6,6 +6,8 @@ import re
|
|||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import hashlib
|
import hashlib
|
||||||
|
import time
|
||||||
|
import requests
|
||||||
from functools import lru_cache
|
from functools import lru_cache
|
||||||
from glob import glob
|
from glob import glob
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@ -29,6 +31,12 @@ from typing import TYPE_CHECKING
|
|||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
# Git 服务器配置
|
||||||
|
GIT_DOMAIN = 'git.jingrow.com'
|
||||||
|
GIT_SSH_USER = 'gitea'
|
||||||
|
GIT_SSH_HOST = 'git01.jingrow.com'
|
||||||
|
GIT_SSH_PORT = 198
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(PROJECT_NAME)
|
logger = logging.getLogger(PROJECT_NAME)
|
||||||
paths_in_app = ("hooks.py", "modules.txt", "patches.txt")
|
paths_in_app = ("hooks.py", "modules.txt", "patches.txt")
|
||||||
@ -430,29 +438,113 @@ def get_env_jingrow_commands(bench_path=".") -> List:
|
|||||||
|
|
||||||
|
|
||||||
def find_org(org_repo, using_cached: bool = False):
|
def find_org(org_repo, using_cached: bool = False):
|
||||||
import requests
|
|
||||||
|
|
||||||
org_repo = org_repo[0]
|
org_repo = org_repo[0]
|
||||||
|
|
||||||
|
# 1. 检测 SSH 配置
|
||||||
|
ssh_available = _check_ssh_availability()
|
||||||
|
print(f"SSH detection result: {ssh_available}")
|
||||||
|
|
||||||
|
# 2. SSH 优先尝试
|
||||||
|
if ssh_available:
|
||||||
|
print("Trying SSH method...")
|
||||||
|
for org in ["jingrow", "jerp"]:
|
||||||
|
if _try_ssh_access(org, org_repo):
|
||||||
|
print(f"SSH successfully found: {org}/{org_repo}")
|
||||||
|
return org, org_repo
|
||||||
|
|
||||||
|
# 3. HTTP 回退
|
||||||
|
print("Falling back to HTTP method...")
|
||||||
|
username, password = _get_http_credentials()
|
||||||
for org in ["jingrow", "jerp"]:
|
for org in ["jingrow", "jerp"]:
|
||||||
url = f"http://git.jingrow.com/api/v1/repos/{org}/{org_repo}"
|
if _try_http_access(org, org_repo, username, password):
|
||||||
res = requests.get(url)
|
print(f"HTTP successfully found: {org}/{org_repo}")
|
||||||
|
|
||||||
if res.status_code in (400, 403):
|
|
||||||
url2 = f"http://git.jingrow.com/{org}/{org_repo}"
|
|
||||||
res = requests.get(url2)
|
|
||||||
|
|
||||||
if res.ok:
|
|
||||||
return org, org_repo
|
return org, org_repo
|
||||||
|
|
||||||
|
# 4. 失败处理
|
||||||
if using_cached:
|
if using_cached:
|
||||||
return "", org_repo
|
return "", org_repo
|
||||||
|
|
||||||
raise InvalidRemoteException(
|
raise InvalidRemoteException(
|
||||||
f"{org_repo} not found under jingrow or jerp Git accounts"
|
f"{org_repo} not found under jingrow or jerp Git accounts"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _check_ssh_availability():
|
||||||
|
"""检测 SSH 是否可用"""
|
||||||
|
try:
|
||||||
|
# 直接测试 SSH 连接(使用配置的端口)
|
||||||
|
ssh_cmd = ['ssh', '-p', str(GIT_SSH_PORT), '-T', f'{GIT_SSH_USER}@{GIT_SSH_HOST}']
|
||||||
|
print(f"SSH connection test command: {' '.join(ssh_cmd)}")
|
||||||
|
|
||||||
|
result = subprocess.run(
|
||||||
|
ssh_cmd,
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
timeout=10
|
||||||
|
)
|
||||||
|
print(f"SSH connection test: returncode={result.returncode}, stdout='{result.stdout}', stderr='{result.stderr}'")
|
||||||
|
|
||||||
|
# SSH 成功或认证失败都说明 SSH 可用(returncode 0 或 1)
|
||||||
|
ssh_available = result.returncode in [0, 1]
|
||||||
|
print(f"SSH availability: {ssh_available}")
|
||||||
|
return ssh_available
|
||||||
|
except Exception as e:
|
||||||
|
print(f"SSH detection exception: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def _try_ssh_access(org, repo):
|
||||||
|
"""尝试 SSH 访问"""
|
||||||
|
try:
|
||||||
|
ssh_url = f"ssh://{GIT_SSH_USER}@{GIT_SSH_HOST}:{GIT_SSH_PORT}/{org}/{repo}.git"
|
||||||
|
result = subprocess.run(
|
||||||
|
['git', 'ls-remote', ssh_url],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
timeout=15
|
||||||
|
)
|
||||||
|
return result.returncode == 0
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def _get_http_credentials():
|
||||||
|
"""获取 HTTP 凭据"""
|
||||||
|
username = os.getenv('GIT_USERNAME')
|
||||||
|
password = os.getenv('GIT_PASSWORD')
|
||||||
|
|
||||||
|
if not username or not password:
|
||||||
|
try:
|
||||||
|
git_config = subprocess.check_output(
|
||||||
|
['git', 'config', '--get', f'url.http://{GIT_DOMAIN}/.insteadOf'],
|
||||||
|
stderr=subprocess.DEVNULL
|
||||||
|
).decode('utf-8').strip()
|
||||||
|
|
||||||
|
if '@' in git_config:
|
||||||
|
auth_part = git_config.split('@')[0].split('//')[-1]
|
||||||
|
if ':' in auth_part:
|
||||||
|
username, password = auth_part.split(':', 1)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return username, password
|
||||||
|
|
||||||
|
|
||||||
|
def _try_http_access(org, repo, username, password):
|
||||||
|
"""尝试 HTTP 访问"""
|
||||||
|
try:
|
||||||
|
url = f"http://{GIT_DOMAIN}/api/v1/repos/{org}/{repo}"
|
||||||
|
res = requests.get(url, auth=(username, password) if username and password else None, timeout=10)
|
||||||
|
|
||||||
|
if res.status_code in (400, 403):
|
||||||
|
url2 = f"http://{GIT_DOMAIN}/{org}/{repo}"
|
||||||
|
res = requests.get(url2, auth=(username, password) if username and password else None, timeout=10)
|
||||||
|
|
||||||
|
return res.ok
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def fetch_details_from_tag(
|
def fetch_details_from_tag(
|
||||||
_tag: str, using_cached: bool = False
|
_tag: str, using_cached: bool = False
|
||||||
) -> Tuple[str, str, str]:
|
) -> Tuple[str, str, str]:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user