mirror of
https://github.com/go-gitea/gitea.git
synced 2026-05-23 05:42:33 +09:00
## Fixes #36983 ## Summary 1. Add transitional `Cancelling` status (between `Running` and `Cancelled`); cancel flow marks active tasks `Cancelling`, runner finalizes to `Cancelled` on terminal result. 2. Taskless jobs cancel directly (no runner to finalize). 3. Runner-protocol responses map `Cancelling` → `RESULT_CANCELLED`. 4. Run/job aggregation treats `Cancelling` as active. 5. Status mapping/aggregation tests + en-US locale added. **Problem** When a workflow was cancelled from the UI, jobs were marked cancelled immediately, which could skip post-run cleanup behavior. ## Solution Use a transitional status path: Running → Cancelling → Cancelled This allows runner finalization and cleanup path execution before final terminal state. **Testing** > 1. go test -tags "sqlite sqlite_unlock_notify" ./models/actions -run "TestAggregateJobStatus|TestStatusAsResult|TestStatusFromResult" > 2. go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.11.4 run ./models/actions/... ./routers/api/actions/runner/... ## Related - act_runner: https://gitea.com/gitea/act_runner/pulls/825 — independent; this PR's capability gate keeps legacy runners on the immediate-cancel path. The new flow activates only for runners that advertise the `cancelling` capability. Co-authored-by: Nicolas <bircni@icloud.com> Co-authored-by: silverwind <me@silverwind.io> Co-authored-by: Claude (Opus 4.7) <noreply@anthropic.com> Co-authored-by: Zettat123 <zettat123@gmail.com> Co-authored-by: Giteabot <teabot@gitea.io>
59 lines
3.1 KiB
TypeScript
59 lines
3.1 KiB
TypeScript
import {createApp} from 'vue';
|
|
import RepoActionView from '../components/RepoActionView.vue';
|
|
|
|
export function initRepositoryActionView() {
|
|
const el = document.querySelector('#repo-action-view');
|
|
if (!el) return;
|
|
|
|
// TODO: the parent element's full height doesn't work well now,
|
|
// but we can not pollute the global style at the moment, only fix the height problem for pages with this component
|
|
const parentFullHeight = document.querySelector<HTMLElement>('body > div.full.height');
|
|
if (parentFullHeight) parentFullHeight.classList.add('tw-pb-0');
|
|
|
|
const view = createApp(RepoActionView, {
|
|
jobId: parseInt(el.getAttribute('data-job-id')!),
|
|
actionsViewUrl: el.getAttribute('data-actions-view-url'),
|
|
locale: {
|
|
approve: el.getAttribute('data-locale-approve'),
|
|
cancel: el.getAttribute('data-locale-cancel'),
|
|
rerun: el.getAttribute('data-locale-rerun'),
|
|
rerun_all: el.getAttribute('data-locale-rerun-all'),
|
|
rerun_failed: el.getAttribute('data-locale-rerun-failed'),
|
|
latest: el.getAttribute('data-locale-latest'),
|
|
latestAttempt: el.getAttribute('data-locale-latest-attempt'),
|
|
attempt: el.getAttribute('data-locale-attempt'),
|
|
scheduled: el.getAttribute('data-locale-runs-scheduled'),
|
|
commit: el.getAttribute('data-locale-runs-commit'),
|
|
pushedBy: el.getAttribute('data-locale-runs-pushed-by'),
|
|
summary: el.getAttribute('data-locale-summary'),
|
|
allJobs: el.getAttribute('data-locale-all-jobs'),
|
|
triggeredVia: el.getAttribute('data-locale-triggered-via'),
|
|
totalDuration: el.getAttribute('data-locale-total-duration'),
|
|
artifactsTitle: el.getAttribute('data-locale-artifacts-title'),
|
|
artifactExpired: el.getAttribute('data-locale-artifact-expired'),
|
|
artifactExpiresAt: el.getAttribute('data-locale-artifact-expires-at'),
|
|
confirmDeleteArtifact: el.getAttribute('data-locale-confirm-delete-artifact'),
|
|
showTimeStamps: el.getAttribute('data-locale-show-timestamps'),
|
|
showLogSeconds: el.getAttribute('data-locale-show-log-seconds'),
|
|
showFullScreen: el.getAttribute('data-locale-show-full-screen'),
|
|
downloadLogs: el.getAttribute('data-locale-download-logs'),
|
|
status: {
|
|
unknown: el.getAttribute('data-locale-status-unknown'),
|
|
waiting: el.getAttribute('data-locale-status-waiting'),
|
|
running: el.getAttribute('data-locale-status-running'),
|
|
cancelling: el.getAttribute('data-locale-status-cancelling'),
|
|
success: el.getAttribute('data-locale-status-success'),
|
|
failure: el.getAttribute('data-locale-status-failure'),
|
|
cancelled: el.getAttribute('data-locale-status-cancelled'),
|
|
skipped: el.getAttribute('data-locale-status-skipped'),
|
|
blocked: el.getAttribute('data-locale-status-blocked'),
|
|
},
|
|
logsAlwaysAutoScroll: el.getAttribute('data-locale-logs-always-auto-scroll'),
|
|
logsAlwaysExpandRunning: el.getAttribute('data-locale-logs-always-expand-running'),
|
|
workflowFile: el.getAttribute('data-locale-workflow-file'),
|
|
runDetails: el.getAttribute('data-locale-run-details'),
|
|
},
|
|
});
|
|
view.mount(el);
|
|
}
|