Showing preview only (3,962K chars total). Download the full file or copy to clipboard to get everything.
Repository: mgr9525/gokins
Branch: master
Commit: 2c7d3d438e08
Files: 154
Total size: 3.8 MB
Directory structure:
gitextract_0p57qvn9/
├── .gitignore
├── Dockerfile
├── LICENSE
├── README.md
├── bean/
│ ├── condition.go
│ ├── db.go
│ ├── http.go
│ ├── models.go
│ ├── pipeline.go
│ ├── pipelinevar.go
│ ├── runtime.go
│ ├── thirdbean/
│ │ ├── gitea.go
│ │ ├── gitee.go
│ │ ├── giteepremium.go
│ │ ├── github.go
│ │ └── gitlab.go
│ ├── trigger.go
│ └── yml.go
├── bindata.sh
├── bindui.sh
├── build.sh
├── cmd/
│ └── cmd.go
├── comm/
│ ├── app.go
│ ├── cache.go
│ ├── config.go
│ ├── db.go
│ ├── migrate.go
│ ├── thirdapi.go
│ └── uis.go
├── compressui.go
├── engine/
│ ├── buildDao.go
│ ├── buildEgn.go
│ ├── buildTask.go
│ ├── buildTaskc.go
│ ├── buildtask_test.go
│ ├── hbtpruner.go
│ ├── jobEgn.go
│ ├── mgr.go
│ ├── runner.go
│ ├── timermgr.go
│ └── timermgr_test.go
├── go.mod
├── go.sum
├── hook/
│ ├── action.go
│ ├── event.go
│ ├── git.go
│ ├── gitea/
│ │ └── gitea.go
│ ├── gitee/
│ │ └── gitee.go
│ ├── github/
│ │ └── github.go
│ ├── gitlab/
│ │ └── gitlab.go
│ ├── pr.go
│ ├── repo.go
│ └── webhook.go
├── main.go
├── migrates/
│ ├── init.go
│ ├── mysql/
│ │ ├── 000001_gokins.down.sql
│ │ └── 000001_gokins.up.sql
│ ├── sqlite/
│ │ ├── 000001_gokins.down.sql
│ │ └── 000001_gokins.up.sql
│ └── up.go
├── model/
│ ├── schema_migrations.go
│ ├── t_artifact_package.go
│ ├── t_artifact_version.go
│ ├── t_artifactory.go
│ ├── t_build.go
│ ├── t_cmd_line.go
│ ├── t_message.go
│ ├── t_org.go
│ ├── t_org_pipe.go
│ ├── t_param.go
│ ├── t_pipeline.go
│ ├── t_pipeline_conf.go
│ ├── t_pipeline_var.go
│ ├── t_pipeline_version.go
│ ├── t_stage.go
│ ├── t_step.go
│ ├── t_trigger.go
│ ├── t_trigger_run.go
│ ├── t_user.go
│ ├── t_user_info.go
│ ├── t_user_msg.go
│ ├── t_user_org.go
│ ├── t_user_token.go
│ ├── t_yml_plugin.go
│ └── t_yml_template.go
├── models/
│ ├── run_build.go
│ ├── run_stage.go
│ ├── t_artifact_package.go
│ ├── t_artifact_version.go
│ ├── t_artifactory.go
│ ├── t_org.go
│ ├── t_pipeline.go
│ ├── t_pipeline_var.go
│ ├── t_pipeline_version.go
│ ├── t_trigger.go
│ ├── t_trigger_run.go
│ ├── t_user.go
│ ├── t_yml_plugin.go
│ └── t_yml_template.go
├── route/
│ ├── api.go
│ ├── artifact.go
│ ├── artpub.go
│ ├── hook.go
│ ├── install.go
│ ├── login.go
│ ├── org.go
│ ├── pipeline.go
│ ├── pipelineversion.go
│ ├── runtime.go
│ ├── trigger.go
│ ├── user.go
│ └── yml.go
├── ruis_test.go
├── server/
│ ├── db.go
│ ├── hbtp.go
│ ├── server.go
│ └── web.go
├── service/
│ ├── db.go
│ ├── hook.go
│ ├── mid.go
│ ├── notice.go
│ ├── param.go
│ ├── perms.go
│ ├── pipeline.go
│ ├── trigger.go
│ └── user.go
├── thirdapi/
│ ├── client.go
│ ├── giteaapi/
│ │ ├── gitea.go
│ │ ├── giteaapi.go
│ │ ├── giteaapi_test.go
│ │ └── repositoryservice.go
│ ├── giteeapi/
│ │ ├── gitee.go
│ │ ├── giteeapi.go
│ │ ├── giteeapi_test.go
│ │ └── repositoryservice.go
│ ├── giteepremiumapi/
│ │ ├── giteepremium.go
│ │ ├── giteepremiumapi.go
│ │ ├── giteepremiumapi_test.go
│ │ └── repositoryservice.go
│ ├── githubapi/
│ │ ├── github.go
│ │ ├── githubapi.go
│ │ ├── githubapi_test.go
│ │ └── repositoryservice.go
│ ├── gitlabapi/
│ │ ├── gitlab.go
│ │ ├── gitlabapi.go
│ │ ├── gitlabapi_test.go
│ │ └── repositoryservice.go
│ ├── repo.go
│ └── repositoryservice.go
└── util/
├── gin.go
├── git.go
├── httpex/
│ ├── const.go
│ └── post.go
└── token.go
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
/dbm.bat
/dbm.sh
/model.yml
/install.html
*.test
*.bak
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
bin/
# Dependency directories (remove the comment below to include it)
# vendor/
__debug_bin
================================================
FILE: Dockerfile
================================================
FROM golang:1.16.6-alpine3.14 AS builder
# ENV GOPROXY=https://goproxy.cn,direct
# RUN apk add git build-base && git clone https://gitee.com/gokins/gokins.git /build
RUN apk add git build-base && git clone https://github.com/gokins/gokins.git /build
WORKDIR /build
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/gokins main.go
FROM alpine:latest AS final
ENV GOKINS_WORKPATH=/data/gokins
RUN apk --no-cache add openssl ca-certificates curl git wget \
&& rm -rf /var/cache/apk \
&& mkdir -p /app /data/gokins
COPY --from=builder /build/bin/gokins /app
WORKDIR /app
ENTRYPOINT ["/app/gokins"]
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2021 gokins
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# 项目已经转移仓库到下面地址维护
## https://github.com/gokins/gokins
# Gokins文档
# Gokins: *More Power*

Gokins一款由Go语言和Vue编写的款轻量级、能够持续集成和持续交付的工具.
* **持续集成和持续交付**
作为一个可扩展的自动化服务器,Gokins 可以用作简单的 CI 服务器,或者变成任何项目的持续交付中心
* **简易安装**
Gokins 是一个基于 Go 的独立程序,可以立即运行,包含 Windows、Mac OS X 和其他类 Unix 操作系统。
* **安全**
绝不收集任何用户、服务器信息,是一个独立安全的服务
## Gokins 官网
**地址 : http://gokins.cn**
可在官网上获取最新的Gokins动态
## Gokins Demo
http://gokins.cn:8030
```
用户名: guest
密码: 123456
```
## Quick Start
It is super easy to get started with your first project.
#### Step 1: 环境准备
- Mysql
- Dokcer(非必要)
#### Step 2: 下载
- Linux下载:http://bin.gokins.cn/gokins-linux-amd64
- Mac下载:http://bin.gokins.cn/gokins-darwin-amd64
> 我们推荐使用docker或者直接下载release的方式安装Gokins`
#### Step 3: 启动服务
```
./gokins
```
#### Step 3: 安装Gokins
访问 `http://localhost:8030`进入到Gokins安装页面

按页面上的提示填入信息
默认管理员账号密码
`username :gokins `
`pwd: 123456 `
#### Step 4: 新建流水线
- 进入到流水线页面

- 点击新建流水线

