Search before asking
What happened
When trying to delete a Jenkins data scope that originates from a branch containing a / character in its name, the deletion fails because the data scope is stored with the branch name URL-encoded.
For example, a branch named: feature/LOY-12394-accesspermission-front-users is registered as loyalty-core/feature%2FLOY-12394-accesspermission-front-users
When attempting to remove the data scope, the connector does not correctly handle the encoded branch name, preventing the data scope from being deleted and showing "operation failed" into UI
What do you expect to happen
The Jenkins data scope should be removable regardless of whether the original branch name contains special characters such as /
How to reproduce
- Configure multibranch pipeline into jenkins
Example: loyalty-core
- The job should discover several branches almost one of them should contain symbol /
Example:
-- master
-- develop
-- feature/LOY-12394-accesspermission-front-users
- Configure the Jenkins connector at devlake
- Add data scope selecting job loyalty-core
- Assign scope to project and collect data
- Go to jenkins connection / details. Data scopes should be listed for every branch into job
- Try to delete data scope for loyalty-core/feature%2FLOY-12394-accesspermission-front-users
Anything else
This is the error into log
devlake-1 | time="2026-09-10 14:24:10" level=error msg="HTTP 404 error\n\tcaused by: attached stack trace\n\t -- stack trace:\n\t | github.com/apache/devlake/helpers/srvhelper.(*ModelSrvHelper[...]).FindByPk\n\t | \t/app/helpers/srvhelper/model_service_helper.go:148\n\t | [...repeated from below...]\n\tWraps: (2) *models.JenkinsJob not found (404)\n\tWraps: (3) attached stack trace\n\t -- stack trace:\n\t | github.com/apache/devlake/impls/dalgorm.(*Dalgorm).convertGormError\n\t | \t/app/impls/dalgorm/dalgorm.go:542\n\t | github.com/apache/devlake/impls/dalgorm.(*Dalgorm).First\n\t | \t/app/impls/dalgorm/dalgorm.go:215\n\t | github.com/apache/devlake/helpers/srvhelper.(*ModelSrvHelper[...]).FindByPk\n\t | \t/app/helpers/srvhelper/model_service_helper.go:145\n\t | github.com/apache/devlake/helpers/pluginhelper/api.(*ModelApiHelper[...]).FindByPk\n\t | \t/app/helpers/pluginhelper/api/model_api_helper.go:100\n\t | github.com/apache/devlake/helpers/pluginhelper/api.(*DsScopeApiHelper[...]).Delete\n\t | \t/app/helpers/pluginhelper/api/ds_scope_api_helper.go:135\n\t | github.com/apache/devlake/plugins/jenkins/api.DeleteScope\n\t | \t/app/plugins/jenkins/api/scope_api.go:119\n\t | github.com/apache/devlake/server/api.registerPluginEndpoints.handlePluginCall.func1\n\t | \t/app/server/api/router.go:149\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.CSRFProtect.(*Service).CSRFProtect.func3\n\t | \t/app/server/api/auth/middleware.go:140\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.RequireAuth.(*Service).RequireAuth.func2\n\t | \t/app/server/api/auth/middleware.go:104\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.OAuth2ProxyAuthentication.func1\n\t | \t/app/server/api/middlewares.go:115\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.OIDCAuthentication.(*Service).OIDCAuthentication.func1\n\t | \t/app/server/api/auth/middleware.go:61\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.RequirePushAuthentication.func1\n\t | \t/app/server/api/middlewares.go:158\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.RestAuthentication.func1\n\t | \t/app/server/api/middlewares.go:136\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/recovery.go:102\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.LoggerWithConfig.func1\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/logger.go:240\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:620\n\t | github.com/gin-gonic/gin.(*Engine).ServeHTTP\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:576\n\t | net/http.serverHandler.ServeHTTP\n\t | \t/usr/local/go/src/net/http/server.go:3311\n\t | net/http.(*conn).serve\n\t | \t/usr/local/go/src/net/http/server.go:2067\n\t | runtime.goexit\n\t | \t/usr/local/go/src/runtime/asm_amd64.s:1771\n\tWraps: (4) record not found (404)\n\tWraps: (5) record not found\n\tError types: (1) *withstack.withStack (2) *errutil.withPrefix (3) *withstack.withStack (4) *errutil.withPrefix (5) *errors.errorString"
config-ui-1 | 10.89.1.1 - - [10/Sep/2026:14:24:10 +0000] "DELETE /api/plugins/jenkins/connections/1/scopes/loyalty-core/feature%2FLOY-12394-accesspermission-front-users?delete_data_only=false HTTP/1.1" 404 4019 "http://localhost:4000/connections/jenkins/1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36" "-"
devlake-1 | time="2026-09-10 14:24:10" level=error msg="HTTP 404 error\n\tcaused by: attached stack trace\n\t -- stack trace:\n\t | github.com/apache/devlake/helpers/srvhelper.(*ModelSrvHelper[...]).FindByPk\n\t | \t/app/helpers/srvhelper/model_service_helper.go:148\n\t | [...repeated from below...]\n\tWraps: (2) *models.JenkinsJob not found (404)\n\tWraps: (3) attached stack trace\n\t -- stack trace:\n\t | github.com/apache/devlake/impls/dalgorm.(*Dalgorm).convertGormError\n\t | \t/app/impls/dalgorm/dalgorm.go:542\n\t | github.com/apache/devlake/impls/dalgorm.(*Dalgorm).First\n\t | \t/app/impls/dalgorm/dalgorm.go:215\n\t | github.com/apache/devlake/helpers/srvhelper.(*ModelSrvHelper[...]).FindByPk\n\t | \t/app/helpers/srvhelper/model_service_helper.go:145\n\t | github.com/apache/devlake/helpers/pluginhelper/api.(*ModelApiHelper[...]).FindByPk\n\t | \t/app/helpers/pluginhelper/api/model_api_helper.go:100\n\t | github.com/apache/devlake/helpers/pluginhelper/api.(*DsScopeApiHelper[...]).Delete\n\t | \t/app/helpers/pluginhelper/api/ds_scope_api_helper.go:135\n\t | github.com/apache/devlake/plugins/jenkins/api.DeleteScope\n\t | \t/app/plugins/jenkins/api/scope_api.go:119\n\t | github.com/apache/devlake/server/api.registerPluginEndpoints.handlePluginCall.func1\n\t | \t/app/server/api/router.go:149\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.CSRFProtect.(*Service).CSRFProtect.func3\n\t | \t/app/server/api/auth/middleware.go:140\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.RequireAuth.(*Service).RequireAuth.func2\n\t | \t/app/server/api/auth/middleware.go:104\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.OAuth2ProxyAuthentication.func1\n\t | \t/app/server/api/middlewares.go:115\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.OIDCAuthentication.(*Service).OIDCAuthentication.func1\n\t | \t/app/server/api/auth/middleware.go:61\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.RequirePushAuthentication.func1\n\t | \t/app/server/api/middlewares.go:158\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.RestAuthentication.func1\n\t | \t/app/server/api/middlewares.go:136\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/recovery.go:102\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.LoggerWithConfig.func1\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/logger.go:240\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:620\n\t | github.com/gin-gonic/gin.(*Engine).ServeHTTP\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:576\n\t | net/http.serverHandler.ServeHTTP\n\t | \t/usr/local/go/src/net/http/server.go:3311\n\t | net/http.(*conn).serve\n\t | \t/usr/local/go/src/net/http/server.go:2067\n\t | runtime.goexit\n\t | \t/usr/local/go/src/runtime/asm_amd64.s:1771\n\tWraps: (4) record not found (404)\n\tWraps: (5) record not found\n\tError types: (1) *withstack.withStack (2) *errutil.withPrefix (3) *withstack.withStack (4) *errutil.withPrefix (5) *errors.errorString"
devlake-1 | time="2026-09-10 14:24:10" level=error msg="HTTP 404 error\n\tcaused by: attached stack trace\n\t -- stack trace:\n\t | github.com/apache/devlake/helpers/srvhelper.(*ModelSrvHelper[...]).FindByPk\n\t | \t/app/helpers/srvhelper/model_service_helper.go:148\n\t | [...repeated from below...]\n\tWraps: (2) *models.JenkinsJob not found (404)\n\tWraps: (3) attached stack trace\n\t -- stack trace:\n\t | github.com/apache/devlake/impls/dalgorm.(*Dalgorm).convertGormError\n\t | \t/app/impls/dalgorm/dalgorm.go:542\n\t | github.com/apache/devlake/impls/dalgorm.(*Dalgorm).First\n\t | \t/app/impls/dalgorm/dalgorm.go:215\n\t | github.com/apache/devlake/helpers/srvhelper.(*ModelSrvHelper[...]).FindByPk\n\t | \t/app/helpers/srvhelper/model_service_helper.go:145\n\t | github.com/apache/devlake/helpers/pluginhelper/api.(*ModelApiHelper[...]).FindByPk\n\t | \t/app/helpers/pluginhelper/api/model_api_helper.go:100\n\t | github.com/apache/devlake/helpers/pluginhelper/api.(*DsScopeApiHelper[...]).Delete\n\t | \t/app/helpers/pluginhelper/api/ds_scope_api_helper.go:135\n\t | github.com/apache/devlake/plugins/jenkins/api.DeleteScope\n\t | \t/app/plugins/jenkins/api/scope_api.go:119\n\t | github.com/apache/devlake/server/api.registerPluginEndpoints.handlePluginCall.func1\n\t | \t/app/server/api/router.go:149\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.CSRFProtect.(*Service).CSRFProtect.func3\n\t | \t/app/server/api/auth/middleware.go:140\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.RequireAuth.(*Service).RequireAuth.func2\n\t | \t/app/server/api/auth/middleware.go:104\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.OAuth2ProxyAuthentication.func1\n\t | \t/app/server/api/middlewares.go:115\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.OIDCAuthentication.(*Service).OIDCAuthentication.func1\n\t | \t/app/server/api/auth/middleware.go:61\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.RequirePushAuthentication.func1\n\t | \t/app/server/api/middlewares.go:158\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.RestAuthentication.func1\n\t | \t/app/server/api/middlewares.go:136\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/recovery.go:102\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.LoggerWithConfig.func1\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/logger.go:240\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:620\n\t | github.com/gin-gonic/gin.(*Engine).ServeHTTP\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:576\n\t | net/http.serverHandler.ServeHTTP\n\t | \t/usr/local/go/src/net/http/server.go:3311\n\t | net/http.(*conn).serve\n\t | \t/usr/local/go/src/net/http/server.go:2067\n\t | runtime.goexit\n\t | \t/usr/local/go/src/runtime/asm_amd64.s:1771\n\tWraps: (4) record not found (404)\n\tWraps: (5) record not found\n\tError types: (1) *withstack.withStack (2) *errutil.withPrefix (3) *withstack.withStack (4) *errutil.withPrefix (5) *errors.errorString"
devlake-1 | [GIN] 2026/09/10 - 14:24:10 | 404 | 7.769236ms | 10.89.1.39 | DELETE "/plugins/jenkins/connections/1/scopes/loyalty-core/feature/LOY-12394-accesspermission-front-users?delete_data_only=false"
devlake-1 | time="2026-09-10 14:24:10" level=error msg="HTTP 404 error\n\tcaused by: attached stack trace\n\t -- stack trace:\n\t | github.com/apache/devlake/helpers/srvhelper.(*ModelSrvHelper[...]).FindByPk\n\t | \t/app/helpers/srvhelper/model_service_helper.go:148\n\t | [...repeated from below...]\n\tWraps: (2) *models.JenkinsJob not found (404)\n\tWraps: (3) attached stack trace\n\t -- stack trace:\n\t | github.com/apache/devlake/impls/dalgorm.(*Dalgorm).convertGormError\n\t | \t/app/impls/dalgorm/dalgorm.go:542\n\t | github.com/apache/devlake/impls/dalgorm.(*Dalgorm).First\n\t | \t/app/impls/dalgorm/dalgorm.go:215\n\t | github.com/apache/devlake/helpers/srvhelper.(*ModelSrvHelper[...]).FindByPk\n\t | \t/app/helpers/srvhelper/model_service_helper.go:145\n\t | github.com/apache/devlake/helpers/pluginhelper/api.(*ModelApiHelper[...]).FindByPk\n\t | \t/app/helpers/pluginhelper/api/model_api_helper.go:100\n\t | github.com/apache/devlake/helpers/pluginhelper/api.(*DsScopeApiHelper[...]).Delete\n\t | \t/app/helpers/pluginhelper/api/ds_scope_api_helper.go:135\n\t | github.com/apache/devlake/plugins/jenkins/api.DeleteScope\n\t | \t/app/plugins/jenkins/api/scope_api.go:119\n\t | github.com/apache/devlake/server/api.registerPluginEndpoints.handlePluginCall.func1\n\t | \t/app/server/api/router.go:149\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.CSRFProtect.(*Service).CSRFProtect.func3\n\t | \t/app/server/api/auth/middleware.go:140\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.RequireAuth.(*Service).RequireAuth.func2\n\t | \t/app/server/api/auth/middleware.go:104\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.OAuth2ProxyAuthentication.func1\n\t | \t/app/server/api/middlewares.go:115\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.OIDCAuthentication.(*Service).OIDCAuthentication.func1\n\t | \t/app/server/api/auth/middleware.go:61\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.RequirePushAuthentication.func1\n\t | \t/app/server/api/middlewares.go:158\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.RestAuthentication.func1\n\t | \t/app/server/api/middlewares.go:136\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/recovery.go:102\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.LoggerWithConfig.func1\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/logger.go:240\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:620\n\t | github.com/gin-gonic/gin.(*Engine).ServeHTTP\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:576\n\t | net/http.serverHandler.ServeHTTP\n\t | \t/usr/local/go/src/net/http/server.go:3311\n\t | net/http.(*conn).serve\n\t | \t/usr/local/go/src/net/http/server.go:2067\n\t | runtime.goexit\n\t | \t/usr/local/go/src/runtime/asm_amd64.s:1771\n\tWraps: (4) record not found (404)\n\tWraps: (5) record not found\n\tError types: (1) *withstack.withStack (2) *errutil.withPrefix (3) *withstack.withStack (4) *errutil.withPrefix (5) *errors.errorString"
devlake-1 | time="2026-09-10 14:24:10" level=error msg="HTTP 404 error\n\tcaused by: attached stack trace\n\t -- stack trace:\n\t | github.com/apache/devlake/helpers/srvhelper.(*ModelSrvHelper[...]).FindByPk\n\t | \t/app/helpers/srvhelper/model_service_helper.go:148\n\t | [...repeated from below...]\n\tWraps: (2) *models.JenkinsJob not found (404)\n\tWraps: (3) attached stack trace\n\t -- stack trace:\n\t | github.com/apache/devlake/impls/dalgorm.(*Dalgorm).convertGormError\n\t | \t/app/impls/dalgorm/dalgorm.go:542\n\t | github.com/apache/devlake/impls/dalgorm.(*Dalgorm).First\n\t | \t/app/impls/dalgorm/dalgorm.go:215\n\t | github.com/apache/devlake/helpers/srvhelper.(*ModelSrvHelper[...]).FindByPk\n\t | \t/app/helpers/srvhelper/model_service_helper.go:145\n\t | github.com/apache/devlake/helpers/pluginhelper/api.(*ModelApiHelper[...]).FindByPk\n\t | \t/app/helpers/pluginhelper/api/model_api_helper.go:100\n\t | github.com/apache/devlake/helpers/pluginhelper/api.(*DsScopeApiHelper[...]).Delete\n\t | \t/app/helpers/pluginhelper/api/ds_scope_api_helper.go:135\n\t | github.com/apache/devlake/plugins/jenkins/api.DeleteScope\n\t | \t/app/plugins/jenkins/api/scope_api.go:119\n\t | github.com/apache/devlake/server/api.registerPluginEndpoints.handlePluginCall.func1\n\t | \t/app/server/api/router.go:149\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.CSRFProtect.(*Service).CSRFProtect.func3\n\t | \t/app/server/api/auth/middleware.go:140\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.RequireAuth.(*Service).RequireAuth.func2\n\t | \t/app/server/api/auth/middleware.go:104\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.OAuth2ProxyAuthentication.func1\n\t | \t/app/server/api/middlewares.go:115\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.CreateApiServer.OIDCAuthentication.(*Service).OIDCAuthentication.func1\n\t | \t/app/server/api/auth/middleware.go:61\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.RequirePushAuthentication.func1\n\t | \t/app/server/api/middlewares.go:158\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/apache/devlake/server/api.RestAuthentication.func1\n\t | \t/app/server/api/middlewares.go:136\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/recovery.go:102\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.LoggerWithConfig.func1\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/logger.go:240\n\t | github.com/gin-gonic/gin.(*Context).Next\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174\n\t | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:620\n\t | github.com/gin-gonic/gin.(*Engine).ServeHTTP\n\t | \t/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:576\n\t | net/http.serverHandler.ServeHTTP\n\t | \t/usr/local/go/src/net/http/server.go:3311\n\t | net/http.(*conn).serve\n\t | \t/usr/local/go/src/net/http/server.go:2067\n\t | runtime.goexit\n\t | \t/usr/local/go/src/runtime/asm_amd64.s:1771\n\tWraps: (4) record not found (404)\n\tWraps: (5) record not found\n\tError types: (1) *withstack.withStack (2) *errutil.withPrefix (3) *withstack.withStack (4) *errutil.withPrefix (5) *errors.errorString"
devlake-1 | [GIN] 2026/09/10 - 14:24:10 | 404 | 7.769236ms | 10.89.1.39 | DELETE "/plugins/jenkins/connections/1/scopes/loyalty-core/feature/LOY-12394-accesspermission-front-users?delete_data_only=false"
devlake-1 | [GIN] 2026/09/10 - 14:24:10 | 404 | 7.769236ms | 10.89.1.39 | DELETE "/plugins/jenkins/connections/1/scopes/loyalty-core/feature/LOY-12394-accesspermission-front-users?delete_data_only=false"
devlake-1 | [GIN] 2026/09/10 - 14:24:10 | 404 | 7.769236ms | 10.89.1.39 | DELETE "/plugins/jenkins/connections/1/scopes/loyalty-core/feature/LOY-12394-accesspermission-front-users?delete_data_only=false"
devlake-1 | [GIN] 2026/09/10 - 14:24:10 | 404 | 7.769236ms | 10.89.1.39 | DELETE "/plugins/jenkins/connections/1/scopes/loyalty-core/feature/LOY-12394-accesspermission-front-users?delete_data_only=false"
Version
v1.0.3-beta17@8fe26f4
Are you willing to submit PR?
Code of Conduct
Search before asking
What happened
When trying to delete a Jenkins data scope that originates from a branch containing a / character in its name, the deletion fails because the data scope is stored with the branch name URL-encoded.
For example, a branch named: feature/LOY-12394-accesspermission-front-users is registered as loyalty-core/feature%2FLOY-12394-accesspermission-front-users
When attempting to remove the data scope, the connector does not correctly handle the encoded branch name, preventing the data scope from being deleted and showing "operation failed" into UI
What do you expect to happen
The Jenkins data scope should be removable regardless of whether the original branch name contains special characters such as /
How to reproduce
Example: loyalty-core
Example:
-- master
-- develop
-- feature/LOY-12394-accesspermission-front-users
Anything else
This is the error into log
Version
v1.0.3-beta17@8fe26f4
Are you willing to submit PR?
Code of Conduct