Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ __debug_bin*
# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Generated GraphQL client code
server/forge/sourcehut/*/gql.go

### Frontend ###
web/dist/**
!web/dist/.gitkeep
Expand Down
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -118,14 +118,17 @@ clean-all: clean ## Clean all artifacts
rm -rf docs/docs/40-cli.md docs/openapi.json

.PHONY: generate
generate: install-mockery generate-openapi ## Run all code generations
generate: install-mockery generate-openapi generate-sourcehut ## Run all code generations
mockery
CGO_ENABLED=0 go generate ./...

generate-openapi: ## Run openapi code generation and format it
CGO_ENABLED=0 go run github.com/swaggo/swag/cmd/swag fmt --exclude pipeline/rpc/proto
CGO_ENABLED=0 go generate cmd/server/openapi.go

generate-sourcehut: ## Run sourcehut GraphQL client generation
CGO_ENABLED=0 go generate ./server/forge/sourcehut/...

generate-license-header: install-addlicense
addlicense -c "Woodpecker Authors" -ignore "vendor/**" **/*.go

Expand Down
38 changes: 33 additions & 5 deletions cmd/server/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,7 @@ var flags = append([]cli.Flag{
&cli.StringFlag{
Name: "forge-url",
Usage: "url of the forge",
Sources: cli.EnvVars("WOODPECKER_FORGE_URL", "WOODPECKER_GITHUB_URL", "WOODPECKER_GITLAB_URL", "WOODPECKER_GITEA_URL", "WOODPECKER_FORGEJO_URL", "WOODPECKER_BITBUCKET_URL", "WOODPECKER_BITBUCKET_DC_URL"),
Sources: cli.EnvVars("WOODPECKER_FORGE_URL", "WOODPECKER_GITHUB_URL", "WOODPECKER_GITLAB_URL", "WOODPECKER_GITEA_URL", "WOODPECKER_FORGEJO_URL", "WOODPECKER_BITBUCKET_URL", "WOODPECKER_BITBUCKET_DC_URL", "WOODPECKER_SOURCEHUT_URL"),
},
&cli.StringFlag{
Sources: cli.NewValueSourceChain(
Expand All @@ -401,14 +401,16 @@ var flags = append([]cli.Flag{
"WOODPECKER_GITEA_CLIENT_FILE",
"WOODPECKER_FORGEJO_CLIENT_FILE",
"WOODPECKER_BITBUCKET_CLIENT_FILE",
"WOODPECKER_BITBUCKET_DC_CLIENT_ID_FILE")),
"WOODPECKER_BITBUCKET_DC_CLIENT_ID_FILE",
"WOODPECKER_SOURCEHUT_CLIENT_FILE")),
cli.EnvVar("WOODPECKER_FORGE_CLIENT"),
cli.EnvVar("WOODPECKER_GITHUB_CLIENT"),
cli.EnvVar("WOODPECKER_GITLAB_CLIENT"),
cli.EnvVar("WOODPECKER_GITEA_CLIENT"),
cli.EnvVar("WOODPECKER_FORGEJO_CLIENT"),
cli.EnvVar("WOODPECKER_BITBUCKET_CLIENT"),
cli.EnvVar("WOODPECKER_BITBUCKET_DC_CLIENT_ID")),
cli.EnvVar("WOODPECKER_BITBUCKET_DC_CLIENT_ID"),
cli.EnvVar("WOODPECKER_SOURCEHUT_CLIENT")),
Name: "forge-oauth-client",
Usage: "oauth2 client id",
Config: cli.StringConfig{
Expand All @@ -425,14 +427,16 @@ var flags = append([]cli.Flag{
"WOODPECKER_FORGEJO_SECRET_FILE",
"WOODPECKER_BITBUCKET_SECRET_FILE",
"WOODPECKER_BITBUCKET_DC_CLIENT_SECRET_FILE",
"WOODPECKER_SOURCEHUT_SECRET_FILE",
)),
cli.EnvVar("WOODPECKER_FORGE_SECRET"),
cli.EnvVar("WOODPECKER_GITHUB_SECRET"),
cli.EnvVar("WOODPECKER_GITLAB_SECRET"),
cli.EnvVar("WOODPECKER_GITEA_SECRET"),
cli.EnvVar("WOODPECKER_FORGEJO_SECRET"),
cli.EnvVar("WOODPECKER_BITBUCKET_SECRET"),
cli.EnvVar("WOODPECKER_BITBUCKET_DC_CLIENT_SECRET")),
cli.EnvVar("WOODPECKER_BITBUCKET_DC_CLIENT_SECRET"),
cli.EnvVar("WOODPECKER_SOURCEHUT_SECRET")),
Name: "forge-oauth-secret",
Usage: "oauth2 client secret",
Config: cli.StringConfig{
Expand All @@ -448,7 +452,8 @@ var flags = append([]cli.Flag{
"WOODPECKER_GITLAB_SKIP_VERIFY",
"WOODPECKER_GITEA_SKIP_VERIFY",
"WOODPECKER_FORGEJO_SKIP_VERIFY",
"WOODPECKER_BITBUCKET_SKIP_VERIFY"),
"WOODPECKER_BITBUCKET_SKIP_VERIFY",
"WOODPECKER_SOURCEHUT_SKIP_VERIFY"),
},
&cli.StringFlag{
Sources: cli.EnvVars("WOODPECKER_EXPERT_FORGE_OAUTH_HOST"),
Expand Down Expand Up @@ -549,6 +554,29 @@ var flags = append([]cli.Flag{
Usage: "Bitbucket DataCenter/Server oauth2 scope should be configured to include PROJECT_ADMIN configuration.",
},
//
// SourceHut
//
&cli.BoolFlag{
Sources: cli.EnvVars("WOODPECKER_SOURCEHUT"),
Name: "sourcehut",
Usage: "sourcehut driver is enabled",
},
&cli.StringFlag{
Sources: cli.EnvVars("WOODPECKER_SOURCEHUT_META_URL"),
Name: "sourcehut-meta-url",
Usage: "sourcehut meta.sr.ht URL",
},
&cli.StringFlag{
Sources: cli.EnvVars("WOODPECKER_SOURCEHUT_GIT_URL"),
Name: "sourcehut-git-url",
Usage: "sourcehut git.sr.ht URL",
},
&cli.StringFlag{
Sources: cli.EnvVars("WOODPECKER_SOURCEHUT_LISTS_URL"),
Name: "sourcehut-lists-url",
Usage: "sourcehut lists.sr.ht URL",
},
//
// development flags
//
&cli.StringFlag{
Expand Down
4 changes: 4 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,12 @@ require (

require (
filippo.io/edwards25519 v1.1.0 // indirect
git.sr.ht/~emersion/gqlclient v0.0.0-20250318184027-d4a003529bba // indirect
github.com/42wim/httpsig v1.2.3 // indirect
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/agnivade/levenshtein v1.1.1 // indirect
github.com/atotto/clipboard v0.1.4 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/beorn7/perks v1.0.1 // indirect
Expand All @@ -101,6 +103,7 @@ require (
github.com/containerd/log v0.1.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
github.com/danieljoos/wincred v1.2.3 // indirect
github.com/dave/jennifer v1.7.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/davidmz/go-pageant v1.0.2 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
Expand Down Expand Up @@ -197,6 +200,7 @@ require (
github.com/ugorji/go/codec v1.3.0 // indirect
github.com/urfave/cli/v2 v2.25.3 // indirect
github.com/valyala/fastjson v1.6.4 // indirect
github.com/vektah/gqlparser/v2 v2.5.8 // indirect
github.com/woodsbury/decimal128 v1.3.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
Expand Down
11 changes: 11 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ codeberg.org/mvdkleijn/forgejo-sdk/forgejo/v2 v2.2.0 h1:HTCWpzyWQOHDWt3LzI6/d2jv
codeberg.org/mvdkleijn/forgejo-sdk/forgejo/v2 v2.2.0/go.mod h1:ZglEEDj+qkxYUb+SQIeqGtFxQrbaMYqIOgahNKb7uxs=
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
git.sr.ht/~emersion/gqlclient v0.0.0-20250318184027-d4a003529bba h1:Rl2ylhbDFXZ5LfT43Usf/8WTWOG01FQ+1uPTuLiH34k=
git.sr.ht/~emersion/gqlclient v0.0.0-20250318184027-d4a003529bba/go.mod h1:kvl/JK0Z3VRmtbBxdOJR4ydyXVouUIcFIXgv4H6rVAY=
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
gitee.com/travelliu/dm v1.8.11192/go.mod h1:DHTzyhCrM843x9VdKVbZ+GKXGRbKM2sJ4LxihRxShkE=
Expand All @@ -32,8 +34,11 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78=
github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ=
github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8=
github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
Expand Down Expand Up @@ -110,6 +115,8 @@ github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s=
github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE=
github.com/danieljoos/wincred v1.2.3 h1:v7dZC2x32Ut3nEfRH+vhoZGvN72+dQ/snVXo/vMFLdQ=
github.com/danieljoos/wincred v1.2.3/go.mod h1:6qqX0WNrS4RzPZ1tnroDzq9kY3fu1KwE7MRLQK4X0bs=
github.com/dave/jennifer v1.7.0 h1:uRbSBH9UTS64yXbh4FrMHfgfY762RD+C7bUPKODpSJE=
github.com/dave/jennifer v1.7.0/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
Expand All @@ -120,6 +127,7 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvw
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
github.com/denisenkom/go-mssqldb v0.12.3 h1:pBSGx9Tq67pBOTLmxNuirNTeB8Vjmf886Kx+8Y+8shw=
github.com/denisenkom/go-mssqldb v0.12.3/go.mod h1:k0mtMFOnU+AihqFxPMiF05rtiDrorD1Vrm1KEz5hxDo=
github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
Expand Down Expand Up @@ -575,6 +583,8 @@ github.com/urfave/cli/v3 v3.6.1 h1:j8Qq8NyUawj/7rTYdBGrxcH7A/j7/G8Q5LhWEW4G3Mo=
github.com/urfave/cli/v3 v3.6.1/go.mod h1:ysVLtOEmg2tOy6PknnYVhDoouyC/6N42TMeoMzskhso=
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
github.com/vektah/gqlparser/v2 v2.5.8 h1:pm6WOnGdzFOCfcQo9L3+xzW51mKrlwTEg4Wr7AH1JW4=
github.com/vektah/gqlparser/v2 v2.5.8/go.mod h1:z8xXUff237NntSuH8mLFijZ+1tjV1swDbpDqjJmk6ME=
github.com/woodsbury/decimal128 v1.3.0 h1:8pffMNWIlC0O5vbyHWFZAt5yWvWcrHA+3ovIIjVWss0=
github.com/woodsbury/decimal128 v1.3.0/go.mod h1:C5UTmyTjW3JftjUFzOVhC20BEQa2a4ZKOB5I6Zjb+ds=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
Expand Down Expand Up @@ -787,6 +797,7 @@ google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aO
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
Expand Down
51 changes: 51 additions & 0 deletions server/forge/setup/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"go.woodpecker-ci.org/woodpecker/v3/server/forge/gitea"
"go.woodpecker-ci.org/woodpecker/v3/server/forge/github"
"go.woodpecker-ci.org/woodpecker/v3/server/forge/gitlab"
"go.woodpecker-ci.org/woodpecker/v3/server/forge/sourcehut"
"go.woodpecker-ci.org/woodpecker/v3/server/model"
)

Expand All @@ -34,6 +35,8 @@ func Forge(forge *model.Forge) (forge.Forge, error) {
return setupForgejo(forge)
case model.ForgeTypeBitbucketDatacenter:
return setupBitbucketDatacenter(forge)
case model.ForgeTypeSourceHut:
return setupSourceHut(forge)
default:
return nil, fmt.Errorf("forge not configured")
}
Expand Down Expand Up @@ -188,6 +191,54 @@ func setupBitbucketDatacenter(forge *model.Forge) (forge.Forge, error) {
return bitbucketdatacenter.New(forge.ID, opts)
}

func setupSourceHut(forge *model.Forge) (forge.Forge, error) {
server, err := url.Parse(forge.URL)
if err != nil {
return nil, err
}

metaURL, ok := forge.AdditionalOptions["meta-url"].(string)
if !ok {
return nil, fmt.Errorf("missing meta-url")
}

gitURL, ok := forge.AdditionalOptions["git-url"].(string)
if !ok {
return nil, fmt.Errorf("missing git-url")
}

listsURL, ok := forge.AdditionalOptions["lists-url"].(string)
if !ok {
return nil, fmt.Errorf("missing lists-url")
}

opts := sourcehut.Opts{
URL: strings.TrimRight(server.String(), "/"),
MetaURL: metaURL,
GitURL: gitURL,
ListsURL: listsURL,
OAuthClientID: forge.OAuthClientID,
OAuthClientSecret: forge.OAuthClientSecret,
SkipVerify: forge.SkipVerify,
OAuth2URL: metaURL,
}
if len(opts.URL) == 0 {
return nil, fmt.Errorf("WOODPECKER_SOURCEHUT_URL must be set")
}
log.Debug().
Str("url", opts.URL).
Str("meta-url", opts.MetaURL).
Str("git-url", opts.GitURL).
Str("lists-url", opts.ListsURL).
Str("oauth2-url", opts.OAuth2URL).
Bool("skip-verify", opts.SkipVerify).
Bool("oauth-client-id-set", opts.OAuthClientID != "").
Bool("oauth-client-secret-set", opts.OAuthClientSecret != "").
Str("type", string(forge.Type)).
Msg("setting up forge")
return sourcehut.New(forge.ID, opts)
}

func setupAddon(forge *model.Forge) (forge.Forge, error) {
executable, ok := forge.AdditionalOptions["executable"].(string)
if !ok {
Expand Down
3 changes: 3 additions & 0 deletions server/forge/sourcehut/git/gen.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package git

//go:generate go run git.sr.ht/~emersion/gqlclient/cmd/gqlclientgen -s schema.graphqls -q queries.graphql -o gql.go -n git
Loading