Skip to content

Commit 92474af

Browse files
committed
fix: openEuler迁移到gitCode,lfs服务做迁移
openEuler迁移到gitCode,lfs服务做迁移
1 parent da19302 commit 92474af

8 files changed

Lines changed: 148 additions & 33 deletions

File tree

auth/gitee.go

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ var (
2222
clientId string
2323
clientSecret string
2424
defaultToken string
25+
defaultGiteCodeToken string
26+
gitCodeSwitch bool
2527
openEulerAccountParam batch.OpenEulerAccountParam
2628
)
2729

2830
var (
29-
allowedRepos = []string{"openeuler", "src-openeuler", "lfs-org"}
31+
allowedRepos = []string{"openeuler", "src-openeuler", "lfs-org", "openeuler-test"}
3032
uploadPermissions = []string{"admin", "developer"}
3133
downloadPermissions = []string{"admin", "developer", "read"}
3234
)
@@ -101,7 +103,15 @@ func Init(cfg *config.Config) error {
101103
return errors.New("default token required")
102104
}
103105
}
106+
defaultGiteCodeToken = cfg.DefaultGitCodeToken
107+
if defaultGiteCodeToken == "" {
108+
defaultGiteCodeToken = os.Getenv("GITE_CODE_TOKEN")
109+
if defaultGiteCodeToken == "" {
110+
return errors.New("defaultGiteCode token required")
111+
}
112+
}
104113

114+
gitCodeSwitch = cfg.GitCodeSwitch
105115
return nil
106116
}
107117

