Refactor JSON and SDK fields (#3968)

This commit is contained in:
qwerty287 2024-08-07 10:49:03 +02:00 committed by GitHub
parent 2d1bc9f15c
commit 2081ca85db
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 164 additions and 133 deletions

View file

@ -4415,8 +4415,7 @@ const docTemplate = `{
"branch": {
"type": "string"
},
"created_at": {
"description": "TODO change JSON field to \"created\" in 3.0",
"created": {
"type": "integer"
},
"creator_id": {
@ -4458,15 +4457,13 @@ const docTemplate = `{
"commit": {
"type": "string"
},
"created_at": {
"description": "TODO change JSON field to \"created\" in 3.0",
"created": {
"type": "integer"
},
"event": {
"type": "string"
},
"finished_at": {
"description": "TODO change JSON field to \"finished\" in 3.0",
"finished": {
"type": "integer"
},
"id": {
@ -4487,8 +4484,7 @@ const docTemplate = `{
"repo_id": {
"type": "integer"
},
"started_at": {
"description": "TODO change JSON field to \"started\" in 3.0",
"started": {
"type": "integer"
},
"status": {
@ -4645,8 +4641,7 @@ const docTemplate = `{
"commit": {
"type": "string"
},
"created_at": {
"description": "TODO change JSON field to \"created\" in 3.0",
"created": {
"type": "integer"
},
"deploy_task": {
@ -4664,8 +4659,7 @@ const docTemplate = `{
"event": {
"$ref": "#/definitions/WebhookEvent"
},
"finished_at": {
"description": "TODO change JSON field to \"finished\" in 3.0",
"finished": {
"type": "integer"
},
"forge_url": {
@ -4698,8 +4692,7 @@ const docTemplate = `{
"refspec": {
"type": "string"
},
"reviewed_at": {
"description": "TODO change JSON field to \"reviewed\" in 3.0",
"reviewed": {
"type": "integer"
},
"reviewed_by": {
@ -4709,8 +4702,7 @@ const docTemplate = `{
"description": "uses reported user for webhooks and name of cron for cron pipelines",
"type": "string"
},
"started_at": {
"description": "TODO change JSON field to \"started\" in 3.0",
"started": {
"type": "integer"
},
"status": {
@ -4722,8 +4714,7 @@ const docTemplate = `{
"title": {
"type": "string"
},
"updated_at": {
"description": "TODO change JSON field to \"updated\" in 3.0",
"updated": {
"type": "integer"
},
"variables": {
@ -5012,15 +5003,15 @@ const docTemplate = `{
"Step": {
"type": "object",
"properties": {
"end_time": {
"type": "integer"
},
"error": {
"type": "string"
},
"exit_code": {
"type": "integer"
},
"finished": {
"type": "integer"
},
"id": {
"type": "integer"
},
@ -5036,7 +5027,7 @@ const docTemplate = `{
"ppid": {
"type": "integer"
},
"start_time": {
"started": {
"type": "integer"
},
"state": {
@ -5196,9 +5187,6 @@ const docTemplate = `{
"$ref": "#/definitions/Step"
}
},
"end_time": {
"type": "integer"
},
"environ": {
"type": "object",
"additionalProperties": {
@ -5208,6 +5196,9 @@ const docTemplate = `{
"error": {
"type": "string"
},
"finished": {
"type": "integer"
},
"id": {
"type": "integer"
},
@ -5223,7 +5214,7 @@ const docTemplate = `{
"platform": {
"type": "string"
},
"start_time": {
"started": {
"type": "integer"
},
"state": {

View file

@ -25,6 +25,7 @@ Some versions need some changes to the server configuration or the pipeline conf
- Deprecated `environment` filter, use `when.evaluate`
- Removed `WOODPECKER_WEBHOOK_HOST` in favor of `WOODPECKER_EXPERT_WEBHOOK_HOST`
- Migrated to rfc9421 for webhook signatures
- Renamed `start_time`, `end_time`, `created_at`, `started_at`, `finished_at` and `reviewed_at` JSON fields to `started`, `finished`, `created`, `started`, `finished`, `reviewed`
## 2.0.0

View file

@ -27,7 +27,7 @@ type Cron struct {
CreatorID int64 `json:"creator_id" xorm:"creator_id INDEX"`
NextExec int64 `json:"next_exec" xorm:"next_exec"`
Schedule string `json:"schedule" xorm:"schedule NOT NULL"` // @weekly, 3min, ...
Created int64 `json:"created_at" xorm:"created NOT NULL DEFAULT 0"` // TODO change JSON field to "created" in 3.0
Created int64 `json:"created" xorm:"created NOT NULL DEFAULT 0"`
Branch string `json:"branch" xorm:"branch"`
} // @name Cron

View file

@ -22,9 +22,9 @@ type Feed struct {
Number int64 `json:"number,omitempty" xorm:"pipeline_number"`
Event string `json:"event,omitempty" xorm:"pipeline_event"`
Status string `json:"status,omitempty" xorm:"pipeline_status"`
Created int64 `json:"created_at,omitempty" xorm:"pipeline_created"` // TODO change JSON field to "created" in 3.0
Started int64 `json:"started_at,omitempty" xorm:"pipeline_started"` // TODO change JSON field to "started" in 3.0
Finished int64 `json:"finished_at,omitempty" xorm:"pipeline_finished"` // TODO change JSON field to "finished" in 3.0
Created int64 `json:"created,omitempty" xorm:"pipeline_created"`
Started int64 `json:"started,omitempty" xorm:"pipeline_started"`
Finished int64 `json:"finished,omitempty" xorm:"pipeline_finished"`
Commit string `json:"commit,omitempty" xorm:"pipeline_commit"`
Branch string `json:"branch,omitempty" xorm:"pipeline_branch"`
Ref string `json:"ref,omitempty" xorm:"pipeline_ref"`

View file

@ -28,10 +28,10 @@ type Pipeline struct {
Event WebhookEvent `json:"event" xorm:"event"`
Status StatusValue `json:"status" xorm:"INDEX 'status'"`
Errors []*types.PipelineError `json:"errors" xorm:"json 'errors'"`
Created int64 `json:"created_at" xorm:"'created' NOT NULL DEFAULT 0 created"` // TODO change JSON field to "created" in 3.0
Updated int64 `json:"updated_at" xorm:"'updated' NOT NULL DEFAULT 0 updated"` // TODO change JSON field to "updated" in 3.0
Started int64 `json:"started_at" xorm:"started"` // TODO change JSON field to "started" in 3.0
Finished int64 `json:"finished_at" xorm:"finished"` // TODO change JSON field to "finished" in 3.0
Created int64 `json:"created" xorm:"'created' NOT NULL DEFAULT 0 created"`
Updated int64 `json:"updated" xorm:"'updated' NOT NULL DEFAULT 0 updated"`
Started int64 `json:"started" xorm:"started"`
Finished int64 `json:"finished" xorm:"finished"`
DeployTo string `json:"deploy_to" xorm:"deploy"`
DeployTask string `json:"deploy_task" xorm:"deploy_task"`
Commit string `json:"commit" xorm:"commit"`
@ -46,7 +46,7 @@ type Pipeline struct {
Email string `json:"author_email" xorm:"email"`
ForgeURL string `json:"forge_url" xorm:"forge_url"`
Reviewer string `json:"reviewed_by" xorm:"reviewer"`
Reviewed int64 `json:"reviewed_at" xorm:"reviewed"` // TODO change JSON field to "reviewed" in 3.0
Reviewed int64 `json:"reviewed" xorm:"reviewed"`
Workflows []*Workflow `json:"workflows,omitempty" xorm:"-"`
ChangedFiles []string `json:"changed_files,omitempty" xorm:"LONGTEXT 'changed_files'"`
AdditionalVariables map[string]string `json:"variables,omitempty" xorm:"json 'additional_variables'"`

View file

@ -36,8 +36,8 @@ type Step struct {
Error string `json:"error,omitempty" xorm:"TEXT 'error'"`
Failure string `json:"-" xorm:"failure"`
ExitCode int `json:"exit_code" xorm:"exit_code"`
Started int64 `json:"start_time,omitempty" xorm:"started"`
Finished int64 `json:"end_time,omitempty" xorm:"stopped"`
Started int64 `json:"started,omitempty" xorm:"started"`
Finished int64 `json:"finished,omitempty" xorm:"finished"`
Type StepType `json:"type,omitempty" xorm:"type"`
} // @name Step

View file

@ -23,8 +23,8 @@ type Workflow struct {
Name string `json:"name" xorm:"name"`
State StatusValue `json:"state" xorm:"state"`
Error string `json:"error,omitempty" xorm:"TEXT 'error'"`
Started int64 `json:"start_time,omitempty" xorm:"started"`
Finished int64 `json:"end_time,omitempty" xorm:"stopped"`
Started int64 `json:"started,omitempty" xorm:"started"`
Finished int64 `json:"finished,omitempty" xorm:"finished"`
AgentID int64 `json:"agent_id,omitempty" xorm:"agent_id"`
Platform string `json:"platform,omitempty" xorm:"platform"`
Environ map[string]string `json:"environ,omitempty" xorm:"json 'environ'"`

View file

@ -0,0 +1,59 @@
// Copyright 2024 Woodpecker Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package migration
import (
"fmt"
"src.techknowlogick.com/xormigrate"
"xorm.io/xorm"
)
type stepV033 struct {
Finished int64 `xorm:"stopped"`
}
func (stepV033) TableName() string {
return "steps"
}
type workflowV033 struct {
Finished int64 `xorm:"stopped"`
}
func (workflowV033) TableName() string {
return "workflows"
}
var renameStartEndTime = xormigrate.Migration{
ID: "rename-start-end-time",
MigrateSession: func(sess *xorm.Session) (err error) {
if err := sess.Sync(new(stepV033), new(workflowV033)); err != nil {
return fmt.Errorf("sync models failed: %w", err)
}
// Step
if err := renameColumn(sess, "steps", "stopped", "finished"); err != nil {
return err
}
// Workflow
if err := renameColumn(sess, "workflows", "stopped", "finished"); err != nil {
return err
}
return nil
},
}

View file

@ -64,6 +64,7 @@ var migrationTasks = []*xormigrate.Migration{
&unifyColumnsTables,
&alterTableRegistriesFixRequiredFields,
&cronWithoutSec,
&renameStartEndTime,
}
var allBeans = []any{

View file

@ -13,7 +13,7 @@
<div class="flex flex-row items-center ml-auto gap-x-2">
<IconButton
v-if="step?.end_time !== undefined && hasLogs"
v-if="step?.finished !== undefined && hasLogs"
:is-loading="downloadInProgress"
:title="$t('repo.pipeline.actions.log_download')"
class="!hover:bg-white !hover:bg-opacity-10"
@ -21,14 +21,14 @@
@click="download"
/>
<IconButton
v-if="step?.end_time !== undefined && hasLogs && hasPushPermission"
v-if="step?.finished !== undefined && hasLogs && hasPushPermission"
:title="$t('repo.pipeline.actions.log_delete')"
class="!hover:bg-white !hover:bg-opacity-10"
icon="trash"
@click="deleteLogs"
/>
<IconButton
v-if="step?.end_time === undefined"
v-if="step?.finished === undefined"
:title="
autoScroll ? $t('repo.pipeline.actions.log_auto_scroll_off') : $t('repo.pipeline.actions.log_auto_scroll')
"
@ -89,13 +89,13 @@
<div class="m-auto text-xl text-wp-text-alt-100">
<span v-if="step?.state === 'skipped'">{{ $t('repo.pipeline.actions.canceled') }}</span>
<span v-else-if="!step?.start_time">{{ $t('repo.pipeline.step_not_started') }}</span>
<span v-else-if="!step?.started">{{ $t('repo.pipeline.step_not_started') }}</span>
<div v-else-if="!loadedLogs">{{ $t('repo.pipeline.loading') }}</div>
<div v-else-if="log?.length === 0">{{ $t('repo.pipeline.no_logs') }}</div>
</div>
<div
v-if="step?.end_time !== undefined"
v-if="step?.finished !== undefined"
class="flex items-center w-full bg-wp-code-100 text-md text-wp-code-text-alt-100 p-4 font-bold"
>
<PipelineStatusIcon :status="step.state" class="!h-4 !w-4" />
@ -350,7 +350,7 @@ watch(stepSlug, async () => {
watch(step, async (newStep, oldStep) => {
if (oldStep?.name === newStep?.name) {
if (oldStep?.end_time !== newStep?.end_time && autoScroll.value) {
if (oldStep?.finished !== newStep?.finished && autoScroll.value) {
scrollDown();
}

View file

@ -19,8 +19,8 @@ const workflow = toRef(props, 'workflow');
const { durationAsNumber } = useDate();
const durationRaw = computed(() => {
const start = (step.value ? step.value?.start_time : workflow.value?.start_time) || 0;
const end = (step.value ? step.value?.end_time : workflow.value?.end_time) || 0;
const start = (step.value ? step.value?.started : workflow.value?.started) || 0;
const end = (step.value ? step.value?.finished : workflow.value?.finished) || 0;
if (end === 0 && start === 0) {
return undefined;
@ -43,5 +43,5 @@ const duration = computed(() => {
return durationAsNumber(durationElapsed.value || 0);
});
const started = computed(() => (step.value ? step.value?.start_time : workflow.value?.start_time) !== undefined);
const started = computed(() => (step.value ? step.value?.started : workflow.value?.started) !== undefined);
</script>

View file

@ -82,7 +82,7 @@
<PipelineStatusIcon :status="workflow.state" class="!h-4 !w-4" />
<span class="truncate">{{ workflow.name }}</span>
<PipelineStepDuration
v-if="workflow.start_time !== workflow.end_time"
v-if="workflow.started !== workflow.finished"
:workflow="workflow"
class="mr-1 pr-2px"
/>

View file

@ -14,7 +14,7 @@ export default (pipeline: Ref<Pipeline | undefined>) => {
return undefined;
}
const start = pipeline.value.created_at || 0;
const start = pipeline.value.created || 0;
return start * 1000;
});
@ -44,8 +44,8 @@ export default (pipeline: Ref<Pipeline | undefined>) => {
return undefined;
}
const start = pipeline.value.started_at || 0;
const end = pipeline.value.finished_at || pipeline.value.updated_at || 0;
const start = pipeline.value.started || 0;
const end = pipeline.value.finished || pipeline.value.updated || 0;
if (start === 0 || end === 0) {
return 0;
@ -109,7 +109,7 @@ export default (pipeline: Ref<Pipeline | undefined>) => {
return undefined;
}
const start = pipeline.value.created_at || 0;
const start = pipeline.value.created || 0;
return toLocaleString(new Date(start * 1000));
});

View file

@ -25,16 +25,16 @@ export interface Pipeline {
errors?: PipelineError[];
// When the pipeline request was received.
created_at: number;
created: number;
// When the pipeline was updated last time in database.
updated_at: number;
updated: number;
// When the pipeline began execution.
started_at: number;
started: number;
// When the pipeline was finished.
finished_at: number;
finished: number;
// Where the deployment should go.
deploy_to: string;
@ -76,13 +76,9 @@ export interface Pipeline {
// This url will point to the repository state associated with the pipeline's commit.
forge_url: string;
signed: boolean;
verified: boolean;
reviewed_by: string;
reviewed_at: number;
reviewed: number;
// The steps associated with this pipeline.
// A pipeline will have multiple steps if a matrix pipeline was used or if a rebuild was requested.
@ -110,8 +106,8 @@ export interface PipelineWorkflow {
name: string;
state: PipelineStatus;
environ?: Record<string, string>;
start_time?: number;
end_time?: number;
started?: number;
finished?: number;
agent_id?: number;
error?: string;
children: PipelineStep[];
@ -126,8 +122,8 @@ export interface PipelineStep {
name: string;
state: PipelineStatus;
exit_code: number;
start_time?: number;
end_time?: number;
started?: number;
finished?: number;
error?: string;
type?: StepType;
}

View file

@ -46,7 +46,7 @@ export function isStepRunning(step: PipelineStep): boolean {
* @returns {number} 0 if created at the same time, < 0 if b was create before a, > 0 otherwise
*/
export function comparePipelines(a: Pipeline, b: Pipeline): number {
return (b.created_at || -1) - (a.created_at || -1);
return (b.created || -1) - (a.created || -1);
}
/**

View file

@ -75,8 +75,6 @@ type (
Event string `json:"event"`
Status string `json:"status"`
Errors []*PipelineError `json:"errors"`
// Deprecated TODO remove in 3.x
Enqueued int64 `json:"enqueued_at"`
Created int64 `json:"created_at"`
Updated int64 `json:"updated_at"`
Started int64 `json:"started_at"`
@ -86,7 +84,6 @@ type (
Branch string `json:"branch"`
Ref string `json:"ref"`
Refspec string `json:"refspec"`
CloneURL string `json:"clone_url"`
Title string `json:"title"`
Message string `json:"message"`
Timestamp int64 `json:"timestamp"`
@ -137,10 +134,6 @@ type (
Address string `json:"address"`
Username string `json:"username"`
Password string `json:"password,omitempty"`
// Deprecated
Email string `json:"email"` // TODO: remove in 3.x
// Deprecated
Token string `json:"token"` // TODO: remove in 3.x
}
// Secret represents a secret variable, such as a password or token.
@ -161,9 +154,9 @@ type (
Number int64 `json:"number,omitempty"`
Event string `json:"event,omitempty"`
Status string `json:"status,omitempty"`
Created int64 `json:"created_at,omitempty"`
Started int64 `json:"started_at,omitempty"`
Finished int64 `json:"finished_at,omitempty"`
Created int64 `json:"created,omitempty"`
Started int64 `json:"started,omitempty"`
Finished int64 `json:"finished,omitempty"`
Commit string `json:"commit,omitempty"`
Branch string `json:"branch,omitempty"`
Ref string `json:"ref,omitempty"`
@ -183,30 +176,20 @@ type (
Commit string `json:"commit,omitempty"`
}
//nolint:godot
// TODO: use dedicated struct in 3.x
// QueueStats struct {
// Workers int `json:"worker_count"`
// Pending int `json:"pending_count"`
// WaitingOnDeps int `json:"waiting_on_deps_count"`
// Running int `json:"running_count"`
// Complete int `json:"completed_count"`
// }
QueueStats struct {
Workers int `json:"worker_count"`
Pending int `json:"pending_count"`
WaitingOnDeps int `json:"waiting_on_deps_count"`
Running int `json:"running_count"`
Complete int `json:"completed_count"`
}
// Info provides queue stats.
Info struct {
Pending []Task `json:"pending"`
WaitingOnDeps []Task `json:"waiting_on_deps"`
Running []Task `json:"running"`
// TODO: use dedicated struct in 3.x
// Stats QueueStats `json:"stats"`
Stats struct {
Workers int `json:"worker_count"`
Pending int `json:"pending_count"`
WaitingOnDeps int `json:"waiting_on_deps_count"`
Running int `json:"running_count"`
Complete int `json:"completed_count"`
} `json:"stats"`
Stats QueueStats `json:"stats"`
Paused bool `json:"paused,omitempty"`
}
@ -233,7 +216,7 @@ type (
CreatorID int64 `json:"creator_id"`
NextExec int64 `json:"next_exec"`
Schedule string `json:"schedule"`
Created int64 `json:"created_at"`
Created int64 `json:"created"`
Branch string `json:"branch"`
}