docs: add fast build feature and activate it in CI

Adds feature for skipping include of doxygen headers into sphinx build
when env variable is set.

Builds incomplete docs (no function API documention)
but speeds up building (20min to 1<min).

Add this fast build as the default way of building docs in CI on
non protected branches.
pull/7041/head
Marius Vikhammer 2021-04-27 12:24:22 +08:00
rodzic eccdf88712
commit 89179dc286
6 zmienionych plików z 103 dodań i 67 usunięć

Wyświetl plik

@ -49,22 +49,6 @@
- build_system - build_system
- macos - macos
"build:docs":
labels:
- docs
- build_docs # for backward compatibility
patterns:
- docs
deploy:
- production
"build:docs:label-only":
labels:
- docs
- build_docs # for backward compatibility
deploy:
- preview
# --------------- # ---------------
# Build Test Jobs # Build Test Jobs
# --------------- # ---------------

Wyświetl plik

@ -1,8 +1,45 @@
.patterns-docs: &patterns-docs
- ".gitlab/ci/docs.yml"
- "docs/**/*"
- "components/**/*.h"
- "components/**/Kconfig*"
- "components/**/CMakeList.txt"
- "components/**/sdkconfig*"
- "tools/kconfig_new/**/*"
- "CONTRIBUTING.rst"
.if-protected: &if-protected
if: '($CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_BRANCH =~ /^release\/v/ || $CI_COMMIT_TAG =~ /^v\d+\.\d+(\.\d+)?($|-)/)'
.if-protected-no_label: &if-protected-no_label
if: '($CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_BRANCH =~ /^release\/v/ || $CI_COMMIT_TAG =~ /^v\d+\.\d+(\.\d+)?($|-)/) && $BOT_TRIGGER_WITH_LABEL == null'
.if-label-build_docs: &if-label-build_docs
if: '$BOT_LABEL_BUILD_DOCS || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*build_docs(?:,[^,\n\r]+)*$/i'
.if-label-docs: &if-label-docs
if: '$BOT_LABEL_DOCS || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*docs(?:,[^,\n\r]+)*$/i'
.if-label-docs_full: &if-label-docs_full
if: '$BOT_LABEL_DOCS_FULL || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*docs_full(?:,[^,\n\r]+)*$/i'
.if-dev-push: &if-dev-push
if: '$CI_COMMIT_REF_NAME != "master" && $CI_COMMIT_BRANCH !~ /^release\/v/ && $CI_COMMIT_TAG !~ /^v\d+\.\d+(\.\d+)?($|-)/ && ($CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "merge_request_event")'
.doc-rules:build:docs:
rules:
- <<: *if-protected
- <<: *if-label-build_docs
- <<: *if-label-docs
- <<: *if-label-docs_full
- <<: *if-dev-push
changes: *patterns-docs
# stage: pre_check # stage: pre_check
check_readme_links: check_readme_links:
extends: extends:
- .pre_check_job_template - .pre_check_job_template
- .rules:build:docs - .doc-rules:build:docs
tags: ["build", "amd64", "internet"] tags: ["build", "amd64", "internet"]
allow_failure: true allow_failure: true
script: script:
@ -11,7 +48,7 @@ check_readme_links:
check_docs_lang_sync: check_docs_lang_sync:
extends: extends:
- .pre_check_job_template - .pre_check_job_template
- .rules:build:docs - .doc-rules:build:docs
script: script:
- cd docs - cd docs
- ./check_lang_folder_sync.sh - ./check_lang_folder_sync.sh
@ -34,7 +71,7 @@ check_docs_gh_links:
extends: extends:
- .pre_check_job_template - .pre_check_job_template
- .build_docs_template - .build_docs_template
- .rules:build:docs - .doc-rules:build:docs
script: script:
- cd docs - cd docs
- ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh -p 3.6.10 pip install -r requirements.txt - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh -p 3.6.10 pip install -r requirements.txt
@ -45,7 +82,6 @@ check_docs_gh_links:
.build_docs_build_stage_template: .build_docs_build_stage_template:
extends: extends:
- .build_docs_template - .build_docs_template
- .rules:build:docs
stage: build_doc stage: build_doc
needs: needs:
- job: check_docs_lang_sync - job: check_docs_lang_sync
@ -53,9 +89,14 @@ check_docs_gh_links:
- job: check_docs_gh_links - job: check_docs_gh_links
artifacts: false artifacts: false
build_docs_html: # Doc jobs have a lot of special cases, we specify rules here directly instead
# in dependencies.yml to simplify things
build_docs_html_full:
extends: extends:
- .build_docs_build_stage_template - .build_docs_build_stage_template
rules:
- <<: *if-protected
- <<: *if-label-docs_full
artifacts: artifacts:
when: always when: always
paths: paths:
@ -65,10 +106,32 @@ build_docs_html:
variables: variables:
DOC_BUILDERS: "html" DOC_BUILDERS: "html"
build_docs_html_fast:
extends:
- .build_docs_build_stage_template
rules:
- <<: *if-label-docs_full
when: never
- <<: *if-label-build_docs
- <<: *if-label-docs
- <<: *if-dev-push
changes: *patterns-docs
artifacts:
when: always
paths:
- docs/_build/*/*/*.txt
- docs/_build/*/*/html/*
expire_in: 4 days
variables:
DOC_BUILDERS: "html"
DOCS_FAST_BUILD: "yes"
build_docs_pdf: build_docs_pdf:
extends: extends:
- .build_docs_build_stage_template - .build_docs_build_stage_template
- .rules:build:docs:label-only rules:
- <<: *if-protected
- <<: *if-label-docs_full
artifacts: artifacts:
when: always when: always
paths: paths:
@ -98,10 +161,12 @@ build_docs_pdf:
deploy_docs_preview: deploy_docs_preview:
extends: extends:
- .deploy_docs_template - .deploy_docs_template
- .rules:build:docs:label-only-preview rules:
dependencies: # set dependencies to null to avoid missing artifacts issue - <<: *if-label-build_docs
needs: - <<: *if-label-docs
- build_docs_html dependencies:
- build_docs_html_fast
- build_docs_html_full
- build_docs_pdf - build_docs_pdf
variables: variables:
TYPE: "preview" TYPE: "preview"
@ -117,11 +182,12 @@ deploy_docs_production:
# The DOCS_PROD_* variables used by this job are "Protected" so these branches must all be marked "Protected" in Gitlab settings # The DOCS_PROD_* variables used by this job are "Protected" so these branches must all be marked "Protected" in Gitlab settings
extends: extends:
- .deploy_docs_template - .deploy_docs_template
- .rules:build:docs-production rules:
- <<: *if-protected-no_label
stage: post_deploy stage: post_deploy
dependencies: # set dependencies to null to avoid missing artifacts issue dependencies: # set dependencies to null to avoid missing artifacts issue
needs: # ensure runs after push_to_github succeeded needs: # ensure runs after push_to_github succeeded
- build_docs_html - build_docs_html_full
- build_docs_pdf - build_docs_pdf
- job: push_to_github - job: push_to_github
artifacts: false artifacts: false

Wyświetl plik

@ -1,16 +1,6 @@
############ ############
# Patterns # # Patterns #
############ ############
.patterns-docs: &patterns-docs
- ".gitlab/ci/docs.yml"
- "docs/**/*"
- "components/**/*.h"
- "components/**/Kconfig*"
- "components/**/CMakeList.txt"
- "components/**/sdkconfig*"
- "tools/kconfig_new/**/*"
- "CONTRIBUTING.rst"
.patterns-c-files: &patterns-c-files .patterns-c-files: &patterns-c-files
- ".gitlab/ci/static-code-analysis.yml" - ".gitlab/ci/static-code-analysis.yml"
- "tools/ci/static-analysis-rules.yml" - "tools/ci/static-analysis-rules.yml"
@ -258,9 +248,6 @@
.if-label-build: &if-label-build .if-label-build: &if-label-build
if: '$BOT_LABEL_BUILD || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*build(?:,[^,\n\r]+)*$/i' if: '$BOT_LABEL_BUILD || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*build(?:,[^,\n\r]+)*$/i'
.if-label-build_docs: &if-label-build_docs
if: '$BOT_LABEL_BUILD_DOCS || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*build_docs(?:,[^,\n\r]+)*$/i'
.if-label-component_ut: &if-label-component_ut .if-label-component_ut: &if-label-component_ut
if: '$BOT_LABEL_COMPONENT_UT || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*component_ut(?:,[^,\n\r]+)*$/i' if: '$BOT_LABEL_COMPONENT_UT || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*component_ut(?:,[^,\n\r]+)*$/i'
@ -294,9 +281,6 @@
.if-label-docker: &if-label-docker .if-label-docker: &if-label-docker
if: '$BOT_LABEL_DOCKER || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*docker(?:,[^,\n\r]+)*$/i' if: '$BOT_LABEL_DOCKER || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*docker(?:,[^,\n\r]+)*$/i'
.if-label-docs: &if-label-docs
if: '$BOT_LABEL_DOCS || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*docs(?:,[^,\n\r]+)*$/i'
.if-label-example_test: &if-label-example_test .if-label-example_test: &if-label-example_test
if: '$BOT_LABEL_EXAMPLE_TEST || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*example_test(?:,[^,\n\r]+)*$/i' if: '$BOT_LABEL_EXAMPLE_TEST || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*example_test(?:,[^,\n\r]+)*$/i'
@ -486,29 +470,6 @@
- <<: *if-dev-push - <<: *if-dev-push
changes: *patterns-docker changes: *patterns-docker
.rules:build:docs:
rules:
- <<: *if-protected
- <<: *if-label-build_docs
- <<: *if-label-docs
- <<: *if-dev-push
changes: *patterns-docs
.rules:build:docs-production:
rules:
- <<: *if-protected-no_label
.rules:build:docs:label-only:
rules:
- <<: *if-protected
- <<: *if-label-build_docs
- <<: *if-label-docs
.rules:build:docs:label-only-preview:
rules:
- <<: *if-label-build_docs
- <<: *if-label-docs
.rules:build:example_test-esp32: .rules:build:example_test-esp32:
rules: rules:
- <<: *if-protected - <<: *if-protected

