Console output is duplicated in pull request pipelines (#663)

This commit is contained in:
Tan Nhu 2023-10-09 20:38:10 +00:00 committed by Harness
parent 1c762c6802
commit 12b192cf1c
2 changed files with 52 additions and 55 deletions

View File

@ -74,7 +74,7 @@ export function useScheduleJob<T>({
function sendDataToScheduler(item: T | T[]) { function sendDataToScheduler(item: T | T[]) {
if (Array.isArray(item)) { if (Array.isArray(item)) {
data.current.push(...item) data.current.push(...item)
} else { } else if (item) {
data.current.push(item) data.current.push(item)
} }

View File

@ -82,15 +82,11 @@ const CheckPipelineStep: React.FC<CheckPipelineStepsProps & { step: TypesStep }>
) )
const lazy = const lazy =
!expanded || isRunning || step.status === ExecutionState.PENDING || step.status === ExecutionState.SKIPPED !expanded || isRunning || step.status === ExecutionState.PENDING || step.status === ExecutionState.SKIPPED
const { const { data, error, loading, refetch } = useGet<LivelogLine[]>({
data: logs,
error,
loading,
refetch
} = useGet<LivelogLine[]>({
path, path,
lazy: true lazy: true
}) })
const logs = useMemo(() => data?.map(({ out = '' }) => out), [data])
const [isStreamingDone, setIsStreamingDone] = useState(false) const [isStreamingDone, setIsStreamingDone] = useState(false)
const containerRef = useRef<HTMLDivElement | null>(null) const containerRef = useRef<HTMLDivElement | null>(null)
const [autoCollapse, setAutoCollapse] = useState(false) const [autoCollapse, setAutoCollapse] = useState(false)
@ -140,58 +136,62 @@ const CheckPipelineStep: React.FC<CheckPipelineStepsProps & { step: TypesStep }>
maxProcessingBlockSize: 100 maxProcessingBlockSize: 100
}) })
useEffect(() => { useEffect(
if (expanded && isRunning) { function initStreamingLogs() {
setAutoCollapse(false) if (expanded && isRunning) {
setAutoCollapse(false)
if (containerRef.current) { if (containerRef.current) {
containerRef.current.textContent = '' containerRef.current.textContent = ''
}
eventSourceRef.current = new EventSource(`${path}/stream`)
eventSourceRef.current.onmessage = event => {
try {
sendStreamLogToRenderer((JSON.parse(event.data) as LivelogLine).out || '')
} catch (exception) {
showError(getErrorMessage(exception))
closeEventStream()
}
}
eventSourceRef.current.onerror = event => {
setIsStreamingDone(true)
setAutoCollapse(true)
closeEventStream(event)
}
} else {
closeEventStream()
} }
eventSourceRef.current = new EventSource(`${path}/stream`) return closeEventStream
eventSourceRef.current.onmessage = event => { },
try { [expanded, isRunning, showError, path, step.status, closeEventStream, sendStreamLogToRenderer]
sendStreamLogToRenderer((JSON.parse(event.data) as LivelogLine).out || '') )
} catch (exception) {
showError(getErrorMessage(exception)) useEffect(
closeEventStream() function fetchAndRenderCompleteLogs() {
if (!lazy && !error && !isRunning && !isStreamingDone && expanded) {
if (!logs) {
refetch()
} else if (Array.isArray(logs)) {
sendCompleteLogsToRenderer(logs)
} }
} }
},
[lazy, error, logs, refetch, isStreamingDone, expanded, isRunning, sendCompleteLogsToRenderer]
)
eventSourceRef.current.onerror = event => { useEffect(
setIsStreamingDone(true) function autoCollapseWhenStreamingIsDone() {
setAutoCollapse(true) if (autoCollapse && expanded && step.status === ExecutionState.SUCCESS) {
closeEventStream(event) setIsStreamingDone(false)
setAutoCollapse(false)
setExpanded(false)
} }
} else { },
closeEventStream() [autoCollapse, expanded, step.status]
} )
return closeEventStream
}, [expanded, isRunning, showError, path, step.status, closeEventStream, sendStreamLogToRenderer])
useEffect(() => {
if (!lazy && !error && !isRunning && !isStreamingDone && expanded) {
if (!logs) {
refetch()
} else {
sendCompleteLogsToRenderer(logs.map(({ out = '' }) => out))
}
}
}, [lazy, error, logs, refetch, isStreamingDone, expanded, isRunning, sendCompleteLogsToRenderer])
useEffect(() => {
if (autoCollapse && expanded && step.status === ExecutionState.SUCCESS) {
setAutoCollapse(false)
setExpanded(false)
}
}, [autoCollapse, expanded, step.status])
useEffect(() => {
if (!isRunning && logs?.length) {
sendCompleteLogsToRenderer(logs.map(({ out = '' }) => out))
}
}, [isRunning, logs, sendCompleteLogsToRenderer])
useShowRequestError(error, 0) useShowRequestError(error, 0)
@ -202,9 +202,6 @@ const CheckPipelineStep: React.FC<CheckPipelineStepsProps & { step: TypesStep }>
className={cx(css.stepHeader, { [css.expanded]: expanded, [css.selected]: expanded })} className={cx(css.stepHeader, { [css.expanded]: expanded, [css.selected]: expanded })}
{...ButtonRoleProps} {...ButtonRoleProps}
onClick={() => { onClick={() => {
if (expanded && isStreamingDone) {
setIsStreamingDone(false)
}
setExpanded(!expanded) setExpanded(!expanded)
}}> }}>
<NavArrowRight color={Utils.getRealCSSColor(Color.GREY_500)} className={cx(css.noShrink, css.chevron)} /> <NavArrowRight color={Utils.getRealCSSColor(Color.GREY_500)} className={cx(css.noShrink, css.chevron)} />