mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2024-12-22 16:36:30 +00:00
Allow to change forge status messages (#900)
Allow to change the status message via template option Closes https://github.com/woodpecker-ci/woodpecker/issues/855
This commit is contained in:
parent
acbcc53872
commit
6568751320
6 changed files with 83 additions and 20 deletions
|
@ -206,6 +206,12 @@ var flags = []cli.Flag{
|
|||
Usage: "status context prefix",
|
||||
Value: "ci/woodpecker",
|
||||
},
|
||||
&cli.StringFlag{
|
||||
EnvVars: []string{"WOODPECKER_STATUS_CONTEXT_FORMAT"},
|
||||
Name: "status-context-format",
|
||||
Usage: "status context format",
|
||||
Value: "{{ .context }}/{{ .event }}/{{ .pipeline }}",
|
||||
},
|
||||
//
|
||||
// resource limit parameters
|
||||
//
|
||||
|
|
|
@ -317,6 +317,7 @@ func setupEvilGlobals(c *cli.Context, v store.Store, r remote.Remote) {
|
|||
server.Config.Server.Port = c.String("server-addr")
|
||||
server.Config.Server.Docs = c.String("docs")
|
||||
server.Config.Server.StatusContext = c.String("status-context")
|
||||
server.Config.Server.StatusContextFormat = c.String("status-context-format")
|
||||
server.Config.Server.SessionExpires = c.Duration("session-expires")
|
||||
server.Config.Pipeline.Networks = c.StringSlice("network")
|
||||
server.Config.Pipeline.Volumes = c.StringSlice("volume")
|
||||
|
|
|
@ -305,6 +305,17 @@ Read the value for `WOODPECKER_PROMETHEUS_AUTH_TOKEN` from the specified filepat
|
|||
|
||||
Context prefix Woodpecker will use to publish status messages to SCM. You probably will only need to change it if you run multiple Woodpecker instances for a single repository.
|
||||
|
||||
### `WOODPECKER_STATUS_CONTEXT_FORMAT`
|
||||
> Default: `{{ .context }}/{{ .event }}/{{ .pipeline }}`
|
||||
|
||||
Template for the status messages published to forges, uses [Go templates](https://pkg.go.dev/text/template) as template language.
|
||||
Supported variables:
|
||||
- `context`: Woodpecker's context (see `WOODPECKER_STATUS_CONTEXT`)
|
||||
- `event`: the event which started the pipeline
|
||||
- `pipeline`: the pipeline's name
|
||||
- `owner`: the repo's owner
|
||||
- `repo`: the repo's name
|
||||
|
||||
---
|
||||
|
||||
### `WOODPECKER_LIMIT_MEM_SWAP`
|
||||
|
|
|
@ -51,15 +51,16 @@ var Config = struct {
|
|||
// Secrets model.SecretStore
|
||||
}
|
||||
Server struct {
|
||||
Key string
|
||||
Cert string
|
||||
OAuthHost string
|
||||
Host string
|
||||
Port string
|
||||
Pass string
|
||||
Docs string
|
||||
StatusContext string
|
||||
SessionExpires time.Duration
|
||||
Key string
|
||||
Cert string
|
||||
OAuthHost string
|
||||
Host string
|
||||
Port string
|
||||
Pass string
|
||||
Docs string
|
||||
StatusContext string
|
||||
StatusContextFormat string
|
||||
SessionExpires time.Duration
|
||||
// Open bool
|
||||
// Orgs map[string]struct{}
|
||||
// Admins map[string]struct{}
|
||||
|
|
|
@ -1,32 +1,41 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"text/template"
|
||||
|
||||
"github.com/woodpecker-ci/woodpecker/server"
|
||||
"github.com/woodpecker-ci/woodpecker/server/model"
|
||||
)
|
||||
|
||||
func GetBuildStatusContext(repo *model.Repo, build *model.Build, proc *model.Proc) string {
|
||||
name := server.Config.Server.StatusContext
|
||||
|
||||
event := string(build.Event)
|
||||
switch build.Event {
|
||||
case model.EventPull:
|
||||
name += "/pr"
|
||||
default:
|
||||
if len(build.Event) > 0 {
|
||||
name += "/" + string(build.Event)
|
||||
}
|
||||
event = "pr"
|
||||
}
|
||||
|
||||
if proc != nil {
|
||||
name += "/" + proc.Name
|
||||
tmpl, err := template.New("context").Parse(server.Config.Server.StatusContextFormat)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
var ctx bytes.Buffer
|
||||
err = tmpl.Execute(&ctx, map[string]interface{}{
|
||||
"context": server.Config.Server.StatusContext,
|
||||
"event": event,
|
||||
"pipeline": proc.Name,
|
||||
"owner": repo.Owner,
|
||||
"repo": repo.Name,
|
||||
})
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
return name
|
||||
return ctx.String()
|
||||
}
|
||||
|
||||
// getBuildStatusDescription is a helper function that generates a description
|
||||
// GetBuildStatusDescription is a helper function that generates a description
|
||||
// message for the current build status.
|
||||
func GetBuildStatusDescription(status model.StatusValue) string {
|
||||
switch status {
|
||||
|
|
35
server/remote/common/status_test.go
Normal file
35
server/remote/common/status_test.go
Normal file
|
@ -0,0 +1,35 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/woodpecker-ci/woodpecker/server"
|
||||
"github.com/woodpecker-ci/woodpecker/server/model"
|
||||
)
|
||||
|
||||
func TestGetBuildStatusContext(t *testing.T) {
|
||||
origFormat := server.Config.Server.StatusContextFormat
|
||||
origCtx := server.Config.Server.StatusContext
|
||||
defer func() {
|
||||
server.Config.Server.StatusContextFormat = origFormat
|
||||
server.Config.Server.StatusContext = origCtx
|
||||
}()
|
||||
|
||||
repo := &model.Repo{Owner: "user1", Name: "repo1"}
|
||||
build := &model.Build{Event: model.EventPull}
|
||||
proc := &model.Proc{Name: "lint"}
|
||||
|
||||
assert.EqualValues(t, "", GetBuildStatusContext(repo, build, proc))
|
||||
|
||||
server.Config.Server.StatusContext = "ci/woodpecker"
|
||||
server.Config.Server.StatusContextFormat = "{{ .context }}/{{ .event }}/{{ .pipeline }}"
|
||||
assert.EqualValues(t, "ci/woodpecker/pr/lint", GetBuildStatusContext(repo, build, proc))
|
||||
build.Event = model.EventPush
|
||||
assert.EqualValues(t, "ci/woodpecker/push/lint", GetBuildStatusContext(repo, build, proc))
|
||||
|
||||
server.Config.Server.StatusContext = "ci"
|
||||
server.Config.Server.StatusContextFormat = "{{ .context }}:{{ .owner }}/{{ .repo }}:{{ .event }}:{{ .pipeline }}"
|
||||
assert.EqualValues(t, "ci:user1/repo1:push:lint", GetBuildStatusContext(repo, build, proc))
|
||||
}
|
Loading…
Reference in a new issue