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:
qwerty287 2022-05-12 19:07:33 +02:00 committed by GitHub
parent acbcc53872
commit 6568751320
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 83 additions and 20 deletions

View file

@ -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
//

View file

@ -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")

View file

@ -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`

View file

@ -59,6 +59,7 @@ var Config = struct {
Pass string
Docs string
StatusContext string
StatusContextFormat string
SessionExpires time.Duration
// Open bool
// Orgs map[string]struct{}

View file

@ -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 {

View 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))
}