From 9bcc4fc7ccb6f4f8053efce388baab20d8d7f6e7 Mon Sep 17 00:00:00 2001 From: morningman Date: Thu, 6 Aug 2026 15:29:23 +0800 Subject: [PATCH 1/2] [Feature](website) Retire the deprecated /learning, /archive-docs and /vendors pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These three standalone pages have no inbound link anywhere on the site: /learning lost its footer entry in #1461, while /archive-docs and /vendors lost theirs in the new-homepage refactor (#3660). Their content has also gone stale — /learning links to pre-4.x doc slugs that no longer exist, and /archive-docs still calls 3.0 the "latest version". - /learning: page removed, redirects to /course (Doris 101 is now the entry point for newcomers). Its 10 exclusive sitemap icons are removed too. - /archive-docs: page removed, along with its exclusive pdf.svg, the unused ARCHIVE_PATH constant and 17 orphaned archive.* zh-CN translation keys. The v2.0 PDF it linked stays reachable from the download page. - /vendors: source parked at src/pages/_vendors (underscore = not routed) so the content is preserved, and the route redirects to the homepage. plugin-client-redirects drops any redirect that would override a live route, so the page has to leave the route table for the redirect to apply. - src/pages/_download: removed. Underscore-prefixed, so it was never built. createRedirects() previously normalized the site root to an empty string, which meant no redirect could ever target the homepage; it now keeps '/'. Verified with a production-shaped `--locale en --locale zh-CN` build: /learning -> /course/, /zh-CN/learning -> /zh-CN/course/, /vendors -> /, /zh-CN/vendors -> /zh-CN/, and no remaining route or broken link references any of the removed pages. Co-Authored-By: Claude Opus 5 (1M context) --- docusaurus.config.js | 17 +- i18n/zh-CN/code.json | 68 --- src/constant/common.tsx | 4 +- src/pages/_download/index.scss | 308 ----------- src/pages/_download/index.tsx | 607 --------------------- src/pages/{vendors => _vendors}/index.tsx | 4 + src/pages/archive-docs/index.scss | 90 --- src/pages/archive-docs/index.tsx | 165 ------ src/pages/learning/index.tsx | 341 ------------ src/pages/learning/siteMap.scss | 104 ---- static/images/sitemap/sitemap-admin.png | Bin 1801 -> 0 bytes static/images/sitemap/sitemap-book.png | Bin 1809 -> 0 bytes static/images/sitemap/sitemap-export.png | Bin 2696 -> 0 bytes static/images/sitemap/sitemap-model.png | Bin 1911 -> 0 bytes static/images/sitemap/sitemap-question.png | Bin 2035 -> 0 bytes static/images/sitemap/sitemap-refresh.png | Bin 2445 -> 0 bytes static/images/sitemap/sitemap-search.png | Bin 2012 -> 0 bytes static/images/sitemap/sitemap-setting.png | Bin 2298 -> 0 bytes static/images/sitemap/sitemap-sql.png | Bin 2389 -> 0 bytes static/images/sitemap/sitemap-start.png | Bin 2131 -> 0 bytes static/images/toc-icon/pdf.svg | 5 - 21 files changed, 20 insertions(+), 1693 deletions(-) delete mode 100644 src/pages/_download/index.scss delete mode 100644 src/pages/_download/index.tsx rename src/pages/{vendors => _vendors}/index.tsx (92%) delete mode 100644 src/pages/archive-docs/index.scss delete mode 100644 src/pages/archive-docs/index.tsx delete mode 100644 src/pages/learning/index.tsx delete mode 100644 src/pages/learning/siteMap.scss delete mode 100644 static/images/sitemap/sitemap-admin.png delete mode 100644 static/images/sitemap/sitemap-book.png delete mode 100644 static/images/sitemap/sitemap-export.png delete mode 100644 static/images/sitemap/sitemap-model.png delete mode 100644 static/images/sitemap/sitemap-question.png delete mode 100644 static/images/sitemap/sitemap-refresh.png delete mode 100644 static/images/sitemap/sitemap-search.png delete mode 100644 static/images/sitemap/sitemap-setting.png delete mode 100644 static/images/sitemap/sitemap-sql.png delete mode 100644 static/images/sitemap/sitemap-start.png delete mode 100644 static/images/toc-icon/pdf.svg diff --git a/docusaurus.config.js b/docusaurus.config.js index 11df557dc7737..37208cafaaa31 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -100,6 +100,17 @@ function buildRedirectIndex() { add('/download', '/download-next'); add('/zh-CN/download', '/zh-CN/download-next'); + // The hand-curated /learning sitemap page was retired; Doris 101 is now + // the structured entry point for newcomers. + add('/course', '/learning'); + add('/zh-CN/course', '/zh-CN/learning'); + + // /vendors lost its navigation entry in the new-homepage refactor and has + // no obvious successor page, so it lands on the homepage. Its source is + // parked at src/pages/_vendors (underscore = not routed). + add('/', '/vendors'); + add('/zh-CN', '/zh-CN/vendors'); + // /ecosystem/* was retired; its closest spiritual home is the Dev tree's // Data Integration intro, which catalogs the same connector/tool families // the old /ecosystem/ pages did. @@ -364,8 +375,10 @@ const config = { // Static redirects indexed by target. Trim trailing slash // for the lookup since Docusaurus' trailingSlash:true - // gives us paths like /docs/4.x/foo/. - const normalized = existingPath.replace(/\/$/, ''); + // gives us paths like /docs/4.x/foo/. The locale root + // ('/' or '/zh-CN/') is the one path whose slash is the + // whole path, so keep it as-is. + const normalized = existingPath === '/' ? '/' : existingPath.replace(/\/$/, ''); if (REDIRECT_INDEX[normalized]) { redirects.push(...REDIRECT_INDEX[normalized]); } diff --git a/i18n/zh-CN/code.json b/i18n/zh-CN/code.json index ab98f26312f61..ca68b95015e41 100644 --- a/i18n/zh-CN/code.json +++ b/i18n/zh-CN/code.json @@ -1,72 +1,4 @@ { - "archive.layout.title": { - "message": "Apache Doris - 归档文档中心", - "description": "Apache Doris - Archive Document Center" - }, - "archive.layout.description": { - "message": "收录Apache doris归档文档", - "description": "Collection of Apache doris archive documents" - }, - "archive.page.title": { - "message": "归档文档中心", - "description": "The label for archived docs page title" - }, - "archive.admonition.1": { - "message": "此为 Apache Doris 归档文档,已归档文档不再提供任何更新。", - "description": "The label for admonition in archived docs page" - }, - "archive.admonition.2": { - "message": "建议使用", - "description": "The label for admonition in archived docs page" - }, - "archive.page.2": { - "message": "建议使用 {stableLink}或{latestLink}。", - "description": "The label for admonition in archived docs page" - }, - "archive.admonition.stable": { - "message": "版本(2.1)", - "description": "stable version" - }, - "archive.admonition.latest": { - "message": "版本(3.x)", - "description": "latest version" - }, - "archive.admonition.and": { - "message": "或", - "description": "and" - }, - "archive.page.version": { - "message": "版本:1.2", - "description": "Archive Version" - }, - "archive.preview.v12": { - "message": "归档文档链接:{previewLink}", - "description": "Archive preview link" - }, - "archive.preview.link": { - "message": "Apache Doris v1.2 中文文档", - "description": "Archive preview link" - }, - "archive.preview.date": { - "message": "归档日期:{date}", - "description": "Archive date" - }, - "archive-tips-1": { - "message": "本页将归档 Apache Doris 暂停维护版本的所有文档,并提供 PDF 格式供用户下载。", - "description": "Archive tips" - }, - "archive-tips-2": { - "message": "请注意,归档文档将不再进行任何更新,建议用户使用{latestVersion}。", - "description": "Archive tips" - }, - "archive-download-text": { - "message": "下载 PDF", - "description": "archive download text" - }, - "archive.latest.version": { - "message": "最新版本", - "description": "archive latest version" - }, "theme.docs.versions.latestVersionSuggestionLabel": { "message": "使用参考请跳转至 {v4xLink}/{v3xLink}/{v21Link} 正式版本文档进行查阅。" }, diff --git a/src/constant/common.tsx b/src/constant/common.tsx index 2c5673b37bcdb..3f16c270e2c12 100644 --- a/src/constant/common.tsx +++ b/src/constant/common.tsx @@ -17,6 +17,4 @@ export const BLOG_TAG_ICONS = { 'Release Notes': , 'Top News': , All: , -}; - -export const ARCHIVE_PATH = 'archive-docs'; \ No newline at end of file +}; \ No newline at end of file diff --git a/src/pages/_download/index.scss b/src/pages/_download/index.scss deleted file mode 100644 index 85d3b8eb704ae..0000000000000 --- a/src/pages/_download/index.scss +++ /dev/null @@ -1,308 +0,0 @@ -.download { - margin: 3rem 0; - - a { - transition: all 0.3s; - - &:hover { - text-decoration: underline; - } - } - - .page-column { - padding: 1.875rem 0; - } - - .maven { - .page-column-title { - font-size: 1.5rem; - } - } - .downlaod-document { - color: var(--ifm-color-primary); - cursor: pointer; - padding-left: 0.4rem; - display: flex; - align-items: center; - } - - &-box { - padding: 3.125rem; - box-shadow: 10px 12px 38px rgba(33, 39, 116, 0.07); - border-radius: 4px; - background-color: var(--global-colors-white); - - .download-type { - display: flex; - align-items: center; - - & + .download-type { - margin-top: 1rem; - } - - &.way { - align-items: start; - } - - label { - font-size: var(--global-font-size-default); - font-weight: 600; - color: var(--global-colors-text-primary); - margin-right: 2.125rem; - flex-shrink: 0; - width: 9.0625rem; - } - - .tabs-radio { - flex: 1; - display: flex; - align-items: center; - border-radius: 2px; - - .radio { - border: var(--ifm-color-primary) solid 1px; - flex: 1; - text-align: center; - font-size: var(--global-font-size-medium); - color: var(--global-colors-text-primary); - min-height: 3.125rem; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - cursor: pointer; - - &.disabled { - background-color: var(--global-colors-background); - cursor: not-allowed; - border-color: var(--global-colors-split); - color: var(--global-colors-text); - } - - &.checked { - background-color: var(--ifm-color-primary); - color: var(--global-colors-white); - } - - & + .radio { - margin-left: -1px; - } - & + .disabled { - border-left: none; - margin-left: 0; - } - - .inner { - margin: 0.3125rem; - background-color: #f7faff; - width: calc(100% - 0.625rem); - color: var(--ifm-color-primary); - - & + .inner { - margin-top: 0; - } - } - } - } - } - .download-way { - display: none; - &.show { - display: block; - width: 100%; - } - &.all-in-one { - .theme-code-block { - font-size: 0.875rem ; - padding-left: 2rem; - position: relative; - &:before { - content: '$'; - position: absolute; - left: 1rem; - top: 50%; - transform: translateY(-50%); - font-size: 1rem; - } - } - } - } - - .tips { - margin-top: 1rem; - .title { - color: #556986; - font-weight: 600; - font-size: var(--global-font-size-smaller); - } - .notice-text { - font-size: var(--global-font-size-smaller); - font-weight: 600; - color: #556986; - a { - margin: 0 0.3125rem; - } - } - .notice-dir { - display: flex; - // margin-bottom: 0.5rem; - .notice-dir-name { - min-width: 10rem; - padding-left: 3.5rem; - &.md { - position: relative; - &:before { - position: absolute; - left: 0.8rem; - content: ''; - width: 0; - height: 100%; - border-left: 1.5px solid #556986; - } - &:after { - position: absolute; - left: 0.8rem; - top: 50%; - content: ''; - width: 2rem; - height: 0; - border-top: 1.5px solid #556986; - } - } - &.end { - position: relative; - &:before { - position: absolute; - left: 0.8rem; - content: ''; - width: 0; - height: 50%; - border-left: 1.5px solid #556986; - } - &:after { - position: absolute; - left: 0.8rem; - top: 50%; - content: ''; - width: 2rem; - height: 0; - border-top: 1.5px solid #556986; - } - } - } - .notice-dir-val { - margin-left: 1rem; - } - } - ul { - margin: 0; - padding: 0; - padding-left: 0.9375rem; - li { - color: #556986; - font-size: var(--global-font-size-smaller); - line-height: 1.5; - font-weight: 600; - margin-top: 0.3125rem; - - code { - border-radius: 0.125rem; - border-width: 1px; - padding: 0.125rem 0.3125rem; - margin: 0 0.3125rem; - } - a { - margin: 0 0.3125rem; - } - } - } - } - } - - @media screen and (max-width: 996px) { - &-box { - padding: 0; - box-shadow: none; - - .download-type { - flex-direction: column; - align-items: flex-start; - - label { - width: 100%; - } - - .tabs-radio { - width: 100%; - } - } - - .intr { - margin-left: 0; - } - - .tips { - margin-left: 0; - } - } - } - - .table-content { - .content { - overflow: auto; - } - - table { - width: 100%; - display: table; - margin-bottom: 0; - - thead { - tr { - background-color: #f7faff; - border-bottom: none; - border-top: none; - - th { - font-size: var(--global-font-size-default); - color: var(--global-colors-text-primary); - font-weight: 700; - border-color: #dbe4f3; - line-height: 1.9; - white-space: nowrap; - } - } - } - - tbody { - tr { - td { - border-color: #dbe4f3; - font-size: var(--global-font-size-medium); - white-space: nowrap; - - a + a { - margin-left: 1.25rem; - } - } - } - } - } - - .more { - margin-top: 2.5rem; - - @media screen and (max-width: 996px) { - margin-top: 1.5rem; - } - } - } - - .verify { - font-size: var(--global-font-size-smaller); - - .page-column { - line-height: 1.8; - } - } -} diff --git a/src/pages/_download/index.tsx b/src/pages/_download/index.tsx deleted file mode 100644 index 26a4a5b69382c..0000000000000 --- a/src/pages/_download/index.tsx +++ /dev/null @@ -1,607 +0,0 @@ -import clsx from 'clsx'; -import CodeBlock from '@theme/CodeBlock'; -import Layout from '../../theme/Layout'; -import Link from '@docusaurus/Link'; -import More from '@site/src/components/More'; -import PageColumn from '@site/src/components/PageColumn'; -import React, { useEffect, useState } from 'react'; -import Translate, { translate } from '@docusaurus/Translate'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import './index.scss'; -import { - CPUEnum, - DownloadLinkProps, - JDKEnum, - VersionEnum, - getAllDownloadLinks, - getAllFlinkConnectorDownloadLinks, - getAllSparkConnectorDownloadLinks, - getAllRelease, -} from '@site/src/constant/download.data'; -import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem'; - -const BINARY_VERSION = [ - { label: `${VersionEnum.Latest} ( Latest )`, value: VersionEnum.Latest }, - { label: `${VersionEnum.Prev}`, value: VersionEnum.Prev }, - { label: `${VersionEnum.Earlier} ( Stable )`, value: VersionEnum.Earlier }, -]; - -const JDK = [ - { label: 'JDK 8', value: JDKEnum.JDK8 }, - { label: 'JDK 11', value: JDKEnum.JDK11 }, -]; - -export default function Download(): JSX.Element { - const { - siteConfig, - i18n: { currentLocale, locales, localeConfigs }, - } = useDocusaurusContext(); - const dataLocale = currentLocale === 'zh-CN' ? 'zh-CN' : 'en'; - - const [version, setVersion] = useState(VersionEnum.Latest); - const [cpus, setCpus] = useState([]); - const [cpu, setCPU] = useState(CPUEnum.IntelAvx2); - const [jdk, setJDK] = useState(JDKEnum.JDK8); - const [current, setCurrent] = useState(); - const [downloadWay, setDownloadWay] = useState('all-in-one'); - - const FLINK_CONNECTOR = getAllFlinkConnectorDownloadLinks(dataLocale); - const SPARK_CONNECTOR = getAllSparkConnectorDownloadLinks(dataLocale); - const ALL_RELEASE = getAllRelease(dataLocale); - let ALL_RELEASE_VERSION = {}; - ALL_RELEASE.forEach(item => { - const info: any = Array.isArray(item.download) ? item.download.find(item => item.cpu === 'X64 ( avx2 )') : {}; - ALL_RELEASE_VERSION[item.version] = { - cpu: CPUEnum.IntelAvx2, - binary: info.binary, - source: info.source, - }; - }); - const [releaseUrls, setReleaseUrls] = useState(ALL_RELEASE_VERSION); - - const changeVersion = (val: string) => { - setVersion(val); - }; - const changeCPU = (val: string) => { - setCPU(val); - }; - const changeJDK = (val: string) => { - // if (version === VersionEnum.Latest && val !== JDKEnum.JDK8) return; - if (val !== JDKEnum.JDK8) return; - setJDK(val); - }; - - const getDownloadLinks = () => { - const text = `${version}-${cpu}-${jdk}`; - const linkObj = getAllDownloadLinks(dataLocale).find(item => item.id === text); - setCurrent(linkObj); - if (linkObj && !linkObj.sh) { - setDownloadWay('download'); - } - }; - - function downloadFile(url: string) { - const a = document.createElement('a'); - a.download = url; - a.href = url; - a.target = '_blank'; - const clickEvt = new MouseEvent('click', { - view: window, - bubbles: true, - cancelable: true, - }); - a.dispatchEvent(clickEvt); - a.remove(); - } - - const downloadDocument = () => { - const url = - currentLocale === 'zh-CN' - ? 'https://doris.apache.org/assets/files/Apache Doris Docs (中文).pdf' - : 'https://doris.apache.org/assets/files/Apache Doris Docs (English).pdf'; - downloadFile(url); - }; - - const CPU = [ - { label: 'X64 ( avx2 )', value: CPUEnum.IntelAvx2 }, - { label: 'X64 ( no avx2 )', value: CPUEnum.IntelNoAvx2 }, - { label: 'ARM64', value: CPUEnum.ARM }, - ]; - - const getCpus = version => { - const currentCpus = []; - getAllDownloadLinks(dataLocale).forEach(item => { - if (item.id.includes(version)) { - const matchCpu = CPU.find(cpu => item.id.includes(cpu.value)); - currentCpus.push(matchCpu); - } - }); - return currentCpus; - }; - - useEffect(() => { - getDownloadLinks(); - }, [version, cpu, jdk]); - - useEffect(() => { - const currentCpus = getCpus(version); - setCpus(currentCpus); - setCPU(CPUEnum.X64); - setJDK(JDKEnum.JDK8); - }, [version]); - - function handleCPUChange(cpu: any, currentVersionInfo: any) { - const info = currentVersionInfo.download.find(item => item.cpu === cpu); - setReleaseUrls({ - ...releaseUrls, - [currentVersionInfo.version]: { - binary: info.binary, - source: info.source, - }, - }); - } - - return ( - -
- - Quick Download - - } - > -
-
- -
- {BINARY_VERSION.map(item => ( -
changeVersion(item.value)} - > - {item.label} -
- ))} -
-
-
- -
- {cpus.map(item => ( -
changeCPU(item.value)} - > - {item.label} -
- ))} -
-
- {/*
- -
- {JDK.map(item => ( -
changeJDK(item.value)} - > - {item.label} -
- ))} -
-
*/} - {current && current?.sh && ( -
- -
-
setDownloadWay('all-in-one')} - className={clsx('radio', { - checked: downloadWay === 'all-in-one', - })} - > - Binary -
- -
setDownloadWay('download')} - className={clsx('radio', { - checked: downloadWay === 'download', - })} - > - Source -
-
-
- )} - -
- -
- {current && current.sh && ( -
-
-
- {current.sh?.label} - ( - asc,{' '} - sha512 - ) -
-
-
- )} - {version === VersionEnum.Latest && ( -
-
- Notice: -
-
- For detailed upgrade precautions, please refer to the - 2.0.3 - and the - deployment and - cluster - upgrade - manual. -
-
- )} -
-
-
-
- {current?.items.map(item => ( -
- {item?.label} - ( - asc,{' '} - sha512 - ) -
- ))} -
-
-
-
-
-
-
-
- All Releases} - footer={ - More} - link="https://archive.apache.org/dist/doris/" - /> - } - > -
- - - - - - - - - - - - {ALL_RELEASE.map((item, index) => ( - - - - - - - - ))} - -
- Version - - Release Date - - CPU Model - - Download - - Release Notes -
{item.version}{item.date} - {/* , */} - - {Array.isArray(item.download) ? ( - - ) : ( - <> - )} - - {Array.isArray(item.download) ? ( -
- - Source - - / - - Binary - -
- ) : ( - - Source / Binary - - )} -
- Release Notes -
-
-
-
-
- - Flink Doris Connector - - } - > -
- - - - - - - - - - - - - {FLINK_CONNECTOR.map((item, index) => ( - - - - - - - - - ))} - -
- Version - - Release Date - - Flink Version - - Scala Version - - Doris Version - - Source -
{item.version}{item.date}{item.flink}{item.scala}{item.doris} - - Download - - GitHub -
-
-
-
-
- - Maven - - } - > - - {` - org.apache.doris - flink-doris-connector-1.14_2.12 - - - - - 1.1.0 -`} - - -
-
- - Spark Doris Connector - - } - > -
- - - - - - - - - - - - - {SPARK_CONNECTOR.map((item, index) => ( - - - - - - - - - ))} - -
- Version - - Release Date - - Spark Version - - Scala Version - - Doris Version - - Source -
{item.version}{item.date}{item.spark}{item.scala}{item.doris} - - Download - - GitHub -
-
-
-
-
- - Maven - - } - > - - {` - org.apache.doris - spark-doris-connector-3.2_2.12 - - - - 1.1.0 -`} - - -
- {/*
- - Document - - } - > -
-

- Click to download the latest - - offline documents{' '} - - -

-
-
-
*/} -
- - Verify - - } - > - To verify the downloaded files, please read - - Verify Apache Release - - and using these - - Keys - - . After verification, please read - - Compilation - - and - - Installation and Deployment - - to compile and install Doris. - -
-
- ); -} diff --git a/src/pages/vendors/index.tsx b/src/pages/_vendors/index.tsx similarity index 92% rename from src/pages/vendors/index.tsx rename to src/pages/_vendors/index.tsx index 151af71ccfb8e..29f055e09765a 100644 --- a/src/pages/vendors/index.tsx +++ b/src/pages/_vendors/index.tsx @@ -1,3 +1,7 @@ +// Parked page: kept for reference but intentionally not routed. The underscore +// prefix tells Docusaurus to skip it, and /vendors now redirects to the +// homepage (see buildRedirectIndex in docusaurus.config.js). Restore it by +// renaming this directory back to `vendors` and dropping that redirect. import Layout from '../../theme/Layout'; import { VelodbLogo } from '../../components/Icons/velodb-logo'; import Link from '@docusaurus/Link'; diff --git a/src/pages/archive-docs/index.scss b/src/pages/archive-docs/index.scss deleted file mode 100644 index e3e8322d1ff91..0000000000000 --- a/src/pages/archive-docs/index.scss +++ /dev/null @@ -1,90 +0,0 @@ -.archive-container { - padding: 0 1rem; - width: 100%; - margin-bottom: 5.5rem; - .archive-admonition { - padding: 2rem; - margin-top: 1.25rem; - margin-bottom: 1.25rem; - background-color: rgb(255, 248, 230); - border-radius: 6px; - border: 0 solid rgb(230, 167, 0); - border-left-width: 5px; - p { - color: rgb(107, 88, 39); - font-weight: 600; - } - } - h1 { - font-size: 2.25rem; - font-weight: 700; - line-height: 45px; - margin-top: 2.875rem; - margin-bottom: 1.5rem; - } - h2 { - padding-top: 1.25rem; - margin-top: 2.875rem; - margin-bottom: 1.25rem; - font-size: 1.625rem; - font-weight: 700; - line-height: 32px; - } - - ul li { - margin-bottom: 1.25rem; - color: rgb(85, 95, 115); - } - - .preview-item-content { - display: flex; - justify-content: space-between; - border-bottom: 1px solid #d6dfe6; - } - - .preview-link { - display: flex; - align-items: center; - } - - .preview-link > svg { - margin-left: 8px; - } - - .preview-link:hover { - cursor: pointer; - } - - .download-link:hover { - text-decoration: underline; - color: var(--ifm-color-primary); - } - - .archive-tips-content { - margin-bottom: 5.5rem; - } - - .latest-version-link { - color: var(--ifm-color-primary); - text-decoration: underline; - } - - .preview-item-version { - font-size: 1.125rem; - font-weight: 600; - } - .preview-link { - font-size: 1.125rem; - font-weight: 600; - } -} - -@media (min-width: 1280px) { - .archive-container { - margin: 0 0 5.5rem 5rem; - width: 834px; - .archive-admonition { - max-width: 75%; - } - } -} diff --git a/src/pages/archive-docs/index.tsx b/src/pages/archive-docs/index.tsx deleted file mode 100644 index 44c96f34ed834..0000000000000 --- a/src/pages/archive-docs/index.tsx +++ /dev/null @@ -1,165 +0,0 @@ -import React from 'react'; -import Layout from '@site/src/theme/Layout'; -import Link from '@docusaurus/Link'; -import Translate, { translate } from '@docusaurus/Translate'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import PdfIcon from '@site/static/images/toc-icon/pdf.svg'; -import { getLocalePrefix } from '@site/src/utils/locale'; -import './index.scss'; - -const PREVIEW_LINK_ZH = 'https://cdn.selectdb.com/static/doris_1_2_2_18e810982b.pdf'; -const PREVIEW_LINK_EN = 'https://cdn.selectdb.com/static/doris_1_2_en_0d0a9b6a03.pdf'; -const PREVIEW_LINK_V20 = 'https://doris.apache.org/pdf/Apache_Doris_v2_0_0b89998444.pdf'; - -const DATE_LINK = '2025-01-17'; - -export default function Archive() { - const { - i18n: { currentLocale, defaultLocale }, - } = useDocusaurusContext(); - const isZH = currentLocale === 'zh-CN'; - const localePrefix = getLocalePrefix(currentLocale, defaultLocale); - const handleMouseEnter = (id: string) => { - const dom = document.getElementById(id); - dom!.style.color = 'var(--brand-primary)'; - dom!.firstChild!.style.fill = 'var(--brand-primary)'; - }; - - const handleMouseLeave = (id: string) => { - const dom = document.getElementById(id); - dom!.style.color = '#7F7F83'; - dom!.firstChild!.style.fill = '#7F7F83'; - }; - - return ( - -
-