填入流水线基本信息
- 流水线配置
```
version: 1.0
vars:
stages:
- stage:
displayName: build
name: build
steps:
- step: shell@sh
displayName: test-build
name: build
env:
commands:
- echo Hello World
```
关于流水线配置的YML更多信息请访问 [YML文档](http://gokins.cn/%E5%B7%A5%E4%BD%9C%E6%B5%81%E8%AF%AD%E6%B3%95/)
- 运行流水线

`这里可以选择输入仓库分支或者commitSha,如果不填则为默认分支`
- 查看运行结果

================================================
FILE: bean/condition.go
================================================
package bean
import (
"regexp"
"strings"
)
func skipBranch(c *Condition, branch string) bool {
return !c.Match(branch)
}
func skipCommitMessages(c *Condition, branch string) bool {
return !c.Match(branch)
}
func skipCommitNotes(c *Condition, branch string) bool {
return !c.Match(branch)
}
func (c *Condition) Match(v string) bool {
if c == nil {
return false
}
if c.Include != nil && c.Exclude != nil {
return c.Includes(v) && !c.Excludes(v)
}
if c.Include != nil && c.Includes(v) {
return true
}
if c.Exclude != nil && !c.Excludes(v) {
return true
}
return false
}
func (c *Condition) Excludes(v string) bool {
for _, in := range c.Exclude {
if in == "" {
continue
}
if in == v {
return true
}
if isMatch(v, in) {
return true
}
reg, err := regexp.Compile(in)
if err != nil {
return false
}
match := reg.Match([]byte(strings.Replace(v, "\n", "", -1)))
if match {
return true
}
}
return false
}
func (c *Condition) Includes(v string) bool {
for _, in := range c.Include {
if in == "" {
continue
}
if in == v {
return true
}
if isMatch(v, in) {
return true
}
reg, err := regexp.Compile(in)
if err != nil {
return false
}
match := reg.Match([]byte(strings.Replace(v, "\n", "", -1)))
if match {
return true
}
}
return false
}
func isMatch(s string, p string) bool {
m, n := len(s), len(p)
dp := make([][]bool, m+1)
for i := 0; i <= m; i++ {
dp[i] = make([]bool, n+1)
}
dp[0][0] = true
for i := 1; i <= n; i++ {
if p[i-1] == '*' {
dp[0][i] = true
} else {
break
}
}
for i := 1; i <= m; i++ {
for j := 1; j <= n; j++ {
if p[j-1] == '*' {
dp[i][j] = dp[i][j-1] || dp[i-1][j]
} else if s[i-1] == p[j-1] {
dp[i][j] = dp[i-1][j-1]
}
}
}
return dp[m][n]
}
================================================
FILE: bean/db.go
================================================
package bean
type Page struct {
Page int64 `json:"page"`
Size int64 `json:"size"`
Total int64 `json:"total"`
Pages int64 `json:"pages"`
Data interface{} `json:"data"`
}
type PageGen struct {
SQL string
Args []interface{}
CountCols string
FindCols string
}
================================================
FILE: bean/http.go
================================================
package bean
type IdsRes struct {
Id string `json:"id"`
Aid int64 `json:"aid"`
}
type LoginReq struct {
Name string `json:"name"`
Pass string `json:"pass"`
}
type LoginRes struct {
Token string `json:"token"`
Id string `json:"id"`
Name string `json:"name"`
Nick string `json:"nick"`
Avatar string `json:"avatar"`
LastLoginTime string `json:"lastLoginTime"`
}
================================================
FILE: bean/models.go
================================================
package bean
type PipelineShow struct {
Id string `json:"id"`
Uid string `json:"uid"`
Name string `json:"name"`
DisplayName string `json:"displayName"`
PipelineType string `json:"pipelineType"`
YmlContent string `json:"ymlContent"`
Url string `json:"url"`
Username string `json:"username"`
AccessToken string `json:"accessToken"`
}
================================================
FILE: bean/pipeline.go
================================================
package bean
type NewPipeline struct {
Name string `json:"name"`
DisplayName string `json:"displayName"`
Content string `json:"content"`
OrgId string `json:"orgId"`
AccessToken string `json:"accessToken"`
Url string `json:"url"`
Username string `json:"username"`
Vars []*NewPipelineVar `json:"vars"`
}
type NewPipelineVar struct {
Name string `json:"name"`
Value string `json:"value"`
Remarks string `json:"remarks"`
Public bool `json:"public"`
}
func (p *NewPipeline) Check() bool {
if p.Name == "" || p.Content == "" {
return false
}
return true
}
================================================
FILE: bean/pipelinevar.go
================================================
package bean
type PipelineVar struct {
Aid int64 `json:"aid"`
PipelineId string `json:"pipelineId"`
Name string ` json:"name"`
Value string ` json:"value"`
Remarks string ` json:"remarks"`
Public bool ` json:"public"`
}
================================================
FILE: bean/runtime.go
================================================
package bean
import "time"
type LogOutJson struct {
Id string `json:"id"`
Content string `json:"content"`
Times time.Time `json:"times"`
Errs bool `json:"errs"`
}
type LogOutJsonRes struct {
Id string `json:"id"`
Content string `json:"content"`
Times time.Time `json:"times"`
Errs bool `json:"errs"`
Offset int64 `json:"offset"`
}
================================================
FILE: bean/thirdbean/gitea.go
================================================
package thirdbean
import "time"
type ResultGiteaRepo struct {
Id int `json:"id"`
Owner struct {
Id int `json:"id"`
Login string `json:"login"`
FullName string `json:"full_name"`
Email string `json:"email"`
AvatarUrl string `json:"avatar_url"`
Language string `json:"language"`
IsAdmin bool `json:"is_admin"`
LastLogin time.Time `json:"last_login"`
Created time.Time `json:"created"`
Restricted bool `json:"restricted"`
Active bool `json:"active"`
ProhibitLogin bool `json:"prohibit_login"`
Location string `json:"location"`
Website string `json:"website"`
Description string `json:"description"`
Username string `json:"username"`
} `json:"owner"`
Name string `json:"name"`
FullName string `json:"full_name"`
Description string `json:"description"`
Empty bool `json:"empty"`
Private bool `json:"private"`
Fork bool `json:"fork"`
Template bool `json:"template"`
Parent interface{} `json:"parent"`
Mirror bool `json:"mirror"`
Size int `json:"size"`
HtmlUrl string `json:"html_url"`
SshUrl string `json:"ssh_url"`
CloneUrl string `json:"clone_url"`
OriginalUrl string `json:"original_url"`
Website string `json:"website"`
StarsCount int `json:"stars_count"`
ForksCount int `json:"forks_count"`
WatchersCount int `json:"watchers_count"`
OpenIssuesCount int `json:"open_issues_count"`
OpenPrCounter int `json:"open_pr_counter"`
ReleaseCounter int `json:"release_counter"`
DefaultBranch string `json:"default_branch"`
Archived bool `json:"archived"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Permissions struct {
Admin bool `json:"admin"`
Push bool `json:"push"`
Pull bool `json:"pull"`
} `json:"permissions"`
HasIssues bool `json:"has_issues"`
InternalTracker struct {
EnableTimeTracker bool `json:"enable_time_tracker"`
AllowOnlyContributorsToTrackTime bool `json:"allow_only_contributors_to_track_time"`
EnableIssueDependencies bool `json:"enable_issue_dependencies"`
} `json:"internal_tracker"`
HasWiki bool `json:"has_wiki"`
HasPullRequests bool `json:"has_pull_requests"`
HasProjects bool `json:"has_projects"`
IgnoreWhitespaceConflicts bool `json:"ignore_whitespace_conflicts"`
AllowMergeCommits bool `json:"allow_merge_commits"`
AllowRebase bool `json:"allow_rebase"`
AllowRebaseExplicit bool `json:"allow_rebase_explicit"`
AllowSquashMerge bool `json:"allow_squash_merge"`
DefaultMergeStyle string `json:"default_merge_style"`
AvatarUrl string `json:"avatar_url"`
Internal bool `json:"internal"`
MirrorInterval string `json:"mirror_interval"`
}
type ResultGiteaRepoBranch struct {
Name string `json:"name"`
Commit struct {
Id string `json:"id"`
Message string `json:"message"`
Url string `json:"url"`
Author struct {
Name string `json:"name"`
Email string `json:"email"`
Username string `json:"username"`
} `json:"author"`
Committer struct {
Name string `json:"name"`
Email string `json:"email"`
Username string `json:"username"`
} `json:"committer"`
Verification struct {
Verified bool `json:"verified"`
Reason string `json:"reason"`
Signature string `json:"signature"`
Signer interface{} `json:"signer"`
Payload string `json:"payload"`
} `json:"verification"`
Timestamp time.Time `json:"timestamp"`
Added interface{} `json:"added"`
Removed interface{} `json:"removed"`
Modified interface{} `json:"modified"`
} `json:"commit"`
Protected bool `json:"protected"`
RequiredApprovals int `json:"required_approvals"`
EnableStatusCheck bool `json:"enable_status_check"`
StatusCheckContexts []interface{} `json:"status_check_contexts"`
UserCanPush bool `json:"user_can_push"`
UserCanMerge bool `json:"user_can_merge"`
EffectiveBranchProtectionName string `json:"effective_branch_protection_name"`
}
type ResultGetGiteaHook struct {
Id int `json:"id"`
Type string `json:"type"`
Config struct {
ContentType string `json:"content_type"`
Url string `json:"url"`
} `json:"config"`
Events []string `json:"events"`
Active bool `json:"active"`
UpdatedAt time.Time `json:"updated_at"`
CreatedAt time.Time `json:"created_at"`
}
================================================
FILE: bean/thirdbean/gitee.go
================================================
package thirdbean
import "time"
type ResultGiteeCreateHooks struct {
Id int `json:"id"`
Url string `json:"url"`
CreatedAt time.Time `json:"created_at"`
Password string `json:"password"`
ProjectId int `json:"project_id"`
Result string `json:"result"`
ResultCode interface{} `json:"result_code"`
PushEvents bool `json:"push_events"`
TagPushEvents bool `json:"tag_push_events"`
IssuesEvents bool `json:"issues_events"`
NoteEvents bool `json:"note_events"`
MergeRequestsEvents bool `json:"merge_requests_events"`
}
type ResultGiteeRepo struct {
Id int64 `json:"id"`
FullName string `json:"full_name"`
HumanName string `json:"human_name"`
Url string `json:"url"`
Namespace struct {
Id int `json:"id"`
Type string `json:"type"`
Name string `json:"name"`
Path string `json:"path"`
HtmlUrl string `json:"html_url"`
} `json:"namespace"`
Path string `json:"path"`
Name string `json:"name"`
Owner struct {
Id int `json:"id"`
Login string `json:"login"`
Name string `json:"name"`
AvatarUrl string `json:"avatar_url"`
Url string `json:"url"`
HtmlUrl string `json:"html_url"`
FollowersUrl string `json:"followers_url"`
FollowingUrl string `json:"following_url"`
GistsUrl string `json:"gists_url"`
StarredUrl string `json:"starred_url"`
SubscriptionsUrl string `json:"subscriptions_url"`
OrganizationsUrl string `json:"organizations_url"`
ReposUrl string `json:"repos_url"`
EventsUrl string `json:"events_url"`
ReceivedEventsUrl string `json:"received_events_url"`
Type string `json:"type"`
} `json:"owner"`
Description string `json:"description"`
Private bool `json:"private"`
Public bool `json:"public"`
Internal bool `json:"internal"`
Fork bool `json:"fork"`
HtmlUrl string `json:"html_url"`
SshUrl string `json:"ssh_url"`
ForksUrl string `json:"forks_url"`
KeysUrl string `json:"keys_url"`
CollaboratorsUrl string `json:"collaborators_url"`
HooksUrl string `json:"hooks_url"`
BranchesUrl string `json:"branches_url"`
TagsUrl string `json:"tags_url"`
BlobsUrl string `json:"blobs_url"`
StargazersUrl string `json:"stargazers_url"`
ContributorsUrl string `json:"contributors_url"`
CommitsUrl string `json:"commits_url"`
CommentsUrl string `json:"comments_url"`
IssueCommentUrl string `json:"issue_comment_url"`
IssuesUrl string `json:"issues_url"`
PullsUrl string `json:"pulls_url"`
MilestonesUrl string `json:"milestones_url"`
NotificationsUrl string `json:"notifications_url"`
LabelsUrl string `json:"labels_url"`
ReleasesUrl string `json:"releases_url"`
Recommend bool `json:"recommend"`
Homepage interface{} `json:"homepage"`
Language string `json:"language"`
ForksCount int `json:"forks_count"`
StargazersCount int `json:"stargazers_count"`
WatchersCount int `json:"watchers_count"`
DefaultBranch string `json:"default_branch"`
OpenIssuesCount int `json:"open_issues_count"`
HasIssues bool `json:"has_issues"`
HasWiki bool `json:"has_wiki"`
IssueComment bool `json:"issue_comment"`
CanComment bool `json:"can_comment"`
PullRequestsEnabled bool `json:"pull_requests_enabled"`
HasPage bool `json:"has_page"`
License string `json:"license"`
Outsourced bool `json:"outsourced"`
ProjectCreator string `json:"project_creator"`
Members []string `json:"members"`
PushedAt time.Time `json:"pushed_at"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Parent interface{} `json:"parent"`
Paas interface{} `json:"paas"`
Stared bool `json:"stared"`
Watched bool `json:"watched"`
Permission struct {
Pull bool `json:"pull"`
Push bool `json:"push"`
Admin bool `json:"admin"`
} `json:"permission"`
Relation string `json:"relation"`
AssigneesNumber int `json:"assignees_number"`
TestersNumber int `json:"testers_number"`
Assignees []struct {
Id int `json:"id"`
Login string `json:"login"`
Name string `json:"name"`
AvatarUrl string `json:"avatar_url"`
Url string `json:"url"`
HtmlUrl string `json:"html_url"`
FollowersUrl string `json:"followers_url"`
FollowingUrl string `json:"following_url"`
GistsUrl string `json:"gists_url"`
StarredUrl string `json:"starred_url"`
SubscriptionsUrl string `json:"subscriptions_url"`
OrganizationsUrl string `json:"organizations_url"`
ReposUrl string `json:"repos_url"`
EventsUrl string `json:"events_url"`
ReceivedEventsUrl string `json:"received_events_url"`
Type string `json:"type"`
} `json:"assignees"`
Testers []struct {
Id int `json:"id"`
Login string `json:"login"`
Name string `json:"name"`
AvatarUrl string `json:"avatar_url"`
Url string `json:"url"`
HtmlUrl string `json:"html_url"`
FollowersUrl string `json:"followers_url"`
FollowingUrl string `json:"following_url"`
GistsUrl string `json:"gists_url"`
StarredUrl string `json:"starred_url"`
SubscriptionsUrl string `json:"subscriptions_url"`
OrganizationsUrl string `json:"organizations_url"`
ReposUrl string `json:"repos_url"`
EventsUrl string `json:"events_url"`
ReceivedEventsUrl string `json:"received_events_url"`
Type string `json:"type"`
} `json:"testers"`
}
type ResultGiteeRepoBranch struct {
Name string `json:"name"`
Commit struct {
Sha string `json:"sha"`
Url string `json:"url"`
} `json:"commit"`
Protected bool `json:"protected"`
ProtectionUrl string `json:"protection_url"`
}
type ResultGetGiteeHook struct {
Id int `json:"id"`
Url string `json:"url"`
CreatedAt time.Time `json:"created_at"`
Password string `json:"password"`
ProjectId int `json:"project_id"`
Result string `json:"result"`
ResultCode int `json:"result_code"`
PushEvents bool `json:"push_events"`
TagPushEvents bool `json:"tag_push_events"`
IssuesEvents bool `json:"issues_events"`
NoteEvents bool `json:"note_events"`
MergeRequestsEvents bool `json:"merge_requests_events"`
}
================================================
FILE: bean/thirdbean/giteepremium.go
================================================
package thirdbean
import "time"
type ResultGiteePremiumCreateHooks struct {
Id int `json:"id"`
Url string `json:"url"`
CreatedAt time.Time `json:"created_at"`
Password string `json:"password"`
ProjectId int `json:"project_id"`
Result string `json:"result"`
ResultCode interface{} `json:"result_code"`
PushEvents bool `json:"push_events"`
TagPushEvents bool `json:"tag_push_events"`
IssuesEvents bool `json:"issues_events"`
NoteEvents bool `json:"note_events"`
MergeRequestsEvents bool `json:"merge_requests_events"`
}
type ResultGiteePremiumRepo struct {
Id int64 `json:"id"`
FullName string `json:"full_name"`
HumanName string `json:"human_name"`
Url string `json:"url"`
Namespace struct {
Id int `json:"id"`
Type string `json:"type"`
Name string `json:"name"`
Path string `json:"path"`
HtmlUrl string `json:"html_url"`
} `json:"namespace"`
Path string `json:"path"`
Name string `json:"name"`
Owner struct {
Id int `json:"id"`
Login string `json:"login"`
Name string `json:"name"`
AvatarUrl string `json:"avatar_url"`
Url string `json:"url"`
HtmlUrl string `json:"html_url"`
FollowersUrl string `json:"followers_url"`
FollowingUrl string `json:"following_url"`
GistsUrl string `json:"gists_url"`
StarredUrl string `json:"starred_url"`
SubscriptionsUrl string `json:"subscriptions_url"`
OrganizationsUrl string `json:"organizations_url"`
ReposUrl string `json:"repos_url"`
EventsUrl string `json:"events_url"`
ReceivedEventsUrl string `json:"received_events_url"`
Type string `json:"type"`
} `json:"owner"`
Description string `json:"description"`
Private bool `json:"private"`
Public bool `json:"public"`
Internal bool `json:"internal"`
Fork bool `json:"fork"`
HtmlUrl string `json:"html_url"`
SshUrl string `json:"ssh_url"`
ForksUrl string `json:"forks_url"`
KeysUrl string `json:"keys_url"`
CollaboratorsUrl string `json:"collaborators_url"`
HooksUrl string `json:"hooks_url"`
BranchesUrl string `json:"branches_url"`
TagsUrl string `json:"tags_url"`
BlobsUrl string `json:"blobs_url"`
StargazersUrl string `json:"stargazers_url"`
ContributorsUrl string `json:"contributors_url"`
CommitsUrl string `json:"commits_url"`
CommentsUrl string `json:"comments_url"`
IssueCommentUrl string `json:"issue_comment_url"`
IssuesUrl string `json:"issues_url"`
PullsUrl string `json:"pulls_url"`
MilestonesUrl string `json:"milestones_url"`
NotificationsUrl string `json:"notifications_url"`
LabelsUrl string `json:"labels_url"`
ReleasesUrl string `json:"releases_url"`
Recommend bool `json:"recommend"`
Homepage interface{} `json:"homepage"`
Language string `json:"language"`
ForksCount int `json:"forks_count"`
StargazersCount int `json:"stargazers_count"`
WatchersCount int `json:"watchers_count"`
DefaultBranch string `json:"default_branch"`
OpenIssuesCount int `json:"open_issues_count"`
HasIssues bool `json:"has_issues"`
HasWiki bool `json:"has_wiki"`
IssueComment bool `json:"issue_comment"`
CanComment bool `json:"can_comment"`
PullRequestsEnabled bool `json:"pull_requests_enabled"`
HasPage bool `json:"has_page"`
License string `json:"license"`
Outsourced bool `json:"outsourced"`
ProjectCreator string `json:"project_creator"`
Members []string `json:"members"`
PushedAt time.Time `json:"pushed_at"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Parent interface{} `json:"parent"`
Paas interface{} `json:"paas"`
Stared bool `json:"stared"`
Watched bool `json:"watched"`
Permission struct {
Pull bool `json:"pull"`
Push bool `json:"push"`
Admin bool `json:"admin"`
} `json:"permission"`
Relation string `json:"relation"`
AssigneesNumber int `json:"assignees_number"`
TestersNumber int `json:"testers_number"`
Assignees []struct {
Id int `json:"id"`
Login string `json:"login"`
Name string `json:"name"`
AvatarUrl string `json:"avatar_url"`
Url string `json:"url"`
HtmlUrl string `json:"html_url"`
FollowersUrl string `json:"followers_url"`
FollowingUrl string `json:"following_url"`
GistsUrl string `json:"gists_url"`
StarredUrl string `json:"starred_url"`
SubscriptionsUrl string `json:"subscriptions_url"`
OrganizationsUrl string `json:"organizations_url"`
ReposUrl string `json:"repos_url"`
EventsUrl string `json:"events_url"`
ReceivedEventsUrl string `json:"received_events_url"`
Type string `json:"type"`
} `json:"assignees"`
Testers []struct {
Id int `json:"id"`
Login string `json:"login"`
Name string `json:"name"`
AvatarUrl string `json:"avatar_url"`
Url string `json:"url"`
HtmlUrl string `json:"html_url"`
FollowersUrl string `json:"followers_url"`
FollowingUrl string `json:"following_url"`
GistsUrl string `json:"gists_url"`
StarredUrl string `json:"starred_url"`
SubscriptionsUrl string `json:"subscriptions_url"`
OrganizationsUrl string `json:"organizations_url"`
ReposUrl string `json:"repos_url"`
EventsUrl string `json:"events_url"`
ReceivedEventsUrl string `json:"received_events_url"`
Type string `json:"type"`
} `json:"testers"`
}
type ResultGiteePremiumRepoBranch struct {
Name string `json:"name"`
Commit struct {
Sha string `json:"sha"`
Url string `json:"url"`
} `json:"commit"`
Protected bool `json:"protected"`
ProtectionUrl string `json:"protection_url"`
}
type ResultGetGiteePremiumHook struct {
Id int `json:"id"`
Url string `json:"url"`
CreatedAt time.Time `json:"created_at"`
Password string `json:"password"`
ProjectId int `json:"project_id"`
Result string `json:"result"`
ResultCode int `json:"result_code"`
PushEvents bool `json:"push_events"`
TagPushEvents bool `json:"tag_push_events"`
IssuesEvents bool `json:"issues_events"`
NoteEvents bool `json:"note_events"`
MergeRequestsEvents bool `json:"merge_requests_events"`
}
================================================
FILE: bean/thirdbean/github.go
================================================
package thirdbean
import "time"
type ResultGithubRepo struct {
Id int `json:"id"`
NodeId string `json:"node_id"`
Name string `json:"name"`
FullName string `json:"full_name"`
Private bool `json:"private"`
Owner struct {
Login string `json:"login"`
Id int `json:"id"`
NodeId string `json:"node_id"`
AvatarUrl string `json:"avatar_url"`
GravatarId string `json:"gravatar_id"`
Url string `json:"url"`
HtmlUrl string `json:"html_url"`
FollowersUrl string `json:"followers_url"`
FollowingUrl string `json:"following_url"`
GistsUrl string `json:"gists_url"`
StarredUrl string `json:"starred_url"`
SubscriptionsUrl string `json:"subscriptions_url"`
OrganizationsUrl string `json:"organizations_url"`
ReposUrl string `json:"repos_url"`
EventsUrl string `json:"events_url"`
ReceivedEventsUrl string `json:"received_events_url"`
Type string `json:"type"`
SiteAdmin bool `json:"site_admin"`
} `json:"owner"`
HtmlUrl string `json:"html_url"`
Description *string `json:"description"`
Fork bool `json:"fork"`
Url string `json:"url"`
ForksUrl string `json:"forks_url"`
KeysUrl string `json:"keys_url"`
CollaboratorsUrl string `json:"collaborators_url"`
TeamsUrl string `json:"teams_url"`
HooksUrl string `json:"hooks_url"`
IssueEventsUrl string `json:"issue_events_url"`
EventsUrl string `json:"events_url"`
AssigneesUrl string `json:"assignees_url"`
BranchesUrl string `json:"branches_url"`
TagsUrl string `json:"tags_url"`
BlobsUrl string `json:"blobs_url"`
GitTagsUrl string `json:"git_tags_url"`
GitRefsUrl string `json:"git_refs_url"`
TreesUrl string `json:"trees_url"`
StatusesUrl string `json:"statuses_url"`
LanguagesUrl string `json:"languages_url"`
StargazersUrl string `json:"stargazers_url"`
ContributorsUrl string `json:"contributors_url"`
SubscribersUrl string `json:"subscribers_url"`
SubscriptionUrl string `json:"subscription_url"`
CommitsUrl string `json:"commits_url"`
GitCommitsUrl string `json:"git_commits_url"`
CommentsUrl string `json:"comments_url"`
IssueCommentUrl string `json:"issue_comment_url"`
ContentsUrl string `json:"contents_url"`
CompareUrl string `json:"compare_url"`
MergesUrl string `json:"merges_url"`
ArchiveUrl string `json:"archive_url"`
DownloadsUrl string `json:"downloads_url"`
IssuesUrl string `json:"issues_url"`
PullsUrl string `json:"pulls_url"`
MilestonesUrl string `json:"milestones_url"`
NotificationsUrl string `json:"notifications_url"`
LabelsUrl string `json:"labels_url"`
ReleasesUrl string `json:"releases_url"`
DeploymentsUrl string `json:"deployments_url"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
PushedAt time.Time `json:"pushed_at"`
GitUrl string `json:"git_url"`
SshUrl string `json:"ssh_url"`
CloneUrl string `json:"clone_url"`
SvnUrl string `json:"svn_url"`
Homepage *string `json:"homepage"`
Size int `json:"size"`
StargazersCount int `json:"stargazers_count"`
WatchersCount int `json:"watchers_count"`
Language *string `json:"language"`
HasIssues bool `json:"has_issues"`
HasProjects bool `json:"has_projects"`
HasDownloads bool `json:"has_downloads"`
HasWiki bool `json:"has_wiki"`
HasPages bool `json:"has_pages"`
ForksCount int `json:"forks_count"`
MirrorUrl interface{} `json:"mirror_url"`
Archived bool `json:"archived"`
Disabled bool `json:"disabled"`
OpenIssuesCount int `json:"open_issues_count"`
License *struct {
Key string `json:"key"`
Name string `json:"name"`
SpdxId string `json:"spdx_id"`
Url *string `json:"url"`
NodeId string `json:"node_id"`
} `json:"license"`
Forks int `json:"forks"`
OpenIssues int `json:"open_issues"`
Watchers int `json:"watchers"`
DefaultBranch string `json:"default_branch"`
Permissions struct {
Admin bool `json:"admin"`
Push bool `json:"push"`
Pull bool `json:"pull"`
} `json:"permissions"`
}
type ResultGithubRepoBranch struct {
Name string `json:"name"`
Commit struct {
Sha string `json:"sha"`
Url string `json:"url"`
} `json:"commit"`
Protected bool `json:"protected"`
Protection struct {
RequiredStatusChecks struct {
EnforcementLevel string `json:"enforcement_level"`
Contexts []string `json:"contexts"`
} `json:"required_status_checks"`
} `json:"protection"`
ProtectionUrl string `json:"protection_url"`
}
type ResultGetGithubHook struct {
Type string `json:"type"`
Id int `json:"id"`
Name string `json:"name"`
Active bool `json:"active"`
Events []string `json:"events"`
Config struct {
ContentType string `json:"content_type"`
InsecureSsl string `json:"insecure_ssl"`
Url string `json:"url"`
} `json:"config"`
UpdatedAt time.Time `json:"updated_at"`
CreatedAt time.Time `json:"created_at"`
Url string `json:"url"`
TestUrl string `json:"test_url"`
PingUrl string `json:"ping_url"`
LastResponse struct {
Code interface{} `json:"code"`
Status string `json:"status"`
Message interface{} `json:"message"`
} `json:"last_response"`
}
================================================
FILE: bean/thirdbean/gitlab.go
================================================
package thirdbean
import "time"
type ResultGitlabRepo struct {
Id int `json:"id"`
Description string `json:"description"`
Name string `json:"name"`
NameWithNamespace string `json:"name_with_namespace"`
Path string `json:"path"`
PathWithNamespace string `json:"path_with_namespace"`
CreatedAt time.Time `json:"created_at"`
DefaultBranch string `json:"default_branch"`
TagList []interface{} `json:"tag_list"`
Topics []interface{} `json:"topics"`
SshUrlToRepo string `json:"ssh_url_to_repo"`
HttpUrlToRepo string `json:"http_url_to_repo"`
WebUrl string `json:"web_url"`
ReadmeUrl string `json:"readme_url"`
AvatarUrl interface{} `json:"avatar_url"`
ForksCount int `json:"forks_count"`
StarCount int `json:"star_count"`
LastActivityAt time.Time `json:"last_activity_at"`
Namespace struct {
Id int `json:"id"`
Name string `json:"name"`
Path string `json:"path"`
Kind string `json:"kind"`
FullPath string `json:"full_path"`
ParentId interface{} `json:"parent_id"`
AvatarUrl string `json:"avatar_url"`
WebUrl string `json:"web_url"`
} `json:"namespace"`
ContainerRegistryImagePrefix string `json:"container_registry_image_prefix"`
Links struct {
Self string `json:"self"`
Issues string `json:"issues"`
MergeRequests string `json:"merge_requests"`
RepoBranches string `json:"repo_branches"`
Labels string `json:"labels"`
Events string `json:"events"`
Members string `json:"members"`
} `json:"_links"`
PackagesEnabled bool `json:"packages_enabled"`
EmptyRepo bool `json:"empty_repo"`
Archived bool `json:"archived"`
Visibility string `json:"visibility"`
Owner struct {
Id int `json:"id"`
Name string `json:"name"`
Username string `json:"username"`
State string `json:"state"`
AvatarUrl string `json:"avatar_url"`
WebUrl string `json:"web_url"`
} `json:"owner"`
ResolveOutdatedDiffDiscussions bool `json:"resolve_outdated_diff_discussions"`
ContainerExpirationPolicy struct {
Cadence string `json:"cadence"`
Enabled bool `json:"enabled"`
KeepN int `json:"keep_n"`
OlderThan string `json:"older_than"`
NameRegex string `json:"name_regex"`
NameRegexKeep interface{} `json:"name_regex_keep"`
NextRunAt time.Time `json:"next_run_at"`
} `json:"container_expiration_policy"`
IssuesEnabled bool `json:"issues_enabled"`
MergeRequestsEnabled bool `json:"merge_requests_enabled"`
WikiEnabled bool `json:"wiki_enabled"`
JobsEnabled bool `json:"jobs_enabled"`
SnippetsEnabled bool `json:"snippets_enabled"`
ContainerRegistryEnabled bool `json:"container_registry_enabled"`
ServiceDeskEnabled bool `json:"service_desk_enabled"`
ServiceDeskAddress string `json:"service_desk_address"`
CanCreateMergeRequestIn bool `json:"can_create_merge_request_in"`
IssuesAccessLevel string `json:"issues_access_level"`
RepositoryAccessLevel string `json:"repository_access_level"`
MergeRequestsAccessLevel string `json:"merge_requests_access_level"`
ForkingAccessLevel string `json:"forking_access_level"`
WikiAccessLevel string `json:"wiki_access_level"`
BuildsAccessLevel string `json:"builds_access_level"`
SnippetsAccessLevel string `json:"snippets_access_level"`
PagesAccessLevel string `json:"pages_access_level"`
OperationsAccessLevel string `json:"operations_access_level"`
AnalyticsAccessLevel string `json:"analytics_access_level"`
EmailsDisabled interface{} `json:"emails_disabled"`
SharedRunnersEnabled bool `json:"shared_runners_enabled"`
LfsEnabled bool `json:"lfs_enabled"`
CreatorId int `json:"creator_id"`
ImportStatus string `json:"import_status"`
OpenIssuesCount int `json:"open_issues_count"`
CiDefaultGitDepth int `json:"ci_default_git_depth"`
CiForwardDeploymentEnabled bool `json:"ci_forward_deployment_enabled"`
PublicJobs bool `json:"public_jobs"`
BuildTimeout int `json:"build_timeout"`
AutoCancelPendingPipelines string `json:"auto_cancel_pending_pipelines"`
BuildCoverageRegex interface{} `json:"build_coverage_regex"`
CiConfigPath string `json:"ci_config_path"`
SharedWithGroups []interface{} `json:"shared_with_groups"`
OnlyAllowMergeIfPipelineSucceeds bool `json:"only_allow_merge_if_pipeline_succeeds"`
AllowMergeOnSkippedPipeline interface{} `json:"allow_merge_on_skipped_pipeline"`
RestrictUserDefinedVariables bool `json:"restrict_user_defined_variables"`
RequestAccessEnabled bool `json:"request_access_enabled"`
OnlyAllowMergeIfAllDiscussionsAreResolved bool `json:"only_allow_merge_if_all_discussions_are_resolved"`
RemoveSourceBranchAfterMerge bool `json:"remove_source_branch_after_merge"`
PrintingMergeRequestLinkEnabled bool `json:"printing_merge_request_link_enabled"`
MergeMethod string `json:"merge_method"`
SuggestionCommitMessage interface{} `json:"suggestion_commit_message"`
AutoDevopsEnabled bool `json:"auto_devops_enabled"`
AutoDevopsDeployStrategy string `json:"auto_devops_deploy_strategy"`
AutocloseReferencedIssues bool `json:"autoclose_referenced_issues"`
ExternalAuthorizationClassificationLabel string `json:"external_authorization_classification_label"`
RequirementsEnabled bool `json:"requirements_enabled"`
SecurityAndComplianceEnabled bool `json:"security_and_compliance_enabled"`
ComplianceFrameworks []interface{} `json:"compliance_frameworks"`
Permissions struct {
ProjectAccess struct {
AccessLevel int `json:"access_level"`
NotificationLevel int `json:"notification_level"`
} `json:"project_access"`
GroupAccess interface{} `json:"group_access"`
} `json:"permissions"`
}
type ResultGitlabRepoBranch struct {
Name string `json:"name"`
Merged bool `json:"merged"`
Protected bool `json:"protected"`
Default bool `json:"default"`
DevelopersCanPush bool `json:"developers_can_push"`
DevelopersCanMerge bool `json:"developers_can_merge"`
CanPush bool `json:"can_push"`
WebUrl string `json:"web_url"`
Commit struct {
AuthorEmail string `json:"author_email"`
AuthorName string `json:"author_name"`
AuthoredDate time.Time `json:"authored_date"`
CommittedDate time.Time `json:"committed_date"`
CommitterEmail string `json:"committer_email"`
CommitterName string `json:"committer_name"`
Id string `json:"id"`
ShortId string `json:"short_id"`
Title string `json:"title"`
Message string `json:"message"`
ParentIds []string `json:"parent_ids"`
} `json:"commit"`
}
type ResultGetGitlabHook struct {
Id int `json:"id"`
Url string `json:"url"`
CreatedAt time.Time `json:"created_at"`
PushEvents bool `json:"push_events"`
TagPushEvents bool `json:"tag_push_events"`
MergeRequestsEvents bool `json:"merge_requests_events"`
RepositoryUpdateEvents bool `json:"repository_update_events"`
EnableSslVerification bool `json:"enable_ssl_verification"`
ProjectId int `json:"project_id"`
IssuesEvents bool `json:"issues_events"`
ConfidentialIssuesEvents bool `json:"confidential_issues_events"`
NoteEvents bool `json:"note_events"`
ConfidentialNoteEvents bool `json:"confidential_note_events"`
PipelineEvents bool `json:"pipeline_events"`
WikiPageEvents bool `json:"wiki_page_events"`
DeploymentEvents bool `json:"deployment_events"`
JobEvents bool `json:"job_events"`
ReleasesEvents bool `json:"releases_events"`
PushEventsBranchFilter string `json:"push_events_branch_filter"`
}
================================================
FILE: bean/trigger.go
================================================
package bean
import "errors"
type TriggerParam struct {
Id string `json:"id"`
PipelineId string `json:"pipelineId"`
Types string `json:"types"`
Name string `json:"name"`
Desc string `json:"desc"`
Params string `json:"params"`
Enabled bool ` json:"enabled"`
}
func (c *TriggerParam) Check() error {
if c.PipelineId == "" {
return errors.New("流水线ID不能为空")
}
if c.Types == "" {
return errors.New("触发器类型不能为空")
}
if c.Name == "" {
return errors.New("触发器名称不能为空")
}
if c.Params == "" {
return errors.New("触发器参数不能为空")
}
return nil
}
================================================
FILE: bean/yml.go
================================================
package bean
import (
"encoding/json"
"errors"
"fmt"
"strings"
)
type Pipeline struct {
Version string `yaml:"version,omitempty" json:"version"`
Triggers map[string]*Trigger `yaml:"triggers,omitempty" json:"triggers"`
Vars map[string]string `yaml:"vars,omitempty" json:"vars"`
Stages []*Stage `yaml:"stages,omitempty" json:"stages"`
}
type Trigger struct {
AutoCancel bool `yaml:"autoCancel,omitempty" json:"autoCancel,omitempty"`
Timeout string `yaml:"timeout,omitempty" json:"timeout,omitempty"`
Branches *Condition `yaml:"branches,omitempty" json:"branches,omitempty"`
Tags *Condition `yaml:"tags,omitempty" json:"tags,omitempty"`
Paths *Condition `yaml:"paths,omitempty" json:"paths,omitempty"`
Notes *Condition `yaml:"notes,omitempty" json:"notes,omitempty"`
CommitMessages *Condition `yaml:"commitMessages,omitempty" json:"commitMessages,omitempty"`
}
type Condition struct {
Include []string `yaml:"include,omitempty" json:"include,omitempty"`
Exclude []string `yaml:"exclude,omitempty" json:"exclude,omitempty"`
}
type Stage struct {
Stage string `yaml:"stage" json:"stage"`
Name string `yaml:"name,omitempty" json:"name"`
DisplayName string `yaml:"displayName,omitempty" json:"displayName"`
Steps []*Step `yaml:"steps,omitempty" json:"steps"`
}
/*type Input struct {
Value string `yaml:"value"`
Required bool `yaml:"required"`
}*/
type Step struct {
Step string `yaml:"step" json:"step"`
DisplayName string `yaml:"displayName,omitempty" json:"displayName"`
Name string `yaml:"name,omitempty" json:"name"`
Input map[string]string `yaml:"input,omitempty" json:"input"`
Env map[string]string `yaml:"env,omitempty" json:"env"`
Commands interface{} `yaml:"commands,omitempty" json:"commands"`
Waits []string `yaml:"wait,omitempty" json:"wait"`
Image string `yaml:"image,omitempty" json:"image"`
Artifacts []*Artifact `yaml:"artifacts,omitempty" json:"artifacts"`
UseArtifacts []*UseArtifacts `yaml:"useArtifacts,omitempty" json:"useArtifacts"`
}
type Artifact struct {
Scope string `yaml:"scope,omitempty" json:"scope"`
Repository string `yaml:"repository,omitempty" json:"repository"`
Name string `yaml:"name,omitempty" json:"name"`
Path string `yaml:"path,omitempty" json:"path"`
}
type UseArtifacts struct {
Scope string `yaml:"scope" json:"scope"` //archive,pipeline,env
Repository string `yaml:"repository" json:"repository"` // archive,制品库ID
Name string `yaml:"name" json:"name"` //archive,pipeline,env
//IsForce bool `yaml:"isForce" json:"isForce"`
IsUrl bool `yaml:"isUrl" json:"isUrl"`
Alias string `yaml:"alias" json:"alias"`
Path string `yaml:"path" json:"path"` //archive,pipeline
FromStage string `yaml:"fromStage" json:"sourceStage"` //pipeline
FromStep string `yaml:"fromStep" json:"sourceStep"` //pipeline
}
func (c *Pipeline) ToJson() ([]byte, error) {
c.ConvertCmd()
return json.Marshal(c)
}
func (c *Pipeline) ConvertCmd() {
for _, stage := range c.Stages {
for _, step := range stage.Steps {
v := step.Commands
switch v.(type) {
case string:
step.Commands = v.(string)
case []interface{}:
ls := make([]string, 0)
for _, v1 := range v.([]interface{}) {
ls = append(ls, fmt.Sprintf("%v", v1))
}
step.Commands = ls
default:
step.Commands = fmt.Sprintf("%v", v)
}
}
}
}
func (c *Pipeline) Check() error {
stages := make(map[string]map[string]*Step)
if c.Stages == nil || len(c.Stages) <= 0 {
return errors.New("stages 为空")
}
for _, v := range c.Stages {
if v.Name == "" {
return errors.New("stages name 为空")
}
if v.Steps == nil || len(v.Steps) <= 0 {
return errors.New("step 为空")
}
if _, ok := stages[v.Name]; ok {
return errors.New(fmt.Sprintf("build stages.%s 重复", v.Name))
}
m := map[string]*Step{}
stages[v.Name] = m
for _, e := range v.Steps {
if strings.TrimSpace(e.Step) == "" {
return errors.New("step 插件为空")
}
if e.Name == "" {
return errors.New("step name 为空")
}
if _, ok := m[e.Name]; ok {
return errors.New(fmt.Sprintf("steps.%s 重复", e.Name))
}
m[e.Name] = e
}
}
return nil
}
//func (c *Pipeline) SkipTriggerRules(events string) bool {
// if events != "manual" {
// return true
// }
//
// if c.Triggers == nil || len(c.Triggers) <= 0 {
// logrus.Error("Triggers is empty")
// return false
// }
// switch events {
// case "push", "pr", "comment":
// default:
// logrus.Debugf("not match action:%v", events)
// return false
// }
// v, ok := c.Triggers[events]
// if !ok {
// logrus.Debugf("not match action: %v", events)
// return false
// }
// if v == nil {
// logrus.Debugf("%v trigger is empty",events)
// return false
// }
// if !skipCommitNotes(v.Notes, pb.Info.Note) {
// return false
// } else if !skipBranch(v.Branches, pb.Info.Repository.Branch) {
// return false
// } else if !skipCommitMessages(v.CommitMessages, pb.Info.CommitMessage) {
// return false
// } else {
// logrus.Debugf("%v skip", c.Name)
// return true
// }
//}
================================================
FILE: bindata.sh
================================================
# go get -u github.com/jteeuwen/go-bindata/...
go-bindata -o comm/migrate.go -pkg=comm -prefix migrates migrates/mysql/ migrates/sqlite/
================================================
FILE: bindui.sh
================================================
go run compressui.go
================================================
FILE: build.sh
================================================
export CGO_ENABLED=0
go build -o ../bin/gokins main.go
================================================
FILE: cmd/cmd.go
================================================
package cmd
import (
"github.com/gokins/core"
"github.com/gokins/gokins/comm"
"github.com/gokins/gokins/server"
hbtp "github.com/mgr9525/HyperByte-Transfer-Protocol"
"gopkg.in/alecthomas/kingpin.v2"
"os"
"os/exec"
"os/signal"
"syscall"
)
const Version = "0.1.1"
var app = kingpin.New("gokins", "A golang workflow application.")
func Run() {
regs()
kingpin.Version(Version)
kingpin.MustParse(app.Parse(os.Args[1:]))
}
func regs() {
app.Flag("web", "gokins web host").Default(":8030").StringVar(&comm.WebHost)
//app.Flag("hbtp", "gokins hbtp host").Default(":8031").StringVar(&comm.HbtpHost)
app.Flag("workdir", "gokins work path").Short('w').StringVar(&comm.WorkPath)
app.Flag("nupass", "can't update password").Hidden().BoolVar(&comm.NotUpPass)
cmd := app.Command("run", "run process").Default().
Action(run)
cmd.Flag("debug", "debug log show").BoolVar(&core.Debug)
cmd = app.Command("daemon", "run process background").
Action(start)
}
func getArgs() []string {
args := make([]string, 0)
args = append(args, "run")
if comm.WebHost != "" {
args = append(args, "--web")
args = append(args, comm.WebHost)
}
/*if comm.HbtpHost != "" {
args = append(args, "--hbtp")
args = append(args, comm.HbtpHost)
}*/
if comm.WorkPath != "" {
args = append(args, "--workdir")
args = append(args, comm.WorkPath)
}
if comm.NotUpPass {
args = append(args, "--nupass")
}
return args
}
func start(pc *kingpin.ParseContext) error {
args := getArgs()
fullpth, err := os.Executable()
if err != nil {
return err
}
println("start process")
cmd := exec.Command(fullpth, args...)
err = cmd.Start()
if err != nil {
return err
}
return nil
}
func run(pc *kingpin.ParseContext) error {
csig := make(chan os.Signal, 1)
signal.Notify(csig, os.Interrupt, syscall.SIGALRM)
go func() {
s := <-csig
hbtp.Debugf("get signal(%d):%s", s, s.String())
comm.Cancel()
}()
if core.Debug {
hbtp.Debug = true
}
return server.Run()
}
================================================
FILE: comm/app.go
================================================
package comm
import (
"context"
"github.com/boltdb/bolt"
"github.com/gin-gonic/gin"
hbtp "github.com/mgr9525/HyperByte-Transfer-Protocol"
"xorm.io/xorm"
)
var (
Ctx context.Context
cncl context.CancelFunc
)
var (
Cfg = Config{}
Db *xorm.Engine
BCache *bolt.DB
WebEgn *gin.Engine
HbtpEgn *hbtp.Engine
IsMySQL = false
Installed = false
NotUpPass = false
WorkPath = ""
WebHost = ""
//HbtpHost = ""
)
func init() {
Ctx, cncl = context.WithCancel(context.Background())
}
func Cancel() {
if cncl != nil {
cncl()
}
}
================================================
FILE: comm/cache.go
================================================
package comm
import (
"bytes"
"encoding/json"
"errors"
"github.com/boltdb/bolt"
hbtp "github.com/mgr9525/HyperByte-Transfer-Protocol"
"github.com/sirupsen/logrus"
"time"
)
var mainCacheBucket = []byte("mainCacheBucket")
func CacheSet(key string, data []byte, outm ...time.Duration) error {
if BCache == nil {
return errors.New("cache not init")
}
err := BCache.Update(func(tx *bolt.Tx) error {
var err error
bk := tx.Bucket(mainCacheBucket)
if bk == nil {
bk, err = tx.CreateBucket(mainCacheBucket)
if err != nil {
return err
}
}
if data == nil {
return bk.Delete([]byte(key))
}
buf := &bytes.Buffer{}
var outms []byte
if len(outm) > 0 {
outms = []byte(time.Now().Add(outm[0]).Format(time.RFC3339Nano))
} else {
outms = []byte(time.Now().Add(time.Hour).Format(time.RFC3339Nano))
}
buf.Write(hbtp.BigIntToByte(int64(len(outms)), 4))
buf.Write(outms)
buf.Write(data)
return bk.Put([]byte(key), buf.Bytes())
})
return err
}
func CacheSets(key string, data interface{}, outm ...time.Duration) error {
if BCache == nil {
return errors.New("cache not init")
}
if data == nil {
return CacheSet(key, nil)
}
bts, err := json.Marshal(data)
if err != nil {
return err
}
return CacheSet(key, bts, outm...)
}
func parseCacheData(bts []byte) []byte {
if bts == nil {
return nil
}
ln := int(hbtp.BigByteToInt(bts[:4]))
tms := string(bts[4 : ln+4])
outm, err := time.Parse(time.RFC3339Nano, tms)
if err != nil {
return nil
}
if time.Since(outm).Milliseconds() < 0 {
return bts[4+ln:]
}
return nil
}
var KeyNotFoundErr = errors.New("key not found")
var KeyOutTimeErr = errors.New("key is timeout")
func CacheGet(key string) ([]byte, error) {
if BCache == nil {
return nil, errors.New("cache not init")
}
var rt []byte
err := BCache.View(func(tx *bolt.Tx) error {
bk := tx.Bucket(mainCacheBucket)
if bk == nil {
return KeyNotFoundErr
}
bts := bk.Get([]byte(key))
if bts == nil {
return KeyNotFoundErr
}
rt = parseCacheData(bts)
if rt == nil {
bk.Delete([]byte(key))
return KeyOutTimeErr
}
return nil
})
if time.Since(mainCacheClearTime).Hours() > 30 {
go mainCacheClear()
}
return rt, err
}
func CacheGets(key string, data interface{}) error {
if BCache == nil {
return errors.New("cache not init")
}
if data == nil {
return errors.New("data not be nil")
}
bts, err := CacheGet(key)
if err != nil {
return err
}
return json.Unmarshal(bts, data)
}
func CacheFlush() error {
if BCache == nil {
return errors.New("cache not init")
}
err := BCache.Update(func(tx *bolt.Tx) error {
return tx.DeleteBucket(mainCacheBucket)
})
return err
}
var mainCacheClearTime time.Time
func mainCacheClear() {
defer func() {
if err := recover(); err != nil {
logrus.Errorf("mainCacheClear recover err:%v", err)
}
}()
if BCache == nil {
return
}
/*if time.Now().Hour()!=3|| time.Since(mainCacheClearTime).Hours() < 30 {
return
}*/
mainCacheClearTime = time.Now()
/*if err := CacheFlush(); err != nil {
logrus.Errorf("mainCacheClear err:%v", err)
}*/
err := BCache.Update(func(tx *bolt.Tx) error {
bk := tx.Bucket(mainCacheBucket)
if bk == nil {
return nil
}
bk.ForEach(func(k, v []byte) error {
data := parseCacheData(v)
if data == nil {
return bk.Delete(k)
}
return nil
})
return nil
})
if err != nil {
logrus.Errorf("mainCacheClear err:%v", err)
}
}
================================================
FILE: comm/config.go
================================================
package comm
type Config struct {
Server struct {
Host string `yaml:"host"` //外网访问地址
LoginKey string `yaml:"loginKey"`
RunLimit int `yaml:"runLimit"`
HbtpHost string `yaml:"hbtpHost"`
Secret string `yaml:"secret"`
Shells []string `yaml:"shells"`
DownToken string `yaml:"DownToken"`
} `yaml:"server"`
Datasource struct {
Driver string `yaml:"driver"`
Url string `yaml:"url"`
} `yaml:"datasource"`
}
================================================
FILE: comm/db.go
================================================
package comm
import (
"errors"
"fmt"
"reflect"
"strings"
"github.com/gokins/gokins/bean"
"xorm.io/builder"
"xorm.io/xorm"
)
type SesFuncHandler = func(ses *xorm.Session)
func findCount(cds builder.Cond, data interface{}) (int64, error) {
if data == nil {
return 0, errors.New("needs a pointer to a slice")
}
of := reflect.TypeOf(data)
if of.Kind() == reflect.Ptr {
of = of.Elem()
}
if of.Kind() == reflect.Slice {
sty := of.Elem()
if sty.Kind() == reflect.Ptr {
sty = sty.Elem()
}
pv := reflect.New(sty)
ses := Db.NewSession()
defer ses.Close()
return ses.Where(cds).Count(pv.Interface())
}
return 0, errors.New("GetCount err : not found any data")
}
func FindPage(ses *xorm.Session, ls interface{}, page int64, size ...int64) (*bean.Page, error) {
count, err := findCount(ses.Conds(), ls)
if err != nil {
return nil, err
}
return findPages(ses, ls, count, page, size...)
}
func findPages(ses *xorm.Session, ls interface{}, count, page int64, size ...int64) (*bean.Page, error) {
var pageno int64 = 1
var sizeno int64 = 10
var pagesno int64 = 0
//var count=c.FindCount(pars)
if page > 0 {
pageno = page
}
if len(size) > 0 && size[0] > 0 {
sizeno = size[0]
}
start := (pageno - 1) * sizeno
err := ses.Limit(int(sizeno), int(start)).Find(ls)
if err != nil {
return nil, err
}
pagest := count / sizeno
if count%sizeno > 0 {
pagesno = pagest + 1
} else {
pagesno = pagest
}
return &bean.Page{
Page: pageno,
Pages: pagesno,
Size: sizeno,
Total: count,
Data: ls,
}, nil
}
func FindPages(gen *bean.PageGen, ls interface{}, page int64, size ...int64) (*bean.Page, error) {
var count int64
counts := "count(*)"
if gen.CountCols != "" {
counts = fmt.Sprintf("count(%s)", gen.CountCols)
}
sqls := strings.Replace(gen.SQL, "{{select}}", counts, 1)
sqls = strings.Replace(sqls, "{{limit}}", "", 1)
_, err := Db.SQL(sqls, gen.Args...).Get(&count)
if err != nil {
return nil, err
}
var pageno int64 = 1
var sizeno int64 = 10
var pagesno int64 = 0
//var count=c.FindCount(pars)
if page > 0 {
pageno = page
}
if len(size) > 0 && size[0] > 0 {
sizeno = size[0]
}
start := (pageno - 1) * sizeno
starts := ""
if start > 0 {
starts = fmt.Sprintf("%d,", start)
}
ses := Db.NewSession()
defer ses.Close()
sqls = strings.Replace(gen.SQL, "{{select}}", gen.FindCols, 1)
if strings.Contains(sqls, "{{limit}}") {
sqls = strings.Replace(sqls, "{{limit}}", fmt.Sprintf("LIMIT %s%d", starts, sizeno), 1)
} else {
sqls += fmt.Sprintf("\nLIMIT %s%d", starts, sizeno)
}
err = ses.SQL(sqls, gen.Args...).Find(ls)
if err != nil {
return nil, err
}
pagest := count / sizeno
if count%sizeno > 0 {
pagesno = pagest + 1
} else {
pagesno = pagest
}
return &bean.Page{
Page: pageno,
Pages: pagesno,
Size: sizeno,
Total: count,
Data: ls,
}, nil
}
================================================
FILE: comm/migrate.go
================================================
package comm
import (
"bytes"
"compress/gzip"
"fmt"
"io"
"strings"
)
func bindata_read(data []byte, name string) ([]byte, error) {
gz, err := gzip.NewReader(bytes.NewBuffer(data))
if err != nil {
return nil, fmt.Errorf("Read %q: %v", name, err)
}
var buf bytes.Buffer
_, err = io.Copy(&buf, gz)
gz.Close()
if err != nil {
return nil, fmt.Errorf("Read %q: %v", name, err)
}
return buf.Bytes(), nil
}
var _mysql_000001_gokins_down_sql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xd1\xcd\x4a\x04\x31\x0c\xc0\xf1\xbb\x4f\xd1\xf7\xd8\x93\xe2\x0a\x0b\x82\xe2\xee\xc1\x5b\x26\x76\x33\x25\x4c\xbf\x48\xd3\x81\x79\x7b\x19\x41\xf6\x96\xce\xf9\xff\xa3\x24\xe9\xeb\xd7\xc7\xa7\xbb\x3d\xbf\xbc\x9f\xdd\xe5\xcd\x9d\xbf\x2f\xd7\xdb\xd5\x4d\x0a\x28\xca\x33\x7a\x85\x8a\x7e\xc1\x40\xd3\xe9\x69\x48\x57\x92\xc6\x25\x1f\xa0\x45\x36\x43\xfd\x74\x8e\x77\xa3\xfb\x74\x87\xc8\xd9\x9a\xa9\xa9\x3d\x73\x53\xaa\x46\x56\xe1\x10\x48\xc6\x02\xa4\x5b\xfb\x26\x6a\xcd\x1e\xa4\x48\xb0\x2b\x54\xae\xd6\x03\x7b\x1e\x1c\xe3\x9f\x80\x2f\x79\x3e\xe2\x56\xb4\x56\x7f\xb0\xe1\x7f\x57\x14\x4c\x46\xef\xcd\x3c\xf2\x9e\x81\xf3\x5c\x46\xc6\xbe\xe2\x1f\x49\x6d\x48\xb4\x2c\x64\x6d\xb3\xa5\x08\x35\xf6\xc0\x23\xa4\x94\x6a\x44\xa5\xe9\xf4\x1b\x00\x00\xff\xff\x07\x37\xa2\xca\x5f\x03\x00\x00")
func mysql_000001_gokins_down_sql() ([]byte, error) {
return bindata_read(
_mysql_000001_gokins_down_sql,
"mysql/000001_gokins.down.sql",
)
}
var _mysql_000001_gokins_up_sql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xdd\x6e\x1b\xc7\x15\xbe\xd7\x53\x0c\x92\x02\xa4\x00\x2b\x21\x65\xcb\xb5\x55\x04\xa8\x6c\xb3\x0e\x51\x9b\x2a\x64\xba\x4d\x00\x03\xe4\x70\x77\x44\x6e\xb4\x3b\xb3\x98\x1d\x52\x16\xd0\x0b\x09\xad\x5b\xb9\x6e\x61\xbb\x71\x62\x1b\x6e\xda\x0a\x06\xe2\x04\x71\x22\x17\x70\x55\x83\x92\xeb\x87\x89\x96\x94\xaf\xf2\x0a\xc5\xec\x2e\xc5\xfd\xe5\xcc\x52\x4b\xc5\x45\xc2\x1b\x49\x3b\x67\x86\x33\xe7\x7c\xe7\x9b\xf3\x9d\xd5\xf9\xa5\xd2\x42\xb5\x04\xaa\x0b\xe7\x2e\x95\x40\x9d\xd5\x20\x65\xda\x32\x54\x58\xcd\x84\xca\x0a\x6c\xa2\x3a\xc8\x4f\x01\x50\xd7\xd4\x3a\xe8\x40\xaa\xb4\x20\xcd\x9f\x3e\x35\x0d\x2a\x8b\x55\x50\xb9\x7a\xe9\xd2\x09\x3e\x08\xf9\x68\x43\x6b\x6a\x98\xe5\x67\x0b\xc3\x41\xb0\x70\xb5\xba\x58\x2b\x57\xce\x2f\x95\x2e\x97\x2a\x55\xc7\x96\x22\x93\xd4\xc2\xab\x5d\x28\xfd\x62\xe1\xea\x25\xdf\x8a\x18\x1a\x68\x68\x52\x2c\x14\x62\x6c\x54\xcd\x32\x75\xb8\x56\x0b\xda\xce\xce\xcd\xc5\xd9\x22\x4b\x19\xda\xcc\xc5\xae\xa7\x50\x04\x19\x52\xeb\x40\x85\x0c\x31\xcd\x40\x51\x93\xb6\xa9\x8a\x4c\x54\xa4\x23\xc7\x84\x3b\xa3\x18\xbb\x15\xc7\xa0\xc6\xa7\x8f\x58\xe8\x57\x4b\xe5\xcb\x0b\x4b\x1f\x82\x5f\x96\x3e\x04\x79\xc7\xc3\x27\x9c\x28\x4c\xf3\x41\xfe\xb0\x6e\x72\x2f\xe6\x0f\x1d\x3a\x1c\xa0\x26\x36\xfc\x23\x27\x3c\x7f\x4e\x4f\x4d\x83\x52\xe5\x62\xb9\x52\x02\xef\x81\x32\xc6\xe4\xc2\xb9\xc3\xaf\x3d\xff\xfe\xc2\xd2\x95\x52\x15\xbc\x07\xda\x6c\xf9\x8c\xd1\x38\xf5\xb3\xa9\x44\x64\x74\x10\xb5\x34\x82\xbf\x1f\x64\x78\xb0\xcc\x06\x42\x87\x27\x19\x6d\x66\xb5\xa0\x10\x8c\x12\x00\x33\x29\xea\x68\x68\x35\x19\x1a\x99\x20\x50\x0c\x9c\x09\xe3\x83\xd0\xb5\xac\xa1\xd1\x16\x46\x9b\xd0\xa6\x18\x12\x9a\x8a\x30\xd3\x96\x35\x44\xfd\xa1\x12\x62\x67\x36\x89\x7e\x60\x43\x8f\xc9\xf4\x5c\x21\x07\xce\x2f\x5e\xe6\x9b\x07\xb9\xde\x83\x6d\xfb\xce\xe7\xf6\xcb\xbf\xf6\xb6\x1e\xe7\x8b\xee\xcf\xdf\x16\x7a\x5f\x3f\xb6\x5f\xbc\x98\xce\xb9\xe8\x22\x6d\xaa\x20\xc1\x8e\x64\xf0\xa5\x93\x26\x11\x11\xe1\xff\x09\xc9\x81\xab\x57\xca\x95\x8b\xe0\x5c\x75\xa9\x54\x3a\x1a\x2a\x1b\x6d\x4d\x57\x65\xf0\x68\x6a\x26\xd2\x35\x1c\x65\x16\x07\x94\xd1\x64\x1e\x98\x7b\x1c\x22\x39\xcd\x62\x90\xb5\xad\x10\x9b\x44\x4c\x7d\xf8\xf9\xfb\xef\xed\xdd\x6e\xff\x4f\x3b\xbd\xf5\x0d\x17\x2e\x88\x52\x42\x43\x50\x18\xb1\xc0\xeb\x7b\x0f\x0f\xb6\xb7\xf7\x5f\x6d\xf5\x36\xb6\xbd\x05\x3a\x08\x33\xf9\x1d\xec\x77\x6f\xed\xef\xee\xe4\x06\xbb\xa7\x01\x68\xe4\x47\xcf\xb5\xf7\xd6\xed\x27\xb7\x7a\xf7\x77\x5e\xdf\x7f\xee\xae\xb0\xac\x61\xcd\x6a\xa5\x58\xa2\xbf\xfb\x71\xef\xb3\x7f\xf8\x97\x88\x40\x58\xb4\x89\xcd\x47\xf6\x6e\xd7\xbf\x42\x04\xe1\x82\x15\x7a\x8f\x9e\xf7\x3e\x7d\xe6\x5f\x21\x72\x71\x38\xd9\x36\xea\x18\x37\x37\x7b\x7f\x7b\x9a\x8b\x82\x3e\x5b\xb4\x2b\x86\x5a\xe3\xa8\x94\x01\x7c\x93\x92\xb6\x29\x09\x5b\x27\x8b\xa4\x21\x8e\x64\x97\x0d\x67\xc3\x5c\x5c\x1c\x5c\x46\x6e\x1b\x1e\xdb\x14\x93\x4c\x14\xa2\x22\xb1\x0d\x66\x0e\xfa\x19\xba\xce\x46\xb0\x62\x2c\x20\x52\xa4\x40\x1a\xac\x4f\x1a\x13\x16\x93\x2c\xe3\xd3\x53\x9a\x2f\x45\xfe\xbd\xd1\x7b\xf6\xbc\xdf\x7d\xa5\xa9\xb9\x31\x10\xf3\xbd\x93\x62\x8c\x88\x18\x45\x29\x77\xfe\x62\x7f\x7d\x3f\x27\x92\x21\x47\x41\xd0\x0f\x80\x44\x2d\x42\x99\x28\x61\x3d\xf0\x8a\xdd\x3a\xd9\x0c\x42\xa6\x4c\x02\xa5\xc4\x7c\x48\xc5\x08\x51\x1f\x4e\xb1\xd4\xc8\xcb\x34\xc1\x5d\xa7\xc8\xe1\xfd\xa8\xd9\x3d\x7e\xc5\x82\xae\x6b\xac\x26\xb8\x19\x7c\xbc\xb0\xbe\x6e\xff\xb1\xdb\xff\xe7\x64\x58\x45\xb4\x6f\x3f\xab\xfc\x48\x12\x19\x54\x5a\x3c\x80\x5a\x13\x13\x2a\x51\x17\x18\x06\xc4\xaa\x15\x2e\x0c\x56\xa1\xc6\xac\x3a\xf8\xc8\x22\xd8\x07\x68\x31\x6f\x4d\x92\x8d\x18\xd5\x9a\x4d\x2e\x61\x8f\x5b\x63\x27\x2b\x24\xff\x77\xb2\x35\x13\x59\xa9\xf4\xb5\x4c\x47\x25\x5e\xcd\x9a\x90\x42\x63\x10\x9f\xc8\x28\xc2\xf1\x02\xfd\xb8\xfb\x2d\x6d\xb7\x51\xc7\x7f\x1c\xb1\xc5\xe2\x85\xbe\x46\xdb\x99\x77\xdf\xd8\xa8\xf0\x0f\xb3\xeb\xe0\xc9\xe7\xf6\xed\xbb\xf6\xc3\x2f\xca\x17\x72\x87\xa0\x48\xbc\x4f\xa2\x1d\x18\xbc\x4c\x92\xe3\x15\xa4\xdb\x71\x1b\x18\xe2\x80\x30\x37\x20\xec\xe8\x01\x31\x90\x65\xa5\x69\x92\x9f\x2b\x5f\x2c\x57\xaa\xe9\xf2\x70\x14\xe1\xde\xbe\xfb\x7a\x7d\xe3\x60\xfd\xc6\x77\x7b\x9b\xf6\xed\xed\xfe\x97\xdd\xef\xf6\x6e\xe6\xbc\x78\x32\x5d\xae\x2a\x38\xd4\x44\x3a\xc1\xcd\x20\xfd\xc5\xe4\x72\xc2\x1a\xf2\x02\xca\x83\x40\xf0\x8b\xda\x54\x17\xdd\xb3\xc7\xd4\x2f\x22\xb4\x79\xbc\xd1\x4c\x6a\x38\xc6\x1b\xba\xac\x58\x2d\x7d\x50\x4d\xaa\xf1\xda\x0d\x5d\x53\xea\xa0\x5c\xa9\xe6\xc3\xb7\x53\xc1\x87\x9c\x1b\x4f\xed\xbd\xf5\x37\xe7\x9a\x0f\x77\x14\x83\xfb\x1e\xd1\x53\x94\x94\xd4\x09\x58\xe1\x86\xe5\xca\x85\xd2\x07\x6e\xa4\x3c\x92\xce\x14\x4d\x35\xce\x90\x1e\xa4\xd2\x10\x72\x5c\x47\x3b\xb9\xac\x4f\x55\xca\xdf\xdb\xd9\xdf\xdd\xd9\xef\x76\xd3\x84\x7f\x4c\x70\x45\xa3\x90\xe4\x7f\xef\xbc\xf9\xc1\x2f\x19\x46\x61\x50\xb8\xc8\x24\xb6\xb8\x0c\x92\x7a\xdf\x98\xe2\xdd\xe4\x61\x59\xc5\xd9\x36\x83\xfe\x7d\x52\x73\x3e\x57\xc8\x8d\xdf\x9b\x9f\x4c\x40\x6a\x0a\xc1\xcb\xfe\xdc\x90\x49\x0c\xb9\x32\x34\x70\xa3\xc4\xfb\x12\x2a\x0a\xb2\xac\x1a\x23\x2b\x28\xac\x2f\x22\xb6\x6b\x86\x5e\x8b\x5c\x94\xee\x17\x59\x88\x4a\x84\x59\x90\x08\x19\xf9\x33\xc5\xab\x59\x09\xa0\xb7\x8d\x06\xd7\x19\x3e\xc2\x1a\xa5\xd8\x7b\x4f\xb7\x7a\x9f\x3c\xf3\x29\xf6\xb0\xe6\x1f\xa5\xd6\xcd\xb6\xd5\xfa\x76\x7d\xc3\xa4\xdf\xae\x6f\x60\xc2\x90\xa7\x82\xfd\x2f\x5e\x05\xd9\x93\x2a\xd5\xc6\xca\x4f\xa1\xc3\xe2\xb5\xaa\xb8\xe0\x4a\x9d\xd9\x4c\xc3\x6b\x09\xd9\x6d\xd2\x9a\x20\x6e\x8e\x99\xf3\xee\x57\xd1\x09\x46\x35\x71\xa6\x4c\x94\x0a\xb8\x84\x1b\xe3\x7a\x94\x69\xad\xa4\x2c\x84\x55\xc8\x60\xb8\x30\xe5\x81\xb0\xc6\xaa\x36\x32\xf4\x11\xa7\x98\x2c\x8b\x52\x69\xdf\x99\xd0\xb2\xa4\x5c\x87\x35\x65\x45\x6a\x45\xd8\x81\x0c\x0a\x7b\x6a\x69\xeb\x12\x9d\x34\x35\x2c\x5b\x18\xd6\xa1\xc2\xb4\x0e\x4a\xba\x1f\x27\xa0\x31\x66\x66\xc0\xcc\x88\xcf\x54\xb9\x72\xa5\xb4\x54\xe5\x55\xd5\xa2\x83\x39\x37\xe0\x53\xbf\x5e\xb8\x74\xb5\x74\x65\x0a\x38\x91\x07\xe0\x2d\xa8\x1a\x1a\x7e\xeb\x84\xf3\x47\xd1\xfd\x91\x6b\x92\x15\x0d\x5b\x39\xef\x2f\x54\x2c\x40\x55\x39\x79\xf6\xd4\xd9\x06\x9c\x3b\x0b\x1b\x0d\x34\x77\x1a\x15\xe6\x7e\xba\x3c\x5b\x58\x3e\x73\xe6\x24\x1a\xd8\xf5\xbf\xd9\xea\xdf\xf9\x83\x7d\xf7\x81\xf7\x60\xe0\x1a\x00\x2a\x8b\xbf\xc9\x4f\x87\x1f\x16\xa7\x00\x98\x16\x1f\x03\x80\x38\xe0\xd6\xb8\xe0\xab\x7b\x67\x18\x89\x5f\x0e\xb8\x16\xc1\xa2\xce\x10\xbf\x5e\x0c\xa8\xe9\x82\x7f\xd0\x00\xa0\xde\xd0\x28\x6b\xa9\x70\x6d\x04\xa7\x3a\x54\x68\x40\xba\xe2\x26\xfe\x60\x1b\x88\x1a\x5e\xd6\x25\xf4\x8e\x06\x46\x8e\x5c\x14\xd8\xb8\x02\x20\xd1\x28\xca\xae\xdc\xdd\x47\xe5\x8b\xa1\x90\x4d\x47\xac\xd2\x9a\x35\x8d\x44\x49\x95\xcd\x03\xb7\x41\xd5\x10\x2a\x8d\x30\x90\xdd\x99\x74\x55\x3c\x71\xef\xd3\x83\xff\xde\xed\x7d\xf6\xbb\xd7\x0f\xef\x04\xe6\xa2\xeb\x48\x2c\x70\x7a\x37\x9f\x1c\x6c\xfd\x39\x66\xb6\x4a\x56\x71\x6c\xa8\x7d\xf5\xce\x8b\x5b\x07\x2f\x5f\xda\x9b\x3b\xf6\xc7\x1b\x81\x15\x24\xa4\x92\x48\xac\x06\x6c\x48\xa2\x9a\x0a\x2e\x45\x0e\xd7\x3a\x01\xe2\xc5\x57\x16\x70\x34\xac\x10\x1c\xc5\xf7\x54\xca\x66\x58\x50\xd6\x02\x50\x37\xac\x09\xc1\x93\x22\xa8\x32\x43\xce\x76\xf0\xf6\x2b\xf6\x75\x41\xc1\x33\x12\x77\x3f\xd2\xf7\x3f\x32\x01\x54\x26\xa1\xf7\x04\xd6\xf8\x5c\xe4\xb7\x4e\x70\x73\x50\x3b\x27\x36\x2a\x39\x69\x99\x08\x8b\x5f\xbb\x7a\xc6\xb2\xaf\x56\x23\x25\xd0\x48\x53\xf9\x22\x28\xa2\x52\x0f\xab\xd3\x78\x5c\x2e\x53\x64\xb5\xa4\x6c\xd1\x75\x53\xa3\xc8\xaa\x69\x38\xd9\xbf\x85\x90\xad\x34\xf2\x86\x3b\x91\x9e\x91\x2a\x01\x9d\x03\x86\x9b\xc8\x0e\x5a\x62\x9a\xcb\x13\x60\x56\x17\x42\xf9\xc1\x2f\x99\xa6\xcc\x50\xcb\x43\x9a\xd5\x05\x1e\x77\xc5\xca\xaa\x5a\xb9\x8e\x17\x57\xbf\x50\x6f\x4b\x98\xb9\xe5\x56\x58\x56\xc4\xed\xd0\x6b\x36\x8e\xfa\xf7\x5a\x5f\xa7\x51\xac\xc1\x8e\x18\x98\x35\x43\xaf\x99\x7a\xbb\xa9\x8d\xcb\x65\x41\x37\x26\xf8\x3a\xb1\xd1\x24\xee\xec\xc9\xf7\xf6\x32\xf7\x55\x44\xc1\xf8\x9c\x15\xd6\x31\x03\xe9\x62\xb5\x06\x72\x04\x38\x9f\x19\x60\x31\x64\xce\x03\xab\x85\x74\xfd\xe7\x56\xeb\x1a\x06\xde\xc7\xeb\xd6\x54\xa0\x81\xf8\xf0\x70\x00\x47\x9e\x0c\x5e\xe4\xcf\x0f\x1f\xf1\x95\x91\xd2\x22\x80\xaf\x4b\xc0\x2a\xa1\xba\xea\x7d\x73\x61\xa8\x74\x5c\x89\x93\xe6\x1c\xb3\xde\xee\x1b\x70\xf4\x49\xf8\x78\xc2\x59\x82\x43\x38\xe6\xd9\x31\x9e\xe7\xa4\x77\x06\x93\xac\x22\xea\x6c\x7d\xd4\xa9\x86\x56\x09\x67\x8b\x33\xc0\x89\x23\xe9\xce\x59\x3c\xca\x39\x4f\x0d\xf0\x27\x00\xa0\xd5\xba\x46\x93\x30\x18\x1c\xc3\x71\x0f\x35\x6c\xb6\xd9\xbc\xff\x09\x00\x2d\x62\xb1\x79\xa0\x13\x05\xea\xce\xaf\xb3\xb3\x00\xbc\xdd\xff\x6a\xdb\xbe\xfd\xd8\x7e\x75\xc3\xde\xfa\x2a\x68\xce\xab\xa7\x79\x40\x09\x61\xc1\xe7\x26\xb4\xac\x79\x50\x9c\x3d\x79\x6a\xee\x74\x70\x64\x95\xd0\x15\xcb\x84\x0a\x9a\x07\xef\xf2\x79\xef\x32\x64\x31\xf0\xf6\xfe\x8b\x6e\xff\xcb\xae\xfd\xec\x5f\xbd\x07\xdb\xe0\x27\xef\x2f\x5e\x2e\x81\xfe\xbd\x2f\x7a\x9b\xff\xe9\x3f\xfa\xc6\x7e\xf9\x89\x7f\x8d\x61\x20\xe8\x78\x90\x8b\xa3\x4d\x86\x0c\x53\x87\x0c\xfd\x48\x9c\x52\xc4\x79\xe8\x2e\x9f\xb7\xfc\xae\x88\x39\x71\xe8\xa0\x71\xa7\xe2\x5b\x4b\xe2\xe2\x8b\x44\x87\xb8\x39\x48\x07\xaf\x8f\x3d\x0f\x8a\xef\x14\xae\xe1\x0e\xa4\x3c\x2d\x9d\x7f\x58\x74\xf3\x93\x27\x0a\x6c\x22\x2f\x57\x83\x8c\xd6\xd6\x74\xd5\x7d\x8e\xc3\x0f\x78\x76\x0d\x13\x5c\x92\xee\x9b\x64\xc6\x59\x62\xa6\x18\x21\xca\xe1\xca\xfc\x83\x70\x67\x5e\xc8\x27\x4d\xe2\x4e\x03\x06\xd4\xf0\x3b\x4d\x32\xee\x66\x66\xc3\x9b\xe1\x79\x96\x7e\x2f\x4e\x76\xce\x74\xae\xe1\x54\xfc\x7d\x7c\xf0\x18\x5c\x71\x97\x61\x07\xe1\x37\x11\x1d\x1f\xc1\x0e\xcc\x12\x1f\x46\x07\x03\x45\x47\x10\x47\x1f\x6b\xfc\x8c\xc3\x2b\x2b\xfd\x06\xb3\xc0\x0c\xdf\x88\x07\x9a\x37\x14\x32\x83\x2a\xa2\x62\x1a\x6f\x22\x60\xb0\x69\x64\x89\x17\x6c\x1a\xc1\x79\xa9\xb7\x11\x41\x85\x23\x7b\xfc\x13\xa5\x37\xe2\xcd\x04\x09\xc8\xf8\x5f\x00\x00\x00\xff\xff\x73\x4b\x5a\xf3\xea\x3d\x00\x00")
func mysql_000001_gokins_up_sql() ([]byte, error) {
return bindata_read(
_mysql_000001_gokins_up_sql,
"mysql/000001_gokins.up.sql",
)
}
var _sqlite_000001_gokins_down_sql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x72\x09\xf2\x0f\x50\x08\x71\x74\xf2\x71\x55\xf0\x74\x53\x70\x8d\xf0\x0c\x0e\x09\x56\x48\x28\x89\x4f\x2a\xcd\xcc\x49\x49\xb0\x06\x04\x00\x00\xff\xff\xaa\x8a\x92\x63\x1f\x00\x00\x00")
func sqlite_000001_gokins_down_sql() ([]byte, error) {
return bindata_read(
_sqlite_000001_gokins_down_sql,
"sqlite/000001_gokins.down.sql",
)
}
var _sqlite_000001_gokins_up_sql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xd1\xcf\x4a\xc4\x30\x10\xc7\xf1\xfb\x3e\xc5\x1c\x15\x7c\x03\x4f\xd1\x1d\x61\x31\xbb\x4a\xc9\x82\x7b\x6a\xa2\x19\x75\xa0\xcd\x86\xcc\xb4\xcf\x2f\xc5\x3f\x28\x36\xa5\xe7\xdf\x87\x84\x2f\x73\xdb\xa0\x71\x08\xce\xdc\x58\x04\xaf\xed\xf3\xc0\x5d\xf4\x70\xb1\x01\xf0\x1c\x3d\x38\x7c\x72\x70\x78\x70\x70\x38\x5a\x0b\x8f\xcd\x6e\x6f\x9a\x13\xdc\xe3\xe9\x6a\x12\x99\x33\x75\x9c\xa8\xfd\xa1\x5b\xbc\x33\x47\xfb\xc9\xff\x92\x91\x8a\xf0\x39\x2d\x50\xd1\xa0\x83\xd4\x56\x2a\xe5\x5c\xaa\xe3\x48\x49\x6b\xa3\x72\x4f\xad\x68\xe8\xb3\x87\xad\x71\xe8\x76\x7b\x9c\x53\xda\xd1\x77\xf0\x14\xfb\x4f\xf4\x24\x12\xde\x96\x8d\x68\x28\x4a\xf1\xd7\x47\xf3\xee\x95\x13\xcb\xfb\x0a\xf8\x52\x28\xac\x79\x70\xc8\x71\x95\xfb\x3a\x43\x2d\x62\x73\x79\xfd\x11\x00\x00\xff\xff\x55\x1f\xab\xd7\x13\x02\x00\x00")
func sqlite_000001_gokins_up_sql() ([]byte, error) {
return bindata_read(
_sqlite_000001_gokins_up_sql,
"sqlite/000001_gokins.up.sql",
)
}
// Asset loads and returns the asset for the given name.
// It returns an error if the asset could not be found or
// could not be loaded.
func Asset(name string) ([]byte, error) {
cannonicalName := strings.Replace(name, "\\", "/", -1)
if f, ok := _bindata[cannonicalName]; ok {
return f()
}
return nil, fmt.Errorf("Asset %s not found", name)
}
// AssetNames returns the names of the assets.
func AssetNames() []string {
names := make([]string, 0, len(_bindata))
for name := range _bindata {
names = append(names, name)
}
return names
}
// _bindata is a table, holding each asset generator, mapped to its name.
var _bindata = map[string]func() ([]byte, error){
"mysql/000001_gokins.down.sql": mysql_000001_gokins_down_sql,
"mysql/000001_gokins.up.sql": mysql_000001_gokins_up_sql,
"sqlite/000001_gokins.down.sql": sqlite_000001_gokins_down_sql,
"sqlite/000001_gokins.up.sql": sqlite_000001_gokins_up_sql,
}
// AssetDir returns the file names below a certain
// directory embedded in the file by go-bindata.
// For example if you run go-bindata on data/... and data contains the
// following hierarchy:
// data/
// foo.txt
// img/
// a.png
// b.png
// then AssetDir("data") would return []string{"foo.txt", "img"}
// AssetDir("data/img") would return []string{"a.png", "b.png"}
// AssetDir("foo.txt") and AssetDir("notexist") would return an error
// AssetDir("") will return []string{"data"}.
func AssetDir(name string) ([]string, error) {
node := _bintree
if len(name) != 0 {
cannonicalName := strings.Replace(name, "\\", "/", -1)
pathList := strings.Split(cannonicalName, "/")
for _, p := range pathList {
node = node.Children[p]
if node == nil {
return nil, fmt.Errorf("Asset %s not found", name)
}
}
}
if node.Func != nil {
return nil, fmt.Errorf("Asset %s not found", name)
}
rv := make([]string, 0, len(node.Children))
for name := range node.Children {
rv = append(rv, name)
}
return rv, nil
}
type _bintree_t struct {
Func func() ([]byte, error)
Children map[string]*_bintree_t
}
var _bintree = &_bintree_t{nil, map[string]*_bintree_t{
"mysql": &_bintree_t{nil, map[string]*_bintree_t{
"000001_gokins.down.sql": &_bintree_t{mysql_000001_gokins_down_sql, map[string]*_bintree_t{
}},
"000001_gokins.up.sql": &_bintree_t{mysql_000001_gokins_up_sql, map[string]*_bintree_t{
}},
}},
"sqlite": &_bintree_t{nil, map[string]*_bintree_t{
"000001_gokins.down.sql": &_bintree_t{sqlite_000001_gokins_down_sql, map[string]*_bintree_t{
}},
"000001_gokins.up.sql": &_bintree_t{sqlite_000001_gokins_up_sql, map[string]*_bintree_t{
}},
}},
}}
================================================
FILE: comm/thirdapi.go
================================================
package comm
import (
"github.com/gokins/gokins/thirdapi"
"github.com/gokins/gokins/thirdapi/giteaapi"
"github.com/gokins/gokins/thirdapi/giteeapi"
"github.com/gokins/gokins/thirdapi/giteepremiumapi"
"github.com/gokins/gokins/thirdapi/githubapi"
"github.com/gokins/gokins/thirdapi/gitlabapi"
"github.com/sirupsen/logrus"
)
var (
apiClient *thirdapi.Client
)
func GetThirdApi(s string, host string) (*thirdapi.Client, error) {
if apiClient == nil {
switch s {
case "gitee":
apiClient = giteeapi.NewDefault()
case "github":
apiClient = githubapi.NewDefault()
case "gitalb":
client, err := gitlabapi.New(host + "/api/v4")
if err != nil {
return nil, err
}
apiClient = client
case "giteepremium":
client, err := giteepremiumapi.New(host + "/api/v5")
if err != nil {
return nil, err
}
apiClient = client
case "gitea":
client, err := giteaapi.New(host + "/api/v1")
if err != nil {
return nil, err
}
apiClient = client
default:
logrus.Debug("GetThirdApi default : 'github' ")
apiClient = githubapi.NewDefault()
}
}
return apiClient, nil
}
================================================
FILE: comm/uis.go
================================================
package comm
const StaticPkg = "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
gitextract_0p57qvn9/
├── .gitignore
├── Dockerfile
├── LICENSE
├── README.md
├── bean/
│ ├── condition.go
│ ├── db.go
│ ├── http.go
│ ├── models.go
│ ├── pipeline.go
│ ├── pipelinevar.go
│ ├── runtime.go
│ ├── thirdbean/
│ │ ├── gitea.go
│ │ ├── gitee.go
│ │ ├── giteepremium.go
│ │ ├── github.go
│ │ └── gitlab.go
│ ├── trigger.go
│ └── yml.go
├── bindata.sh
├── bindui.sh
├── build.sh
├── cmd/
│ └── cmd.go
├── comm/
│ ├── app.go
│ ├── cache.go
│ ├── config.go
│ ├── db.go
│ ├── migrate.go
│ ├── thirdapi.go
│ └── uis.go
├── compressui.go
├── engine/
│ ├── buildDao.go
│ ├── buildEgn.go
│ ├── buildTask.go
│ ├── buildTaskc.go
│ ├── buildtask_test.go
│ ├── hbtpruner.go
│ ├── jobEgn.go
│ ├── mgr.go
│ ├── runner.go
│ ├── timermgr.go
│ └── timermgr_test.go
├── go.mod
├── go.sum
├── hook/
│ ├── action.go
│ ├── event.go
│ ├── git.go
│ ├── gitea/
│ │ └── gitea.go
│ ├── gitee/
│ │ └── gitee.go
│ ├── github/
│ │ └── github.go
│ ├── gitlab/
│ │ └── gitlab.go
│ ├── pr.go
│ ├── repo.go
│ └── webhook.go
├── main.go
├── migrates/
│ ├── init.go
│ ├── mysql/
│ │ ├── 000001_gokins.down.sql
│ │ └── 000001_gokins.up.sql
│ ├── sqlite/
│ │ ├── 000001_gokins.down.sql
│ │ └── 000001_gokins.up.sql
│ └── up.go
├── model/
│ ├── schema_migrations.go
│ ├── t_artifact_package.go
│ ├── t_artifact_version.go
│ ├── t_artifactory.go
│ ├── t_build.go
│ ├── t_cmd_line.go
│ ├── t_message.go
│ ├── t_org.go
│ ├── t_org_pipe.go
│ ├── t_param.go
│ ├── t_pipeline.go
│ ├── t_pipeline_conf.go
│ ├── t_pipeline_var.go
│ ├── t_pipeline_version.go
│ ├── t_stage.go
│ ├── t_step.go
│ ├── t_trigger.go
│ ├── t_trigger_run.go
│ ├── t_user.go
│ ├── t_user_info.go
│ ├── t_user_msg.go
│ ├── t_user_org.go
│ ├── t_user_token.go
│ ├── t_yml_plugin.go
│ └── t_yml_template.go
├── models/
│ ├── run_build.go
│ ├── run_stage.go
│ ├── t_artifact_package.go
│ ├── t_artifact_version.go
│ ├── t_artifactory.go
│ ├── t_org.go
│ ├── t_pipeline.go
│ ├── t_pipeline_var.go
│ ├── t_pipeline_version.go
│ ├── t_trigger.go
│ ├── t_trigger_run.go
│ ├── t_user.go
│ ├── t_yml_plugin.go
│ └── t_yml_template.go
├── route/
│ ├── api.go
│ ├── artifact.go
│ ├── artpub.go
│ ├── hook.go
│ ├── install.go
│ ├── login.go
│ ├── org.go
│ ├── pipeline.go
│ ├── pipelineversion.go
│ ├── runtime.go
│ ├── trigger.go
│ ├── user.go
│ └── yml.go
├── ruis_test.go
├── server/
│ ├── db.go
│ ├── hbtp.go
│ ├── server.go
│ └── web.go
├── service/
│ ├── db.go
│ ├── hook.go
│ ├── mid.go
│ ├── notice.go
│ ├── param.go
│ ├── perms.go
│ ├── pipeline.go
│ ├── trigger.go
│ └── user.go
├── thirdapi/
│ ├── client.go
│ ├── giteaapi/
│ │ ├── gitea.go
│ │ ├── giteaapi.go
│ │ ├── giteaapi_test.go
│ │ └── repositoryservice.go
│ ├── giteeapi/
│ │ ├── gitee.go
│ │ ├── giteeapi.go
│ │ ├── giteeapi_test.go
│ │ └── repositoryservice.go
│ ├── giteepremiumapi/
│ │ ├── giteepremium.go
│ │ ├── giteepremiumapi.go
│ │ ├── giteepremiumapi_test.go
│ │ └── repositoryservice.go
│ ├── githubapi/
│ │ ├── github.go
│ │ ├── githubapi.go
│ │ ├── githubapi_test.go
│ │ └── repositoryservice.go
│ ├── gitlabapi/
│ │ ├── gitlab.go
│ │ ├── gitlabapi.go
│ │ ├── gitlabapi_test.go
│ │ └── repositoryservice.go
│ ├── repo.go
│ └── repositoryservice.go
└── util/
├── gin.go
├── git.go
├── httpex/
│ ├── const.go
│ └── post.go
└── token.go
SYMBOL INDEX (694 symbols across 141 files)
FILE: bean/condition.go
function skipBranch (line 8) | func skipBranch(c *Condition, branch string) bool {
function skipCommitMessages (line 11) | func skipCommitMessages(c *Condition, branch string) bool {
function skipCommitNotes (line 14) | func skipCommitNotes(c *Condition, branch string) bool {
method Match (line 18) | func (c *Condition) Match(v string) bool {
method Excludes (line 37) | func (c *Condition) Excludes(v string) bool {
method Includes (line 60) | func (c *Condition) Includes(v string) bool {
function isMatch (line 83) | func isMatch(s string, p string) bool {
FILE: bean/db.go
type Page (line 3) | type Page struct
type PageGen (line 10) | type PageGen struct
FILE: bean/http.go
type IdsRes (line 3) | type IdsRes struct
type LoginReq (line 7) | type LoginReq struct
type LoginRes (line 11) | type LoginRes struct
FILE: bean/models.go
type PipelineShow (line 3) | type PipelineShow struct
FILE: bean/pipeline.go
type NewPipeline (line 3) | type NewPipeline struct
method Check (line 21) | func (p *NewPipeline) Check() bool {
type NewPipelineVar (line 14) | type NewPipelineVar struct
FILE: bean/pipelinevar.go
type PipelineVar (line 3) | type PipelineVar struct
FILE: bean/runtime.go
type LogOutJson (line 5) | type LogOutJson struct
type LogOutJsonRes (line 11) | type LogOutJsonRes struct
FILE: bean/thirdbean/gitea.go
type ResultGiteaRepo (line 5) | type ResultGiteaRepo struct
type ResultGiteaRepoBranch (line 74) | type ResultGiteaRepoBranch struct
type ResultGetGiteaHook (line 110) | type ResultGetGiteaHook struct
FILE: bean/thirdbean/gitee.go
type ResultGiteeCreateHooks (line 5) | type ResultGiteeCreateHooks struct
type ResultGiteeRepo (line 20) | type ResultGiteeRepo struct
type ResultGiteeRepoBranch (line 148) | type ResultGiteeRepoBranch struct
type ResultGetGiteeHook (line 158) | type ResultGetGiteeHook struct
FILE: bean/thirdbean/giteepremium.go
type ResultGiteePremiumCreateHooks (line 5) | type ResultGiteePremiumCreateHooks struct
type ResultGiteePremiumRepo (line 20) | type ResultGiteePremiumRepo struct
type ResultGiteePremiumRepoBranch (line 148) | type ResultGiteePremiumRepoBranch struct
type ResultGetGiteePremiumHook (line 158) | type ResultGetGiteePremiumHook struct
FILE: bean/thirdbean/github.go
type ResultGithubRepo (line 5) | type ResultGithubRepo struct
type ResultGithubRepoBranch (line 111) | type ResultGithubRepoBranch struct
type ResultGetGithubHook (line 127) | type ResultGetGithubHook struct
FILE: bean/thirdbean/gitlab.go
type ResultGitlabRepo (line 5) | type ResultGitlabRepo struct
type ResultGitlabRepoBranch (line 124) | type ResultGitlabRepoBranch struct
type ResultGetGitlabHook (line 148) | type ResultGetGitlabHook struct
FILE: bean/trigger.go
type TriggerParam (line 5) | type TriggerParam struct
method Check (line 15) | func (c *TriggerParam) Check() error {
FILE: bean/yml.go
type Pipeline (line 10) | type Pipeline struct
method ToJson (line 76) | func (c *Pipeline) ToJson() ([]byte, error) {
method ConvertCmd (line 80) | func (c *Pipeline) ConvertCmd() {
method Check (line 100) | func (c *Pipeline) Check() error {
type Trigger (line 17) | type Trigger struct
type Condition (line 27) | type Condition struct
type Stage (line 32) | type Stage struct
type Step (line 43) | type Step struct
type Artifact (line 56) | type Artifact struct
type UseArtifacts (line 63) | type UseArtifacts struct
FILE: cmd/cmd.go
constant Version (line 15) | Version = "0.1.1"
function Run (line 19) | func Run() {
function regs (line 24) | func regs() {
function getArgs (line 36) | func getArgs() []string {
function start (line 56) | func start(pc *kingpin.ParseContext) error {
function run (line 70) | func run(pc *kingpin.ParseContext) error {
FILE: comm/app.go
function init (line 30) | func init() {
function Cancel (line 33) | func Cancel() {
FILE: comm/cache.go
function CacheSet (line 15) | func CacheSet(key string, data []byte, outm ...time.Duration) error {
function CacheSets (line 45) | func CacheSets(key string, data interface{}, outm ...time.Duration) error {
function parseCacheData (line 58) | func parseCacheData(bts []byte) []byte {
function CacheGet (line 77) | func CacheGet(key string) ([]byte, error) {
function CacheGets (line 103) | func CacheGets(key string, data interface{}) error {
function CacheFlush (line 117) | func CacheFlush() error {
function mainCacheClear (line 129) | func mainCacheClear() {
FILE: comm/config.go
type Config (line 3) | type Config struct
FILE: comm/db.go
function findCount (line 16) | func findCount(cds builder.Cond, data interface{}) (int64, error) {
function FindPage (line 39) | func FindPage(ses *xorm.Session, ls interface{}, page int64, size ...int...
function findPages (line 46) | func findPages(ses *xorm.Session, ls interface{}, count, page int64, siz...
function FindPages (line 76) | func FindPages(gen *bean.PageGen, ls interface{}, page int64, size ...in...
FILE: comm/migrate.go
function bindata_read (line 11) | func bindata_read(data []byte, name string) ([]byte, error) {
function mysql_000001_gokins_down_sql (line 30) | func mysql_000001_gokins_down_sql() ([]byte, error) {
function mysql_000001_gokins_up_sql (line 39) | func mysql_000001_gokins_up_sql() ([]byte, error) {
function sqlite_000001_gokins_down_sql (line 48) | func sqlite_000001_gokins_down_sql() ([]byte, error) {
function sqlite_000001_gokins_up_sql (line 57) | func sqlite_000001_gokins_up_sql() ([]byte, error) {
function Asset (line 67) | func Asset(name string) ([]byte, error) {
function AssetNames (line 76) | func AssetNames() []string {
function AssetDir (line 104) | func AssetDir(name string) ([]string, error) {
type _bintree_t (line 126) | type _bintree_t struct
FILE: comm/thirdapi.go
function GetThirdApi (line 17) | func GetThirdApi(s string, host string) (*thirdapi.Client, error) {
FILE: comm/uis.go
constant StaticPkg (line 3) | StaticPkg = "UEsDBBQACAAIAAAAAAAAAAAAAAAAAAAAAAALAAAAZmF2aWNvbi5pY2/sXA9...
FILE: compressui.go
function main (line 15) | func main() {
function gengo (line 27) | func gengo() error {
FILE: engine/buildDao.go
method updateBuild (line 13) | func (c *BuildTask) updateBuild(build *runtime.Build) {
method updateStage (line 71) | func (c *BuildTask) updateStage(stage *runtime.Stage) {
method updateStep (line 107) | func (c *BuildTask) updateStep(job *jobSync) {
method updateStepCmd (line 146) | func (c *BuildTask) updateStepCmd(cmd *cmdSync) {
FILE: engine/buildEgn.go
type BuildEngine (line 15) | type BuildEngine struct
method Stop (line 40) | func (c *BuildEngine) Stop() {
method init (line 47) | func (c *BuildEngine) init() {
method run (line 73) | func (c *BuildEngine) run() {
method startBuild (line 104) | func (c *BuildEngine) startBuild(v *BuildTask) {
method Put (line 110) | func (c *BuildEngine) Put(bd *runtime.Build) {
method Get (line 115) | func (c *BuildEngine) Get(buildid string) (*BuildTask, bool) {
function StartBuildEngine (line 23) | func StartBuildEngine() *BuildEngine {
FILE: engine/buildTask.go
type taskStage (line 24) | type taskStage struct
method status (line 31) | func (c *taskStage) status(stat, errs string, event ...string) {
type BuildTask (line 41) | type BuildTask struct
method status (line 65) | func (c *BuildTask) status(stat, errs string, event ...string) {
method stopd (line 80) | func (c *BuildTask) stopd() bool {
method stop (line 86) | func (c *BuildTask) stop() {
method Cancel (line 92) | func (c *BuildTask) Cancel() {
method clears (line 98) | func (c *BuildTask) clears() {
method run (line 114) | func (c *BuildTask) run() {
method runStage (line 174) | func (c *BuildTask) runStage(stage *runtime.Stage) {
method runStep (line 227) | func (c *BuildTask) runStep(stage *taskStage, job *jobSync) {
method getRepo (line 334) | func (c *BuildTask) getRepo() error {
method Write (line 348) | func (c *BuildTask) Write(bts []byte) (n int, err error) {
method gitClone (line 369) | func (c *BuildTask) gitClone(ctx context.Context, dir string, repo *ru...
method UpJob (line 395) | func (c *BuildTask) UpJob(job *jobSync, stat, errs string, code int) {
method UpJobCmd (line 406) | func (c *BuildTask) UpJobCmd(cmd *cmdSync, fs, code int) {
method WorkProgress (line 436) | func (c *BuildTask) WorkProgress() int {
method Show (line 439) | func (c *BuildTask) Show() (*runtime.BuildShow, bool) {
method GetJob (line 513) | func (c *BuildTask) GetJob(id string) (*jobSync, bool) {
function NewBuildTask (line 75) | func NewBuildTask(egn *BuildEngine, bd *runtime.Build) *BuildTask {
FILE: engine/buildTaskc.go
method check (line 19) | func (c *BuildTask) check() bool {
method genRunjob (line 135) | func (c *BuildTask) genRunjob(stage *runtime.Stage, job *jobSync) (rterr...
method appendcmds (line 221) | func (c *BuildTask) appendcmds(runjb *runners.RunJob, conts string) {
method gencmds (line 230) | func (c *BuildTask) gencmds(runjb *runners.RunJob, cmds []interface{}) (...
FILE: engine/buildtask_test.go
function TestGitClone (line 9) | func TestGitClone(t *testing.T) {
FILE: engine/hbtpruner.go
type HbtpRunner (line 14) | type HbtpRunner struct
method AuthFun (line 17) | func (HbtpRunner) AuthFun() hbtp.AuthFun {
method ServerInfo (line 47) | func (HbtpRunner) ServerInfo(c *hbtp.Context) {
method PullJob (line 55) | func (HbtpRunner) PullJob(c *hbtp.Context, m *runners.ReqPullJob) {
method CheckCancel (line 63) | func (HbtpRunner) CheckCancel(c *hbtp.Context) {
method Update (line 67) | func (HbtpRunner) Update(c *hbtp.Context, m *runners.UpdateJobInfo) {
method UpdateCmd (line 75) | func (HbtpRunner) UpdateCmd(c *hbtp.Context) {
method PushOutLine (line 92) | func (HbtpRunner) PushOutLine(c *hbtp.Context) {
method FindJobId (line 105) | func (HbtpRunner) FindJobId(c *hbtp.Context) {
method ReadDir (line 116) | func (HbtpRunner) ReadDir(c *hbtp.Context) {
method ReadFile (line 131) | func (HbtpRunner) ReadFile(c *hbtp.Context) {
method GetEnv (line 160) | func (HbtpRunner) GetEnv(c *hbtp.Context) {
method GenEnv (line 171) | func (HbtpRunner) GenEnv(c *hbtp.Context, env utils.EnvVal) {
method UploadFile (line 181) | func (HbtpRunner) UploadFile(c *hbtp.Context) {
method FindArtVersionId (line 213) | func (HbtpRunner) FindArtVersionId(c *hbtp.Context) {
method NewArtVersionId (line 224) | func (HbtpRunner) NewArtVersionId(c *hbtp.Context) {
FILE: engine/jobEgn.go
type JobEngine (line 18) | type JobEngine struct
method run (line 72) | func (c *JobEngine) run() {
method rmExec (line 104) | func (c *JobEngine) rmExec(k string, ex *executer) {
method Put (line 122) | func (c *JobEngine) Put(job *jobSync) error {
method Pull (line 137) | func (c *JobEngine) Pull(name string, plugs []string) *runners.RunJob {
type executer (line 25) | type executer struct
type cmdSync (line 31) | type cmdSync struct
type jobSync (line 39) | type jobSync struct
method status (line 48) | func (c *jobSync) status(stat, errs string, event ...string) {
function StartJobEngine (line 58) | func StartJobEngine() *JobEngine {
FILE: engine/mgr.go
type Manager (line 18) | type Manager struct
method run (line 63) | func (c *Manager) run() {
method BuildEgn (line 73) | func (c *Manager) BuildEgn() *BuildEngine {
method HRun (line 76) | func (c *Manager) HRun() *HbtpRunner {
method TimerEng (line 80) | func (c *Manager) TimerEng() *TimerEngine {
function Start (line 27) | func Start() error {
FILE: engine/runner.go
type baseRunner (line 24) | type baseRunner struct
method ServerInfo (line 26) | func (c *baseRunner) ServerInfo() (*runners.ServerInfo, error) {
method PullJob (line 33) | func (c *baseRunner) PullJob(name string, plugs []string) (*runners.Ru...
method CheckCancel (line 44) | func (c *baseRunner) CheckCancel(buildId string) bool {
method Update (line 51) | func (c *baseRunner) Update(m *runners.UpdateJobInfo) error {
method UpdateCmd (line 64) | func (c *baseRunner) UpdateCmd(buildId, jobId, cmdId string, fs, code ...
method PushOutLine (line 82) | func (c *baseRunner) PushOutLine(buildId, jobId, cmdId, bs string, ise...
method FindJobId (line 114) | func (c *baseRunner) FindJobId(buildId, stgNm, stpNm string) (string, ...
method ReadDir (line 138) | func (c *baseRunner) ReadDir(fs int, buildId string, pth string) ([]*r...
method ReadFile (line 172) | func (c *baseRunner) ReadFile(fs int, buildId string, pth string) (int...
method GetEnv (line 202) | func (c *baseRunner) GetEnv(buildId, jobId, key string) (string, bool) {
method GenEnv (line 230) | func (c *baseRunner) GenEnv(buildId, jobId string, env utils.EnvVal) e...
method UploadFile (line 251) | func (c *baseRunner) UploadFile(fs int, buildId, jobId string, dir, pt...
method FindArtVersionId (line 280) | func (c *baseRunner) FindArtVersionId(buildId, idnt string, names stri...
method NewArtVersionId (line 333) | func (c *baseRunner) NewArtVersionId(buildId, idnt string, name string...
FILE: engine/timermgr.go
type TimerEngine (line 17) | type TimerEngine struct
method run (line 41) | func (c *TimerEngine) run() {
method execItem (line 55) | func (c *TimerEngine) execItem(v *timerExec) {
method refresh (line 90) | func (c *TimerEngine) refresh() {
method resetOne (line 109) | func (c *TimerEngine) resetOne(tmr *model.TTrigger) error {
method Refresh (line 190) | func (c *TimerEngine) Refresh(tmrid string) error {
method Delete (line 202) | func (c *TimerEngine) Delete(tmrid string) {
type timerExec (line 21) | type timerExec struct
function StartTimerEngine (line 28) | func StartTimerEngine() *TimerEngine {
FILE: engine/timermgr_test.go
function TestTimer (line 10) | func TestTimer(t *testing.T) {
function TestSync (line 21) | func TestSync(t *testing.T) {
FILE: hook/action.go
type Action (line 3) | type Action
constant ActionOpen (line 6) | ActionOpen = "open"
constant ActionOpened (line 7) | ActionOpened = "opened"
constant ActionClose (line 8) | ActionClose = "close"
constant ActionCreate (line 9) | ActionCreate = "create"
constant ActionDelete (line 10) | ActionDelete = "delete"
constant ActionSync (line 11) | ActionSync = "sync"
constant ActionUpdate (line 12) | ActionUpdate = "update"
constant ActionSynchronize (line 13) | ActionSynchronize = "synchronize"
FILE: hook/event.go
constant EVENTS_TYPE_COMMENT (line 6) | EVENTS_TYPE_COMMENT = "comment"
constant EVENTS_TYPE_PR (line 8) | EVENTS_TYPE_PR = "pr"
constant EVENTS_TYPE_PUSH (line 10) | EVENTS_TYPE_PUSH = "push"
constant EVENTS_TYPE_BUILD (line 12) | EVENTS_TYPE_BUILD = "build"
constant EVENTS_TYPE_REBUILD (line 14) | EVENTS_TYPE_REBUILD = "rebuild"
constant GITEE_EVENT (line 18) | GITEE_EVENT = "X-Gitee-Event"
constant GITEE_EVENT_PUSH (line 19) | GITEE_EVENT_PUSH = "Push Hook"
constant GITEE_EVENT_NOTE (line 20) | GITEE_EVENT_NOTE = "Note Hook"
constant GITEE_EVENT_PR (line 21) | GITEE_EVENT_PR = "Merge Request Hook"
constant GITEE_EVENT_PR_ACTION_OPEN (line 22) | GITEE_EVENT_PR_ACTION_OPEN = "open"
constant GITEE_EVENT_PR_ACTION_UPDATE (line 23) | GITEE_EVENT_PR_ACTION_UPDATE = "update"
constant GITEE_EVENT_PR_ACTION_COMMENT (line 24) | GITEE_EVENT_PR_ACTION_COMMENT = "comment"
constant GITHUB_EVENT (line 27) | GITHUB_EVENT = "X-GitHub-Event"
constant GITHUB_EVENT_ISSUE_COMMENT (line 28) | GITHUB_EVENT_ISSUE_COMMENT = "issue_comment"
constant GITHUB_EVENT_PUSH (line 29) | GITHUB_EVENT_PUSH = "push"
constant GITHUB_EVENT_PR (line 30) | GITHUB_EVENT_PR = "pull_request"
constant GITHUB_EVENT_PR_ACTION_OPEN (line 31) | GITHUB_EVENT_PR_ACTION_OPEN = "open"
constant GITHUB_EVENT_PR_ACTION_UPDATE (line 32) | GITHUB_EVENT_PR_ACTION_UPDATE = "update"
constant GITHUB_EVENT_PR_ACTION_COMMENT (line 33) | GITHUB_EVENT_PR_ACTION_COMMENT = "comment"
constant GITLAB_EVENT (line 37) | GITLAB_EVENT = "X-Gitlab-Event"
constant GITLAB_EVENT_PUSH (line 38) | GITLAB_EVENT_PUSH = "Push Hook"
constant GITLAB_EVENT_PR (line 39) | GITLAB_EVENT_PR = "Merge Request Hook"
constant GITLAB_EVENT_NOTE (line 40) | GITLAB_EVENT_NOTE = "Note Hook"
constant GITEA_EVENT (line 44) | GITEA_EVENT = "X-Gitea-Event"
constant GITEA_EVENT_PUSH (line 45) | GITEA_EVENT_PUSH = "push"
constant GITEA_EVENT_PR (line 46) | GITEA_EVENT_PR = "pull_request"
constant GITEA_EVENT_NOTE (line 47) | GITEA_EVENT_NOTE = "issue_comment"
FILE: hook/git.go
type Reference (line 4) | type Reference struct
type Commit (line 10) | type Commit struct
type User (line 16) | type User struct
FILE: hook/gitea/gitea.go
function Parse (line 23) | func Parse(req *http.Request, secret string) (hook.WebHook, error) {
function Validate (line 59) | func Validate(h func() hash.Hash, message, key []byte, signature string)...
function validatePrefix (line 67) | func validatePrefix(message, key []byte, signature string) bool {
function validate (line 77) | func validate(h func() hash.Hash, message, key, signature []byte) bool {
function parseCommentHook (line 84) | func parseCommentHook(data []byte) (*hook.PullRequestCommentHook, error) {
function parsePullRequestHook (line 96) | func parsePullRequestHook(data []byte) (*hook.PullRequestHook, error) {
function parsePushHook (line 114) | func parsePushHook(data []byte) (*hook.PushHook, error) {
function convertPushHook (line 122) | func convertPushHook(gp *giteaPushHook) *hook.PushHook {
function convertPullRequestHook (line 162) | func convertPullRequestHook(gp *giteaPRHook) *hook.PullRequestHook {
function convertPullRequestURL (line 228) | func convertPullRequestURL(gc *giteaCommentHook) (*giteaPullRequestURL, ...
function convertCommentHook (line 258) | func convertCommentHook(gp *giteaCommentHook) (*hook.PullRequestCommentH...
type giteaPushHook (line 335) | type giteaPushHook struct
type giteaPRHook (line 468) | type giteaPRHook struct
type giteaCommentHook (line 756) | type giteaCommentHook struct
type giteaPullRequestURL (line 924) | type giteaPullRequestURL struct
FILE: hook/gitee/gitee.go
function Parse (line 18) | func Parse(req *http.Request, secret string) (hook.WebHook, error) {
function parseCommentHook (line 55) | func parseCommentHook(data []byte) (*hook.PullRequestCommentHook, error) {
function parsePullRequestHook (line 64) | func parsePullRequestHook(data []byte) (*hook.PullRequestHook, error) {
function parsePushHook (line 78) | func parsePushHook(data []byte) (*hook.PushHook, error) {
function convertPullRequestHook (line 86) | func convertPullRequestHook(gp *giteePRHook) *hook.PullRequestHook {
function convertPushHook (line 156) | func convertPushHook(gp *giteePushHook) *hook.PushHook {
function convertCommentHook (line 198) | func convertCommentHook(gp *giteeCommentHook) *hook.PullRequestCommentHo...
type giteePushHook (line 277) | type giteePushHook struct
type giteePRHook (line 472) | type giteePRHook struct
type giteeCommentHook (line 1042) | type giteeCommentHook struct
FILE: hook/github/github.go
function Parse (line 23) | func Parse(req *http.Request, secret string) (hook.WebHook, error) {
function Validate (line 57) | func Validate(h func() hash.Hash, message, key []byte, signature string)...
function validatePrefix (line 65) | func validatePrefix(message, key []byte, signature string) bool {
function validate (line 80) | func validate(h func() hash.Hash, message, key, signature []byte) bool {
function parseCommentHook (line 87) | func parseCommentHook(data []byte) (*hook.PullRequestCommentHook, error) {
function parsePullRequestHook (line 96) | func parsePullRequestHook(data []byte) (*hook.PullRequestHook, error) {
function parsePushHook (line 114) | func parsePushHook(data []byte) (*hook.PushHook, error) {
function convertPullRequestHook (line 122) | func convertPullRequestHook(gp *githubPRHook) *hook.PullRequestHook {
function convertPushHook (line 192) | func convertPushHook(gp *githubPushHook) *hook.PushHook {
function convertPullRequestURL (line 234) | func convertPullRequestURL(u string) (*githubPullRequestURL, error) {
function convertCommentHook (line 262) | func convertCommentHook(gp *githubCommentHook) (*hook.PullRequestComment...
type githubPullRequestURL (line 344) | type githubPullRequestURL struct
type githubPushHook (line 675) | type githubPushHook struct
type githubPRHook (line 849) | type githubPRHook struct
type githubCommentHook (line 1305) | type githubCommentHook struct
FILE: hook/gitlab/gitlab.go
function Parse (line 23) | func Parse(req *http.Request, secret string) (hook.WebHook, error) {
function Validate (line 57) | func Validate(h func() hash.Hash, message, key []byte, signature string)...
function validatePrefix (line 65) | func validatePrefix(message, key []byte, signature string) bool {
function validate (line 80) | func validate(h func() hash.Hash, message, key, signature []byte) bool {
function parseCommentHook (line 87) | func parseCommentHook(data []byte) (*hook.PullRequestCommentHook, error) {
function parsePullRequestHook (line 96) | func parsePullRequestHook(data []byte) (*hook.PullRequestHook, error) {
function parsePushHook (line 110) | func parsePushHook(data []byte) (*hook.PushHook, error) {
function convertPullRequestHook (line 118) | func convertPullRequestHook(gp *gitlabPRHook) *hook.PullRequestHook {
function convertPushHook (line 179) | func convertPushHook(gp *gitlabPushHook) *hook.PushHook {
function convertCommentHook (line 212) | func convertCommentHook(gp *gitlabCommentHook) (*hook.PullRequestComment...
type gitlabPushHook (line 280) | type gitlabPushHook struct
type gitlabPRHook (line 339) | type gitlabPRHook struct
type gitlabCommentHook (line 467) | type gitlabCommentHook struct
FILE: hook/pr.go
type PullRequest (line 7) | type PullRequest struct
type Comment (line 18) | type Comment struct
FILE: hook/repo.go
type Repository (line 5) | type Repository struct
FILE: hook/webhook.go
type WebHook (line 8) | type WebHook interface
type WebhookService (line 11) | type WebhookService interface
type PushHook (line 15) | type PushHook struct
method Repository (line 52) | func (h *PushHook) Repository() Repository { return h.Re...
type BranchHook (line 26) | type BranchHook struct
method Repository (line 53) | func (h *BranchHook) Repository() Repository { return h.Re...
type PullRequestHook (line 32) | type PullRequestHook struct
method Repository (line 54) | func (h *PullRequestHook) Repository() Repository { return h.Re...
type PullRequestCommentHook (line 40) | type PullRequestCommentHook struct
method Repository (line 55) | func (h *PullRequestCommentHook) Repository() Repository { return h.Re...
type SecretFunc (line 49) | type SecretFunc
FILE: main.go
function main (line 8) | func main() {
FILE: migrates/init.go
function InitMysqlMigrate (line 17) | func InitMysqlMigrate(host, dbs, user, pass string) (wait bool, rtul str...
function InitSqliteMigrate (line 106) | func InitSqliteMigrate() (rtul string, errs error) {
FILE: migrates/mysql/000001_gokins.up.sql
type `t_artifact_package` (line 1) | CREATE TABLE `t_artifact_package` (
type `t_artifact_version` (line 16) | CREATE TABLE `t_artifact_version` (
type `t_artifactory` (line 31) | CREATE TABLE `t_artifactory` (
type `t_build` (line 48) | CREATE TABLE `t_build` (
type `t_cmd_line` (line 62) | CREATE TABLE `t_cmd_line` (
type `t_stage` (line 76) | CREATE TABLE `t_stage` (
type `t_step` (line 92) | CREATE TABLE `t_step` (
type `t_trigger` (line 115) | CREATE TABLE `t_trigger` (
type `t_trigger_run` (line 130) | CREATE TABLE `t_trigger_run` (
type `t_message` (line 141) | CREATE TABLE `t_message` (
type `t_org` (line 153) | CREATE TABLE `t_org` (
type `t_org_pipe` (line 167) | CREATE TABLE `t_org_pipe` (
type `t_pipeline` (line 176) | CREATE TABLE `t_pipeline` (
type `t_pipeline_conf` (line 187) | CREATE TABLE `t_pipeline_conf` (
type `t_pipeline_version` (line 196) | CREATE TABLE `t_pipeline_version` (
type `t_param` (line 213) | CREATE TABLE `t_param` (
type `t_user` (line 221) | CREATE TABLE `t_user` (
type `t_user_info` (line 249) | CREATE TABLE `t_user_info` (
type `t_user_org` (line 260) | CREATE TABLE `t_user_org` (
type `t_user_msg` (line 274) | CREATE TABLE `t_user_msg` (
type `t_user_token` (line 286) | CREATE TABLE `t_user_token` (
type `t_pipeline_var` (line 306) | CREATE TABLE `t_pipeline_var` (
type `t_yml_plugin` (line 316) | CREATE TABLE `t_yml_plugin` (
type `t_yml_template` (line 364) | CREATE TABLE `t_yml_template` (
FILE: migrates/sqlite/000001_gokins.up.sql
type `t_build` (line 1) | CREATE TABLE `t_build` (
FILE: migrates/up.go
function UpMysqlMigrate (line 15) | func UpMysqlMigrate(ul string) error {
function UpSqliteMigrate (line 68) | func UpSqliteMigrate(ul string) error {
FILE: model/schema_migrations.go
type SchemaMigrations (line 3) | type SchemaMigrations struct
FILE: model/t_artifact_package.go
type TArtifactPackage (line 7) | type TArtifactPackage struct
FILE: model/t_artifact_version.go
type TArtifactVersion (line 7) | type TArtifactVersion struct
FILE: model/t_artifactory.go
type TArtifactory (line 7) | type TArtifactory struct
FILE: model/t_build.go
type TBuild (line 7) | type TBuild struct
FILE: model/t_cmd_line.go
type TCmdLine (line 7) | type TCmdLine struct
FILE: model/t_message.go
type TMessage (line 7) | type TMessage struct
FILE: model/t_org.go
type TOrg (line 7) | type TOrg struct
FILE: model/t_org_pipe.go
type TOrgPipe (line 7) | type TOrgPipe struct
FILE: model/t_param.go
type TParam (line 7) | type TParam struct
FILE: model/t_pipeline.go
type TPipeline (line 7) | type TPipeline struct
FILE: model/t_pipeline_conf.go
type TPipelineConf (line 3) | type TPipelineConf struct
FILE: model/t_pipeline_var.go
type TPipelineVar (line 3) | type TPipelineVar struct
FILE: model/t_pipeline_version.go
type TPipelineVersion (line 7) | type TPipelineVersion struct
FILE: model/t_stage.go
type TStage (line 7) | type TStage struct
FILE: model/t_step.go
type TStep (line 7) | type TStep struct
FILE: model/t_trigger.go
type TTrigger (line 7) | type TTrigger struct
FILE: model/t_trigger_run.go
type TTriggerRun (line 7) | type TTriggerRun struct
FILE: model/t_user.go
type TUser (line 7) | type TUser struct
FILE: model/t_user_info.go
type TUserInfo (line 7) | type TUserInfo struct
FILE: model/t_user_msg.go
type TUserMsg (line 7) | type TUserMsg struct
FILE: model/t_user_org.go
type TUserOrg (line 7) | type TUserOrg struct
FILE: model/t_user_token.go
type TUserToken (line 7) | type TUserToken struct
FILE: model/t_yml_plugin.go
type TYmlPlugin (line 7) | type TYmlPlugin struct
FILE: model/t_yml_template.go
type TYmlTemplate (line 7) | type TYmlTemplate struct
FILE: models/run_build.go
type RunBuild (line 7) | type RunBuild struct
method TableName (line 21) | func (RunBuild) TableName() string {
FILE: models/run_stage.go
type RunStage (line 7) | type RunStage struct
method TableName (line 23) | func (RunStage) TableName() string {
type RunStep (line 27) | type RunStep struct
method TableName (line 48) | func (RunStep) TableName() string {
FILE: models/t_artifact_package.go
type TArtifactPackage (line 7) | type TArtifactPackage struct
FILE: models/t_artifact_version.go
type TArtifactVersion (line 13) | type TArtifactVersion struct
method ReadFiles (line 29) | func (c *TArtifactVersion) ReadFiles() error {
method readDir (line 35) | func (c *TArtifactVersion) readDir(pth string) ([]hbtp.Map, error) {
FILE: models/t_artifactory.go
type TArtifactory (line 7) | type TArtifactory struct
FILE: models/t_org.go
type TOrg (line 7) | type TOrg struct
type TOrgInfo (line 20) | type TOrgInfo struct
method TableName (line 38) | func (TOrgInfo) TableName() string {
FILE: models/t_pipeline.go
type TPipeline (line 7) | type TPipeline struct
type TPipelineInfo (line 26) | type TPipelineInfo struct
method TableName (line 39) | func (TPipelineInfo) TableName() string {
FILE: models/t_pipeline_var.go
type TPipelineVar (line 3) | type TPipelineVar struct
method TableName (line 12) | func (TPipelineVar) TableName() string {
FILE: models/t_pipeline_version.go
type TPipelineVersion (line 7) | type TPipelineVersion struct
type RunPipelineVersion (line 25) | type RunPipelineVersion struct
FILE: models/t_trigger.go
type TTrigger (line 5) | type TTrigger struct
FILE: models/t_trigger_run.go
type TTriggerRun (line 7) | type TTriggerRun struct
type TimerTriggerRun (line 23) | type TimerTriggerRun struct
FILE: models/t_user.go
type TUser (line 7) | type TUser struct
type TUserOrgInfo (line 18) | type TUserOrgInfo struct
method TableName (line 34) | func (TUserOrgInfo) TableName() string {
FILE: models/t_yml_plugin.go
type TYmlPlugin (line 3) | type TYmlPlugin struct
FILE: models/t_yml_template.go
type TYmlTemplate (line 3) | type TYmlTemplate struct
FILE: route/api.go
type ApiController (line 16) | type ApiController struct
method GetPath (line 18) | func (ApiController) GetPath() string {
method Routes (line 21) | func (c *ApiController) Routes(g gin.IRoutes) {
method hello (line 25) | func (ApiController) hello(c *gin.Context) {
method test (line 28) | func (ApiController) test(c *gin.Context) {
function prebuild (line 66) | func prebuild(b *runtime.Build) error {
FILE: route/artifact.go
type ArtifactController (line 25) | type ArtifactController struct
method GetPath (line 27) | func (ArtifactController) GetPath() string {
method Routes (line 30) | func (c *ArtifactController) Routes(g gin.IRoutes) {
method orgList (line 43) | func (ArtifactController) orgList(c *gin.Context, m *hbtp.Map) {
method info (line 96) | func (ArtifactController) info(c *gin.Context, m *hbtp.Map) {
method edit (line 127) | func (ArtifactController) edit(c *gin.Context, m *hbtp.Map) {
method rm (line 196) | func (ArtifactController) rm(c *gin.Context, m *hbtp.Map) {
method packageList (line 224) | func (ArtifactController) packageList(c *gin.Context, m *hbtp.Map) {
method versionList (line 254) | func (ArtifactController) versionList(c *gin.Context, m *hbtp.Map) {
method versionInfos (line 284) | func (ArtifactController) versionInfos(c *gin.Context, m *hbtp.Map) {
method versionUrl (line 318) | func (ArtifactController) versionUrl(c *gin.Context, m *hbtp.Map) {
method versionSave (line 353) | func (ArtifactController) versionSave(c *gin.Context, m *hbtp.Map) {
method versionRm (line 388) | func (ArtifactController) versionRm(c *gin.Context, m *hbtp.Map) {
FILE: route/artpub.go
type ArtPublicController (line 20) | type ArtPublicController struct
method GetPath (line 22) | func (ArtPublicController) GetPath() string {
method Routes (line 25) | func (c *ArtPublicController) Routes(g gin.IRoutes) {
method down (line 28) | func (ArtPublicController) down(c *gin.Context) {
FILE: route/hook.go
type HookController (line 13) | type HookController struct
method GetPath (line 16) | func (HookController) GetPath() string {
method Routes (line 19) | func (c *HookController) Routes(g gin.IRoutes) {
method hooks (line 23) | func (HookController) hooks(c *gin.Context) {
method web (line 46) | func (HookController) web(c *gin.Context, m *hbtp.Map) {
FILE: route/install.go
type installConfig (line 23) | type installConfig struct
type InstallController (line 39) | type InstallController struct
method GetPath (line 41) | func (InstallController) GetPath() string {
method auth (line 44) | func (cs *InstallController) auth(c *gin.Context) {
method Routes (line 51) | func (cs *InstallController) Routes(g gin.IRoutes) {
method check (line 56) | func (InstallController) check(c *gin.Context) {
method install (line 73) | func (InstallController) install(c *gin.Context, m *installConfig) {
function checkUrl (line 59) | func checkUrl(host string) bool {
function initConfig (line 147) | func initConfig() error {
function Install (line 155) | func Install(c *gin.Context) {
FILE: route/login.go
type LoginController (line 19) | type LoginController struct
method GetPath (line 21) | func (LoginController) GetPath() string {
method Routes (line 24) | func (c *LoginController) Routes(g gin.IRoutes) {
method info (line 28) | func (LoginController) info(c *gin.Context) {
method login (line 46) | func (LoginController) login(c *gin.Context, m *bean.LoginReq) {
FILE: route/org.go
type OrgController (line 18) | type OrgController struct
method GetPath (line 20) | func (OrgController) GetPath() string {
method Routes (line 23) | func (c *OrgController) Routes(g gin.IRoutes) {
method list (line 37) | func (OrgController) list(c *gin.Context, m *hbtp.Map) {
method new (line 97) | func (OrgController) new(c *gin.Context, m *hbtp.Map) {
method info (line 136) | func (OrgController) info(c *gin.Context, m *hbtp.Map) {
method users (line 172) | func (OrgController) users(c *gin.Context, m *hbtp.Map) {
method save (line 215) | func (OrgController) save(c *gin.Context, m *hbtp.Map) {
method rm (line 252) | func (OrgController) rm(c *gin.Context, m *hbtp.Map) {
method userEdit (line 276) | func (OrgController) userEdit(c *gin.Context, m *hbtp.Map) {
method userRm (line 353) | func (OrgController) userRm(c *gin.Context, m *hbtp.Map) {
method pipeAdd (line 389) | func (OrgController) pipeAdd(c *gin.Context, m *hbtp.Map) {
method pipeRm (line 418) | func (OrgController) pipeRm(c *gin.Context, m *hbtp.Map) {
FILE: route/pipeline.go
type PipelineController (line 21) | type PipelineController struct
method GetPath (line 23) | func (PipelineController) GetPath() string {
method Routes (line 26) | func (c *PipelineController) Routes(g gin.IRoutes) {
method orgPipelines (line 44) | func (PipelineController) orgPipelines(c *gin.Context, m *hbtp.Map) {
method getPipelines (line 104) | func (PipelineController) getPipelines(c *gin.Context, m *hbtp.Map) {
method save (line 151) | func (PipelineController) save(c *gin.Context, m *hbtp.Map) {
method delete (line 198) | func (PipelineController) delete(c *gin.Context, m *hbtp.Map) {
method new (line 233) | func (PipelineController) new(c *gin.Context, npipe *bean.NewPipeline) {
method info (line 327) | func (PipelineController) info(c *gin.Context, m *hbtp.Map) {
method run (line 375) | func (PipelineController) run(c *gin.Context, m *hbtp.Map) {
method copy (line 401) | func (PipelineController) copy(c *gin.Context, m *hbtp.Map) {
method rebuild (line 457) | func (PipelineController) rebuild(c *gin.Context, m *hbtp.Map) {
method pipelineVersions (line 488) | func (PipelineController) pipelineVersions(c *gin.Context, m *hbtp.Map) {
method pipelineVersion (line 550) | func (PipelineController) pipelineVersion(c *gin.Context, m *hbtp.Map) {
method searchSha (line 603) | func (PipelineController) searchSha(c *gin.Context, m *hbtp.Map) {
method vars (line 642) | func (PipelineController) vars(c *gin.Context, m *hbtp.Map) {
method varSave (line 683) | func (PipelineController) varSave(c *gin.Context, pv *bean.PipelineVar) {
method varDel (line 736) | func (PipelineController) varDel(c *gin.Context, m *hbtp.Map) {
FILE: route/pipelineversion.go
type PipelineVersionController (line 12) | type PipelineVersionController struct
method GetPath (line 14) | func (PipelineVersionController) GetPath() string {
method Routes (line 17) | func (c *PipelineVersionController) Routes(g gin.IRoutes) {
method delete (line 22) | func (PipelineVersionController) delete(c *gin.Context, m *hbtp.Map) {
FILE: route/runtime.go
type RuntimeController (line 20) | type RuntimeController struct
method GetPath (line 22) | func (RuntimeController) GetPath() string {
method Routes (line 25) | func (c *RuntimeController) Routes(g gin.IRoutes) {
method stages (line 33) | func (RuntimeController) stages(c *gin.Context, m *hbtp.Map) {
method cmds (line 70) | func (RuntimeController) cmds(c *gin.Context, m *hbtp.Map) {
method build (line 97) | func (RuntimeController) build(c *gin.Context, m *hbtp.Map) {
method cancel (line 118) | func (RuntimeController) cancel(c *gin.Context, m *hbtp.Map) {
method logs (line 143) | func (RuntimeController) logs(c *gin.Context, m *hbtp.Map) {
FILE: route/trigger.go
type TriggerController (line 18) | type TriggerController struct
method GetPath (line 20) | func (TriggerController) GetPath() string {
method Routes (line 23) | func (c *TriggerController) Routes(g gin.IRoutes) {
method triggers (line 31) | func (TriggerController) triggers(c *gin.Context, m *hbtp.Map) {
method save (line 82) | func (TriggerController) save(c *gin.Context, tp *bean.TriggerParam) {
method delete (line 129) | func (TriggerController) delete(c *gin.Context, m *hbtp.Map) {
method runs (line 165) | func (TriggerController) runs(c *gin.Context, m *hbtp.Map) {
FILE: route/user.go
type UserController (line 16) | type UserController struct
method GetPath (line 18) | func (UserController) GetPath() string {
method Routes (line 21) | func (c *UserController) Routes(g gin.IRoutes) {
method page (line 31) | func (UserController) page(c *gin.Context, m *hbtp.Map) {
method new (line 48) | func (UserController) new(c *gin.Context, m *hbtp.Map) {
method info (line 98) | func (UserController) info(c *gin.Context, m *hbtp.Map) {
method upinfo (line 116) | func (UserController) upinfo(c *gin.Context, m *hbtp.Map) {
method upass (line 161) | func (UserController) upass(c *gin.Context, m *hbtp.Map) {
method active (line 208) | func (UserController) active(c *gin.Context, m *hbtp.Map) {
method perm (line 239) | func (UserController) perm(c *gin.Context, m *hbtp.Map) {
FILE: route/yml.go
type YmlController (line 10) | type YmlController struct
method GetPath (line 12) | func (YmlController) GetPath() string {
method Routes (line 15) | func (c *YmlController) Routes(g gin.IRoutes) {
method templates (line 19) | func (YmlController) templates(c *gin.Context) {
method plugins (line 25) | func (YmlController) plugins(c *gin.Context) {
FILE: ruis_test.go
function Test1 (line 7) | func Test1(t *testing.T) {
FILE: server/db.go
function initDb (line 15) | func initDb() error {
function initCache (line 42) | func initCache() error {
FILE: server/hbtp.go
function runHbtp (line 10) | func runHbtp() {
FILE: server/server.go
function Run (line 22) | func Run() error {
function parseConfig (line 73) | func parseConfig() error {
FILE: server/web.go
function runWeb (line 24) | func runWeb() {
function regApi (line 41) | func regApi() {
function midUiHandle (line 58) | func midUiHandle(c *gin.Context) {
function getRdr (line 118) | func getRdr() (*zip.Reader, error) {
function getFile (line 134) | func getFile(pth string) (*zip.File, error) {
FILE: service/db.go
function GetIdOrAid (line 5) | func GetIdOrAid(id interface{}, e interface{}) bool {
FILE: service/hook.go
function TriggerHook (line 21) | func TriggerHook(tt *model.TTrigger, req *http.Request) (rb *runtime.Bui...
function TriggerWeb (line 107) | func TriggerWeb(tt *model.TTrigger, secret string) (rb *runtime.Build, e...
function TriggerTimer (line 155) | func TriggerTimer(tt *model.TTrigger) (rb *runtime.Build, err error) {
function parseHook (line 180) | func parseHook(hookType string, req *http.Request, secret string) (hook....
FILE: service/mid.go
constant LgUserKey (line 8) | LgUserKey = "lguser"
function MidUserCheck (line 10) | func MidUserCheck(c *gin.Context) {
function GetMidLgUser (line 19) | func GetMidLgUser(c *gin.Context) *model.TUser {
FILE: service/param.go
function FindParam (line 12) | func FindParam(key string) (*model.TParam, bool) {
function SetParam (line 20) | func SetParam(key string, data []byte, tit ...string) error {
function SetsParam (line 37) | func SetsParam(key string, data interface{}, tit ...string) error {
function GetParam (line 48) | func GetParam(key string) ([]byte, error) {
function GetsParam (line 55) | func GetsParam(key string, data interface{}) error {
function GetsParamCache (line 66) | func GetsParamCache(key string, data interface{}, outm ...time.Duration)...
FILE: service/perms.go
function CheckPermission (line 8) | func CheckPermission(uid string, perms string) bool {
function CheckUPermission (line 15) | func CheckUPermission(usr *model.TUser, perms string) bool {
function CheckCurrPermission (line 26) | func CheckCurrPermission(c *gin.Context, perms string) bool {
FILE: service/pipeline.go
function Run (line 18) | func Run(uid, pipeId, sha, event string) (*model.TPipelineVersion, *runt...
function ReBuild (line 35) | func ReBuild(uid string, tvp *model.TPipelineVersion) (*model.TPipelineV...
function preBuild (line 52) | func preBuild(uid string, pipe *bean.Pipeline, tpipe *model.TPipelineCon...
function convertVar (line 223) | func convertVar(pipelineId string, vm map[string]string) (map[string]*ru...
function replaceStages (line 253) | func replaceStages(stages []*bean.Stage, mVars map[string]*runtime.Varia...
function replaceStage (line 258) | func replaceStage(stage *bean.Stage, mVars map[string]*runtime.Variables) {
function replaceSteps (line 269) | func replaceSteps(steps []*bean.Step, mVars map[string]*runtime.Variable...
function replaceStep (line 274) | func replaceStep(step *bean.Step, mVars map[string]*runtime.Variables) {
function replaceMaps (line 291) | func replaceMaps(envs map[string]string, mVars map[string]*runtime.Varia...
function replace (line 300) | func replace(s string, mVars map[string]*runtime.Variables, mustShow ......
FILE: service/trigger.go
function TriggerPerm (line 8) | func TriggerPerm(tt *model.TTrigger) error {
FILE: service/user.go
function GetUser (line 12) | func GetUser(uid string) (*model.TUser, bool) {
function GetUserInfo (line 23) | func GetUserInfo(uid string) (*model.TUserInfo, bool) {
function FindUserName (line 34) | func FindUserName(name string) (*model.TUser, bool) {
function ClearUserCache (line 43) | func ClearUserCache(uid string) {
function GetUserCache (line 50) | func GetUserCache(uid string) (*model.TUser, bool) {
function CurrUserCache (line 64) | func CurrUserCache(c *gin.Context) (*model.TUser, bool) {
function IsAdmin (line 84) | func IsAdmin(usr *model.TUser) bool {
function IsOrgAdmin (line 87) | func IsOrgAdmin(uid, orgId string) bool {
function GetUsePermRwr (line 94) | func GetUsePermRwr(uid, orgId string) int {
function HasOrgExec (line 101) | func HasOrgExec(uid, orgId string) bool {
function GetUserOrg (line 108) | func GetUserOrg(uid, orgId string) (*model.TUserOrg, bool) {
type OrgPerm (line 125) | type OrgPerm struct
method IsAdmin (line 150) | func (c *OrgPerm) IsAdmin() bool {
method IsOrgOwner (line 156) | func (c *OrgPerm) IsOrgOwner() bool {
method IsOrgPublic (line 162) | func (c *OrgPerm) IsOrgPublic() bool {
method IsOrgAdmin (line 168) | func (c *OrgPerm) IsOrgAdmin() bool {
method CanRead (line 177) | func (c *OrgPerm) CanRead() bool {
method CanWrite (line 183) | func (c *OrgPerm) CanWrite() bool {
method CanDownload (line 192) | func (c *OrgPerm) CanDownload() bool {
method CanExec (line 201) | func (c *OrgPerm) CanExec() bool {
method LgUser (line 212) | func (c *OrgPerm) LgUser() *model.TUser {
method Org (line 217) | func (c *OrgPerm) Org() *model.TOrg {
method UserOrg (line 222) | func (c *OrgPerm) UserOrg() *model.TUserOrg {
function NewOrgPerm (line 131) | func NewOrgPerm(lgusr *model.TUser, orgId string) *OrgPerm {
type UserPipeOrgPerm (line 226) | type UserPipeOrgPerm struct
type PipePerm (line 237) | type PipePerm struct
method IsAdmin (line 266) | func (c *PipePerm) IsAdmin() bool {
method IsPipeOwner (line 272) | func (c *PipePerm) IsPipeOwner() bool {
method CanRead (line 278) | func (c *PipePerm) CanRead() bool {
method CanWrite (line 295) | func (c *PipePerm) CanWrite() bool {
method CanExec (line 309) | func (c *PipePerm) CanExec() bool {
method LgUser (line 325) | func (c *PipePerm) LgUser() *model.TUser {
method Pipeline (line 330) | func (c *PipePerm) Pipeline() *model.TPipeline {
function NewPipePerm (line 243) | func NewPipePerm(lgusr *model.TUser, pipeId string) *PipePerm {
FILE: thirdapi/client.go
type Client (line 8) | type Client struct
FILE: thirdapi/giteaapi/gitea.go
function New (line 10) | func New(uri string) (*thirdapi.Client, error) {
function NewDefault (line 25) | func NewDefault() *thirdapi.Client {
type wrapper (line 30) | type wrapper struct
FILE: thirdapi/giteaapi/giteaapi.go
constant BaseApiGitea (line 5) | BaseApiGitea = "https://api.gitea.com"
constant ApiGiteaCreateFile (line 9) | ApiGiteaCreateFile = "/repos/%s/%s/contents/%s"
constant ApiGiteaGetRepos (line 14) | ApiGiteaGetRepos = "/user/repos?page=%v&limit=%v"
constant ApiGiteaCreateHooks (line 19) | ApiGiteaCreateHooks = "/repos/%s/%s/hooks"
constant ApiGiteaGetHooks (line 23) | ApiGiteaGetHooks = "/repos/%s/%s/hooks?page=%v&limit=%v"
constant ApiGiteaDeleteHooks (line 28) | ApiGiteaDeleteHooks = "/repos/%s/%s/hooks/%v"
constant ApiGiteaGetRepoBranches (line 32) | ApiGiteaGetRepoBranches = "/repos/%s/%s/branches?page=1&limit=30"
constant ApiGiteaGetPullRequest (line 35) | ApiGiteaGetPullRequest = "/repos/%s/%s/pulls/%v"
FILE: thirdapi/giteaapi/giteaapi_test.go
function TestGiteeContents (line 10) | func TestGiteeContents(t *testing.T) {
function TestGiteeCode (line 25) | func TestGiteeCode(t *testing.T) {
FILE: thirdapi/giteaapi/repositoryservice.go
type RepositoryService (line 16) | type RepositoryService struct
method GetRepos (line 33) | func (s *RepositoryService) GetRepos(accessToken, username, types, sor...
method DeleteHooks (line 88) | func (s *RepositoryService) DeleteHooks(accessToken, owner, repo, hook...
method CreateWebHooks (line 127) | func (s *RepositoryService) CreateWebHooks(accessToken, owner, repo, b...
method GetRepoBranches (line 179) | func (s *RepositoryService) GetRepoBranches(accessToken, owner, repo s...
method GetPullQuest (line 217) | func (s *RepositoryService) GetPullQuest(accessToken, owner, repo stri...
method GetWebHooks (line 250) | func (s *RepositoryService) GetWebHooks(accessToken, owner, repo strin...
function convertRepositoryList (line 288) | func convertRepositoryList(ls []*thirdbean.ResultGiteaRepo) []*thirdapi....
function convertRepository (line 296) | func convertRepository(from *thirdbean.ResultGiteaRepo) *thirdapi.Reposi...
function convertBranchList (line 308) | func convertBranchList(ls []*thirdbean.ResultGiteaRepoBranch) []*thirdap...
function convertBranch (line 316) | func convertBranch(from *thirdbean.ResultGiteaRepoBranch) *thirdapi.Repo...
function convertHookList (line 321) | func convertHookList(ls []*thirdbean.ResultGetGiteaHook) []*thirdapi.Rep...
function convertHook (line 329) | func convertHook(from *thirdbean.ResultGetGiteaHook) *thirdapi.Repositor...
FILE: thirdapi/giteeapi/gitee.go
function New (line 11) | func New(uri string) (*thirdapi.Client, error) {
function NewDefault (line 29) | func NewDefault() *thirdapi.Client {
type wrapper (line 34) | type wrapper struct
FILE: thirdapi/giteeapi/giteeapi.go
constant BaseApiGitee (line 5) | BaseApiGitee = "https://gitee.com/api/v5"
constant ApiGiteeCreateFile (line 10) | ApiGiteeCreateFile = "/repos/%s/%s/contents/%v"
constant ApiGiteeGetRepos (line 15) | ApiGiteeGetRepos = "/user/repos?access_token=%s&type=%v&sort=%v&directio...
constant ApiGiteeCreateHooks (line 20) | ApiGiteeCreateHooks = "/repos/%s/%s/hooks"
constant ApiGiteeGetHooks (line 24) | ApiGiteeGetHooks = "/repos/%s/%s/hooks?access_token=%s&page=%v&per_page=%v"
constant ApiGiteeDeleteHooks (line 29) | ApiGiteeDeleteHooks = "/repos/%s/%s/hooks/%v?access_token=%s"
constant ApiGiteeGetRepoBranches (line 33) | ApiGiteeGetRepoBranches = "/repos/%s/%s/branches?access_token=%s"
FILE: thirdapi/giteeapi/giteeapi_test.go
function TestGiteeCreateFile (line 25) | func TestGiteeCreateFile(t *testing.T) {
FILE: thirdapi/giteeapi/repositoryservice.go
type RepositoryService (line 17) | type RepositoryService struct
method GetRepos (line 34) | func (s *RepositoryService) GetRepos(accessToken, username, types, sor...
method DeleteHooks (line 83) | func (s *RepositoryService) DeleteHooks(accessToken, owner, repo, hook...
method CreateWebHooks (line 121) | func (s *RepositoryService) CreateWebHooks(accessToken, owner, repo, b...
method GetRepoBranches (line 165) | func (s *RepositoryService) GetRepoBranches(accessToken, owner, repo s...
method GetWebHooks (line 203) | func (s *RepositoryService) GetWebHooks(accessToken, owner, repo strin...
function convertHookList (line 239) | func convertHookList(ls []*thirdbean.ResultGetGiteeHook) []*thirdapi.Rep...
function convertHook (line 247) | func convertHook(from *thirdbean.ResultGetGiteeHook) *thirdapi.Repositor...
function convertBranchList (line 255) | func convertBranchList(ls []*thirdbean.ResultGiteeRepoBranch) []*thirdap...
function convertBranch (line 263) | func convertBranch(from *thirdbean.ResultGiteeRepoBranch) *thirdapi.Repo...
function convertRepositoryList (line 269) | func convertRepositoryList(ls []*thirdbean.ResultGiteeRepo) []*thirdapi....
function convertRepository (line 277) | func convertRepository(from *thirdbean.ResultGiteeRepo) *thirdapi.Reposi...
FILE: thirdapi/giteepremiumapi/giteepremium.go
function New (line 11) | func New(uri string) (*thirdapi.Client, error) {
function NewDefault (line 29) | func NewDefault() *thirdapi.Client {
type wrapper (line 34) | type wrapper struct
FILE: thirdapi/giteepremiumapi/giteepremiumapi.go
constant BaseApiGiteePremium (line 5) | BaseApiGiteePremium = "https://gitee.com/api/v5"
constant ApiGiteePremiumCreateFile (line 10) | ApiGiteePremiumCreateFile = "/repos/%s/%s/contents/%v"
constant ApiGiteePremiumGetRepos (line 15) | ApiGiteePremiumGetRepos = "/user/repos?access_token=%s&type=%v&sort=%v&d...
constant ApiGiteePremiumCreateHooks (line 20) | ApiGiteePremiumCreateHooks = "/repos/%s/%s/hooks"
constant ApiGiteePremiumGetHooks (line 24) | ApiGiteePremiumGetHooks = "/repos/%s/%s/hooks?access_token=%s&page=%v&pe...
constant ApiGiteePremiumDeleteHooks (line 29) | ApiGiteePremiumDeleteHooks = "/repos/%s/%s/hooks/%v?access_token=%s"
constant ApiGiteePremiumGetRepoBranches (line 33) | ApiGiteePremiumGetRepoBranches = "/repos/%s/%s/branches?access_token=%s"
FILE: thirdapi/giteepremiumapi/repositoryservice.go
type RepositoryService (line 17) | type RepositoryService struct
method GetRepos (line 34) | func (s *RepositoryService) GetRepos(accessToken, username, types, sor...
method DeleteHooks (line 83) | func (s *RepositoryService) DeleteHooks(accessToken, owner, repo, hook...
method CreateWebHooks (line 121) | func (s *RepositoryService) CreateWebHooks(accessToken, owner, repo, b...
method GetRepoBranches (line 165) | func (s *RepositoryService) GetRepoBranches(accessToken, owner, repo s...
method GetWebHooks (line 203) | func (s *RepositoryService) GetWebHooks(accessToken, owner, repo strin...
function convertHookList (line 239) | func convertHookList(ls []*thirdbean.ResultGetGiteePremiumHook) []*third...
function convertHook (line 247) | func convertHook(from *thirdbean.ResultGetGiteePremiumHook) *thirdapi.Re...
function convertBranchList (line 255) | func convertBranchList(ls []*thirdbean.ResultGiteePremiumRepoBranch) []*...
function convertBranch (line 263) | func convertBranch(from *thirdbean.ResultGiteePremiumRepoBranch) *thirda...
function convertRepositoryList (line 269) | func convertRepositoryList(ls []*thirdbean.ResultGiteePremiumRepo) []*th...
function convertRepository (line 277) | func convertRepository(from *thirdbean.ResultGiteePremiumRepo) *thirdapi...
FILE: thirdapi/githubapi/github.go
function New (line 10) | func New(uri string) (*thirdapi.Client, error) {
function NewDefault (line 25) | func NewDefault() *thirdapi.Client {
type wrapper (line 30) | type wrapper struct
FILE: thirdapi/githubapi/githubapi.go
constant BaseApiGithub (line 5) | BaseApiGithub = "https://api.github.com"
constant ApiGithubCreateFile (line 9) | ApiGithubCreateFile = "/repos/%s/%s/contents/%s"
constant ApiGithubGetRepos (line 14) | ApiGithubGetRepos = "/user/repos?type=%v&sort=%v&direction=%v&page=%v&pe...
constant ApiGithubCreateHooks (line 19) | ApiGithubCreateHooks = "/repos/%s/%s/hooks"
constant ApiGithubGetHooks (line 23) | ApiGithubGetHooks = "/repos/%s/%s/hooks?page=%v&per_page=%v"
constant ApiGithubDeleteHooks (line 28) | ApiGithubDeleteHooks = "/repos/%s/%s/hooks/%v"
constant ApiGithubGetRepoBranches (line 32) | ApiGithubGetRepoBranches = "/repos/%s/%s/branches?per_page=100"
FILE: thirdapi/githubapi/githubapi_test.go
function TestGiteeContents (line 10) | func TestGiteeContents(t *testing.T) {
function TestGiteeCode (line 25) | func TestGiteeCode(t *testing.T) {
FILE: thirdapi/githubapi/repositoryservice.go
type RepositoryService (line 18) | type RepositoryService struct
method GetRepos (line 35) | func (s *RepositoryService) GetRepos(accessToken, username, types, sor...
method DeleteHooks (line 96) | func (s *RepositoryService) DeleteHooks(accessToken, owner, repo, hook...
method CreateWebHooks (line 135) | func (s *RepositoryService) CreateWebHooks(accessToken, owner, repo, b...
method GetRepoBranches (line 186) | func (s *RepositoryService) GetRepoBranches(accessToken, owner, repo s...
method GetWebHooks (line 224) | func (s *RepositoryService) GetWebHooks(accessToken, owner, repo strin...
function convertRepositoryList (line 262) | func convertRepositoryList(ls []*thirdbean.ResultGithubRepo) []*thirdapi...
function convertRepository (line 270) | func convertRepository(from *thirdbean.ResultGithubRepo) *thirdapi.Repos...
function convertBranchList (line 282) | func convertBranchList(ls []*thirdbean.ResultGithubRepoBranch) []*thirda...
function convertBranch (line 290) | func convertBranch(from *thirdbean.ResultGithubRepoBranch) *thirdapi.Rep...
function convertHookList (line 295) | func convertHookList(ls []*thirdbean.ResultGetGithubHook) []*thirdapi.Re...
function convertHook (line 303) | func convertHook(from *thirdbean.ResultGetGithubHook) *thirdapi.Reposito...
FILE: thirdapi/gitlabapi/gitlab.go
function New (line 10) | func New(uri string) (*thirdapi.Client, error) {
function NewDefault (line 25) | func NewDefault() *thirdapi.Client {
type wrapper (line 30) | type wrapper struct
FILE: thirdapi/gitlabapi/gitlabapi.go
constant BaseApiGitlab (line 5) | BaseApiGitlab = "https://gitlab.com/api/v4"
constant ApiGitlabCreateFile (line 9) | ApiGitlabCreateFile = "/repos/%s/%s/contents/%s"
constant ApiGitlabGetRepos (line 14) | ApiGitlabGetRepos = "/users/%s/projects?type=%v&page=%v&per_page=%v"
constant ApiGitlabCreateHooks (line 19) | ApiGitlabCreateHooks = "/projects/%s/hooks"
constant ApiGitlabGetHooks (line 23) | ApiGitlabGetHooks = "/projects/%s/hooks?page=%v&per_page=%v"
constant ApiGitlabDeleteHooks (line 28) | ApiGitlabDeleteHooks = "/projects/%s/hooks/%v"
constant ApiGitlabGetRepoBranches (line 32) | ApiGitlabGetRepoBranches = "/projects/%v/repository/branches"
FILE: thirdapi/gitlabapi/gitlabapi_test.go
function TestGiteeContents (line 10) | func TestGiteeContents(t *testing.T) {
function TestGiteeCode (line 25) | func TestGiteeCode(t *testing.T) {
FILE: thirdapi/gitlabapi/repositoryservice.go
type RepositoryService (line 17) | type RepositoryService struct
method GetRepos (line 21) | func (s *RepositoryService) GetRepos(accessToken, username, types, sor...
method DeleteHooks (line 71) | func (s *RepositoryService) DeleteHooks(accessToken, owner, repo, hook...
method CreateWebHooks (line 111) | func (s *RepositoryService) CreateWebHooks(accessToken, owner, repo, b...
method GetRepoBranches (line 161) | func (s *RepositoryService) GetRepoBranches(accessToken, owner, repo s...
method GetWebHooks (line 200) | func (s *RepositoryService) GetWebHooks(accessToken, owner, repo strin...
function convertRepositoryList (line 239) | func convertRepositoryList(ls []*thirdbean.ResultGitlabRepo) []*thirdapi...
function convertRepository (line 247) | func convertRepository(from *thirdbean.ResultGitlabRepo) *thirdapi.Repos...
function convertBranchList (line 259) | func convertBranchList(ls []*thirdbean.ResultGitlabRepoBranch) []*thirda...
function convertBranch (line 267) | func convertBranch(from *thirdbean.ResultGitlabRepoBranch) *thirdapi.Rep...
function convertHookList (line 272) | func convertHookList(ls []*thirdbean.ResultGetGitlabHook) []*thirdapi.Re...
function convertHook (line 280) | func convertHook(from *thirdbean.ResultGetGitlabHook) *thirdapi.Reposito...
FILE: thirdapi/repo.go
type Repository (line 5) | type Repository struct
type RepositoryPage (line 16) | type RepositoryPage struct
type RepositoryBranch (line 21) | type RepositoryBranch struct
type RepositoryHook (line 25) | type RepositoryHook struct
FILE: thirdapi/repositoryservice.go
type RepositoryService (line 4) | type RepositoryService interface
FILE: util/gin.go
type GinController (line 12) | type GinController interface
function GinRegController (line 17) | func GinRegController(g *gin.Engine, gc GinController) {
function GinReqParseJson (line 31) | func GinReqParseJson(fn interface{}) gin.HandlerFunc {
function MidAccessAllowFun (line 72) | func MidAccessAllowFun(c *gin.Context) {
FILE: util/git.go
function CloneRepo (line 10) | func CloneRepo(path string, option *git.CloneOptions, ctx context.Contex...
function CheckOutHash (line 18) | func CheckOutHash(repository *git.Repository, hash string) error {
function CheckOut (line 27) | func CheckOut(repository *git.Repository, option *git.CheckoutOptions) e...
function GetLogsHash (line 39) | func GetLogsHash(repository *git.Repository, hash string) (object.Commit...
function GetLogs (line 45) | func GetLogs(repository *git.Repository, option *git.LogOptions) (object...
FILE: util/httpex/const.go
function ResMsgUrl (line 48) | func ResMsgUrl(c *gin.Context, msg string, url ...string) {
FILE: util/httpex/post.go
function Post (line 15) | func Post(ul string, params *url.Values, timeout time.Duration, hds ...h...
function Posts (line 33) | func Posts(ul string, params *url.Values, timeout time.Duration, hds ......
function PostJSON (line 60) | func PostJSON(ul string, params interface{}, timeout time.Duration, hds ...
function PostResult (line 80) | func PostResult(ul string, params *url.Values, result interface{}, timeo...
function PostJSONResult (line 97) | func PostJSONResult(ul string, params interface{}, result interface{}, t...
FILE: util/token.go
function CreateToken (line 13) | func CreateToken(claims jwt.MapClaims, key string, tmout time.Duration) ...
function SetToken (line 25) | func SetToken(c *gin.Context, p jwt.MapClaims, key string, rem bool, dom...
function ClearToken (line 51) | func ClearToken(c *gin.Context, doman ...string) error {
function getToken (line 64) | func getToken(c *gin.Context) string {
function getTokenAuth (line 71) | func getTokenAuth(c *gin.Context) string {
function GetTokens (line 83) | func GetTokens(s string, key string) jwt.MapClaims {
function GetToken (line 98) | func GetToken(c *gin.Context, key string) jwt.MapClaims {
Condensed preview — 154 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,011K chars).
[
{
"path": ".gitignore",
"chars": 334,
"preview": "# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n/dbm.bat\n/db"
},
{
"path": "Dockerfile",
"chars": 614,
"preview": "FROM golang:1.16.6-alpine3.14 AS builder\n# ENV GOPROXY=https://goproxy.cn,direct\n# RUN apk add git build-base && git clo"
},
{
"path": "LICENSE",
"chars": 1063,
"preview": "MIT License\n\nCopyright (c) 2021 gokins\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof "
},
{
"path": "README.md",
"chars": 1799,
"preview": "# 项目已经转移仓库到下面地址维护\n\n## https://github.com/gokins/gokins\n\n\n\n# Gokins文档\n\n# Gokins: *More Power*\n\n\n\nfunc skipBranch(c *Condition, branch string) bool {\n\treturn !c.Match(bran"
},
{
"path": "bean/db.go",
"chars": 305,
"preview": "package bean\n\ntype Page struct {\n\tPage int64 `json:\"page\"`\n\tSize int64 `json:\"size\"`\n\tTotal int64 `j"
},
{
"path": "bean/http.go",
"chars": 416,
"preview": "package bean\n\ntype IdsRes struct {\n\tId string `json:\"id\"`\n\tAid int64 `json:\"aid\"`\n}\ntype LoginReq struct {\n\tName strin"
},
{
"path": "bean/models.go",
"chars": 386,
"preview": "package bean\n\ntype PipelineShow struct {\n\tId string `json:\"id\"`\n\tUid string `json:\"uid\"`\n\tName "
},
{
"path": "bean/pipeline.go",
"chars": 690,
"preview": "package bean\n\ntype NewPipeline struct {\n\tName string `json:\"name\"`\n\tDisplayName string `jso"
},
{
"path": "bean/pipelinevar.go",
"chars": 255,
"preview": "package bean\n\ntype PipelineVar struct {\n\tAid int64 `json:\"aid\"`\n\tPipelineId string `json:\"pipelineId\"`\n\tName "
},
{
"path": "bean/runtime.go",
"chars": 385,
"preview": "package bean\n\nimport \"time\"\n\ntype LogOutJson struct {\n\tId string `json:\"id\"`\n\tContent string `json:\"content\"`"
},
{
"path": "bean/thirdbean/gitea.go",
"chars": 4992,
"preview": "package thirdbean\n\nimport \"time\"\n\ntype ResultGiteaRepo struct {\n\tId int `json:\"id\"`\n\tOwner struct {\n\t\tId i"
},
{
"path": "bean/thirdbean/gitee.go",
"chars": 7337,
"preview": "package thirdbean\n\nimport \"time\"\n\ntype ResultGiteeCreateHooks struct {\n\tId int `json:\"id\"`\n\tUrl"
},
{
"path": "bean/thirdbean/giteepremium.go",
"chars": 7365,
"preview": "package thirdbean\n\nimport \"time\"\n\ntype ResultGiteePremiumCreateHooks struct {\n\tId int `json:\"id"
},
{
"path": "bean/thirdbean/github.go",
"chars": 5949,
"preview": "package thirdbean\n\nimport \"time\"\n\ntype ResultGithubRepo struct {\n\tId int `json:\"id\"`\n\tNodeId string `json:\"no"
},
{
"path": "bean/thirdbean/gitlab.go",
"chars": 9579,
"preview": "package thirdbean\n\nimport \"time\"\n\ntype ResultGitlabRepo struct {\n\tId int `json:\"id\"`\n\tDescripti"
},
{
"path": "bean/trigger.go",
"chars": 585,
"preview": "package bean\n\nimport \"errors\"\n\ntype TriggerParam struct {\n\tId string `json:\"id\"`\n\tPipelineId string `json:\"pipel"
},
{
"path": "bean/yml.go",
"chars": 5256,
"preview": "package bean\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype Pipeline struct {\n\tVersion string "
},
{
"path": "bindata.sh",
"chars": 138,
"preview": "\n# go get -u github.com/jteeuwen/go-bindata/...\n\ngo-bindata -o comm/migrate.go -pkg=comm -prefix migrates migrates/mysql"
},
{
"path": "bindui.sh",
"chars": 20,
"preview": "go run compressui.go"
},
{
"path": "build.sh",
"chars": 55,
"preview": "\nexport CGO_ENABLED=0\ngo build -o ../bin/gokins main.go"
},
{
"path": "cmd/cmd.go",
"chars": 1967,
"preview": "package cmd\n\nimport (\n\t\"github.com/gokins/core\"\n\t\"github.com/gokins/gokins/comm\"\n\t\"github.com/gokins/gokins/server\"\n\thbt"
},
{
"path": "comm/app.go",
"chars": 564,
"preview": "package comm\n\nimport (\n\t\"context\"\n\n\t\"github.com/boltdb/bolt\"\n\t\"github.com/gin-gonic/gin\"\n\thbtp \"github.com/mgr9525/Hyper"
},
{
"path": "comm/cache.go",
"chars": 3444,
"preview": "package comm\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"github.com/boltdb/bolt\"\n\thbtp \"github.com/mgr9525/HyperByte"
},
{
"path": "comm/config.go",
"chars": 453,
"preview": "package comm\n\ntype Config struct {\n\tServer struct {\n\t\tHost string `yaml:\"host\"` //外网访问地址\n\t\tLoginKey string `ya"
},
{
"path": "comm/db.go",
"chars": 2866,
"preview": "package comm\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/gokins/gokins/bean\"\n\t\"xorm.io/builder\"\n\t\"xor"
},
{
"path": "comm/migrate.go",
"chars": 15079,
"preview": "package comm\n\nimport (\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n)\n\nfunc bindata_read(data []byte, name string) "
},
{
"path": "comm/thirdapi.go",
"chars": 1122,
"preview": "package comm\n\nimport (\n\t\"github.com/gokins/gokins/thirdapi\"\n\t\"github.com/gokins/gokins/thirdapi/giteaapi\"\n\t\"github.com/g"
},
{
"path": "comm/uis.go",
"chars": 3296782,
"preview": "package comm\n\nconst StaticPkg = \"UEsDBBQACAAIAAAAAAAAAAAAAAAAAAAAAAALAAAAZmF2aWNvbi5pY2/sXA9wXMV5XyGbIwmOZCBN6pTYJU2xS6A"
},
{
"path": "compressui.go",
"chars": 838,
"preview": "package main\n\nimport (\n\t\"encoding/base64\"\n\t\"flag\"\n\t\"fmt\"\n\t\"github.com/gokins/core/utils\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filep"
},
{
"path": "engine/buildDao.go",
"chars": 5004,
"preview": "package engine\n\nimport (\n\t\"github.com/gokins/core/common\"\n\t\"github.com/gokins/core/runtime\"\n\t\"github.com/gokins/gokins/c"
},
{
"path": "engine/buildEgn.go",
"chars": 2897,
"preview": "package engine\n\nimport (\n\t\"container/list\"\n\t\"github.com/gokins/core/common\"\n\t\"github.com/gokins/core/runtime\"\n\t\"github.c"
},
{
"path": "engine/buildTask.go",
"chars": 12001,
"preview": "package engine\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"runtime/debug\"\n\t\"strconv\"\n\t\"sync\"\n\t\"time\"\n"
},
{
"path": "engine/buildTaskc.go",
"chars": 7173,
"preview": "package engine\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/gokins/core/common\"\n\t\"github.com/gokins/core/runtime\"\n\t\"github.co"
},
{
"path": "engine/buildtask_test.go",
"chars": 500,
"preview": "package engine\n\nimport (\n\t\"fmt\"\n\t\"github.com/gokins/core/runtime\"\n\t\"testing\"\n)\n\nfunc TestGitClone(t *testing.T) {\n\ttask "
},
{
"path": "engine/hbtpruner.go",
"chars": 6448,
"preview": "package engine\n\nimport (\n\t\"fmt\"\n\t\"github.com/gokins/core/common\"\n\t\"github.com/gokins/core/utils\"\n\t\"github.com/gokins/gok"
},
{
"path": "engine/jobEgn.go",
"chars": 3422,
"preview": "package engine\n\nimport (\n\t\"container/list\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/gokins/core/runtime\"\n\t\"github.com/gokins/core/u"
},
{
"path": "engine/mgr.go",
"chars": 1707,
"preview": "package engine\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime/debug\"\n\t\"time\"\n\n\t\"github.com/gokins/core/common\"\n\t\"github.com/"
},
{
"path": "engine/runner.go",
"chars": 9423,
"preview": "package engine\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/gokins/gokins/service\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n"
},
{
"path": "engine/timermgr.go",
"chars": 5036,
"preview": "package engine\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"github.com/gokins/core/common\"\n\t\"github.com/gokins/gokins/comm\"\n\t\""
},
{
"path": "engine/timermgr_test.go",
"chars": 441,
"preview": "package engine\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n)\n\nfunc TestTimer(t *testing.T) {\n\ttm := time.NewTimer(time.S"
},
{
"path": "go.mod",
"chars": 635,
"preview": "module github.com/gokins/gokins\n\ngo 1.15\n\nrequire (\n\tgithub.com/boltdb/bolt v1.3.1\n\tgithub.com/dgrijalva/jwt-go v3.2.0+i"
},
{
"path": "go.sum",
"chars": 77026,
"preview": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1"
},
{
"path": "hook/action.go",
"chars": 281,
"preview": "package hook\n\ntype Action int\n\nconst (\n\tActionOpen = \"open\"\n\tActionOpened = \"opened\"\n\tActionClose = \"c"
},
{
"path": "hook/event.go",
"chars": 1287,
"preview": "package hook\n\n//触发事件\nconst (\n\t// EVENTS_TYPE_COMMENT 评论事件\n\tEVENTS_TYPE_COMMENT = \"comment\"\n\t// EVENTS_TYPE_PR pull reque"
},
{
"path": "hook/git.go",
"chars": 197,
"preview": "package hook\n\ntype (\n\tReference struct {\n\t\tName string\n\t\tPath string\n\t\tSha string\n\t}\n\n\tCommit struct {\n\t\tSha string"
},
{
"path": "hook/gitea/gitea.go",
"chars": 44999,
"preview": "package gitea\n\nimport (\n\t\"crypto/hmac\"\n\t\"crypto/sha1\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\""
},
{
"path": "hook/gitee/gitee.go",
"chars": 55346,
"preview": "package gitee\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/gokins/gokins/hook\"\n\t\"github.com/sirupsen/logrus\""
},
{
"path": "hook/github/github.go",
"chars": 63899,
"preview": "package github\n\nimport (\n\t\"crypto/hmac\"\n\t\"crypto/sha1\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt"
},
{
"path": "hook/gitlab/gitlab.go",
"chars": 23299,
"preview": "package gitlab\n\nimport (\n\t\"crypto/hmac\"\n\t\"crypto/sha1\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt"
},
{
"path": "hook/pr.go",
"chars": 314,
"preview": "package hook\n\nimport \"time\"\n\ntype (\n\t// PullRequest represents a repository pull request.\n\tPullRequest struct {\n\t\tNumber"
},
{
"path": "hook/repo.go",
"chars": 889,
"preview": "package hook\n\nimport \"time\"\n\ntype Repository struct {\n\tId string `json:\"id\"`\n\tRef string `json:\"r"
},
{
"path": "hook/webhook.go",
"chars": 1177,
"preview": "package hook\n\nimport (\n\t\"net/http\"\n)\n\ntype (\n\tWebHook interface {\n\t\tRepository() Repository\n\t}\n\tWebhookService interface"
},
{
"path": "main.go",
"chars": 120,
"preview": "package main\n\nimport (\n\t\"github.com/gokins/gokins/cmd\"\n\t//_ \"github.com/mattn/go-sqlite3\"\n)\n\nfunc main() {\n\tcmd.Run()\n}\n"
},
{
"path": "migrates/init.go",
"chars": 3276,
"preview": "package migrates\n\nimport (\n\t\"database/sql\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/gokins/gokins/comm\"\n\t\"github.com/golang-migrate"
},
{
"path": "migrates/mysql/000001_gokins.down.sql",
"chars": 863,
"preview": "DROP TABLE IF EXISTS `t_artifact_package`;\nDROP TABLE IF EXISTS `t_artifact_version`;\nDROP TABLE IF EXISTS `t_artifactor"
},
{
"path": "migrates/mysql/000001_gokins.up.sql",
"chars": 15502,
"preview": "CREATE TABLE `t_artifact_package` (\n `id` varchar(64) NOT NULL,\n `aid` bigint(20) NOT NULL AUTO_INCREMENT,\n `repo_id`"
},
{
"path": "migrates/sqlite/000001_gokins.down.sql",
"chars": 31,
"preview": "DROP TABLE IF EXISTS `t_build`;"
},
{
"path": "migrates/sqlite/000001_gokins.up.sql",
"chars": 531,
"preview": "CREATE TABLE `t_build` (\n `id` TEXT NOT NULL PRIMARY KEY,\n `pipeline_id` TEXT DEFAULT NULL,\n `pipeline_version_id` TE"
},
{
"path": "migrates/up.go",
"chars": 2670,
"preview": "package migrates\n\nimport (\n\t\"database/sql\"\n\t\"errors\"\n\t\"github.com/gokins/gokins/comm\"\n\t\"github.com/golang-migrate/migrat"
},
{
"path": "model/schema_migrations.go",
"chars": 167,
"preview": "package model\n\ntype SchemaMigrations struct {\n\tVersion int64 `xorm:\"not null pk BIGINT(20)\" json:\"version\"`\n\tDirty int"
},
{
"path": "model/t_artifact_package.go",
"chars": 701,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TArtifactPackage struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\""
},
{
"path": "model/t_artifact_version.go",
"chars": 726,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TArtifactVersion struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" j"
},
{
"path": "model/t_artifactory.go",
"chars": 924,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TArtifactory struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" jso"
},
{
"path": "model/t_build.go",
"chars": 905,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TBuild struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" jso"
},
{
"path": "model/t_cmd_line.go",
"chars": 651,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TCmdLine struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" json:\"id\"`"
},
{
"path": "model/t_message.go",
"chars": 572,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TMessage struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" json:\"id\"`\n"
},
{
"path": "model/t_org.go",
"chars": 709,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TOrg struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" json:\"id\"`\n"
},
{
"path": "model/t_org_pipe.go",
"chars": 384,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TOrgPipe struct {\n\tAid int64 `xorm:\"not null pk autoincr BIGINT(20)\" jso"
},
{
"path": "model/t_param.go",
"chars": 321,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TParam struct {\n\tAid int64 `xorm:\"not null pk autoincr BIGINT(20)\" json:\"a"
},
{
"path": "model/t_pipeline.go",
"chars": 556,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TPipeline struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" json:"
},
{
"path": "model/t_pipeline_conf.go",
"chars": 410,
"preview": "package model\n\ntype TPipelineConf struct {\n\tAid int `xorm:\"not null pk autoincr INT(20)\" json:\"aid\"`\n\tPipelin"
},
{
"path": "model/t_pipeline_var.go",
"chars": 460,
"preview": "package model\n\ntype TPipelineVar struct {\n\tAid int64 `xorm:\"not null pk autoincr BIGINT(20)\" json:\"aid\"`\n\tUid "
},
{
"path": "model/t_pipeline_version.go",
"chars": 1078,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TPipelineVersion struct {\n\tId string `xorm:\"not null pk VARC"
},
{
"path": "model/t_stage.go",
"chars": 1030,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TStage struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" jso"
},
{
"path": "model/t_step.go",
"chars": 1524,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TStep struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" json"
},
{
"path": "model/t_trigger.go",
"chars": 701,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TTrigger struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" json:\"id"
},
{
"path": "model/t_trigger_run.go",
"chars": 525,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TTriggerRun struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" js"
},
{
"path": "model/t_user.go",
"chars": 587,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TUser struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" json:\"id\"`\n\t"
},
{
"path": "model/t_user_info.go",
"chars": 491,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TUserInfo struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" json:\"id\""
},
{
"path": "model/t_user_msg.go",
"chars": 567,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TUserMsg struct {\n\tAid int64 `xorm:\"not null pk autoincr BIGINT(20)\""
},
{
"path": "model/t_user_org.go",
"chars": 627,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TUserOrg struct {\n\tAid int64 `xorm:\"not null pk autoincr BIGINT(20)\" js"
},
{
"path": "model/t_user_token.go",
"chars": 967,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TUserToken struct {\n\tAid int64 `xorm:\"not null pk autoincr BIGINT(2"
},
{
"path": "model/t_yml_plugin.go",
"chars": 376,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TYmlPlugin struct {\n\tAid int64 `xorm:\"not null pk autoincr BIGINT(20"
},
{
"path": "model/t_yml_template.go",
"chars": 378,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype TYmlTemplate struct {\n\tAid int64 `xorm:\"not null pk autoincr BIGINT("
},
{
"path": "models/run_build.go",
"chars": 966,
"preview": "package models\n\nimport (\n\t\"time\"\n)\n\ntype RunBuild struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" "
},
{
"path": "models/run_stage.go",
"chars": 2474,
"preview": "package models\n\nimport (\n\t\"time\"\n)\n\ntype RunStage struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" "
},
{
"path": "models/t_artifact_package.go",
"chars": 716,
"preview": "package models\n\nimport (\n\t\"time\"\n)\n\ntype TArtifactPackage struct {\n\tId string `xorm:\"not null pk VARCHAR(64)"
},
{
"path": "models/t_artifact_version.go",
"chars": 1670,
"preview": "package models\n\nimport (\n\thbtp \"github.com/mgr9525/HyperByte-Transfer-Protocol\"\n\t\"io/ioutil\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t"
},
{
"path": "models/t_artifactory.go",
"chars": 1038,
"preview": "package models\n\nimport (\n\t\"time\"\n)\n\ntype TArtifactory struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" js"
},
{
"path": "models/t_org.go",
"chars": 1558,
"preview": "package models\n\nimport (\n\t\"time\"\n)\n\ntype TOrg struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" json:\"id\"`"
},
{
"path": "models/t_pipeline.go",
"chars": 1529,
"preview": "package models\n\nimport (\n\t\"time\"\n)\n\ntype TPipeline struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" json"
},
{
"path": "models/t_pipeline_var.go",
"chars": 479,
"preview": "package models\n\ntype TPipelineVar struct {\n\tAid int64 `xorm:\"not null pk autoincr BIGINT(20)\" json:\"aid\"`\n\tPipel"
},
{
"path": "models/t_pipeline_version.go",
"chars": 1466,
"preview": "package models\n\nimport (\n\t\"time\"\n)\n\ntype TPipelineVersion struct {\n\tId string `xorm:\"not null pk VAR"
},
{
"path": "models/t_trigger.go",
"chars": 840,
"preview": "package models\n\nimport \"time\"\n\ntype TTrigger struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" json:\"id\"`\n\t"
},
{
"path": "models/t_trigger_run.go",
"chars": 1241,
"preview": "package models\n\nimport (\n\t\"time\"\n)\n\ntype TTriggerRun struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" j"
},
{
"path": "models/t_user.go",
"chars": 1397,
"preview": "package models\n\nimport (\n\t\"time\"\n)\n\ntype TUser struct {\n\tId string `xorm:\"not null pk VARCHAR(64)\" json:\"id\"`\n"
},
{
"path": "models/t_yml_plugin.go",
"chars": 221,
"preview": "package models\n\ntype TYmlPlugin struct {\n\tAid int64 `xorm:\"not null pk autoincr BIGINT(20)\" json:\"aid\"`\n\tName "
},
{
"path": "models/t_yml_template.go",
"chars": 223,
"preview": "package models\n\ntype TYmlTemplate struct {\n\tAid int64 `xorm:\"not null pk autoincr BIGINT(20)\" json:\"aid\"`\n\tName "
},
{
"path": "route/api.go",
"chars": 1801,
"preview": "package route\n\nimport (\n\t\"errors\"\n\t\"io/ioutil\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gokins/core/runtime\"\n\t\"github.c"
},
{
"path": "route/artifact.go",
"chars": 10412,
"preview": "package route\n\nimport (\n\t\"fmt\"\n\t\"github.com/gokins/core/common\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\""
},
{
"path": "route/artpub.go",
"chars": 2621,
"preview": "package route\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com"
},
{
"path": "route/hook.go",
"chars": 1514,
"preview": "package route\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gokins/gokins/comm\"\n\t\"github.com/gokins/gokins/engine\"\n"
},
{
"path": "route/install.go",
"chars": 12922,
"preview": "package route\n\nimport (\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gokins/gok"
},
{
"path": "route/login.go",
"chars": 2036,
"preview": "package route\n\nimport (\n\t\"github.com/gokins/gokins/models\"\n\thbtp \"github.com/mgr9525/HyperByte-Transfer-Protocol\"\n\t\"stri"
},
{
"path": "route/org.go",
"chars": 10115,
"preview": "package route\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gokins/core/utils\"\n\t\"github.com/gokins/"
},
{
"path": "route/pipeline.go",
"chars": 18716,
"preview": "package route\n\nimport (\n\t\"fmt\"\n\t\"github.com/gokins/gokins/engine\"\n\t\"github.com/gokins/gokins/models\"\n\t\"net/http\"\n\t\"time\""
},
{
"path": "route/pipelineversion.go",
"chars": 1201,
"preview": "package route\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gokins/gokins/comm\"\n\t\"github.com/gokins/gokins/model\"\n\t"
},
{
"path": "route/runtime.go",
"chars": 4976,
"preview": "package route\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gokins/core/common\"\n\t\"github."
},
{
"path": "route/trigger.go",
"chars": 4939,
"preview": "package route\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gokins/core/utils\"\n\t\"github.com/gokins"
},
{
"path": "route/user.go",
"chars": 6488,
"preview": "package route\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gokins/core/utils\"\n\t\"github.com/gokins/gokins/comm\"\n\t\"g"
},
{
"path": "route/yml.go",
"chars": 699,
"preview": "package route\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gokins/gokins/comm\"\n\t\"github.com/gokins/gokins/models\"\n"
},
{
"path": "ruis_test.go",
"chars": 84,
"preview": "package main\n\nimport (\n\t\"testing\"\n)\n\nfunc Test1(t *testing.T) {\n\tprintln(\"hello\")\n}\n"
},
{
"path": "server/db.go",
"chars": 958,
"preview": "package server\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/boltdb/bolt\"\n\t\"github.com/gokins/core\"\n\t\"github.com/gokins"
},
{
"path": "server/hbtp.go",
"chars": 561,
"preview": "package server\n\nimport (\n\t\"github.com/gokins/gokins/comm\"\n\t\"github.com/gokins/gokins/engine\"\n\thbtp \"github.com/mgr9525/H"
},
{
"path": "server/server.go",
"chars": 1786,
"preview": "package server\n\nimport (\n\t\"errors\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t_ \"github.com/go-sql-driver/mysql\"\n\t\"gi"
},
{
"path": "server/web.go",
"chars": 3851,
"preview": "package server\n\nimport (\n\t\"archive/zip\"\n\t\"bytes\"\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"net/http\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\""
},
{
"path": "service/db.go",
"chars": 365,
"preview": "package service\n\nimport \"github.com/gokins/gokins/comm\"\n\nfunc GetIdOrAid(id interface{}, e interface{}) bool {\n\tif id =="
},
{
"path": "service/hook.go",
"chars": 4020,
"preview": "package service\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/gokins/core/runtime\"\n\t\"github.com/gokins/core/u"
},
{
"path": "service/mid.go",
"chars": 491,
"preview": "package service\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gokins/gokins/model\"\n)\n\nconst LgUserKey = \"lguser\"\n\nf"
},
{
"path": "service/notice.go",
"chars": 1648,
"preview": "package service\n\n/*func InsertNoticesByRepo(repo *model.TRepo, n *notice.Notice) (rterr error) {\n\treturn InsertNoticesBy"
},
{
"path": "service/param.go",
"chars": 1661,
"preview": "package service\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"github.com/gokins/gokins/comm\"\n\t\"github.com/gokins/gokins/model\"\n"
},
{
"path": "service/perms.go",
"chars": 615,
"preview": "package service\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gokins/gokins/model\"\n)\n\nfunc CheckPermission(uid stri"
},
{
"path": "service/pipeline.go",
"chars": 8480,
"preview": "package service\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gokins/core/common\"\n\t\"github.com/g"
},
{
"path": "service/trigger.go",
"chars": 354,
"preview": "package service\n\nimport (\n\t\"errors\"\n\t\"github.com/gokins/gokins/model\"\n)\n\nfunc TriggerPerm(tt *model.TTrigger) error {\n\tl"
},
{
"path": "service/user.go",
"chars": 6777,
"preview": "package service\n\nimport (\n\t\"fmt\"\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gokins/gokins/comm\"\n\t\"github.com/gokins/gokins"
},
{
"path": "thirdapi/client.go",
"chars": 158,
"preview": "package thirdapi\n\nimport (\n\t\"net/http\"\n\t\"net/url\"\n)\n\ntype Client struct {\n\tHttpClient *http.Client\n\tBaseURL *url."
},
{
"path": "thirdapi/giteaapi/gitea.go",
"chars": 562,
"preview": "package giteaapi\n\nimport (\n\t\"github.com/gokins/gokins/thirdapi\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"time\"\n)\n\nfunc New(uri string) ("
},
{
"path": "thirdapi/giteaapi/giteaapi.go",
"chars": 766,
"preview": "package giteaapi\n\n//api 路径\nconst (\n\tBaseApiGitea = \"https://api.gitea.com\"\n\t/*\n\t https://gitea.com/api/v5/repos/{owner"
},
{
"path": "thirdapi/giteaapi/giteaapi_test.go",
"chars": 910,
"preview": "package giteaapi\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"testing\"\n)\n\nfunc TestGiteeContents(t *testing.T) {\n\tu := fm"
},
{
"path": "thirdapi/giteaapi/repositoryservice.go",
"chars": 11042,
"preview": "package giteaapi\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/gokins/gokins/bean/thirdbean\"\n\t\"githu"
},
{
"path": "thirdapi/giteeapi/gitee.go",
"chars": 647,
"preview": "package giteeapi\n\nimport (\n\t\"github.com/gokins/gokins/thirdapi\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\t\"time\"\n)\n\nfunc New(ur"
},
{
"path": "thirdapi/giteeapi/giteeapi.go",
"chars": 1030,
"preview": "package giteeapi\n\n//api 路径\nconst (\n\tBaseApiGitee = \"https://gitee.com/api/v5\"\n\n\t/*\n\t https://gitee.com/api/v5/repos/{o"
},
{
"path": "thirdapi/giteeapi/giteeapi_test.go",
"chars": 756,
"preview": "package giteeapi\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\n//\n//func TestGiteeContents(t *testing.T) {\n//\n//\tu := fmt.Sprintf(ApiGi"
},
{
"path": "thirdapi/giteeapi/repositoryservice.go",
"chars": 9318,
"preview": "package giteeapi\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/gokins/gokins/bean/thirdbean\"\n\t\"github.com/gok"
},
{
"path": "thirdapi/giteepremiumapi/giteepremium.go",
"chars": 661,
"preview": "package giteepremiumapi\n\nimport (\n\t\"github.com/gokins/gokins/thirdapi\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\t\"time\"\n)\n\nfunc"
},
{
"path": "thirdapi/giteepremiumapi/giteepremiumapi.go",
"chars": 1086,
"preview": "package giteepremiumapi\n\n//api 路径\nconst (\n\tBaseApiGiteePremium = \"https://gitee.com/api/v5\"\n\n\t/*\n\t https://gitee.com/a"
},
{
"path": "thirdapi/giteepremiumapi/giteepremiumapi_test.go",
"chars": 527,
"preview": "package giteepremiumapi\n\n//\n//func TestGiteePremiumContents(t *testing.T) {\n//\n//\tu := fmt.Sprintf(ApiGiteePremiumGetRep"
},
{
"path": "thirdapi/giteepremiumapi/repositoryservice.go",
"chars": 9661,
"preview": "package giteepremiumapi\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/gokins/gokins/bean/thirdbean\"\n\t\"github."
},
{
"path": "thirdapi/githubapi/github.go",
"chars": 564,
"preview": "package githubapi\n\nimport (\n\t\"github.com/gokins/gokins/thirdapi\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"time\"\n)\n\nfunc New(uri string) "
},
{
"path": "thirdapi/githubapi/githubapi.go",
"chars": 674,
"preview": "package githubapi\n\n//api 路径\nconst (\n\tBaseApiGithub = \"https://api.github.com\"\n\t/*\n\t repos/{owner}/{repo}/contents/{pat"
},
{
"path": "thirdapi/githubapi/githubapi_test.go",
"chars": 913,
"preview": "package githubapi\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"testing\"\n)\n\nfunc TestGiteeContents(t *testing.T) {\n\tu := f"
},
{
"path": "thirdapi/githubapi/repositoryservice.go",
"chars": 10151,
"preview": "package githubapi\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/gokins/gokins/bean/thirdbean\"\n\t\"gith"
},
{
"path": "thirdapi/gitlabapi/gitlab.go",
"chars": 564,
"preview": "package gitlabapi\n\nimport (\n\t\"github.com/gokins/gokins/thirdapi\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"time\"\n)\n\nfunc New(uri string) "
},
{
"path": "thirdapi/gitlabapi/gitlabapi.go",
"chars": 664,
"preview": "package gitlabapi\n\n//api 路径\nconst (\n\tBaseApiGitlab = \"https://gitlab.com/api/v4\"\n\t/*\n\t repos/{owner}/{repo}/contents/{p"
},
{
"path": "thirdapi/gitlabapi/gitlabapi_test.go",
"chars": 913,
"preview": "package gitlabapi\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"testing\"\n)\n\nfunc TestGiteeContents(t *testing.T) {\n\tu := f"
},
{
"path": "thirdapi/gitlabapi/repositoryservice.go",
"chars": 9230,
"preview": "package gitlabapi\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/gokins/gokins/bean/thirdbean\"\n\t\"gith"
},
{
"path": "thirdapi/repo.go",
"chars": 600,
"preview": "package thirdapi\n\nimport \"time\"\n\ntype Repository struct {\n\tId string `json:\"id\"`\n\tOwner string `json:\"owner\"`"
},
{
"path": "thirdapi/repositoryservice.go",
"chars": 504,
"preview": "package thirdapi\n\ntype (\n\tRepositoryService interface {\n\t\tGetRepos(accessToken, username, types, sort, direction string,"
},
{
"path": "util/gin.go",
"chars": 1936,
"preview": "package util\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/gin-gonic/gin\"\n)\n\ntype GinController inter"
},
{
"path": "util/git.go",
"chars": 1079,
"preview": "package util\n\nimport (\n\t\"context\"\n\t\"github.com/go-git/go-git/v5\"\n\t\"github.com/go-git/go-git/v5/plumbing\"\n\t\"github.com/go"
},
{
"path": "util/httpex/const.go",
"chars": 1280,
"preview": "package httpex\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"strings\"\n)\n\nvar HTMLMsgUrl = `\n<!DOCTYPE html>\n<html lang=\"en\">\n\n"
},
{
"path": "util/httpex/post.go",
"chars": 3081,
"preview": "package httpex\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\t\"tim"
},
{
"path": "util/token.go",
"chars": 2124,
"preview": "package util\n\nimport (\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/dgrijalva/jwt-go\"\n\t\"github.com/gin-gonic/"
}
]
About this extraction
This page contains the full source code of the mgr9525/gokins GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 154 files (3.8 MB), approximately 989.7k tokens, and a symbol index with 694 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.