@@ -133,7 +143,10 @@ func InitOpenEulerParam(cfg *config.Config) error {
133143

134144
func GiteeAuth() func(UserInRepo) error {
135145
return func(userInRepo UserInRepo) error {
136-
if userInRepo.Password != "" {
146+
if gitCodeSwitch {
147+
userInRepo.Token = userInRepo.Password
148+
}
149+
if userInRepo.Password != "" && !gitCodeSwitch {
137150
token, err := getToken(userInRepo.Username, userInRepo.Password)
138151
if err != nil {
139152
userInRepo.Token = userInRepo.Password
@@ -166,10 +179,27 @@ func CheckRepoOwner(userInRepo UserInRepo) (Repo, error) {
166179
headers := http.Header{contentType: []string{"application/json;charset=UTF-8"}}
167180
repo := new(Repo)
168181
err := getParsedResponse("GET", path, headers, nil, &repo)
169-
if err != nil {
182+
gitCodePath := fmt.Sprintf(
183+
"https://api.gitcode.com/api/v5/repos/%s/%s%s",
184+
userInRepo.Owner,
185+
userInRepo.Repo,
186+
appendPathAccessToken,
187+
)
188+
if userInRepo.Token != "" {
189+
gitCodePath += userInRepo.Token
190+
} else {
191+
gitCodePath += defaultGiteCodeToken
192+
}
193+
headersGitCode := http.Header{contentType: []string{"application/json;charset=UTF-8"}}
194+
gitCodeRepo := new(Repo)
195+
gitCodeErr := getParsedResponse("GET", gitCodePath, headersGitCode, nil, &gitCodeRepo)
196+
if err != nil && gitCodeErr != nil {
170197
msg := err.Error() + ": check repo_id failed"
171198
return *repo, errors.New(msg)
172199
}
200+
if gitCodeErr == nil {
201+
repo = gitCodeRepo
202+
}
173203
for _, allowedRepo := range allowedRepos {
174204
if strings.Split(repo.Fullname, "/")[0] == allowedRepo {
175205
return *repo, nil
@@ -224,12 +254,29 @@ func VerifyUser(userInRepo UserInRepo) error {
224254
} else {
225255
path += defaultToken
226256
}
257+
if gitCodeSwitch {
258+
path = fmt.Sprintf(
259+
"https://api.gitcode.com/api/v5/repos/%s/%s/collaborators/%s/permission%s",
260+
userInRepo.Owner,
261+
userInRepo.Repo,
262+
userInRepo.Username,
263+
appendPathAccessToken,
264+
)
265+
if userInRepo.Token != "" {
266+
path += userInRepo.Token
267+
} else {
268+
path += defaultGiteCodeToken
269+
}
270+
}
227271
headers := http.Header{contentType: []string{"application/json;charset=UTF-8"}}
228272
giteeUser := new(giteeUser)
229273
err := getParsedResponse("GET", path, headers, nil, &giteeUser)
230274
if err != nil {
231275
if userInRepo.Operation == "delete" {
232276
msg := err.Error() + ": 删除权限校验失败,用户使用的gitee token错误或已经过期,请重新使用gitee登录"
277+
if gitCodeSwitch {
278+
msg = err.Error() + ": 删除权限校验失败,用户使用的gitCode token错误或已经过期,请重新使用gitCode登录"
279+
}
233280
return errors.New(msg)
234281
} else {
235282
msg := err.Error() + ": verify user permission failed"
@@ -407,6 +454,12 @@ func GetLFSMapping(userInRepo UserInRepo, pythonScriptPath ...string) (map[strin
407454
repo := userInRepo.Repo
408455
username := userInRepo.Username
409456
token := userInRepo.Token
457+
platform := "gitee"
458+
if gitCodeSwitch {
459+
platform = "gitcode"
460+
} else {
461+
platform = "gitee"
462+
}
410463

411464
// 确定Python脚本路径
412465
scriptPath, err := resolveScriptPath(pythonScriptPath...)
@@ -424,6 +477,7 @@ func GetLFSMapping(userInRepo UserInRepo, pythonScriptPath ...string) (map[strin
424477
// 构建并执行命令
425478
cmd := exec.Command("python3")
426479
cmd.Args = append(cmd.Args, scriptPath)
480+
cmd.Args = append(cmd.Args, platform)
427481
cmd.Args = append(cmd.Args, owner)
428482
cmd.Args = append(cmd.Args, repo)
429483
cmd.Args = append(cmd.Args, outputFile)

config/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ type Config struct {
1616
CdnDomain string `json:"CDN_DOMAIN"`
1717
ObsRegion string `json:"OBS_REGION"`
1818
DefaultToken string `json:"DEFAULT_TOKEN"`
19+
DefaultGitCodeToken string `json:"DEFAULT_GIT_CODE_TOKEN"`
1920
ValidateConfig ValidateConfig `json:"VALIDATE_REGEXP"`
2021
ObsAccessKeyId string `json:"OBS_ACCESS_KEY_ID"`
2122
ObsSecretAccessKey string `json:"OBS_SECRET_ACCESS_KEY"`
2223
OpenEulerAccountConfig OpenEulerAccountConfig `json:"OPENEULER_ACCOUNT_PARAM"`
2324
DBConfig DBConfig `json:"DATABASE"`
25+
GitCodeSwitch bool `json:"GIT_CODE_SWITCH" default:"false"`
2426
}
2527

2628
type ValidateConfig struct {

docs/BasicGuide.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ git config --local lfs.url https://artifacts.openeuler.openatom.cn/{owner}/{repo
6565
> - 当存在.lfsconfig文件时,使用命令行进行LFS远程地址设置的优先级将高于.lfsconfig文件。
6666
> - 在fork一个已经使用第三方LFS服务服务作为LFS远程服务的仓库后,需要需手动使用上述命令设置仓库中LFS远程地址,否则可能会出现权限校验问题,**错误代码401**
6767
> - url中{owner}/{repo}替换为实际的仓库路径,注意仓库路径的大小写。
68+
> - Artlfs服务在迁移到AtomGit平台后,需要使用账号-token的方式进行身份验证。
6869
6970
- 选择要用LFS追踪的文件
7071

docs/QuickStart.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ $ git config --local lfs.url https://artifacts.openeuler.openatom.cn/{owner}/{re
2222
```
2323

2424
> 当存在.lfsconfig文件时,使用命令行进行LFS远程地址设置的优先级将高于.lfsconfig文件。
25-
> url中{owner}/{repo}替换为实际的仓库路径,如:openeuler/lfs。由于Gitee默认会将仓库路径中的大写转化为小写,请确认仓库路径的大小写。
25+
> url中{owner}/{repo}替换为实际的仓库路径,如:openeuler/lfs。由于Gitee默认会将仓库路径中的大写转化为小写,请确认仓库路径的大小写。
26+
> Artlfs服务在迁移到AtomGit平台后,需要使用账号-token的方式进行身份验证。
2627
2728
## 第三方LFS服务与Gitee的使用差异
2829

main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func gatherOptions(fs *flag.FlagSet, args ...string) (options, error) {
6161
}
6262

6363
func initConfig(cfg *config.Config) {
64-
if err := server.Init(cfg.ValidateConfig); err != nil {
64+
if err := server.Init(cfg); err != nil {
6565
logrus.Errorf("load ValidateConfig, err:%s", err.Error())
6666
return
6767
}

scripts/lfsNameQuery.py

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,39 @@
55
import shutil
66
from urllib.parse import quote_plus
77

8+
# 平台配置映射
9+
PLATFORM_CONFIGS = {
10+
"gitee": {
11+
"domain": "gitee.com",
12+
"auth_method": "token" # 或 "username_password"
13+
},
14+
"gitcode": {
15+
"domain": "gitcode.com",
16+
"auth_method": "token" # GitCode必须使用Token认证[6](@ref)
17+
}
18+
}
19+
20+
def clone_repo_skip_lfs(platform, owner, repo, username=None, token=None, target_dir="temp_repo"):
21+
"""克隆仓库并强制跳过LFS文件下载,支持多平台"""
22+
if platform not in PLATFORM_CONFIGS:
23+
raise ValueError(f"不支持的平台: {platform},支持的平台: {list(PLATFORM_CONFIGS.keys())}")
24+
25+
config = PLATFORM_CONFIGS[platform]
26+
domain = config["domain"]
827

9-
def clone_repo_skip_lfs(gitee_owner, gitee_repo, username=None, token=None, target_dir="temp_repo"):
10-
"""克隆仓库并强制跳过LFS文件下载"""
28+
# 构建认证URL
1129
if username and token:
1230
encoded_username = quote_plus(username)
1331
encoded_token = quote_plus(token)
14-
repo_url = f"https://{encoded_username}:{encoded_token}@gitee.com/{gitee_owner}/{gitee_repo}.git"
32+
repo_url = f"https://{encoded_username}:{encoded_token}@{domain}/{owner}/{repo}.git"
33+
elif token and config["auth_method"] == "token":
34+
# GitCode推荐方式:使用用户名+Token[6](@ref)
35+
encoded_token = quote_plus(token)
36+
# 假设username作为GitCode用户名
37+
username = username or "gitcode_user"
38+
repo_url = f"https://{username}:{encoded_token}@{domain}/{owner}/{repo}.git"
1539
else:
16-
repo_url = f"https://gitee.com/{gitee_owner}/{gitee_repo}.git"
40+
repo_url = f"https://{domain}/{owner}/{repo}.git"
1741

1842
force_remove(target_dir)
1943

@@ -24,6 +48,8 @@ def clone_repo_skip_lfs(gitee_owner, gitee_repo, username=None, token=None, targ
2448
"GIT_CLONE_PROTECTION_ACTIVE": "false"
2549
})
2650

51+
print(f"正在克隆 {platform} 仓库: {repo_url.replace(encoded_token, '***') if token else repo_url}")
52+
2753
subprocess.run(
2854
["git", "clone", repo_url, target_dir],
2955
env=env,
@@ -34,10 +60,15 @@ def clone_repo_skip_lfs(gitee_owner, gitee_repo, username=None, token=None, targ
3460
)
3561
return target_dir
3662
except subprocess.CalledProcessError as e:
37-
error_msg = "克隆失败: "
63+
error_msg = f"{platform}克隆失败: "
3864
if username and token:
3965
error_msg += "认证失败或"
4066
error_msg += e.stderr.strip() if e.stderr else '未知错误'
67+
68+
# 平台特定的错误提示
69+
if platform == "gitcode":
70+
error_msg += "\nGitCode提示: 请确认使用Token认证而非密码[6](@ref)"
71+
4172
force_remove(target_dir)
4273
raise RuntimeError(error_msg)
4374

@@ -123,15 +154,19 @@ def force_remove(path):
123154
os.system(f'rm -rf "{path}"' if os.name != 'nt' else f'rd /s /q "{path}"')
124155

125156

126-
def main(owner, repo, output_file="lfs_mapping.json", username=None, token=None):
157+
def main(platform, owner, repo, output_file="lfs_mapping.json", username=None, token=None):
158+
"""主函数,支持平台参数"""
127159
try:
128-
repo_dir = clone_repo_skip_lfs(owner, repo, username, token)
160+
if platform == "gitcode" and not token:
161+
print("警告: GitCode强烈建议使用Token认证而非密码[6](@ref)")
162+
163+
repo_dir = clone_repo_skip_lfs(platform, owner, repo, username, token)
129164
mapping = get_all_branches_lfs_mapping(repo_dir)
130165

131166
with open(output_file, "w", encoding="utf-8") as f:
132167
json.dump(mapping, f, indent=2, ensure_ascii=False)
133168

134-
print(f"结果已保存到 {output_file}")
169+
print(f"{platform}平台结果已保存到 {output_file}")
135170
return True
136171
except Exception as e:
137172
print(f"错误: {str(e)}", file=sys.stderr)
@@ -140,18 +175,19 @@ def main(owner, repo, output_file="lfs_mapping.json", username=None, token=None)
140175
if 'repo_dir' in locals():
141176
force_remove(repo_dir)
142177

143-
144178
if __name__ == "__main__":
145-
if len(sys.argv) < 3:
146-
print("用法: python lfsNameQuery.py <owner> <repo> [output_file] [username] [token]")
179+
if len(sys.argv) < 4:
180+
print("用法: python lfsNameQuery.py <platform> <owner> <repo> [output_file] [username] [token]")
181+
print("平台支持: gitee, gitcode")
147182
sys.exit(1)
148183

149184
args = {
150-
"owner": sys.argv[1],
151-
"repo": sys.argv[2],
152-
"output_file": sys.argv[3] if len(sys.argv) > 3 else "lfs_mapping.json",
153-
"username": sys.argv[4] if len(sys.argv) > 4 else None,
154-
"token": sys.argv[5] if len(sys.argv) > 5 else None
185+
"platform": sys.argv[1], # 新增平台参数
186+
"owner": sys.argv[2],
187+
"repo": sys.argv[3],
188+
"output_file": sys.argv[4] if len(sys.argv) > 4 else "lfs_mapping.json",
189+
"username": sys.argv[5] if len(sys.argv) > 5 else None,
190+
"token": sys.argv[6] if len(sys.argv) > 6 else None
155191
}
156192

157-
sys.exit(0 if main( ** args) else 1)
193+
sys.exit(0 if main(**args) else 1)

server/server.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,10 @@ func (s *server) handleBatch(w http.ResponseWriter, r *http.Request) {
170170
}
171171

172172
func addMetaData(req batch.Request, w http.ResponseWriter, userInRepo auth.UserInRepo) {
173+
platform := "gitee"
174+
if gitCodeSwitch {
175+
platform = "atomGit"
176+
}
173177
// 添加元数据
174178
if req.Operation == "upload" {
175179
for _, object := range req.Objects {
@@ -179,7 +183,7 @@ func addMetaData(req batch.Request, w http.ResponseWriter, userInRepo auth.UserI
179183
Oid: object.OID,
180184
Size: object.Size,
181185
Exist: 2, // 默认设置为2
182-
Platform: "gitee", // 默认平台
186+
Platform: platform, // 默认平台
183187
Operator: userInRepo.Username, // 操作人
184188
}
185189

@@ -500,8 +504,13 @@ func (s *server) getLfsFiles(owner, repo, platform string, page, limit int) ([]d
500504
var files []db.LfsObj
501505

502506
query := db.Db.Model(&db.LfsObj{}).
503-
Where("owner = ? AND repo = ? AND platform = ? AND exist = 1", owner, repo, platform).
504-
Order("create_time DESC").
507+
Where("owner = ? AND repo = ? AND exist = 1", owner, repo)
508+
509+
if platform != "" {
510+
query = query.Where("platform = ?", platform)
511+
}
512+
513+
query = query.Order("create_time DESC").
505514
Limit(limit).
506515
Offset((page - 1) * limit)
507516

@@ -583,10 +592,15 @@ func checkOidFileName() {
583592
logrus.Errorf("fetch repo list failed: %v", err)
584593
return
585594
}
595+
token := giteeDefaultToken
596+
if gitCodeSwitch {
597+
token = atomGiteDefaultToken
598+
}
586599
for _, repo := range repoList {
587600
userInRepo := auth.UserInRepo{
588601
Repo: repo.Repo,
589-
Owner: repo.Owner}
602+
Owner: repo.Owner,
603+
Token: token}
590604
logrus.Infof("checkOidFileName owner:%v repo:%v", repo.Owner, repo.Repo)
591605
checkRepoOidName(userInRepo)
592606

server/validate.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,34 @@ type validateConfig struct {
1515

1616
var validatecfg validateConfig
1717
var Webhook_key string
18-
19-
func Init(cfg config.ValidateConfig) error {
18+
var gitCodeSwitch bool
19+
var giteeDefaultToken string
20+
var atomGiteDefaultToken string
21+
22+
func Init(cfg *config.Config) error {
23+
validateConfig := cfg.ValidateConfig
24+
gitCodeSwitch = cfg.GitCodeSwitch
25+
giteeDefaultToken = cfg.DefaultToken
26+
atomGiteDefaultToken = cfg.DefaultGitCodeToken
2027
var err error
21-
Webhook_key = cfg.WebhookKey
28+
Webhook_key = validateConfig.WebhookKey
2229

23-
validatecfg.ownerRegexp, err = regexp.Compile(cfg.OwnerRegexp)
30+
validatecfg.ownerRegexp, err = regexp.Compile(validateConfig.OwnerRegexp)
2431
if err != nil {
2532
return fmt.Errorf("failed to compile owner regexp: %w", err)
2633
}
2734

28-
validatecfg.reponameRegexp, err = regexp.Compile(cfg.RepoNameRegexp)
35+
validatecfg.reponameRegexp, err = regexp.Compile(validateConfig.RepoNameRegexp)
2936
if err != nil {
3037
return fmt.Errorf("failed to compile repo name regexp: %w", err)
3138
}
3239

33-
validatecfg.usernameRegexp, err = regexp.Compile(cfg.UsernameRegexp)
40+
validatecfg.usernameRegexp, err = regexp.Compile(validateConfig.UsernameRegexp)
3441
if err != nil {
3542
return fmt.Errorf("failed to compile username regexp: %w", err)
3643
}
3744

38-
validatecfg.passwordRegexp, err = regexp.Compile(cfg.PasswordRegexp)
45+
validatecfg.passwordRegexp, err = regexp.Compile(validateConfig.PasswordRegexp)
3946
if err != nil {
4047
return fmt.Errorf("failed to compile password regexp: %w", err)
4148
}

0 commit comments

Comments
 (0)