| .. Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| .. http://www.apache.org/licenses/LICENSE-2.0 |
| |
| .. Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| |
| Building documentation |
| ====================== |
| |
| Airflow uses Sphinx to build the documentation. As of Airflow 3 when we split |
| the distributions into multiple packages, and moved the documentation to inside those |
| distribution building the documentation is way easier than it was on Airflow 2 and you |
| can usually iterate on documentation way faster, including automatically refreshing the |
| documentation in your browser when using ``sphinx-autobuild``. |
| |
| The current distributions we have that have sphinx-buildable documentation are: |
| |
| Documentation in separate distributions: |
| |
| * ``airflow-core/docs`` - documentation for Airflow Core |
| * ``providers/**/docs`` - documentation for Providers |
| * ``chart/docs`` - documentation for Helm Chart |
| * ``task-sdk/docs`` - documentation for Task SDK (new format not yet published) |
| * ``airflow-ctl/docs`` - documentation for Airflow CLI (future) |
| |
| Documentation for general overview and summaries not connected with any specific distribution: |
| |
| * ``docker-stack-docs`` - documentation for Docker Stack' |
| * ``providers-summary-docs`` - documentation for provider summary page |
| |
| Each of the distributions have a ``conf.py`` file in the root of the documentation and there |
| are various configuration parameters for sphinx configured in the ``conf.py`` files. A number of common |
| functions in those ``conf.py`` files are imported from ``deve-common`` distribution, from ``doc`` package, |
| you can also find ``sphinx_ext`` folder there that keeps extensions used during our documentation build. |
| |
| Building documentation with uv in local venv |
| -------------------------------------------- |
| |
| Prerequisites |
| ............. |
| |
| * `uv <https://docs.astral.sh/uv/>`_ as mandatory tool. |
| |
| First of all. you need to have ``uv`` installed. You can very easily build the documentation |
| in your local virtualenv using ``uv`` command. Because some dependencies are not easy to be installed |
| on all OS-es, the ``docs`` group of dependencies is not installed by default when you run |
| ``uv sync`` or ``uv run`` - so you need to pass ``--group docs`` when you want to run command locally |
| that installs the documentation dependencies. |
| |
| * Python 3.11 |
| |
| .. warning:: |
| |
| At least until we manage to workaround it you need to use at most Python 3.11 to build documentation for |
| some packages (``samba`` and ``google``). |
| |
| When you try to build docs locally (at least on MacOS) with Python 3.12, you get |
| ``TypeError: __type_params__ must be set to a tuple`` error related |
| to `This CPython issue <https://github.com/python/cpython/issues/119011>`_ |
| |
| |
| You should run ``uv python pin 3.11`` to pin to Python 3.11 in order to build documentation. |
| |
| .. code-block:: |
| |
| uv python pin 3.11 |
| |
| * Enchant system dependency |
| |
| .. warning:: |
| |
| There is a prerequisite needed to build the documentation locally. Airflow's Sphinx configuration |
| depends on ``enchant`` C-library that needs to be installed and configured to be used by ``pyenchant`` |
| Python distribution package. You can install it as explained in the |
| `pyenchant documentation <https://pyenchant.github.io/pyenchant/install.html>`__. Usually you use your |
| package manager on Linux or ``brew`` on ``MacOS``. Sometimes you might also need to configure it |
| so that ``pyenchant`` can find the dictionary files. You will get error like: |
| |
| .. code-block:: txt |
| |
| Could not import extension sphinxcontrib.spelling (exception: The 'enchant' C library was not |
| found and maybe needs to be installed |
| |
| The easiest way is to find where your enchant library is (usually libenchant-2.dylib) |
| and set the ``PYENCHANT_LIBRARY_PATH`` environment variable to that path in your ``.zshrc`` or ``.bashrc`` |
| - depending which terminal you use and restart your terminal. For example on MacOS, |
| ``brew install enchant`` or ``brew reinstall enchant`` will print the path where enchant is |
| installed and usually the library is in the ``lib`` subfolder of it. An example of line added |
| to one of the ``.rc`` files: |
| |
| .. code-block:: bash |
| |
| export PYENCHANT_LIBRARY_PATH=/opt/homebrew/Cellar/enchant/2.8.2/lib/libenchant-2.dylib |
| |
| Also for some of the providers you might have trouble installing dependencies. The ``uv run`` |
| command will automatically install the needed dependencies for you but some of them might need extra |
| system dependencies. You can always revert to ``breeze`` way of building the documentation in this |
| case (see below) in case you have problems with ``uv run`` command not being able to install |
| the dependencies. |
| |
| Once you have ``enchant`` installed and configured, you can build the documentation very easily. |
| |
| |
| Building the documentation |
| .......................... |
| |
| In Airflow 3 the documentation is placed closely to where source code is placed (in most distribution |
| packages it is in the ``doc`` subfolder of a distribution you want to build the documentation for. |
| Some distributions do not have ``docs`` subfolder - when they are ``doc-only``. The ``build-doc`` script |
| is installed automatically from ``devel-common`` distribution and available to run using ``uv run`` |
| command (or directly ``build-docs`` inside the ``breeze`` container). This script will automatically |
| detect which distribution you are in and build the documentation for it. |
| |
| .. note:: |
| |
| You can also run all those commands directly (without ``uv run --group docs``) inside ``breeze`` |
| container, because there all dependencies are already installed and there is no need to |
| sync dependencies. |
| |
| .. code-block:: bash |
| |
| cd YOUR_DISTRIBUTION_FOLDER |
| uv run --group docs build-docs |
| |
| Example: |
| |
| .. code-block:: bash |
| |
| cd providers/fab |
| uv run --group docs build-docs |
| |
| or |
| |
| .. code-block:: bash |
| |
| cd airflow-core |
| uv run --group docs build-docs |
| |
| When you iterate on the documentation rather than wait for a complete build to pass you might want to |
| run a documentation server that will expose the built documentation and enable auto-refreshing the |
| documentation in your browser (including refreshing the browser when you change the documentation files): |
| |
| .. code-block:: bash |
| |
| cd YOUR_DISTRIBUTION_FOLDER |
| uv run --group docs build-docs --autobuild |
| |
| Example: |
| |
| .. code-block:: bash |
| |
| cd providers/fab |
| uv run --group docs build-docs --autobuild |
| |
| Building docs for multiple distributions at the same time |
| ......................................................... |
| |
| Sometimes - when you have references between distributions and you make changes in both distributions. |
| The common problem when you build such documentation might be when you want to - at the same time - modify |
| documentation for several distributions and refer to the new documentation from the other distribution and |
| that might not work because the documentation for the other distribution is not built yet. |
| |
| If you just build one distribution, the links to the other distribution will not work. And the bad thing |
| might be that you have circular references and the links might be needed in both directions. |
| |
| In order to fix that problem you should run the same ``build-docs`` command and specify the |
| packages you want to build together. The ``build-docs`` command will attempt to build the docs up to |
| three times in order to make sure that references between the packages are resolved. |
| |
| Note that this will not work with ``--autobuild`` option because |
| the ``--autobuild`` option will only build the documentation for single distribution at a time. You will |
| see an error if you try to use ``--autobuild`` with multiple distributions. But once the "other" package |
| is build, you will be able ot use ``--autobuild`` for the other package (until you use ``--clean-build`` |
| option). |
| |
| You can run this command in the folder of the package you want to build - if the package needs another |
| package, usually local virtualenv created by ``uv`` will include sources for the other package. But in case |
| you refer to a package that has no direct dependency, some dependencies might not be installed, so you |
| might need to run it from the root of Airflow repository - when you run ``uv run`` there - all dependencies |
| for all packages are installed and available. |
| |
| .. code-block:: bash |
| cd YOUR_DISTRIBUTION_FOLDER |
| uv run --group docs build-docs PACKAGE_1 PACKAGE_2 |
| |
| Example of building both amazon and google provider docs from amazon provider dir: |
| |
| .. code-block:: bash |
| |
| cd providers/amazon |
| uv run --group docs build-docs amazon google |
| |
| Building documentation for all distributions |
| ............................................ |
| |
| If you want to build all documentation at once, you can run the command from the root of the Airflow |
| repository and by default it will build all documentation in parallel. |
| |
| .. code-block:: bash |
| |
| cd YOUR_ROOT_OF_AIRFLOW_REPO |
| uv run --group docs build-docs |
| |
| Complete command has the following parameters: |
| |
| .. image:: images/build-docs.png |
| :align: center |
| :alt: Available options of the ``build-docs`` command |
| |
| Building documentation in Breeze |
| -------------------------------- |
| |
| This used to be the default way of building documentation - but this method requires things to start |
| and run in Docker containers and is a bit slower than using ``uv`` - especially when iterating with changes. |
| and especially comparing it to sphinx-autobuild. However, the ``breeze`` CI container is guaranteed to have |
| all the dependencies installed that should allow to build all documentation for all distributions we have |
| and it is independent on the host / local environment including the OS you are using. You can always |
| fall-back to this method if - for some reason - your local documentation building is failing. |
| |
| Basic command is ``breeze build-docs`` which except ``--auto-build`` has very similar options |
| as the ``uv run build-docs`` command.. You can also specify a number of options like selecting which |
| distribution packages you want to build and which kind of build to run (``--doc-only`` od ``--spelling-only``) |
| or request to ``--clean`` the build directory before building the documentation. |
| |
| For example: |
| |
| .. code-block:: bash |
| |
| breeze build-docs --doc-only --clean fab |
| |
| Will build ``fab`` provider documentation and clean inventories and other build artifacts before. |
| |
| You can also use ``breeze build-docs --help`` to see available options and head to |
| `breeze documentation <../dev/breeze/doc/03_developer_tasks.rst>`__ to learn more about the ``breeze`` |
| command and it's options. |
| |
| Hints and issues when building documentation |
| ============================================ |
| |
| We are using Sphinx to build our documentation, and while powerful, Sphinx is known from speaking riddles. |
| Sometimes the errors printed by Sphinx build commands are a bit cryptic and do not tell you exactly how to |
| solve them. |
| |
| Here are typical issues and guidelines on how to solve them: |
| |
| WARNING: document isn't included in any toctree |
| ----------------------------------------------- |
| |
| This is by far most common and most cryptic error printed by Sphinx. What it really means is that the |
| document that this error refers to is not linked from anywhere else in any of the other documents. By |
| default all the documents that we generate, should be somehow reachable by the user from the main index, but |
| apparently there is some document that is not reachable, so no other document refer to it |
| either via index and Sphinx complains about this. |
| |
| There might be several reasons for this: |
| |
| * the document is referred to in some other documents with ``:ref:`` or ``:doc:`` but there is a typo and |
| the name is wrong. Or the reference does not use properly formatted syntax for those directives. |
| |
| * the document should be referred by some ``:toctree:`` directive that walks through some of the sub-folders |
| of regular folders or the ``_api`` folders automatically generated by the ``autoapi`` extension. |
| For example the below ``toctree`` will build index with references to all the files that are |
| direct sub-directories of ``operators/airbyte`` and ``connections`` folders. |
| |
| .. code-block:: |
| |
| .. toctree:: |
| :hidden: |
| :maxdepth: 1 |
| :caption: Guides |
| |
| Operators <operators/airbyte> |
| Connection types <connections> |
| |
| Including examples and other files |
| ---------------------------------- |
| |
| When you include examples using ``.. exampleinclude::`` or ``.. include::`` directive, you should use relative |
| reference only to the files that are in the same distribution in one of the subfolders - when you know that |
| this file is relative to your documentation file. For example: |
| |
| .. code-block:: |
| |
| ``.. include:: ../_partials/prerequisite_tasks.rst`` |
| |
| |
| This one will include ``prerequisite_tasks.rst`` file from ``_partials`` subdirectory of the parent folder of |
| the folder where the file you include it from is. |
| |
| However, when you need to refer to files outside of your "docs" tree, it is better to start your reference |
| with ``/``. Such reference start from the "top" of your documentation tree in your distribution (usually |
| ``docs`` folder in your distribution. This way, when we move the distributions around, we should be able |
| to easily move the whole distribution around by knowing how the distribution moved relatively to the included |
| file. For example: |
| |
| .. code-block:: |
| |
| ``.. include:: /../../../devel-common/src/sphinx_exts/includes/sections-and-options.rst`` |