Improve forge token refreshing

This commit is contained in:
Anbraten
2026-01-13 14:40:46 +01:00
parent 6e6e9c4166
commit 567f176b4d
6 changed files with 53 additions and 34 deletions
-17
View File
@@ -19,13 +19,9 @@ import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/rs/zerolog/log"
"go.woodpecker-ci.org/woodpecker/v3/server"
"go.woodpecker-ci.org/woodpecker/v3/server/forge"
"go.woodpecker-ci.org/woodpecker/v3/server/model"
"go.woodpecker-ci.org/woodpecker/v3/server/pipeline"
"go.woodpecker-ci.org/woodpecker/v3/server/store"
"go.woodpecker-ci.org/woodpecker/v3/server/store/types"
)
@@ -52,19 +48,6 @@ func handleDBError(c *gin.Context, err error) {
_ = c.AbortWithError(http.StatusInternalServerError, err)
}
// If the forge has a refresh token, the current access token may be stale.
// Therefore, we should refresh prior to dispatching the job.
func refreshUserToken(c *gin.Context, user *model.User) {
_store := store.FromContext(c)
_forge, err := server.Config.Services.Manager.ForgeFromUser(user)
if err != nil {
log.Error().Err(err).Msg("Cannot get forge from user")
c.AbortWithStatus(http.StatusInternalServerError)
return
}
forge.Refresh(c, _forge, _store, user)
}
// pipelineDeleteAllowed checks if the given pipeline can be deleted based on its status.
// It returns a bool indicating if delete is allowed, and the pipeline's status.
func pipelineDeleteAllowed(pl *model.Pipeline) bool {
+2 -2
View File
@@ -296,12 +296,12 @@ func PostHook(c *gin.Context) {
return
}
user, err := _store.GetUser(repo.UserID)
repoUser, err := _store.GetUser(repo.UserID)
if err != nil {
handleDBError(c, err)
return
}
forge.Refresh(c, _forge, _store, user)
forge.Refresh(c, _forge, _store, repoUser)
//
// 4. Update the repo
+10 -5
View File
@@ -29,6 +29,7 @@ import (
"github.com/rs/zerolog/log"
"go.woodpecker-ci.org/woodpecker/v3/server"
"go.woodpecker-ci.org/woodpecker/v3/server/forge"
"go.woodpecker-ci.org/woodpecker/v3/server/model"
"go.woodpecker-ci.org/woodpecker/v3/server/pipeline"
"go.woodpecker-ci.org/woodpecker/v3/server/pipeline/stepbuilder"
@@ -604,7 +605,7 @@ func PostPipeline(c *gin.Context) {
return
}
user, err := _store.GetUser(repo.UserID)
repoUser, err := _store.GetUser(repo.UserID)
if err != nil {
handleDBError(c, err)
return
@@ -617,9 +618,13 @@ func PostPipeline(c *gin.Context) {
}
// refresh the token to make sure, pipeline.Restart can still obtain the pipeline config if necessary again
refreshUserToken(c, user)
// make Deploy overridable
_forge, err := server.Config.Services.Manager.ForgeFromUser(repoUser)
if err != nil {
log.Error().Err(err).Msg("Cannot get forge from user")
_ = c.AbortWithError(http.StatusBadRequest, err)
return
}
forge.Refresh(c, _forge, _store, repoUser)
// make Deploy task overridable
pl.DeployTask = c.DefaultQuery("deploy_task", pl.DeployTask)
@@ -656,7 +661,7 @@ func PostPipeline(c *gin.Context) {
}
}
newPipeline, err := pipeline.Restart(c, _store, pl, user, repo, envs)
newPipeline, err := pipeline.Restart(c, _store, pl, repoUser, repo, envs)
if err != nil {
handlePipelineErr(c, err)
} else {