Wyświetl plik

@ -100,6 +100,7 @@ def main():
build_parser = action_parsers.add_parser('build', help='Build documentation') build_parser = action_parsers.add_parser('build', help='Build documentation')
build_parser.add_argument('--check-warnings-only', '-w', action='store_true') build_parser.add_argument('--check-warnings-only', '-w', action='store_true')
build_parser.add_argument('--fast-build', '-f', action='store_true', help='Skips including doxygen generated APIs into the Sphinx build')
action_parsers.add_parser('linkcheck', help='Check links (a current IDF revision should be uploaded to GitHub)') action_parsers.add_parser('linkcheck', help='Check links (a current IDF revision should be uploaded to GitHub)')
@ -124,6 +125,11 @@ def main():
if args.action == 'build' or args.action is None: if args.action == 'build' or args.action is None:
if args.action is None: if args.action is None:
args.check_warnings_only = False args.check_warnings_only = False
args.fast_build = False
if args.fast_build:
os.environ['DOCS_FAST_BUILD'] = 'y'
sys.exit(action_build(args)) sys.exit(action_build(args))
if args.action == 'linkcheck': if args.action == 'linkcheck':

Wyświetl plik

@ -513,6 +513,16 @@ As well as wildcards::
Note that this is a feature intended to simply testing and debugging during writing of documentation. The HTML output won't be perfect, i.e. it will not build a proper index that lists all the documents, and any references to documents that are not built will result in warnings. Note that this is a feature intended to simply testing and debugging during writing of documentation. The HTML output won't be perfect, i.e. it will not build a proper index that lists all the documents, and any references to documents that are not built will result in warnings.
Fast build
""""""""""
Another trick to speed up building is to skip including doxygen generated API documention into the Sphinx build process, skipping this drastically reduces build times.
This can be achieved by adding the fast-build argument::
./build_docs.py build -f
or by setting the environment variable `DOCS_FAST_BUILD`. Note that the the `-f` argument is a subargument to `build` and thus must be listed after `build`.
Building PDF Building PDF
"""""""""""" """"""""""""

Wyświetl plik

@ -73,6 +73,8 @@ def convert_api_xml_to_inc(app, doxyfiles):
xml_directory_path = '{}/xml'.format(build_dir) xml_directory_path = '{}/xml'.format(build_dir)
inc_directory_path = '{}/inc'.format(build_dir) inc_directory_path = '{}/inc'.format(build_dir)
fast_build = os.environ.get('DOCS_FAST_BUILD', None)
if not os.path.isdir(xml_directory_path): if not os.path.isdir(xml_directory_path):
raise RuntimeError('Directory {} does not exist!'.format(xml_directory_path)) raise RuntimeError('Directory {} does not exist!'.format(xml_directory_path))
@ -96,6 +98,13 @@ def convert_api_xml_to_inc(app, doxyfiles):
with open(inc_file_path, 'w', encoding='utf-8') as inc_file: with open(inc_file_path, 'w', encoding='utf-8') as inc_file:
inc_file.write(rst_output) inc_file.write(rst_output)
# For fast builds we wipe the doxygen api documention.
# Parsing this output during the sphinx build process is
# what takes 95% of the build time
if fast_build:
with open(inc_file_path, 'w', encoding='utf-8') as inc_file:
inc_file.write('')
def get_doxyfile_input_paths(app, doxyfile_path): def get_doxyfile_input_paths(app, doxyfile_path):
"""Get contents of Doxyfile's INPUT statement. """Get contents of Doxyfile's INPUT statement.