woodpecker-ci / woodpecker

Woodpecker is a simple, yet powerful CI/CD engine with great extensibility.
https://woodpecker-ci.org
Apache License 2.0
4.2k stars 364 forks source link

Server panic on tag event using gitea #1422

Closed simmstein closed 1 year ago

simmstein commented 1 year ago

Component

server

Describe the bug

System Info

{"source":"https://github.com/woodpecker-ci/woodpecker","version":"next-7859bde6"}

Additional context

Docker log:

woodpecker-server_1  | 2022/11/16 18:40:38 [Recovery] 2022/11/16 - 18:40:38 panic recovered:
woodpecker-server_1  | runtime error: invalid memory address or nil pointer dereference
woodpecker-server_1  | /usr/local/go/src/runtime/panic.go:220 (0x452e9c)
woodpecker-server_1  | /usr/local/go/src/runtime/signal_unix.go:818 (0x452e6c)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/server/forge/gitea/gitea.go:485 (0xd0652e)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/server/api/hook.go:75 (0xc5a710)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/vendor/github.com/gin-gonic/gin/context.go:173 (0xcacd4d)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/server/router/middleware/token/token.go:33 (0xcac8d8)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/vendor/github.com/gin-gonic/gin/context.go:173 (0xc53e1c)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/server/router/middleware/session/user.go:72 (0xc53e03)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/vendor/github.com/gin-gonic/gin/context.go:173 (0xcb1e1e)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/server/router/middleware/store.go:29 (0xcb1e05)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/vendor/github.com/gin-gonic/gin/context.go:173 (0xcb16c7)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/server/router/middleware/logger.go:23 (0xcb16aa)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/vendor/github.com/gin-gonic/gin/context.go:173 (0xcac739)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/server/router/middleware/header/header.go:38 (0xcac664)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/vendor/github.com/gin-gonic/gin/context.go:173 (0xcac5c1)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/server/router/middleware/header/header.go:30 (0xcac5a6)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/vendor/github.com/gin-gonic/gin/context.go:173 (0xcb0aca)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/server/router/router.go:39 (0xcb0ab0)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/vendor/github.com/gin-gonic/gin/context.go:173 (0xa107a1)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/vendor/github.com/gin-gonic/gin/recovery.go:101 (0xa1078c)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/vendor/github.com/gin-gonic/gin/context.go:173 (0xa0f5f0)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/vendor/github.com/gin-gonic/gin/gin.go:616 (0xa0f258)
woodpecker-server_1  | /woodpecker/src/github.com/woodpecker-ci/woodpecker/vendor/github.com/gin-gonic/gin/gin.go:572 (0xa0ed9c)
woodpecker-server_1  | /usr/local/go/src/net/http/server.go:2916 (0x78395a)
woodpecker-server_1  | /usr/local/go/src/net/http/server.go:1966 (0x77e956)
woodpecker-server_1  | /usr/local/go/src/runtime/asm_amd64.s:1571 (0x46fd40)

Hook content:

{
  "sha": "6cae0ca70a8cd0da37b2ed9c85263a719a7c0e9f",
  "ref": "v4-221116-gitnet",
  "ref_type": "tag",
  "repository": {
    "id": 386,
    "owner": {
      ####REDACTED#####
    },
    "name": "gitea-pages-server",
    "full_name": "deblan/gitea-pages-server",
    "description": "Fork of https://codeberg.org/Codeberg/pages-server to serve https://gitnet.page",
    "empty": false,
    "private": false,
    "fork": false,
    "template": false,
    "parent": null,
    "mirror": false,
    "size": 614,
    "language": "",
    "languages_url": "https://gitnet.fr/api/v1/repos/deblan/gitea-pages-server/languages",
    "html_url": "https://gitnet.fr/deblan/gitea-pages-server",
    "ssh_url": "git@gitnet.fr:deblan/gitea-pages-server.git",
    "clone_url": "https://gitnet.fr/deblan/gitea-pages-server.git",
    "original_url": "",
    "website": "",
    "stars_count": 0,
    "forks_count": 0,
    "watchers_count": 1,
    "open_issues_count": 0,
    "open_pr_counter": 0,
    "release_counter": 8,
    "default_branch": "main",
    "archived": false,
    "created_at": "2022-07-22T21:29:46+02:00",
    "updated_at": "2022-11-16T19:19:38+01:00",
    "permissions": {
      "admin": false,
      "push": false,
      "pull": false
    },
    "has_issues": true,
    "internal_tracker": {
      "enable_time_tracker": true,
      "allow_only_contributors_to_track_time": true,
      "enable_issue_dependencies": true
    },
    "has_wiki": true,
    "has_pull_requests": true,
    "has_projects": true,
    "ignore_whitespace_conflicts": false,
    "allow_merge_commits": true,
    "allow_rebase": true,
    "allow_rebase_explicit": true,
    "allow_squash_merge": true,
    "default_merge_style": "merge",
    "avatar_url": "",
    "internal": false,
    "mirror_interval": "",
    "mirror_updated": "0001-01-01T00:00:00Z",
    "repo_transfer": null
  },
  "sender": {
    ####REDACTED#####
  }
}

Validations

qwerty287 commented 1 year ago

Interesting 🤔

Looks like pipeline and err is nil here: https://github.com/woodpecker-ci/woodpecker/blob/7859bde63deae2d0fc7d12f3b1b896c2a041705e/server/forge/gitea/gitea.go#L480-L485

That's weird because it actually never does this, an error is always returned if the pipeline couldn't be parsed.

Edit: Maybe the issue is also that pipeline.ChangedFiles is nil and len panics but then the first check should actually fail.

simmstein commented 1 year ago

I forked and build my own image to debug:

    fmt.Printf("pipeline.Event             %+v\n", pipeline.Event)
    fmt.Printf("model.EventPull            %+v\n", model.EventPull)
    fmt.Printf("pipeline.ChangedFiles      %+v\n", pipeline.ChangedFiles)
    fmt.Printf("len(pipeline.ChangedFiles) %+v\n", len(pipeline.ChangedFiles))

    if pipeline.Event == model.EventPull && len(pipeline.ChangedFiles) == 0 {

When a tag is removed, it panic on pipeline.Event.

When a tag is added, it panics too but the debug works:

woodpecker-server_1  | pipeline.Event             tag
woodpecker-server_1  | model.EventPull            pull_request
woodpecker-server_1  | pipeline.ChangedFiles      []
woodpecker-server_1  | len(pipeline.ChangedFiles) 0
simmstein commented 1 year ago

Pipeline is nil when a tag is removed.

When a tag is created, pipeline looks like:

&{ID:0 RepoID:0 Number:0 Author:***redacted*** ConfigID:0 Parent:0 Event:tag Status: Error: Enqueued:0 Created:0 Updated:0 Started:0 Finished:0 Deploy: Commit:6cae0ca70a8cd0da37b2ed9c85263a719a7c0e9f Branch:refs/tags/v4-221116-gitnet Ref:refs/tags/v4-221116-gitnet Refspec: CloneURL: Title: Message:created tag v4-221116-gitnet Timestamp:1668630273 Sender:deblan Avatar:***redacted*** Email: Link:***redacted*** Signed:false Verified:false Reviewer: Reviewed:0 Steps:[] Files:[] ChangedFiles:[] AdditionalVariables:map[]}
simmstein commented 1 year ago

From a fresh database on v15 and a move to next, this is the same problem.

qwerty287 commented 1 year ago

Thanks, that's very helpful :)

simmstein commented 1 year ago

The oldest docker tag next (next-a5e1714039) contains the bug.

6543 commented 1 year ago

thanks for the detailed issue! let's see when one of us has time to look into it :)