Merge pull request '[BUG] Fix SourceHut Builds webhook with triggers field' (#3864) from oliverpool/forgejo:sourcehut_trigger into forgejo

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3864
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
This commit is contained in:
Earl Warren 2024-05-24 00:16:22 +00:00
commit 32222d7d0a
13 changed files with 61 additions and 50 deletions

View file

@ -0,0 +1 @@
SourceHut Builds webhook would fail when the `triggers` field was used.

View file

@ -264,19 +264,13 @@ func (pc sourcehutConvertor) buildManifest(repo *api.Repository, commitID, gitRe
return []byte(msg), fmt.Errorf(msg+": %w", err) return []byte(msg), fmt.Errorf(msg+": %w", err)
} }
defer r.Close() defer r.Close()
// reference: https://man.sr.ht/builds.sr.ht/manifest.md
var manifest struct { var manifest struct {
Image string `yaml:"image"`
Arch string `yaml:"arch,omitempty"`
Packages []string `yaml:"packages,omitempty"`
Repositories map[string]string `yaml:"repositories,omitempty"`
Artifacts []string `yaml:"artifacts,omitempty"`
Shell bool `yaml:"shell,omitempty"`
Sources []string `yaml:"sources"` Sources []string `yaml:"sources"`
Tasks []map[string]string `yaml:"tasks"`
Triggers []string `yaml:"triggers,omitempty"`
Environment map[string]string `yaml:"environment"` Environment map[string]string `yaml:"environment"`
Secrets []string `yaml:"secrets,omitempty"`
Oauth string `yaml:"oauth,omitempty"` Rest map[string]yaml.Node `yaml:",inline"`
} }
if err := yaml.NewDecoder(r).Decode(&manifest); err != nil { if err := yaml.NewDecoder(r).Decode(&manifest); err != nil {
msg := fmt.Sprintf("could not decode manifest %q", pc.meta.ManifestPath) msg := fmt.Sprintf("could not decode manifest %q", pc.meta.ManifestPath)

View file

@ -69,19 +69,21 @@ func TestSourcehutBuildsPayload(t *testing.T) {
pc.meta.ManifestPath = "simple.yml" pc.meta.ManifestPath = "simple.yml"
pl, err := pc.Create(p) pl, err := pc.Create(p)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, buildsVariables{
Manifest: `image: alpine/edge assert.Equal(t, `sources:
sources:
- http://localhost:3000/testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83 - http://localhost:3000/testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83
tasks:
- say-hello: |
echo hello
- say-world: echo world
environment: environment:
BUILD_SUBMITTER: forgejo BUILD_SUBMITTER: forgejo
BUILD_SUBMITTER_URL: https://example.forgejo.org/ BUILD_SUBMITTER_URL: https://example.forgejo.org/
GIT_REF: refs/heads/test GIT_REF: refs/heads/test
`, image: alpine/edge
tasks:
- say-hello: |
echo hello
- say-world: echo world
`, pl.Variables.Manifest)
assert.Equal(t, buildsVariables{
Manifest: pl.Variables.Manifest, // the manifest correctness is checked above, for nicer diff on error
Note: "branch test created", Note: "branch test created",
Tags: []string{"testdata/repo", "branch/test", "simple.yml"}, Tags: []string{"testdata/repo", "branch/test", "simple.yml"},
Secrets: true, Secrets: true,
@ -100,19 +102,21 @@ environment:
pc.meta.ManifestPath = "simple.yml" pc.meta.ManifestPath = "simple.yml"
pl, err := pc.Create(p) pl, err := pc.Create(p)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, buildsVariables{
Manifest: `image: alpine/edge assert.Equal(t, `sources:
sources:
- http://localhost:3000/testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83 - http://localhost:3000/testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83
tasks:
- say-hello: |
echo hello
- say-world: echo world
environment: environment:
BUILD_SUBMITTER: forgejo BUILD_SUBMITTER: forgejo
BUILD_SUBMITTER_URL: https://example.forgejo.org/ BUILD_SUBMITTER_URL: https://example.forgejo.org/
GIT_REF: refs/tags/v1.0.0 GIT_REF: refs/tags/v1.0.0
`, image: alpine/edge
tasks:
- say-hello: |
echo hello
- say-world: echo world
`, pl.Variables.Manifest)
assert.Equal(t, buildsVariables{
Manifest: pl.Variables.Manifest, // the manifest correctness is checked above, for nicer diff on error
Note: "tag v1.0.0 created", Note: "tag v1.0.0 created",
Tags: []string{"testdata/repo", "tag/v1.0.0", "simple.yml"}, Tags: []string{"testdata/repo", "tag/v1.0.0", "simple.yml"},
Secrets: true, Secrets: true,
@ -151,19 +155,20 @@ environment:
pl, err := pc.Push(p) pl, err := pc.Push(p)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, buildsVariables{ assert.Equal(t, `sources:
Manifest: `image: alpine/edge
sources:
- http://localhost:3000/testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83 - http://localhost:3000/testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83
tasks:
- say-hello: |
echo hello
- say-world: echo world
environment: environment:
BUILD_SUBMITTER: forgejo BUILD_SUBMITTER: forgejo
BUILD_SUBMITTER_URL: https://example.forgejo.org/ BUILD_SUBMITTER_URL: https://example.forgejo.org/
GIT_REF: refs/heads/main GIT_REF: refs/heads/main
`, image: alpine/edge
tasks:
- say-hello: |
echo hello
- say-world: echo world
`, pl.Variables.Manifest)
assert.Equal(t, buildsVariables{
Manifest: pl.Variables.Manifest, // the manifest correctness is checked above, for nicer diff on error
Note: "add simple", Note: "add simple",
Tags: []string{"testdata/repo", "branch/main", "simple.yml"}, Tags: []string{"testdata/repo", "branch/main", "simple.yml"},
Secrets: true, Secrets: true,
@ -175,7 +180,7 @@ environment:
p := &api.PushPayload{ p := &api.PushPayload{
Ref: "refs/heads/main", Ref: "refs/heads/main",
HeadCommit: &api.PayloadCommit{ HeadCommit: &api.PayloadCommit{
ID: "69b217caa89166a02b8cd368b64fb83a44720e14", ID: "b0404943256a1f5a50c3726f4378756b4c1e5704",
Message: "replace simple with complex", Message: "replace simple with complex",
}, },
Repo: repo, Repo: repo,
@ -187,23 +192,32 @@ environment:
pl, err := pc.Push(p) pl, err := pc.Push(p)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, buildsVariables{ assert.Equal(t, `sources:
Manifest: `image: archlinux - http://localhost:3000/testdata/repo.git#b0404943256a1f5a50c3726f4378756b4c1e5704
packages:
- nodejs
- npm
- rsync
sources:
- http://localhost:3000/testdata/repo.git#69b217caa89166a02b8cd368b64fb83a44720e14
tasks: []
environment: environment:
BUILD_SUBMITTER: forgejo BUILD_SUBMITTER: forgejo
BUILD_SUBMITTER_URL: https://example.forgejo.org/ BUILD_SUBMITTER_URL: https://example.forgejo.org/
GIT_REF: refs/heads/main GIT_REF: refs/heads/main
deploy: synapse@synapse-bt.org deploy: synapse@synapse-bt.org
image: archlinux
packages:
- nodejs
- npm
- rsync
secrets: secrets:
- 7ebab768-e5e4-4c9d-ba57-ec41a72c5665 - 7ebab768-e5e4-4c9d-ba57-ec41a72c5665
`, tasks: []
triggers:
- condition: failure
action: email
to: Jim Jimson <jim@example.org>
# report back the status
- condition: always
action: webhook
url: https://hook.example.org
`, pl.Variables.Manifest)
assert.Equal(t, buildsVariables{
Manifest: pl.Variables.Manifest, // the manifest correctness is checked above, for nicer diff on error
Note: "replace simple with complex", Note: "replace simple with complex",
Tags: []string{"testdata/repo", "branch/main", "complex.yaml"}, Tags: []string{"testdata/repo", "branch/main", "complex.yaml"},
Secrets: false, Secrets: false,

View file

@ -1 +0,0 @@
x•NKjÃ0ìZ§xûBÑçɶ ”¬z<C2AC>ççQã[FQÚ?"=A3óѲmk#ÏüÒ*@š²L3&²)ú”'D$ #²Î’ƒ æ<>Š½Ñ¼,#/³„Ov‰ƒzIN<Áu'¨‘[;—JŸ¥~á»Ð{þ#'Üe;.xëòƒÜè¼#[K¯Ö[kôy¯áßASq\DAìkƵÑïÚÎÔûúØ<C3BA>~P¯kÙÍÂVO<56>

View file

@ -0,0 +1,4 @@
xU<>έnƒ0 …w<E280A6>§°΄k
λ lΡ4υz―0νΒ ¤„%fmί~@ΫύD²Ωωμc<Ε<C2B7>°% mη]<5D>NjDΫΟR<CE9F>
ζ“Aΰ†ι<CEB9>ΓυΣ9X•x<E280A2>φ·¶u<>{¶θ;NΆΆΘ…4(<28>GyΣ:Q©Oή?…/9 δlhτ|Φ0<30>cΆύυΞ<CF85>l8¶*<>$?ΓΥΤ»§<C2BB>**³<>>7™Α<E284A2>ΞΘXomµΫUJItmKqνΚΐrh<72>8>Ρω)<29>ΊΪFΓ,®<>°†77,8ΐΛΑ {:α0zZfy<66>ξaΩ)
<EFBFBD>Ω5<EFBFBD><EFBFBD> Κ΄Ψυ„ώ<E2809E>η‰7ΞLΗά―¤)z yivoQ78J}³θ‡¤

View file

@ -1 +0,0 @@
x=ЋKnГ0 D»Ц)ё`иkЙ@PdХ{P2™Ё°-AQїк] АYјЗIeЯsmэKoDђЖ)¤™µґ8Ѕp gg44вlЉИFССБп•”F9ѓВ<D193>жИV­,“[ЈО¤`~ф[iрVЪ•Ю њщчёРчєС4к+(Їф0Y)б$µ”"эМлФ lщ“Z-eѓу5чЛwПФ¦КёNЬюЩY»?V4Є&ЏМtпрИэC9ю=aШов ™,PЎ

View file

@ -1 +1 @@
69b217caa89166a02b8cd368b64fb83a44720e14 b0404943256a1f5a50c3726f4378756b4c1e5704