提交 1d304bc1 编写于 作者: 徐超越

WIP issue #80 gitea support

上级 4b798392
...@@ -37,7 +37,7 @@ require ( ...@@ -37,7 +37,7 @@ require (
github.com/casbin/casbin/v2 v2.37.4 github.com/casbin/casbin/v2 v2.37.4
github.com/colynn/go-ldap-client/v3 v3.0.0-20201016034829-4c1455a490de github.com/colynn/go-ldap-client/v3 v3.0.0-20201016034829-4c1455a490de
github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/drone/go-scm v1.18.0 github.com/drone/go-scm v1.19.0
github.com/ghodss/yaml v1.0.0 github.com/ghodss/yaml v1.0.0
github.com/go-atomci/workflow v0.0.0-20211126090842-208f180b47ab github.com/go-atomci/workflow v0.0.0-20211126090842-208f180b47ab
github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df
......
...@@ -188,6 +188,8 @@ github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QL ...@@ -188,6 +188,8 @@ github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QL
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
github.com/drone/go-scm v1.18.0 h1:VU6C6r2Hxf5FZUjTazCH2xlXBe21JDg7gBcJvsL7twk= github.com/drone/go-scm v1.18.0 h1:VU6C6r2Hxf5FZUjTazCH2xlXBe21JDg7gBcJvsL7twk=
github.com/drone/go-scm v1.18.0/go.mod h1:DFIJJjhMj0TSXPz+0ni4nyZ9gtTtC40Vh/TGRugtyWw= github.com/drone/go-scm v1.18.0/go.mod h1:DFIJJjhMj0TSXPz+0ni4nyZ9gtTtC40Vh/TGRugtyWw=
github.com/drone/go-scm v1.19.0 h1:JB/Rln0fBH1y2ENYj4Rr8T+CLfaFOa32KCb7brx/sHY=
github.com/drone/go-scm v1.19.0/go.mod h1:DFIJJjhMj0TSXPz+0ni4nyZ9gtTtC40Vh/TGRugtyWw=
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
......
...@@ -19,6 +19,7 @@ package apps ...@@ -19,6 +19,7 @@ package apps
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/drone/go-scm/scm/driver/gitea"
"net/http" "net/http"
"strings" "strings"
...@@ -39,9 +40,9 @@ func NewScmProvider(vcsType, vcsPath, token string) (*scm.Client, error) { ...@@ -39,9 +40,9 @@ func NewScmProvider(vcsType, vcsPath, token string) (*scm.Client, error) {
var err error var err error
var client *scm.Client var client *scm.Client
switch strings.ToLower(vcsType) { switch strings.ToLower(vcsType) {
case "gitlab": case "gitea", "gitlab":
if strings.HasSuffix(vcsPath, ".git") { if strings.HasSuffix(vcsPath, ".git") {
vcsPath = strings.Replace(vcsPath, ".git", "", -1) vcsPath = strings.TrimSuffix(vcsPath, ".git")
} }
// TODO: verify vcsPath, only support http, do not support git@gitlab.com:/dddd.git // TODO: verify vcsPath, only support http, do not support git@gitlab.com:/dddd.git
projectPathSplit := strings.Split(strings.Split(vcsPath, "://")[1], "/") projectPathSplit := strings.Split(strings.Split(vcsPath, "://")[1], "/")
...@@ -49,12 +50,24 @@ func NewScmProvider(vcsType, vcsPath, token string) (*scm.Client, error) { ...@@ -49,12 +50,24 @@ func NewScmProvider(vcsType, vcsPath, token string) (*scm.Client, error) {
log.Log.Debug("git projectpathsplit: %s,\tprojectName: %s", projectPathSplit, projectName) log.Log.Debug("git projectpathsplit: %s,\tprojectName: %s", projectPathSplit, projectName)
schema := strings.Split(vcsPath, "://")[0] schema := strings.Split(vcsPath, "://")[0]
gitRepo := strings.ToLower(vcsType)
if "gitea" == gitRepo {
client, err = gitea.New(schema + "://" + projectPathSplit[0])
client.Client = &http.Client{
Transport: &transport.BearerToken{
Token: token,
},
}
} else {
client, err = gitlab.New(schema + "://" + projectPathSplit[0]) client, err = gitlab.New(schema + "://" + projectPathSplit[0])
client.Client = &http.Client{ client.Client = &http.Client{
Transport: &transport.PrivateToken{ Transport: &transport.PrivateToken{
Token: token, Token: token,
}, },
} }
}
case "github": case "github":
client = github.NewDefault() client = github.NewDefault()
...@@ -72,6 +85,7 @@ func NewScmProvider(vcsType, vcsPath, token string) (*scm.Client, error) { ...@@ -72,6 +85,7 @@ func NewScmProvider(vcsType, vcsPath, token string) (*scm.Client, error) {
Token: token, Token: token,
}, },
} }
default: default:
err = fmt.Errorf("source code management system not configured") err = fmt.Errorf("source code management system not configured")
} }
......
...@@ -54,7 +54,7 @@ func (manager *AppManager) AppBranches(appID int64, filter *query.FilterQuery) ( ...@@ -54,7 +54,7 @@ func (manager *AppManager) AppBranches(appID int64, filter *query.FilterQuery) (
func (manager *AppManager) GetRepos(projectID int64) ([]*RepoServerRsp, error) { func (manager *AppManager) GetRepos(projectID int64) ([]*RepoServerRsp, error) {
repos := []*models.RepoServer{} repos := []*models.RepoServer{}
// TODO: support code repository defined, // TODO: support code repository defined,
defaultRepos := []string{"gitlab", "github", "gitee"} defaultRepos := []string{"gitlab", "github", "gitee", "gitea"}
// defaultRepos := []string{"gitlab"} // defaultRepos := []string{"gitlab"}
for _, item := range defaultRepos { for _, item := range defaultRepos {
_, err := manager.gitAppModel.GetRepoBycIDAndType(projectID, item) _, err := manager.gitAppModel.GetRepoBycIDAndType(projectID, item)
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div class="page-content"> <div class="page-content">
<div class="portlet-body projectMember"> <div class="portlet-body projectMember">
<template> <template>
<el-form :model="form" ref="ruleForm" :rules="rules"> <el-form ref="ruleForm" :model="form" :rules="rules">
<!-- <el-form-item label="类型" prop="type" > <!-- <el-form-item label="类型" prop="type" >
<el-select v-model="form.type" placeholder="请选择应用类型" filterable style="width: 300px"> <el-select v-model="form.type" placeholder="请选择应用类型" filterable style="width: 300px">
<el-option v-for="(item, index) in typeList" :key="index" :label="item.description" :value="item.name"> <el-option v-for="(item, index) in typeList" :key="index" :label="item.description" :value="item.name">
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
</el-form-item> </el-form-item>
<el-form-item label="语言类型" prop="language"> <el-form-item label="语言类型" prop="language">
<el-select v-model="form.language" placeholder="请选择语言类型" filterable style="width: 300px"> <el-select v-model="form.language" filterable placeholder="请选择语言类型" style="width: 300px">
<el-option v-for="(item, index) in languageList" :key="index" :label="item.description" :value="item.name"> <el-option v-for="(item, index) in languageList" :key="index" :label="item.description" :value="item.name">
</el-option> </el-option>
</el-select> </el-select>
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
</el-form-item> </el-form-item>
<el-form-item label="编译环境" prop="compile_env_id"> <el-form-item label="编译环境" prop="compile_env_id">
<el-select v-model="form.compile_env_id" placeholder="请选择编译环境" clearable filterable style="width: 300px"> <el-select v-model="form.compile_env_id" clearable filterable placeholder="请选择编译环境" style="width: 300px">
<el-option v-for="(item, index) in compileEnvs" :key="index" :label="item.name" :value="item.id"> <el-option v-for="(item, index) in compileEnvs" :key="index" :label="item.name" :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
...@@ -41,30 +41,31 @@ ...@@ -41,30 +41,31 @@
<el-tabs v-model="activeName" @tab-click="handleClick"> <el-tabs v-model="activeName" @tab-click="handleClick">
<template v-if="getTabs"> <template v-if="getTabs">
<template v-for="(item,index) in getTabs"> <template v-for="(item,index) in getTabs">
<el-tab-pane :label="item.type" :key="`${index}`" :name="`${index}`" ref="tabPanel"> <el-tab-pane :key="`${index}`" ref="tabPanel" :label="item.type" :name="`${index}`">
<div class="pv30"> <div class="pv30">
<div v-show="item.stepsNum === 1" class="containerMember"> <div v-show="item.stepsNum === 1" class="containerMember">
{{item.type}}提供丰富的代码管理功能,是目前主流的企业内部代码仓库解决方案 {{item.type}}提供丰富的代码管理功能,是目前主流的企业内部代码仓库解决方案
<el-button type="primary" @click="firstStep(index)">同步代码源</el-button> <el-button type="primary" @click="firstStep(index)">同步代码源</el-button>
</div> </div>
<div v-show="item.stepsNum === 2"> <div v-show="item.stepsNum === 2">
<el-form :model="item" :ref="'listRef'+index"> <el-form :ref="'listRef'+index" :model="item">
<div class="labelSize" > <div class="labelSize" >
<el-form-item v-if="item.type == 'gitlab'" label="地址" prop="base_url" :rules="[{ required: true, message: '请输入地址', trigger: 'blur' }]"> <el-form-item v-if="['gitlab', 'gitea'].includes(item.type)" :rules="[{ required: true, message: '请输入地址', trigger: 'blur' }]" label="地址" prop="base_url">
<el-input v-model.trim="item.base_url" auto-complete="off" placeholder="请输入地址, 如:https://gitlab.com"></el-input> <el-input v-if="item.type === 'gitlab'" v-model.trim="item.base_url" auto-complete="off" placeholder="请输入地址, 如:https://gitlab.yourrepo.com"></el-input>
<el-input v-if="item.type === 'gitea'" v-model.trim="item.base_url" auto-complete="off" placeholder="请输入地址, 如:https://gitea.yourrepo.com"></el-input>
</el-form-item> </el-form-item>
<el-form-item v-else label="地址" prop="base_url"> <el-form-item v-else label="地址" prop="base_url">
<el-input v-if="item.type == 'github'" v-model.trim="item.base_url" auto-complete="off" :readonly="true" placeholder="https://github.com"></el-input> <el-input v-if="item.type === 'github'" v-model.trim="item.base_url" :readonly="true" auto-complete="off" placeholder="https://github.com"></el-input>
<el-input v-else="item.type == 'gitee'" v-model.trim="item.base_url" auto-complete="off" :readonly="true" placeholder="https://gitee.com"></el-input> <el-input v-else-if="item.type === 'gitee'" v-model.trim="item.base_url" :readonly="true" auto-complete="off" placeholder="https://gitee.com"></el-input>
</el-form-item> </el-form-item>
</div> </div>
<div class="labelSize" v-if="item.type == 'gitlab'"> <div v-if="item.type == 'gitlab'" class="labelSize">
<el-form-item label="用户名" prop="user"> <el-form-item label="用户名" prop="user">
<el-input v-model.trim="item.user" auto-complete="off" maxlength="128" placeholder="请输入用户名"></el-input> <el-input v-model.trim="item.user" auto-complete="off" maxlength="128" placeholder="请输入用户名"></el-input>
</el-form-item> </el-form-item>
</div> </div>
<div class="labelSize"> <div class="labelSize">
<el-form-item label="Token" prop="token" :rules="[{ required: true, message: '请输入Token', trigger: 'blur' }]"> <el-form-item :rules="[{ required: true, message: '请输入Token', trigger: 'blur' }]" label="Token" prop="token">
<el-input v-model.trim="item.token" auto-complete="off" maxlength="128" placeholder="请输入Token"></el-input> <el-input v-model.trim="item.token" auto-complete="off" maxlength="128" placeholder="请输入Token"></el-input>
</el-form-item> </el-form-item>
</div> </div>
...@@ -73,12 +74,12 @@ ...@@ -73,12 +74,12 @@
<el-button type="primary" @click="secondStep(index)">同步代码源</el-button> <el-button type="primary" @click="secondStep(index)">同步代码源</el-button>
</div> </div>
</div> </div>
<div class="" v-show="item.stepsNum === 3"> <div v-show="item.stepsNum === 3" class="">
<div class="editBtn">要改变当前绑定的代码库?<el-button type="text" size="small" @click="editPath(index)">解除绑定</el-button></div> <div class="editBtn">要改变当前绑定的代码库?<el-button size="small" type="text" @click="editPath(index)">解除绑定</el-button></div>
<div class="sel-fl"> <div class="sel-fl">
<el-form :model="item" :ref="'listRefs'+index"> <el-form :ref="'listRefs'+index" :model="item">
<el-form-item label="仓库名称" prop="path" :rules="[{ required: true, message: '请选择代码库', trigger: 'change' }]"> <el-form-item :rules="[{ required: true, message: '请选择代码库', trigger: 'change' }]" label="仓库名称" prop="path">
<el-select v-model="item.path" placeholder="请选择代码库" filterable :loading="getRepoLoading" :key="`sel${index}`"> <el-select :key="`sel${index}`" v-model="item.path" :loading="getRepoLoading" filterable placeholder="请选择代码库">
<el-option v-for="(term, indexs) in item.proCol" :key="indexs" :label="term.full_name" :value="indexs"> <el-option v-for="(term, indexs) in item.proCol" :key="indexs" :label="term.full_name" :value="indexs">
</el-option> </el-option>
</el-select> </el-select>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册