feat: 展示发布 ref 提交信息

This commit is contained in:
湛兮
2026-06-12 01:47:17 +08:00
parent 39dbbaa3a1
commit 02e6a963d6
2 changed files with 109 additions and 10 deletions
+15 -8
View File
@@ -210,14 +210,21 @@ export interface ProjectConfig {
export interface ProjectRefs {
source: 'gitea' | 'fallback'
branches: Array<{
name: string
commitSha?: string
}>
tags: Array<{
name: string
commitSha?: string
}>
branches: ProjectRefItem[]
tags: ProjectRefItem[]
}
export interface ProjectRefCommit {
sha: string
message: string
authorName?: string
authoredAt?: string
}
export interface ProjectRefItem {
name: string
commitSha?: string
commit?: ProjectRefCommit
}
export interface PipelineStep {
+94 -2
View File
@@ -1,6 +1,6 @@
<script setup lang="ts">
/**
* 发布中心负责创建发布单、同步 Jenkins 状态并展示当前运行流程
* 发布中心负责创建发布单、展示真实 Gitea ref 摘要并同步 Jenkins 状态。
*/
import { CircleClose, Promotion, RefreshRight, VideoPause } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus'
@@ -9,7 +9,7 @@ import BpmnStatusViewer from '../components/BpmnStatusViewer.vue'
import RunExecutionDetails from '../components/RunExecutionDetails.vue'
import StatusPill from '../components/StatusPill.vue'
import { usePlatformStore } from '../stores/platform'
import type { EnvironmentName, ReleaseRun, ReleaseStatus } from '../types/devops'
import type { EnvironmentName, ProjectRefItem, ReleaseRun, ReleaseStatus } from '../types/devops'
const platform = usePlatformStore()
@@ -77,6 +77,34 @@ const refSourceText = computed(() => {
return '等待后端 refs'
})
const selectedRefDetail = computed<ProjectRefItem | undefined>(() => {
const refs = currentRefs.value
if (!refs) {
return undefined
}
const candidates =
form.environment === 'production' && !useBranchRefs.value ? refs.tags : refs.branches
return candidates.find((item) => item.name === form.ref)
})
const selectedCommitMessage = computed(() => {
return selectedRefDetail.value?.commit?.message?.split('\n')[0] || ''
})
const selectedCommitSha = computed(() => {
return selectedRefDetail.value?.commit?.sha || selectedRefDetail.value?.commitSha || ''
})
const selectedCommitMeta = computed(() => {
const commit = selectedRefDetail.value?.commit
const parts = [commit?.authorName, formatCommitTime(commit?.authoredAt)].filter(Boolean)
return parts.join(' · ')
})
const canTrigger = computed(() => {
if (!form.projectKey || !form.environment || !form.ref) {
return false
@@ -116,6 +144,23 @@ async function triggerRelease() {
}
}
function shortSha(value: string): string {
return value ? value.slice(0, 10) : '-'
}
function formatCommitTime(value?: string): string {
if (!value) {
return ''
}
return new Intl.DateTimeFormat('zh-CN', {
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
}).format(new Date(value))
}
async function cancelRelease() {
if (!shownRun.value) {
return
@@ -264,6 +309,15 @@ watch(refOptions, (options) => {
{{ form.environment === 'production' ? selectedProject?.tagPolicy : selectedProject?.defaultBranch }}
· {{ refSourceText }}
</div>
<div v-if="selectedCommitSha" class="commit-preview">
<div class="commit-main">
<ElTag size="small" effect="plain" class="mono">
{{ shortSha(selectedCommitSha) }}
</ElTag>
<strong>{{ selectedCommitMessage || 'Gitea 未返回提交说明' }}</strong>
</div>
<small v-if="selectedCommitMeta">{{ selectedCommitMeta }}</small>
</div>
</ElFormItem>
<ElFormItem label="备注">
<ElInput v-model="form.note" type="textarea" :rows="3" maxlength="120" show-word-limit />
@@ -356,6 +410,44 @@ watch(refOptions, (options) => {
margin-top: 16px;
}
.commit-preview {
display: grid;
gap: 4px;
width: 100%;
margin-top: 8px;
padding: 8px 10px;
overflow: hidden;
border: 1px solid #d9e2ef;
border-radius: 6px;
background: #f8fafc;
}
.commit-main {
display: grid;
grid-template-columns: max-content minmax(0, 1fr);
gap: 8px;
align-items: center;
}
.commit-main strong,
.commit-preview small {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.commit-main strong {
color: #0f172a;
font-size: 13px;
font-weight: 600;
}
.commit-preview small {
color: #64748b;
font-size: 12px;
}
@media (max-width: 760px) {
.form-grid {
grid-template-columns: 1fr;