From cad9570ea1ae1c60928473743295a72dd462d447 Mon Sep 17 00:00:00 2001 From: Sim-hu Date: Tue, 24 Mar 2026 20:40:19 +0900 Subject: [PATCH 01/10] Show Woodpecker version on pipeline details Store the server version at pipeline creation time so that historical pipelines show the version they were actually run on. The version is displayed in the pipeline header next to duration and created time. Closes #4204 --- server/model/pipeline.go | 1 + server/pipeline/create.go | 2 ++ server/pipeline/restart.go | 2 ++ web/src/assets/locales/en.json | 1 + web/src/lib/api/types/pipeline.ts | 2 ++ web/src/views/repo/pipeline/PipelineWrapper.vue | 4 ++++ 6 files changed, 12 insertions(+) diff --git a/server/model/pipeline.go b/server/model/pipeline.go index 1f67a1b0fa2..bd3983106ee 100644 --- a/server/model/pipeline.go +++ b/server/model/pipeline.go @@ -56,6 +56,7 @@ type Pipeline struct { PullRequestMilestone string `json:"pr_milestone,omitempty" xorm:"pr_milestone"` IsPrerelease bool `json:"is_prerelease,omitempty" xorm:"is_prerelease"` FromFork bool `json:"from_fork,omitempty" xorm:"from_fork"` + Version string `json:"version,omitempty" xorm:"'version'"` } // @name Pipeline // TableName return database table name for xorm. diff --git a/server/pipeline/create.go b/server/pipeline/create.go index 92b507ba788..a55b83c4556 100644 --- a/server/pipeline/create.go +++ b/server/pipeline/create.go @@ -28,6 +28,7 @@ import ( forge_types "go.woodpecker-ci.org/woodpecker/v3/server/forge/types" "go.woodpecker-ci.org/woodpecker/v3/server/model" "go.woodpecker-ci.org/woodpecker/v3/server/store" + "go.woodpecker-ci.org/woodpecker/v3/version" ) var skipPipelineRegex = regexp.MustCompile(`\[(?i:ci *skip|skip *ci)\]`) @@ -68,6 +69,7 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline // update some pipeline fields pipeline.RepoID = repo.ID pipeline.Status = model.StatusCreated + pipeline.Version = version.String() setApprovalState(repo, pipeline) err = _store.CreatePipeline(pipeline) if err != nil { diff --git a/server/pipeline/restart.go b/server/pipeline/restart.go index 844f437b3a4..4dc2ae3f802 100644 --- a/server/pipeline/restart.go +++ b/server/pipeline/restart.go @@ -25,6 +25,7 @@ import ( forge_types "go.woodpecker-ci.org/woodpecker/v3/server/forge/types" "go.woodpecker-ci.org/woodpecker/v3/server/model" "go.woodpecker-ci.org/woodpecker/v3/server/store" + "go.woodpecker-ci.org/woodpecker/v3/version" ) // Restart a pipeline by creating a new one out of the old and start it. @@ -63,6 +64,7 @@ func Restart(ctx context.Context, store store.Store, lastPipeline *model.Pipelin newPipeline := createNewOutOfOld(lastPipeline) newPipeline.Parent = lastPipeline.Number + newPipeline.Version = version.String() err = store.CreatePipeline(newPipeline) if err != nil { diff --git a/web/src/assets/locales/en.json b/web/src/assets/locales/en.json index 3930cf4e9d1..786fc30d60e 100644 --- a/web/src/assets/locales/en.json +++ b/web/src/assets/locales/en.json @@ -272,6 +272,7 @@ "we_got_some_errors": "Oh no, an error occurred!", "duration": "Pipeline duration: {duration}", "created": "Created: {created}", + "version": "Woodpecker version", "cancel_info": { "superseded_by": "Superseded by #{pipelineId}", "canceled_by_user": "Canceled by {user}", diff --git a/web/src/lib/api/types/pipeline.ts b/web/src/lib/api/types/pipeline.ts index 2eaf8e1f967..ab2698d7c20 100644 --- a/web/src/lib/api/types/pipeline.ts +++ b/web/src/lib/api/types/pipeline.ts @@ -95,6 +95,8 @@ export interface Pipeline { changed_files?: string[]; cancel_info: CancelInfo; + + version?: string; } export type PipelineStatus = diff --git a/web/src/views/repo/pipeline/PipelineWrapper.vue b/web/src/views/repo/pipeline/PipelineWrapper.vue index 5007b5e82d1..6c7b9e1513d 100644 --- a/web/src/views/repo/pipeline/PipelineWrapper.vue +++ b/web/src/views/repo/pipeline/PipelineWrapper.vue @@ -78,6 +78,10 @@ {{ duration }} +
+ + {{ pipeline.version }} +
From 36ec588a5f36a76b0a611686a505758606a1bd9a Mon Sep 17 00:00:00 2001 From: Sim-hu Date: Wed, 25 Mar 2026 13:32:34 +0900 Subject: [PATCH 02/10] fix: make pipeline version field required Show empty string for older pipelines without version info instead of omitting the field entirely. --- server/model/pipeline.go | 2 +- web/src/lib/api/types/pipeline.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/model/pipeline.go b/server/model/pipeline.go index bd3983106ee..2a7c67ea9a2 100644 --- a/server/model/pipeline.go +++ b/server/model/pipeline.go @@ -56,7 +56,7 @@ type Pipeline struct { PullRequestMilestone string `json:"pr_milestone,omitempty" xorm:"pr_milestone"` IsPrerelease bool `json:"is_prerelease,omitempty" xorm:"is_prerelease"` FromFork bool `json:"from_fork,omitempty" xorm:"from_fork"` - Version string `json:"version,omitempty" xorm:"'version'"` + Version string `json:"version" xorm:"'version'"` } // @name Pipeline // TableName return database table name for xorm. diff --git a/web/src/lib/api/types/pipeline.ts b/web/src/lib/api/types/pipeline.ts index ab2698d7c20..87fcdcde2b8 100644 --- a/web/src/lib/api/types/pipeline.ts +++ b/web/src/lib/api/types/pipeline.ts @@ -96,7 +96,7 @@ export interface Pipeline { cancel_info: CancelInfo; - version?: string; + version: string; } export type PipelineStatus = From b7ea507d407f8f5145ada57bedb50ff3a7e3c19e Mon Sep 17 00:00:00 2001 From: Sim-hu Date: Wed, 25 Mar 2026 17:38:48 +0900 Subject: [PATCH 03/10] fix: regenerate openapi spec for pipeline version field --- cmd/server/openapi/docs.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/server/openapi/docs.go b/cmd/server/openapi/docs.go index 8482ed39545..985ea3a1eac 100644 --- a/cmd/server/openapi/docs.go +++ b/cmd/server/openapi/docs.go @@ -5102,6 +5102,9 @@ const docTemplate = `{ "type": "string" } }, + "version": { + "type": "string" + }, "workflows": { "type": "array", "items": { From 51f1a724e4a181f409b59325997ac0a03399cbbb Mon Sep 17 00:00:00 2001 From: Sim-hu Date: Wed, 25 Mar 2026 18:05:05 +0900 Subject: [PATCH 04/10] fix: add label text to pipeline version display --- web/src/views/repo/pipeline/PipelineWrapper.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/views/repo/pipeline/PipelineWrapper.vue b/web/src/views/repo/pipeline/PipelineWrapper.vue index 6c7b9e1513d..65e799988fe 100644 --- a/web/src/views/repo/pipeline/PipelineWrapper.vue +++ b/web/src/views/repo/pipeline/PipelineWrapper.vue @@ -80,7 +80,7 @@
- {{ pipeline.version }} + {{ $t('repo.pipeline.version') }}: {{ pipeline.version }}
From 37d0d66fdd6e3ad2d644da9e9fc5c5cc747aaaa8 Mon Sep 17 00:00:00 2001 From: Sim-hu Date: Wed, 25 Mar 2026 18:11:46 +0900 Subject: [PATCH 05/10] fix: use locale format string for pipeline version display --- web/src/assets/locales/en.json | 2 +- web/src/views/repo/pipeline/PipelineWrapper.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/assets/locales/en.json b/web/src/assets/locales/en.json index 786fc30d60e..79e82a026ab 100644 --- a/web/src/assets/locales/en.json +++ b/web/src/assets/locales/en.json @@ -272,7 +272,7 @@ "we_got_some_errors": "Oh no, an error occurred!", "duration": "Pipeline duration: {duration}", "created": "Created: {created}", - "version": "Woodpecker version", + "version": "Woodpecker version: {version}", "cancel_info": { "superseded_by": "Superseded by #{pipelineId}", "canceled_by_user": "Canceled by {user}", diff --git a/web/src/views/repo/pipeline/PipelineWrapper.vue b/web/src/views/repo/pipeline/PipelineWrapper.vue index 65e799988fe..e145e48f6f0 100644 --- a/web/src/views/repo/pipeline/PipelineWrapper.vue +++ b/web/src/views/repo/pipeline/PipelineWrapper.vue @@ -80,7 +80,7 @@
- {{ $t('repo.pipeline.version') }}: {{ pipeline.version }} + {{ $t('repo.pipeline.version', { version: pipeline.version }) }}
From 459aed4ea09a9794c06e6f621ed3d27296cbc767 Mon Sep 17 00:00:00 2001 From: Sim-hu Date: Thu, 26 Mar 2026 20:08:35 +0900 Subject: [PATCH 06/10] fix: move version info to debug tab --- web/src/views/repo/pipeline/PipelineDebug.vue | 3 +++ web/src/views/repo/pipeline/PipelineWrapper.vue | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/web/src/views/repo/pipeline/PipelineDebug.vue b/web/src/views/repo/pipeline/PipelineDebug.vue index c2758378865..a7368ed60a0 100644 --- a/web/src/views/repo/pipeline/PipelineDebug.vue +++ b/web/src/views/repo/pipeline/PipelineDebug.vue @@ -9,6 +9,9 @@
+ + {{ $t('repo.pipeline.version', { version: pipeline.version }) }} +
diff --git a/web/src/views/repo/pipeline/PipelineWrapper.vue b/web/src/views/repo/pipeline/PipelineWrapper.vue index e145e48f6f0..5007b5e82d1 100644 --- a/web/src/views/repo/pipeline/PipelineWrapper.vue +++ b/web/src/views/repo/pipeline/PipelineWrapper.vue @@ -78,10 +78,6 @@ {{ duration }}
-
- - {{ $t('repo.pipeline.version', { version: pipeline.version }) }} -
From d570add1d75fadfffc843fa23261a2dd735105bd Mon Sep 17 00:00:00 2001 From: Sim-hu Date: Thu, 26 Mar 2026 21:26:19 +0900 Subject: [PATCH 07/10] fix: move version info into single panel with bold formatting Address review feedback: remove separate Panel for version info, integrate into existing debug Panel using InputField with header. Use i18n-t component to bold the version string. --- web/src/assets/locales/en.json | 3 ++- web/src/views/repo/pipeline/PipelineDebug.vue | 10 +++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/web/src/assets/locales/en.json b/web/src/assets/locales/en.json index 79e82a026ab..a5dc30e3897 100644 --- a/web/src/assets/locales/en.json +++ b/web/src/assets/locales/en.json @@ -272,7 +272,8 @@ "we_got_some_errors": "Oh no, an error occurred!", "duration": "Pipeline duration: {duration}", "created": "Created: {created}", - "version": "Woodpecker version: {version}", + "version": "This pipeline ran on Woodpecker {version}.", + "version_header": "Woodpecker version", "cancel_info": { "superseded_by": "Superseded by #{pipelineId}", "canceled_by_user": "Canceled by {user}", diff --git a/web/src/views/repo/pipeline/PipelineDebug.vue b/web/src/views/repo/pipeline/PipelineDebug.vue index a7368ed60a0..0330f1876d7 100644 --- a/web/src/views/repo/pipeline/PipelineDebug.vue +++ b/web/src/views/repo/pipeline/PipelineDebug.vue @@ -8,9 +8,13 @@
- - - {{ $t('repo.pipeline.version', { version: pipeline.version }) }} + + + + +
From fea72a629c94a5b6808b1d6cb23f53c512680a46 Mon Sep 17 00:00:00 2001 From: Sim-hu Date: Sat, 28 Mar 2026 21:54:22 +0900 Subject: [PATCH 08/10] fix: use code-box for version display with top padding Address review feedback: show version in a code-box for easy copying, add description text, and add top padding to the InputField. --- web/src/views/repo/pipeline/PipelineDebug.vue | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/web/src/views/repo/pipeline/PipelineDebug.vue b/web/src/views/repo/pipeline/PipelineDebug.vue index 0330f1876d7..9a40f84c137 100644 --- a/web/src/views/repo/pipeline/PipelineDebug.vue +++ b/web/src/views/repo/pipeline/PipelineDebug.vue @@ -8,12 +8,9 @@
- - - - + +

{{ $t('repo.pipeline.version', { version: pipeline.version }) }}

+
{{ pipeline.version }}
From 7153b4d6863a6a9414955f300cc3759571fef979 Mon Sep 17 00:00:00 2001 From: qwerty287 <80460567+qwerty287@users.noreply.github.com> Date: Sat, 28 Mar 2026 15:42:19 +0100 Subject: [PATCH 09/10] Update web/src/views/repo/pipeline/PipelineDebug.vue --- web/src/views/repo/pipeline/PipelineDebug.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/views/repo/pipeline/PipelineDebug.vue b/web/src/views/repo/pipeline/PipelineDebug.vue index 9a40f84c137..b8d60e68eed 100644 --- a/web/src/views/repo/pipeline/PipelineDebug.vue +++ b/web/src/views/repo/pipeline/PipelineDebug.vue @@ -9,7 +9,7 @@
-

{{ $t('repo.pipeline.version', { version: pipeline.version }) }}

+

{{ $t('repo.pipeline.version') }}

{{ pipeline.version }}
From 33265d50a3910aa652530f7c28dacae19c67fe6e Mon Sep 17 00:00:00 2001 From: qwerty287 <80460567+qwerty287@users.noreply.github.com> Date: Sat, 28 Mar 2026 15:42:25 +0100 Subject: [PATCH 10/10] Update web/src/assets/locales/en.json --- web/src/assets/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/assets/locales/en.json b/web/src/assets/locales/en.json index a5dc30e3897..ed4fd590660 100644 --- a/web/src/assets/locales/en.json +++ b/web/src/assets/locales/en.json @@ -272,7 +272,7 @@ "we_got_some_errors": "Oh no, an error occurred!", "duration": "Pipeline duration: {duration}", "created": "Created: {created}", - "version": "This pipeline ran on Woodpecker {version}.", + "version": "The Woodpecker version this pipeline was executed on.", "version_header": "Woodpecker version", "cancel_info": { "superseded_by": "Superseded by #{pipelineId}",