mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2025-01-01 21:28:44 +00:00
load ui assets from filesystem
This commit is contained in:
parent
7f7f9235cc
commit
f0cbe62d81
8 changed files with 206 additions and 328 deletions
|
@ -2,6 +2,7 @@ package router
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
|
||||||
|
@ -21,12 +22,20 @@ func Load(middleware ...gin.HandlerFunc) http.Handler {
|
||||||
e := gin.New()
|
e := gin.New()
|
||||||
e.Use(gin.Recovery())
|
e.Use(gin.Recovery())
|
||||||
|
|
||||||
e.SetHTMLTemplate(template.Load())
|
if pattern := os.Getenv("DRONE_TEMPLATE_GLOB"); pattern == "" {
|
||||||
|
e.SetHTMLTemplate(template.Load())
|
||||||
|
} else {
|
||||||
|
e.SetHTMLTemplate(template.Glob(pattern))
|
||||||
|
}
|
||||||
|
|
||||||
fs := http.FileServer(dist.AssetFS())
|
if dir := os.Getenv("DRONE_STATIC_DIR"); dir == "" {
|
||||||
e.GET("/static/*filepath", func(c *gin.Context) {
|
fs := http.FileServer(dist.AssetFS())
|
||||||
fs.ServeHTTP(c.Writer, c.Request)
|
e.GET("/static/*filepath", func(c *gin.Context) {
|
||||||
})
|
fs.ServeHTTP(c.Writer, c.Request)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
e.Static("/static", dir)
|
||||||
|
}
|
||||||
|
|
||||||
e.Use(header.NoCache)
|
e.Use(header.NoCache)
|
||||||
e.Use(header.Options)
|
e.Use(header.Options)
|
||||||
|
@ -174,3 +183,10 @@ func Load(middleware ...gin.HandlerFunc) http.Handler {
|
||||||
|
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// type FileHandler interface {
|
||||||
|
// Index(res http.ResponseWriter, data interface{}) error
|
||||||
|
// Login(res http.ResponseWriter, data interface{}) error
|
||||||
|
// Error(res http.ResponseWriter, data interface{}) error
|
||||||
|
// Asset(res http.ResponseWriter, req *http.Request)
|
||||||
|
// }
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Broker handles connections to the embedded message broker.
|
|
||||||
func Broker(c *gin.Context) {
|
|
||||||
broker := c.MustGet("broker").(http.Handler)
|
|
||||||
broker.ServeHTTP(c.Writer, c.Request)
|
|
||||||
}
|
|
|
@ -1,62 +0,0 @@
|
||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/drone/drone/model"
|
|
||||||
"github.com/drone/drone/store"
|
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetGlobalSecrets(c *gin.Context) {
|
|
||||||
secrets, err := store.GetGlobalSecretList(c)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
c.AbortWithStatus(http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var list []*model.TeamSecret
|
|
||||||
|
|
||||||
for _, s := range secrets {
|
|
||||||
list = append(list, s.Clone())
|
|
||||||
}
|
|
||||||
|
|
||||||
c.JSON(http.StatusOK, list)
|
|
||||||
}
|
|
||||||
|
|
||||||
func PostGlobalSecret(c *gin.Context) {
|
|
||||||
in := &model.TeamSecret{}
|
|
||||||
err := c.Bind(in)
|
|
||||||
if err != nil {
|
|
||||||
c.String(http.StatusBadRequest, "Invalid JSON input. %s", err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
in.ID = 0
|
|
||||||
|
|
||||||
err = store.SetGlobalSecret(c, in)
|
|
||||||
if err != nil {
|
|
||||||
c.String(http.StatusInternalServerError, "Unable to persist global secret. %s", err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
c.String(http.StatusOK, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteGlobalSecret(c *gin.Context) {
|
|
||||||
name := c.Param("secret")
|
|
||||||
|
|
||||||
secret, err := store.GetGlobalSecret(c, name)
|
|
||||||
if err != nil {
|
|
||||||
c.String(http.StatusNotFound, "Cannot find secret %s.", name)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = store.DeleteGlobalSecret(c, secret)
|
|
||||||
if err != nil {
|
|
||||||
c.String(http.StatusInternalServerError, "Unable to delete global secret. %s", err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
c.String(http.StatusOK, "")
|
|
||||||
}
|
|
|
@ -1,68 +0,0 @@
|
||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/drone/drone/model"
|
|
||||||
"github.com/drone/drone/router/middleware/session"
|
|
||||||
"github.com/drone/drone/store"
|
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetSecrets(c *gin.Context) {
|
|
||||||
repo := session.Repo(c)
|
|
||||||
secrets, err := store.GetSecretList(c, repo)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
c.AbortWithStatus(http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var list []*model.RepoSecret
|
|
||||||
|
|
||||||
for _, s := range secrets {
|
|
||||||
list = append(list, s.Clone())
|
|
||||||
}
|
|
||||||
|
|
||||||
c.JSON(http.StatusOK, list)
|
|
||||||
}
|
|
||||||
|
|
||||||
func PostSecret(c *gin.Context) {
|
|
||||||
repo := session.Repo(c)
|
|
||||||
|
|
||||||
in := &model.RepoSecret{}
|
|
||||||
err := c.Bind(in)
|
|
||||||
if err != nil {
|
|
||||||
c.String(http.StatusBadRequest, "Invalid JSON input. %s", err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
in.ID = 0
|
|
||||||
in.RepoID = repo.ID
|
|
||||||
|
|
||||||
err = store.SetSecret(c, in)
|
|
||||||
if err != nil {
|
|
||||||
c.String(http.StatusInternalServerError, "Unable to persist secret. %s", err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
c.String(http.StatusOK, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteSecret(c *gin.Context) {
|
|
||||||
repo := session.Repo(c)
|
|
||||||
name := c.Param("secret")
|
|
||||||
|
|
||||||
secret, err := store.GetSecret(c, repo, name)
|
|
||||||
if err != nil {
|
|
||||||
c.String(http.StatusNotFound, "Cannot find secret %s.", name)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = store.DeleteSecret(c, secret)
|
|
||||||
if err != nil {
|
|
||||||
c.String(http.StatusInternalServerError, "Unable to delete secret. %s", err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
c.String(http.StatusOK, "")
|
|
||||||
}
|
|
177
server/secret.go
Normal file
177
server/secret.go
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/drone/drone/model"
|
||||||
|
"github.com/drone/drone/router/middleware/session"
|
||||||
|
"github.com/drone/drone/store"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetGlobalSecrets(c *gin.Context) {
|
||||||
|
secrets, err := store.GetGlobalSecretList(c)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
c.AbortWithStatus(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var list []*model.TeamSecret
|
||||||
|
|
||||||
|
for _, s := range secrets {
|
||||||
|
list = append(list, s.Clone())
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, list)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PostGlobalSecret(c *gin.Context) {
|
||||||
|
in := &model.TeamSecret{}
|
||||||
|
err := c.Bind(in)
|
||||||
|
if err != nil {
|
||||||
|
c.String(http.StatusBadRequest, "Invalid JSON input. %s", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
in.ID = 0
|
||||||
|
|
||||||
|
err = store.SetGlobalSecret(c, in)
|
||||||
|
if err != nil {
|
||||||
|
c.String(http.StatusInternalServerError, "Unable to persist global secret. %s", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.String(http.StatusOK, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteGlobalSecret(c *gin.Context) {
|
||||||
|
name := c.Param("secret")
|
||||||
|
|
||||||
|
secret, err := store.GetGlobalSecret(c, name)
|
||||||
|
if err != nil {
|
||||||
|
c.String(http.StatusNotFound, "Cannot find secret %s.", name)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = store.DeleteGlobalSecret(c, secret)
|
||||||
|
if err != nil {
|
||||||
|
c.String(http.StatusInternalServerError, "Unable to delete global secret. %s", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.String(http.StatusOK, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSecrets(c *gin.Context) {
|
||||||
|
repo := session.Repo(c)
|
||||||
|
secrets, err := store.GetSecretList(c, repo)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
c.AbortWithStatus(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var list []*model.RepoSecret
|
||||||
|
|
||||||
|
for _, s := range secrets {
|
||||||
|
list = append(list, s.Clone())
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, list)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PostSecret(c *gin.Context) {
|
||||||
|
repo := session.Repo(c)
|
||||||
|
|
||||||
|
in := &model.RepoSecret{}
|
||||||
|
err := c.Bind(in)
|
||||||
|
if err != nil {
|
||||||
|
c.String(http.StatusBadRequest, "Invalid JSON input. %s", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
in.ID = 0
|
||||||
|
in.RepoID = repo.ID
|
||||||
|
|
||||||
|
err = store.SetSecret(c, in)
|
||||||
|
if err != nil {
|
||||||
|
c.String(http.StatusInternalServerError, "Unable to persist secret. %s", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.String(http.StatusOK, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteSecret(c *gin.Context) {
|
||||||
|
repo := session.Repo(c)
|
||||||
|
name := c.Param("secret")
|
||||||
|
|
||||||
|
secret, err := store.GetSecret(c, repo, name)
|
||||||
|
if err != nil {
|
||||||
|
c.String(http.StatusNotFound, "Cannot find secret %s.", name)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = store.DeleteSecret(c, secret)
|
||||||
|
if err != nil {
|
||||||
|
c.String(http.StatusInternalServerError, "Unable to delete secret. %s", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.String(http.StatusOK, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetTeamSecrets(c *gin.Context) {
|
||||||
|
team := c.Param("team")
|
||||||
|
secrets, err := store.GetTeamSecretList(c, team)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
c.AbortWithStatus(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var list []*model.TeamSecret
|
||||||
|
|
||||||
|
for _, s := range secrets {
|
||||||
|
list = append(list, s.Clone())
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, list)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PostTeamSecret(c *gin.Context) {
|
||||||
|
team := c.Param("team")
|
||||||
|
|
||||||
|
in := &model.TeamSecret{}
|
||||||
|
err := c.Bind(in)
|
||||||
|
if err != nil {
|
||||||
|
c.String(http.StatusBadRequest, "Invalid JSON input. %s", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
in.ID = 0
|
||||||
|
in.Key = team
|
||||||
|
|
||||||
|
err = store.SetTeamSecret(c, in)
|
||||||
|
if err != nil {
|
||||||
|
c.String(http.StatusInternalServerError, "Unable to persist team secret. %s", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.String(http.StatusOK, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteTeamSecret(c *gin.Context) {
|
||||||
|
team := c.Param("team")
|
||||||
|
name := c.Param("secret")
|
||||||
|
|
||||||
|
secret, err := store.GetTeamSecret(c, team, name)
|
||||||
|
if err != nil {
|
||||||
|
c.String(http.StatusNotFound, "Cannot find secret %s.", name)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = store.DeleteTeamSecret(c, secret)
|
||||||
|
if err != nil {
|
||||||
|
c.String(http.StatusInternalServerError, "Unable to delete team secret. %s", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.String(http.StatusOK, "")
|
||||||
|
}
|
113
server/slack.go
113
server/slack.go
|
@ -1,113 +0,0 @@
|
||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/drone/drone/store"
|
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
slashDeploy = "deploy"
|
|
||||||
slashRestart = "restart"
|
|
||||||
slashStatus = "status"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Slack is handler function that handles Slack slash commands.
|
|
||||||
func Slack(c *gin.Context) {
|
|
||||||
command := c.Param("command")
|
|
||||||
text := c.PostForm("text")
|
|
||||||
args := strings.Split(text, " ")
|
|
||||||
|
|
||||||
if command == "" {
|
|
||||||
command = args[0]
|
|
||||||
args = args[1:]
|
|
||||||
}
|
|
||||||
|
|
||||||
switch command {
|
|
||||||
case slashStatus:
|
|
||||||
slackStatus(c, args)
|
|
||||||
|
|
||||||
case slashRestart:
|
|
||||||
slackRestart(c, args)
|
|
||||||
|
|
||||||
case slashDeploy:
|
|
||||||
slackDeploy(c, args)
|
|
||||||
|
|
||||||
default:
|
|
||||||
c.String(200, "sorry, I didn't understand [%s]", text)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func slackDeploy(c *gin.Context, args []string) {
|
|
||||||
if len(args) != 3 {
|
|
||||||
c.String(200, "Invalid command. Please provide [repo] [build number] [environment]")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var (
|
|
||||||
repo = args[0]
|
|
||||||
num = args[1]
|
|
||||||
env = args[2]
|
|
||||||
)
|
|
||||||
owner, name, _ := parseRepoBranch(repo)
|
|
||||||
|
|
||||||
c.String(200, "deploying build %s/%s#%s to %s", owner, name, num, env)
|
|
||||||
}
|
|
||||||
|
|
||||||
func slackRestart(c *gin.Context, args []string) {
|
|
||||||
var (
|
|
||||||
repo = args[0]
|
|
||||||
num = args[1]
|
|
||||||
)
|
|
||||||
owner, name, _ := parseRepoBranch(repo)
|
|
||||||
|
|
||||||
c.String(200, "restarting build %s/%s#%s", owner, name, num)
|
|
||||||
}
|
|
||||||
|
|
||||||
func slackStatus(c *gin.Context, args []string) {
|
|
||||||
var (
|
|
||||||
owner string
|
|
||||||
name string
|
|
||||||
branch string
|
|
||||||
)
|
|
||||||
if len(args) > 0 {
|
|
||||||
owner, name, branch = parseRepoBranch(args[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
repo, err := store.GetRepoOwnerName(c, owner, name)
|
|
||||||
if err != nil {
|
|
||||||
c.String(200, "cannot find repository %s/%s", owner, name)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if branch == "" {
|
|
||||||
branch = repo.Branch
|
|
||||||
}
|
|
||||||
build, err := store.GetBuildLast(c, repo, branch)
|
|
||||||
if err != nil {
|
|
||||||
c.String(200, "cannot find status for %s/%s@%s", owner, name, branch)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
c.String(200, "%s@%s build number %d finished with status %s",
|
|
||||||
repo.FullName,
|
|
||||||
build.Branch,
|
|
||||||
build.Number,
|
|
||||||
build.Status,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseRepoBranch(repo string) (owner, name, branch string) {
|
|
||||||
|
|
||||||
parts := strings.Split(repo, "@")
|
|
||||||
if len(parts) == 2 {
|
|
||||||
branch = parts[1]
|
|
||||||
repo = parts[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
parts = strings.Split(repo, "/")
|
|
||||||
if len(parts) == 2 {
|
|
||||||
owner = parts[0]
|
|
||||||
name = parts[1]
|
|
||||||
}
|
|
||||||
return owner, name, branch
|
|
||||||
}
|
|
|
@ -1,67 +0,0 @@
|
||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/drone/drone/model"
|
|
||||||
"github.com/drone/drone/store"
|
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetTeamSecrets(c *gin.Context) {
|
|
||||||
team := c.Param("team")
|
|
||||||
secrets, err := store.GetTeamSecretList(c, team)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
c.AbortWithStatus(http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var list []*model.TeamSecret
|
|
||||||
|
|
||||||
for _, s := range secrets {
|
|
||||||
list = append(list, s.Clone())
|
|
||||||
}
|
|
||||||
|
|
||||||
c.JSON(http.StatusOK, list)
|
|
||||||
}
|
|
||||||
|
|
||||||
func PostTeamSecret(c *gin.Context) {
|
|
||||||
team := c.Param("team")
|
|
||||||
|
|
||||||
in := &model.TeamSecret{}
|
|
||||||
err := c.Bind(in)
|
|
||||||
if err != nil {
|
|
||||||
c.String(http.StatusBadRequest, "Invalid JSON input. %s", err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
in.ID = 0
|
|
||||||
in.Key = team
|
|
||||||
|
|
||||||
err = store.SetTeamSecret(c, in)
|
|
||||||
if err != nil {
|
|
||||||
c.String(http.StatusInternalServerError, "Unable to persist team secret. %s", err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
c.String(http.StatusOK, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteTeamSecret(c *gin.Context) {
|
|
||||||
team := c.Param("team")
|
|
||||||
name := c.Param("secret")
|
|
||||||
|
|
||||||
secret, err := store.GetTeamSecret(c, team, name)
|
|
||||||
if err != nil {
|
|
||||||
c.String(http.StatusNotFound, "Cannot find secret %s.", name)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = store.DeleteTeamSecret(c, secret)
|
|
||||||
if err != nil {
|
|
||||||
c.String(http.StatusInternalServerError, "Unable to delete team secret. %s", err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
c.String(http.StatusOK, "")
|
|
||||||
}
|
|
|
@ -24,6 +24,14 @@ func Load() *template.Template {
|
||||||
return tmpl
|
return tmpl
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Glob loads the templates matching the given pattern. This function
|
||||||
|
// will not compile if go generate is not executed before.
|
||||||
|
func Glob(pattern string) *template.Template {
|
||||||
|
return template.Must(
|
||||||
|
template.New("_").Funcs(template.FuncMap{"json": marshal}).ParseGlob(pattern),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// marshal is a helper function to render data as JSON inside the template.
|
// marshal is a helper function to render data as JSON inside the template.
|
||||||
func marshal(v interface{}) template.JS {
|
func marshal(v interface{}) template.JS {
|
||||||
a, _ := json.Marshal(v)
|
a, _ := json.Marshal(v)
|
||||||
|
|
Loading…
Reference in a new issue