- Archived Docs -

- {/*
-

- - The older releases are provided for archival purposes only, and are no longer receives - updates. - -

-

- - version(2.1) - - ), - latestLink: ( - - version(3.0) - - ), - }} - > - {'For up-to-date documentation,please see the {stableLink} or {latestLink}'} - -

-
*/} - {/*

- Version:1.2 -

-
    -
  • - - Apache Doris v1.2 - - ), - }} - > - {'Archived documentation: {previewLink}'} - {' '} -
  • -
  • - {DATE_LINK}, - }} - > - {'Archive date: {date}'} - -
  • -
*/} -

- - This page archives all documents of Apache Doris's discontinued maintenance versions and - provides PDF format for users to download. - -
-
- - latest version - - ), - }} - > - { - 'Please note that archived documents no longer receive updates; therefore, Doris encourages you to use the {latestVersion}.' - } - -

- {isZH && ( - - )} -
-
Apache Doris v1.2
- -
handleMouseEnter('toc-icon-pdf-v12')} - onMouseLeave={() => handleMouseLeave('toc-icon-pdf-v12')} - > - - Download PDF -
- -
-
-
- ); -} diff --git a/src/pages/learning/index.tsx b/src/pages/learning/index.tsx deleted file mode 100644 index 4e1e80bc1610d..0000000000000 --- a/src/pages/learning/index.tsx +++ /dev/null @@ -1,341 +0,0 @@ -import Layout from '../../theme/Layout'; -import React from 'react'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import Translate, { translate } from '@docusaurus/Translate'; -import './siteMap.scss'; -import Link from '@docusaurus/Link'; -import More from '@site/src/components/More/index'; -import PageColumn from '@site/src/components/PageColumn'; - -const sitemapList = [ - { - title: Get Started, - icon: require('@site/static/images/sitemap/sitemap-start.png').default, - list: [ - { - title: Introduction to Apache Doris, - link: '/docs/dev/get-starting/what-is-apache-doris', - }, - { - title: Get Started, - link: '/docs/dev/get-starting/quick-start/quick-start', - }, - { - title: Installation and deployment, - link: '/docs/dev/install/standard-deployment', - }, - { - title: Compilation, - link: '/docs/dev/install/source-install/compilation-general', - }, - ], - }, - { - title: Table Design, - icon: require('@site/static/images/sitemap/sitemap-model.png').default, - list: [ - { - title: Data Model, - link: '/docs/dev/data-table/data-model', - }, - { - title: Data Partition, - link: '/docs/dev/data-table/data-partition', - }, - { - title: Guidelines for Creating Table, - link: '/docs/dev/data-table/basic-usage', - }, - { - title: Rollup and Query, - link: '/docs/dev/data-table/hit-the-rollup', - }, - { - title: Practices of Creating Table, - link: '/docs/dev/data-table/best-practice', - }, - { - title: Index, - link: '/docs/dev/data-table/index/index-overview', - }, - ], - }, - { - title: Data Import, - icon: require('@site/static/images/sitemap/sitemap-refresh.png').default, - list: [ - { - title: Import Overview, - link: '/docs/dev/data-operate/import/load-manual', - }, - { - title: Import Local Data, - link: '/docs/dev/data-operate/import/import-scenes/local-file-load', - }, - { - title: Import External Storage Data, - link: '/docs/dev/data-operate/import/import-scenes/external-storage-load', - }, - { - title: Subscribe Kafka Data, - link: '/docs/dev/data-operate/import/import-scenes/kafka-load', - }, - { - title: Synchronize Data Through External Table, - link: '/docs/dev/data-operate/import/import-scenes/external-table-load', - }, - ], - }, - { - title: Data Export, - icon: require('@site/static/images/sitemap/sitemap-setting.png').default, - list: [ - { - title: Export Data, - link: '/docs/dev/data-operate/export/export-manual', - }, - { - title: Export Query Result, - link: '/docs/dev/data-operate/export/outfile', - }, - { - title: Export Table Structure or Data, - link: '/docs/dev/data-operate/export/export-with-mysql-dump', - }, - { - title: Data Backup, - link: '/docs/dev/admin-manual/data-admin/backup', - }, - ], - }, - { - title: Update and Delete, - icon: require('@site/static/images/sitemap/sitemap-export.png').default, - list: [ - { - title: Update, - link: '/docs/dev/data-operate/update-delete/update', - }, - { - title: Delete, - link: '/docs/dev/data-operate/update-delete/delete-manual', - }, - { - title: Batch Delete, - link: '/docs/dev/data-operate/update-delete/batch-delete-manual', - }, - { - title: Sequence Column, - link: '/docs/dev/data-operate/update-delete/sequence-column-manual', - }, - ], - }, - { - title: Advanced Usage, - icon: require('@site/static/images/sitemap/sitemap-book.png').default, - list: [ - { - title: Schema Change, - link: '/docs/dev/advanced/alter-table/schema-change', - }, - { - title: Dynamic Partition, - link: '/docs/dev/advanced/partition/dynamic-partition', - }, - { - title: Data Cache, - link: '/docs/dev/advanced/cache/partition-cache', - }, - { - title: Join Optimization, - link: '/docs/dev/query-acceleration/join-optimization/doris-join-optimization', - }, - { - title: Materialized view, - link: '/docs/dev/query-acceleration/materialized-view', - }, - { - title: BITMAP Precise De-Duplication, - link: '/docs/dev/advanced/orthogonal-bitmap-manual', - }, - { - title: HLL ApproximateDe-duplication, - link: '/docs/dev/advanced/using-hll', - }, - { - title: Variables, - link: '/docs/dev/advanced/variables', - }, - { - title: Time Zone, - link: '/docs/dev/advanced/time-zone', - }, - { - title: File Manager, - link: '/docs/dev/advanced/small-file-mgr', - }, - ], - }, - { - title: Ecosystem, - icon: require('@site/static/images/sitemap/sitemap-search.png').default, - list: [ - { - title: Spark Doris Connector, - link: '/docs/dev/ecosystem/spark-doris-connector', - }, - { - title: Flink Doris Connector, - link: '/docs/dev/ecosystem/flink-doris-connector', - }, - { - title: Seatunnel Connector, - link: '/docs/dev/ecosystem/seatunnel', - }, - { - title: DataX doriswriter, - link: '/docs/dev/ecosystem/datax', - }, - { - title: UDF, - link: '/docs/dev/ecosystem/udf/java-user-defined-function', - }, - { - title: Audit log plugin, - link: '/docs/dev/ecosystem/audit-plugin', - }, - ], - }, - { - title: SQL Manual, - icon: require('@site/static/images/sitemap/sitemap-sql.png').default, - list: [ - { - title: SQL Function, - link: '/docs/dev/sql-manual/sql-functions/array-functions/array', - }, - { - title: DDL, - link: '/docs/dev/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-CATALOG', - }, - { - title: DML, - link: '/docs/dev/sql-manual/sql-reference/Data-Manipulation-Statements/Manipulation/INSERT', - }, - { - title: Data Types, - link: '/docs/dev/sql-manual/sql-reference/Data-Types/BOOLEAN', - }, - { - title: Utility, - link: '/docs/dev/sql-manual/sql-reference/Utility-Statements/HELP', - }, - ], - }, - { - title: Cluster Management, - icon: require('@site/static/images/sitemap/sitemap-admin.png').default, - list: [ - { - title: Cluster Upgrade, - link: '/docs/dev/admin-manual/cluster-management/upgrade', - }, - { - title: Elastic Scaling, - link: '/docs/dev/admin-manual/cluster-management/elastic-expansion', - }, - { - title: Statistics of Query Execution, - link: '/docs/dev/admin-manual/query-profile', - }, - { - title: Maintenance and Monitor, - link: '/docs/dev/admin-manual/maint-monitor/monitor-alert', - }, - { - title: Metadata Operation, - link: '/docs/dev/admin-manual/maint-monitor/metadata-operation', - }, - { - title: Error Code, - link: '/docs/dev/admin-manual/maint-monitor/doris-error-code', - }, - { - title: Config, - link: '/docs/dev/admin-manual/config/fe-config', - }, - { - title: Authority Management, - link: '/docs/dev/admin-manual/privilege-ldap/user-privilege', - }, - { - title: Multi-tenancy, - link: '/docs/dev/admin-manual/multi-tenant', - }, - ], - }, - { - title: FAQ, - icon: require('@site/static/images/sitemap/sitemap-question.png').default, - list: [ - { - title: FAQs of Operation and Maintenance, - link: '/docs/dev/faq/install-faq', - }, - { - title: FAQs of Data Operation, - link: '/docs/dev/faq/data-faq', - }, - { - title: SQL FAQs, - link: '/docs/dev/faq/sql-faq', - }, - ], - }, -]; -export default function Learning(): JSX.Element { - const { siteConfig } = useDocusaurusContext(); - return ( - -
- - Learning Path - - } - subTitle={ - - Start your journey here to discover infinite possibilities with Apache Doris. - - } - > -
- {sitemapList.map((item, index) => ( -
-
{item.title}
-
- -
-
- {item.list.map(path => ( - - {path.title} - - ))} -
-
- ))} -
-
-
-
- ); -} diff --git a/src/pages/learning/siteMap.scss b/src/pages/learning/siteMap.scss deleted file mode 100644 index be4e7db7a772c..0000000000000 --- a/src/pages/learning/siteMap.scss +++ /dev/null @@ -1,104 +0,0 @@ -.sitemap { - .page-column { - padding-top: 3rem; - } -} - -.sitemap-list { - display: flex; - flex-direction: column; - padding: 0 1rem; - line-height: 1.6; - margin-top: 3rem; - - .sitemap-item { - display: flex; - align-items: center; - position: relative; - padding-bottom: 1.25rem; - - &:first-child .sitemap-icon:after { - top: 50%; - } - - &:last-child .sitemap-icon:after { - bottom: 50%; - } - - .sitemap-title { - font-size: 1.2rem; - width: 12rem; - } - - .sitemap-icon { - padding: 0 3rem; - display: flex; - align-items: center; - - img { - width: 2.6rem; - height: 2.6rem; - position: relative; - z-index: 2; - } - - &:after { - content: ''; - border-left: 1px solid #F0F1FC; - position: absolute; - left: 16.3rem; - top: 0; - bottom: 0; - } - } - - .sitemap-paths { - flex: 1; - border: 1px solid #E6E8FB; - color: #252734; - font-size: 1rem; - padding: 0.8rem 0.8rem; - - .path-link { - display: inline-block; - width: 33.333%; - padding: 0 0.5rem; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - line-height: 2; - color: #484954; - text-decoration: none; - - &:hover { - color: var(--ifm-color-primary); - } - } - } - } -} - -@media (max-width: 996px) { - .sitemap-list { - .sitemap-item { - .sitemap-title { - width: 7rem; - padding-right: 0.4rem; - word-break: break-word; - } - - .sitemap-icon { - display: none; - } - - .sitemap-paths { - padding: 0.6rem; - - .path-link { - width: 50%; - } - } - } - } - -} \ No newline at end of file diff --git a/static/images/sitemap/sitemap-admin.png b/static/images/sitemap/sitemap-admin.png deleted file mode 100644 index 7f2b396377b71911fd0e0e7734cf2f0df94cebd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1801 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 diff --git a/static/images/sitemap/sitemap-export.png b/static/images/sitemap/sitemap-export.png deleted file mode 100644 index 6895360af34cbb50e849b9be1d89bf0b9fcc7a9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2696 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 xM)5q|Li&sh=QG^75z0$#)prR;j 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⪚W!gnN7R|GJTqY;4sgjldmEi3!g0KuS4s6+~Bu z>hp15XUHjygrHLEBwSBh8;iM{Oz~Xb=h*{3%{_*AkNKldk9I-4P9xSA74b>N)#vZz z)p@3^L5-PmQo$%vJ;f`Ac0qSKaRioz<<5fs(Wi#;7wq7bk5_1ZVV& rW~*U1Sn` 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 U?K1k5%m4rY07*qoM6N<$g2G=&dH?_b diff --git a/static/images/sitemap/sitemap-sql.png b/static/images/sitemap/sitemap-sql.png deleted file mode 100644 index 26d3aedeedefb11aaffa88ff5da9ca8b869fb656..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2389 zcmV-b399yqP)=-0wQgNIFKs#sS>EfIpjdAwp=RF_5hLEqE@P6p9)ed zio`#O3poH1L9zo9R~8XYQHUdmfCFOUSP*QST^kZ?#XFDR@6E0~Gy89L=FRNP#vf_3 z|7LgN@BaS1-+S{`AO(C~l;$>IOu#l_7$ZW$q=!xCS!wzXF9Cusu=uu=_C*O})~5UW z@?sVpMxXA+=dz+tBB~x@u!8Zee2+l!fdOIGLO^1|x1^wF}A#rcdBm2|0lj z6PK`B1uZVilTykj(LvX47ZP?dKPaZ42`z%MRc?oz5d!xin^1Bq$f`-I{=cK%$OuMHA%MmNAs;Oe&53k1aqtoYO6L6BE zA?hT#{$#!9>$-f!)xSgpSjd-Nxr$4l{eU=l^VCn(_2RcTaeDe1{_>~&NRWoEU)SZg z!=6M$rv5V@o0xtIXIJpzE8ieN*!AmX{Te~pI;lbMM?~P<`RmGZk|b$Sxq;5J68^_) z1l3`k*4!#OLDHi3swo~X9zk_jXQyFN|MBlRT)$x>Zn)t0Td7A-9oCr!thqH6!;=uT z*MP?WH_9f*I%TZZxo^)lgkhmcJl?spr|#obQBVH!0Cw$+JTcJ_DlI3dd2*uKJKYeJ zm%<=M_>X%2eY(=$souS-bOoDKUix>iHd4M7coSgo^> zB?Y0sjuzyL&KIe{T(WY+Ql%85d%UDVhb%u z36rzDi3H#}^wOu{8qW3V&~zeMP?<=E=h9{B>3MWJ9GtdFCViOMi1rzx^MhcGaQA71 zhL{KM-bq!3(=6do6Z^2!MOO$qc6dOw?~)X*5hN(jEoXCyA~!|;O!M*8zGw<4W!6Gj zOzy<*t<$<&Ubod{ZtW%pY0~H3U5Qz)64XLMwWux{iFtPU2Rvgf;lq-*-eplA+S8B6 zf0Dz!{c(ybtX?VY%QSV2Ea4Y(Zgm}h{rqZ;kX6`P-?+M>E{`9`;i-|`N@VRwxyB~#dNQtzZbt1FG`^W(9!u?}%Teo#Sdiwx|`DIi6~TZ(dKeSTiR!kV*D$jhx@jB z?!UYA9fH8w-OZglqL03L=bh?pWAlb``&4K9Mb}iwgM;2|{_^}XTET+=_W*#)EFDA9 zs=G5Ag0kC7DN}8w=gx0hA-lXgV{^uL*O`7eoB#gOSDwn?u!b6xH-pK$&Ia)WB0J^D z>D))xJ@;R@>vm5p<>LLw`8m}jal`j{MCH!tY@J;2M~0@#+;=?zWN%&+iX~Z)DP7vg zEAIGG?SFFJ$)dO|lSO-Ec3ufRKnZ7My*z@d2})m-Cq)Q*E6*TZIzT1+_&)m%>)e7To5j%NoiVqm7% z1%LdA!ceZct5*pgKq#K__GP%mkP;V#lS={-SWtCxsCwh%ci!$GmH{!*&ZdHGr8o}A z^lgpb3YO|vrWnu1xtU-UwHKVgboa(o8h(e|?lROo0)G&7S;o7uq~eN(6Hpj2nMe~e zJpAJA%g`Ogf2pz+TcjO(wX70znkm`cSCr#rCHYv0h?c2C{*REGjAk$dl$?UyIHW^N zM*BKOwpN<-pG^DiI;!U@aYC1no9`PF=@nKK$}}s%jda97>?>_kB5a91e}?+ar{WT_ zN@7cwS=cf#=4=*|+|U0=X`kUW2Vu*gwm%Uaz$Na{IDVjtM0`I<5#6L>aXs%ULFI-i zU>_2~;El6cV6$=_s!!~VBw|siX2G^E^D1nbWa-E+eEIni+o9IjXoH!t00000NkvXX Hu0mjfZ9|>E diff --git a/static/images/sitemap/sitemap-start.png b/static/images/sitemap/sitemap-start.png deleted file mode 100644 index 12fe09063ccdec194a25976bd430f48ce4cab888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2131 zcmV-Z2(0&sP)d^kNkn22C#}>b8*ymVsA?+OQ>kz+J>&wB;DAuo^w3LN2~ee?9uSEtp;A#% z4pc}z6b?OslyHDUFBplQP$8&Fp{J~)7AT3asS*eU@ASRhwPQQ${fKvW#!h}x;*TB2 zo4?>4k|vann$@>(L4vh@CP)y&$)h^gEFn-)o$|>6!Ov)C)gMwlH3LHk`abra0^R+%{ zfd0}GDC+bwit4vt^(82Y+05Xo&G@=e@g1x@2PJZIvdncPCP6v%WETH-uP^W{DD|0* z?&fyj0A&b_c;O9Cf>OdRO8}Z%eqsDX35uGejK)h_*FKc;OiYcw2Z20(p~Km~vvBsW zoN>RvNLMQy-`)+qElm&wsKepTc+61?M?uXX#BYJXp(I)3hcox!_r+&b+ngEbf&D#O zAp&w3q~3N4QjRWfMs%^`^3VQ!;3%fi=I%f6YwjsTKu3#9e_B;gtKU>XAXhR=o`w1* zoq;HzAcaHJ@oL9y1tnL<{-WxOqT=$xqUW|Gd};q0COAAjNE+E4vlVnR=;I&(bIZ?t zwRh_p0)$-OHtMeul$6I$;3JTL_NJPPVWB|mG$|)06ChH{j_q2O%JJQt#Q9}uTrInTmDwA~*l&~M)o^WmVTFWLl($@(hK*uOE zz+z%=CGoQ$At%z0;DlzM7QKgVe&+R;BO5K*kYk+n7iy|vG< zHJLR}DIpPW++2if*Z+m3Co9E|MAs(x_Um3~-6GHMl+q{6OY>>~7mx%F33+iU12cE+ z%Xeg{H-1}$lUzp6mm0!GH ztRa)T6N;krHDR^1ord`$xp8v|e)#c0Ss&?zL}D|@1m~bqm{dU!B;d)@_dL0`9cr)l z@?JD>6@7*anS>*&{QQgAGBF1Su+Z^cKkVDH&Gq#pWH5kttm&C2~PY zI7-N?L4v1UEVLVwdinZK6X`N~FYdl~)V+@t1qvGd@;xWCxnuHb#itcXXbBV2!hDwj6ve0zeJs`;% z-3gqhpH?_18c4#--6xL6Wfqg5jS!R=Knf(mE&r6Qx>N~jsVQ;uYFyt7oWj6M4k|G@ z)NTR6#2&vbb(k{%8ErR#SxwBmp~w1N_GWG#XR=as~{TMd8cq+S-E4ly|8G% z;ByAEAf^ndRKeYe;@ObfbIyfXshzVme<(YvM4Y9J-3$aU=rTt{$Eng^n0JzaO6xS9t88R$U_}?-Mhhk8Cr{tU;8fn1 zl8}3G0&h^lNjd9MaINe)yM~xTO^VpaY91rKW{jBf=+ZG`W>ePjyJ4N}?Bi9>+cnP8 z(nP_lkY&ftItkm4pBiGsKMfn$g4#^Pt1R($TrZEVf6Le+VuMn&Z5>K~wS&$b6o*le zq_igqv?giTsez-Qmg@($(O$jd zXIC%aJ;}rVl(sK}bq42fo0+l16P^V%7Ka*tSguQVLPk@7?eVjzps!&Fb;$T>4X+1F zH7%13$KxSxCRo7O3y#5LOD5IeOv=%Xmnko;NMvT*1 zacGR>KWD9buW85LKsL2Diz)THuPF7GR`AiFMgpmg(TSj&^w(h*kTVl@Whe+SiNL=Y zfUFfK{l{h6UB?d0RHiTuJRFpeD}Og6Z&-$^RCQQd_OaW32!H002ov JPDHLkV1n5b?xX+! diff --git a/static/images/toc-icon/pdf.svg b/static/images/toc-icon/pdf.svg deleted file mode 100644 index 6edc4f745545d..0000000000000 --- a/static/images/toc-icon/pdf.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file From e2de94550fbc70e304ef750517f716933016ab57 Mon Sep 17 00:00:00 2001 From: morningman Date: Thu, 6 Aug 2026 17:27:02 +0800 Subject: [PATCH 2/2] [fix](ci) scope build-check to what actually changed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The detect step had only two outcomes — a specific version set, or every version — so any touch of src/ or static/ jumped straight to the most expensive build. Combined with i18n/**/code.json forcing both locales, a website-only PR paid for 4 doc versions x 2 locales (~11k pages). That is the build that starved the runner and got it killed mid-step on #4040. Split the decision into three independent questions: - TIER (skip / build / full): only versions.json and config/versions-plugin.js — the files that define which versions exist — earn a full build. Site code compiles identically for every version, so one probe version catches the same errors at a quarter of the cost. - VERSIONS: unchanged, still intersected with the active set. - LOCALES: derived from which locale's *content* changed, so an en-only doc change no longer drags zh-CN along, and vice versa. Also: - static/** no longer widens the scope. It is copied verbatim and never reaches the bundler, so a build can neither validate it nor be broken by it. - i18n/**/*.json translation tables are syntax-checked with jq instead of pulling in a whole zh-CN site build. A stale or missing key only warns (Docusaurus falls back to the source string); malformed JSON is the sole build-breaking failure mode. - sidebarsCommunity.json / sidebarsReleases.json no longer force a full build; their plugins are not version-scoped. - Unclassified paths fall back to a minimal build instead of being skipped. - Removed the dead NEED_BUILD variable. - New skip_build output. The Build step still installs dependencies, since the governance steps need node_modules, and skips only the site build itself. Verified by extracting the step and running it under `bash -e` against 29 fixtures, including the real file lists from #4040 and #4038, paired en/zh doc edits, retired version dirs, a versions.json bump, and an empty diff. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/build-check.yml | 326 ++++++++++++++++++++++-------- 1 file changed, 238 insertions(+), 88 deletions(-) diff --git a/.github/workflows/build-check.yml b/.github/workflows/build-check.yml index 592d12d78cfaf..773158e8d52a9 100644 --- a/.github/workflows/build-check.yml +++ b/.github/workflows/build-check.yml @@ -79,149 +79,291 @@ jobs: echo "=== Changed files ===" echo "$CHANGED_FILES" + # --------------------------------------------------------------- + # The build scope is three independent questions. Answering them + # separately is what keeps a website-only PR from paying for a + # 4-version x 2-locale build (~1h, and enough memory pressure to + # kill the runner outright). + # + # TIER how much has to be compiled at all + # skip nothing that reaches the bundler changed + # build compile the version set computed below + # full the *set of versions itself* changed, so every + # active version has to be re-validated + # VERSIONS which doc versions have content changes + # LOCALES which locales have *content* changes + # + # Site code (src/**, docusaurus.config.js, deps) deliberately does + # NOT force `full`: the React/TS/SCSS compile is identical for + # every doc version, so one representative version catches exactly + # the same errors at a quarter of the cost. Only versions.json and + # config/versions-plugin.js — the files that define which versions + # exist — earn a full build. + # + # Unrecognised paths fall through to `build` (minimal, but real), + # so a new kind of file is never silently skipped. + # --------------------------------------------------------------- + VERSIONS="" - LOCALES="en" - NEED_FULL_BUILD="false" + LOCALES="" + TIER="skip" + JSON_TO_VALIDATE="" + + # Representative version for compile-only checks: the latest + # released version, i.e. the stable one the navbar defaults to. + PROBE_VERSION=$(jq -r '.[0] // "4.x"' versions.json) + + # skip < build < full; never lower an already-raised tier. + raise_tier() { + case "$1" in + full) + TIER="full" + ;; + build) + if [ "$TIER" = "skip" ]; then TIER="build"; fi + ;; + esac + } + + add_version() { + VERSIONS="$1,$VERSIONS" + raise_tier build + } + + add_locale() { + case ",$LOCALES," in + *",$1,"*) ;; + *) LOCALES="${LOCALES:+$LOCALES,}$1" ;; + esac + raise_tier build + } + + # Translation JSON only needs a syntax check (see below). + validate_json_later() { + JSON_TO_VALIDATE="${JSON_TO_VALIDATE}${1}"$'\n' + } - # Check each changed file and map to doc version + # First match wins, so order matters: the most specific paths and + # the version-defining files come before the broad catch-alls. while IFS= read -r file; do + [ -n "$file" ] || continue case "$file" in - # English Dev source (current/unreleased version) - docs/*) - VERSIONS="current,$VERSIONS" + # ---- Files that define which versions exist ---------- + # These change the version set itself, so every active + # version has to be rebuilt to stay honest. + versions.json|config/versions-plugin.js) + raise_tier full ;; - # Chinese Dev source (current/unreleased version) - i18n/zh-CN/docusaurus-plugin-content-docs/current/*) - VERSIONS="current,$VERSIONS" - LOCALES="en,zh-CN" + + # ---- English doc content ----------------------------- + # Dev / unreleased version. + docs/*) + add_locale en + add_version current ;; - # English versioned docs versioned_docs/version-*/*) ver=$(echo "$file" | sed -n 's|versioned_docs/version-\([^/]*\)/.*|\1|p') - VERSIONS="${ver},$VERSIONS" + add_locale en + add_version "$ver" + ;; + + # ---- Chinese doc content ----------------------------- + # Only zh-CN is built: an en page cannot break because a + # zh-CN page changed. With a single --locale, Docusaurus + # drops the locale path prefix (baseUrl becomes / instead + # of /zh-CN/) — the same path `yarn start:zh-CN` takes. + # That only shifts output paths, and onBrokenLinks is + # 'warn', so it cannot manufacture a failure. + i18n/zh-CN/docusaurus-plugin-content-docs/current/*) + add_locale zh-CN + add_version current ;; - # Chinese versioned docs i18n/zh-CN/docusaurus-plugin-content-docs/version-*/*) ver=$(echo "$file" | sed -n 's|i18n/zh-CN/docusaurus-plugin-content-docs/version-\([^/]*\)/.*|\1|p') - VERSIONS="${ver},$VERSIONS" - LOCALES="en,zh-CN" - ;; - # Per-version label translations (e.g. version-4.x.json) - i18n/zh-CN/docusaurus-plugin-content-docs/version-*.json) - ver=$(echo "$file" | sed -n 's|i18n/zh-CN/docusaurus-plugin-content-docs/version-\([^.]*\)\.json|\1|p') - VERSIONS="${ver},$VERSIONS" - LOCALES="en,zh-CN" + add_locale zh-CN + add_version "$ver" ;; - # Chinese community docs - i18n/zh-CN/docusaurus-plugin-content-docs-community/*|i18n/zh-CN/code.json) - LOCALES="en,zh-CN" + + # ---- Translation tables (JSON) ----------------------- + # code.json and the per-version label files are lookup + # tables, not content: Docusaurus falls back to the + # source string and warns on a missing/stale key, it does + # not fail. The single build-breaking failure mode is + # malformed JSON, which `jq` catches in milliseconds — so + # these no longer drag a whole zh-CN site build along. + i18n/*/code.json|i18n/*/docusaurus-plugin-content-docs*/*.json) + validate_json_later "$file" ;; - # Versioned sidebars: extract version from filename + + # ---- Version-scoped sidebars ------------------------- # e.g. versioned_sidebars/version-4.x-sidebars.json → 4.x versioned_sidebars/version-*-sidebars.json) ver=$(echo "$file" | sed -n 's|versioned_sidebars/version-\(.*\)-sidebars\.json|\1|p') - VERSIONS="${ver},$VERSIONS" + add_locale en + add_version "$ver" ;; - # Current-version (Dev) sidebar sidebars.ts) - VERSIONS="current,$VERSIONS" + add_locale en + add_version current + ;; + + # ---- Always-built, version-independent plugins ------- + # Blog, community, releases and course are separate + # plugin instances that Docusaurus compiles regardless of + # DOCS_VERSIONS, so they need a build but no extra + # versions. Their sidebars belong here for the same + # reason — they used to force a full multi-version build + # for nothing. + blog/*|community/*|releasenotes/*|course/*) + add_locale en + raise_tier build + ;; + sidebarsCommunity.json|sidebarsReleases.json|sidebarsCourse.ts) + add_locale en + raise_tier build + ;; + i18n/zh-CN/docusaurus-plugin-content-docs-community/*|i18n/zh-CN/docusaurus-plugin-content-docs-releases/*) + add_locale zh-CN + raise_tier build ;; - # versions.json controls which versions are built; any change - # warrants a full multi-version build. - versions.json) - NEED_FULL_BUILD="true" + + # ---- Nothing the bundler ever sees ------------------- + # static/ is copied verbatim into the output. A change + # there cannot fail (or be validated by) a build, so it + # must not widen the scope on its own. A doc that + # references a new asset triggers its own build above. + static/*) + ;; + # CI config, governance tooling, repo-level prose and + # helper scripts. No Python or shell file in this repo is + # compiled into the site. + .github/*|.claude/*|.agents/*|.vscode/*|.idea/*) ;; - # Blog and community are independent plugins, not - # controlled by DOCS_VERSIONS. They are always built - # regardless of version filtering. - blog/*|community/*|releasenotes/*) - NEED_BUILD="true" + scripts/docs-governance/*|website-quality-governance/*) ;; - # Releases i18n docs - i18n/zh-CN/docusaurus-plugin-content-docs-releases/*) - LOCALES="en,zh-CN" + *.py|*.sh) ;; - # Static image assets are copied verbatim to the - # build output and don't affect page rendering, so - # they should NOT trigger a full rebuild on their - # own. Any doc change that references these images - # will trigger its own version-scoped build above. - static/images/*|static/images/**) + README.md|AGENTS.md|TOC.md|LICENSE|NOTICE|store_format_v3.md|cspell.json|author.yml|buildVersions.json|.gitignore|.prettierrc|.prettierignore|.eslintrc|.eslintrc.js) ;; - # Config, source code, or other structural changes - # require a full build to validate - sidebarsCommunity.json|sidebarsReleases.json|docusaurus.config.js|src/*|static/*|config/*|package.json|yarn.lock|tailwind.config.js) - NEED_FULL_BUILD="true" + + # ---- Site code, config and deps ---------------------- + # Compiled once and shared by every version and locale, + # so the representative version is a complete check. + # scripts/ entries listed here are genuine build inputs: + # key-features/ and last-update/ are read by + # docusaurus.config.js, patch-search-tokenize.js runs on + # postinstall. + src/*|config/*|docusaurus.config.js|package.json|yarn.lock|tailwind.config.js|tsconfig.json|scripts/key-features/*|scripts/last-update/*|scripts/patch-search-tokenize.js) + add_locale en + raise_tier build + ;; + + # ---- Anything else: fail safe ------------------------ + *) + echo "Unclassified path '$file' — falling back to a minimal build." + add_locale en + raise_tier build ;; esac done <<< "$CHANGED_FILES" - # Build the set of versions Docusaurus actually builds: - # `current` (the dev/unreleased version) plus everything in versions.json. - # Older version dirs (e.g. version-1.2, version-2.0) may still exist on - # disk but be absent from versions.json — touching them must not poison - # onlyIncludeVersions, which would fail the build with "unknown versions". + # Syntax-check the translation tables we chose not to build. + if [ -n "$JSON_TO_VALIDATE" ]; then + echo "" + echo "=== Validating changed i18n JSON ===" + while IFS= read -r f; do + [ -n "$f" ] || continue + # Deleted in this PR — nothing left to parse. + [ -f "$f" ] || { echo " skip (deleted) $f"; continue; } + if jq empty "$f" >/dev/null 2>&1; then + echo " ok $f" + else + echo " INVALID JSON $f" + jq empty "$f" || true + exit 1 + fi + done <<< "$JSON_TO_VALIDATE" + fi + + # The versions Docusaurus can actually build: `current` (dev) + # plus everything in versions.json. Older dirs (version-1.2, + # version-2.0) may still sit on disk while being absent from + # versions.json — feeding those to onlyIncludeVersions fails the + # build with "unknown versions". ACTIVE_VERSIONS=$(jq -r '.[]' versions.json | tr '\n' ',' | sed 's/,$//') ACTIVE_VERSIONS="current,${ACTIVE_VERSIONS}" + echo "" echo "Active versions (current + versions.json): $ACTIVE_VERSIONS" - # Deduplicate versions - if [ "$NEED_FULL_BUILD" = "true" ]; then - # Structural changes: build all active versions - DOCS_VERSIONS="" - echo "Structural changes detected, will build ALL versions." - elif [ -n "$VERSIONS" ]; then - # Only doc content changes: build only affected versions. - # Intersect detected versions with the active set so that edits to - # retired version dirs (e.g. version-1.2) don't break the build. - RAW_VERSIONS=$(echo "$VERSIONS" | tr ',' '\n' | sort -u | grep -v '^$') + SKIP_BUILD="false" + NEED_FULL_BUILD="false" + DOCS_VERSIONS="" + + if [ "$TIER" = "skip" ]; then + SKIP_BUILD="true" + LOCALES="en" + # An empty DOCS_VERSIONS means "every version" to + # docusaurus.config.js. Nothing should read it while + # skip_build is set, but pin it to the probe version anyway so + # a future edit can't turn a skipped build into the most + # expensive one. + DOCS_VERSIONS="$PROBE_VERSION" + echo "Nothing that reaches the bundler changed — skipping the site build." + elif [ "$TIER" = "full" ]; then + NEED_FULL_BUILD="true" DOCS_VERSIONS="" - SKIPPED_VERSIONS="" + echo "The version set itself changed — building ALL active versions." + else + RAW_VERSIONS=$(echo "$VERSIONS" | tr ',' '\n' | sort -u | grep -v '^$' || true) + KEPT="" + DROPPED="" for v in $RAW_VERSIONS; do if echo ",$ACTIVE_VERSIONS," | grep -q ",$v,"; then - DOCS_VERSIONS="${v},$DOCS_VERSIONS" + KEPT="${v},$KEPT" else - SKIPPED_VERSIONS="${v},$SKIPPED_VERSIONS" + DROPPED="${v},$DROPPED" fi done - DOCS_VERSIONS=$(echo "$DOCS_VERSIONS" | sed 's/,$//') - SKIPPED_VERSIONS=$(echo "$SKIPPED_VERSIONS" | sed 's/,$//') - if [ -n "$SKIPPED_VERSIONS" ]; then - echo "Ignoring changes to retired/unknown versions: $SKIPPED_VERSIONS" + DOCS_VERSIONS=$(echo "$KEPT" | sed 's/,$//') + DROPPED=$(echo "$DROPPED" | sed 's/,$//') + if [ -n "$DROPPED" ]; then + echo "Ignoring changes to retired/unknown versions: $DROPPED" fi if [ -z "$DOCS_VERSIONS" ]; then - # Everything we detected was retired/unknown; fall back to a - # minimal build so the workflow still validates the site. - DOCS_VERSIONS="4.x" - echo "All detected versions were retired/unknown, doing minimal build with '4.x' only." + # Either no versioned content changed (site code, blog, + # community, course...) or everything we found was + # retired. One representative version is enough. + DOCS_VERSIONS="$PROBE_VERSION" + echo "No active versioned content changed — probing with '$PROBE_VERSION' only." else - echo "Doc-only changes detected for versions: $DOCS_VERSIONS" + echo "Versioned content changed for: $DOCS_VERSIONS" fi - else - # No versioned doc changes (e.g., only blog, community, or scripts). - # Blog and community plugins are always compiled by Docusaurus - # regardless of DOCS_VERSIONS, so we just set the minimal docs - # scope to keep the build fast. - DOCS_VERSIONS="4.x" - echo "No doc version changes detected, doing minimal build with '4.x' only." - echo "(Blog and community plugins are always built regardless.)" fi - # Determine locales for the build command + # Default the locale when a build is needed but no locale-specific + # content changed (site code, deps, blog, ...). + if [ "$SKIP_BUILD" != "true" ] && [ -z "$LOCALES" ]; then + LOCALES="en" + fi + LOCALE_ARGS="" IFS=',' read -ra LOCALE_ARR <<< "$LOCALES" for locale in "${LOCALE_ARR[@]}"; do + [ -n "$locale" ] || continue LOCALE_ARGS="$LOCALE_ARGS --locale $locale" done echo "docs_versions=$DOCS_VERSIONS" >> "$GITHUB_OUTPUT" echo "locale_args=$LOCALE_ARGS" >> "$GITHUB_OUTPUT" echo "need_full_build=$NEED_FULL_BUILD" >> "$GITHUB_OUTPUT" + echo "skip_build=$SKIP_BUILD" >> "$GITHUB_OUTPUT" echo "" echo "=== Build plan ===" - echo " DOCS_VERSIONS: ${DOCS_VERSIONS:-all}" - echo " LOCALE_ARGS: $LOCALE_ARGS" + echo " TIER: $TIER" + echo " SKIP_BUILD: $SKIP_BUILD" + echo " DOCS_VERSIONS: ${DOCS_VERSIONS:-all}" + echo " LOCALE_ARGS: ${LOCALE_ARGS:- (none)}" echo " NEED_FULL_BUILD: $NEED_FULL_BUILD" - name: Build @@ -234,6 +376,14 @@ jobs: yarn yarn key-features:generate + # Dependencies are installed unconditionally above because the + # governance steps below need node_modules; only the site build + # itself is scoped by the detect step. + if [ "${{ steps.detect.outputs.skip_build }}" = "true" ]; then + echo "No site-affecting changes detected — skipping the docusaurus build." + exit 0 + fi + echo "Building with DOCS_VERSIONS=${DOCS_VERSIONS:-all}" PWA_SERVICE_WORKER_URL=https://doris.apache.org/sw.js yarn docusaurus build ${{ steps.detect.outputs.locale_args }} rm -rf build