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": { diff --git a/server/model/pipeline.go b/server/model/pipeline.go index 1f67a1b0fa2..2a7c67ea9a2 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" 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..ed4fd590660 100644 --- a/web/src/assets/locales/en.json +++ b/web/src/assets/locales/en.json @@ -272,6 +272,8 @@ "we_got_some_errors": "Oh no, an error occurred!", "duration": "Pipeline duration: {duration}", "created": "Created: {created}", + "version": "The Woodpecker version this pipeline was executed on.", + "version_header": "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..87fcdcde2b8 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/PipelineDebug.vue b/web/src/views/repo/pipeline/PipelineDebug.vue index c2758378865..b8d60e68eed 100644 --- a/web/src/views/repo/pipeline/PipelineDebug.vue +++ b/web/src/views/repo/pipeline/PipelineDebug.vue @@ -8,6 +8,10 @@
{{ $t('repo.pipeline.version') }}
+{{ pipeline.version }}
+