Configuration of the documentation
Once you have installed files using the script setup.sh
, and before starting
to render your documentation you will need some configuration to do:
Base mkdocs configuration
Normally, most configuration of mkdocs
is done in mkdocs.yml
file, but to be
able to use a templated mkdocs.yml
, most of the configuration is handled
differently.
Now, it is the file templates/docs/_data/plugins.py
which will handle the
configuration. This file is automatically called with the
mkdocs-macros-plugins
. So, if you want to overload
mkdocs configuration value, this is done through the file
docs/_data/vars.yaml
. An example of such content is provided in
docs/_data/template/vars.tpl.yaml
.
# Assuming you are at the root of the folder where you installed the documentation
cp docs/_data/template/vars.tpl.yaml docs/_data/vars.yaml
# Now edit the content of the copied file with your favorite editor
vim docs/_data/vars.yaml
The file is heavily commented allowing you to know what you are updating. Note
that this part is optional, as most of the mkdocs.yml
configuration is
automatically set based on the git repo information (git remote origin) and
repo variables.
Repo variables
Ensure a git remote origin exists
Before continuing, your documentation MUST be a git repository with a
remote origin. Indeed, the script docs/_data/plugins.py
will get
remote information to have the repo_slug
to know which file in
docs/_data/
hold the repository information.
So assuming that your remote origin is
https://mygit.tld/namespace/my_repo_slug.git
(this work also for ssh remote).
You will need to copy the template provided in docs/_data/template/repo.tpl.yaml
in docs/_data/my_repo_slug
and then update its content:
# Assuming you are at the root of the repo holding the documentation
cp docs/_data/template/repo.tpl.yaml docs/_data/my_repo_slug.yaml
# Then edit the content of the file with your favorite editor
vim docs/_data/my_repo_slug.yaml
You will need to update some keys in the repo file which will be used to
automatically set mkdocs.yml
configuration if not set in
docs/_data/vars.yaml
.
For instance key my_repo_slug['name']
will be used to dynamically set
site_name
key of the mkdocs.yml
.
Below is an example of such file:
# Repo information
# ===========================================================================
# First key MUST be the "slug" of the repo based on the remote, i.e. if remote
# is git@git.domain.tld:username/repo_name.git, then the key will be
# `repo_name`.
my_repo_slug:
# An explicit name for the repo that will be shown on the documentation
# page.
name: "The Best Repo Name in the World"
# (OPTIONATL) An extension of the explicit name with the namespace in which
# the repo is. For instance, using above remote, the entry will be
# `Username / Repo Name`.
# This entry is not used in the configuration of mkdocs.
#git_name_with_namespace: "Namespace / My Repo Name"
# The complete path of the repo from the git_platform["url"]. For instance,
# using, above remote, the entry will be `username/repo_name.git`
git_slug_with_namespace: "namespace/my_repo_slug.git"
# If the repo documentation is part of a bigger repo, then provide the
# path of the rendered documentation. If the documentation is not part of
# another repo, leave it empty.
#url_slug_with_namespace: "subpath_for_url_renderin/repo_slug"
# (OPTIONAL) Path, relative to `docs_dir` mkdocs config, to the logo of the
# repo. If not specified, path will automatically be set to
# `assets/img/meta/repo_name_logo.png`
#logo: "assets/img/meta/repo_name_logo.png"
# Description of the repo, will be used to setup the mkdocs description.
desc: >-
An explicit description to explain what my repo do. Can be a multiline
description with **markdown** support such as
[link](https://url.domain.tld) and more.
# (OPTIONAL) If you plan to use `mkdocstring` plugins to render python
# source code, you will need to provide the path where your source files
# are relative to the root of the repo.
#src_path:
# - "src"
# List of informations about the main maintainers that will be automatically
# added to the license file in `docs/about/license.md`
maintainers:
- name: "Firstname Lastname"
mail: "mail@domain.tld"
Subrepo Variables
If you are working on a big project, with multiple subrepo you might have or want to split the documentation such as each project hold its own but render all of them from a master repository.
An example could be an ansible collection which can be composed of a master repository holding specific files and folders holdings things like roles, etc. In this case, you might want to keep roles in other git repository (like git submodules) and each of the role holds its own documentation. But you want the final rendered documentation to include these repos.
This can be done via a file describing such subrepo, i.e. the file
docs/_data/subrepo.yaml
. To do so, copy the template provided in
docs/_data/template/subrepo.tpl.yml
.
# Assuming you are at the root of the folder where you installed the documentation
cp docs/_data/template/subrepo.tpl.yaml docs/_data/subrepo.yaml
# Edit the content of the file with your favorite editor
vim docs/_data/subrepo.yaml
Below is an example of file docs/_data/subrepo.yml
for an ansible collection
which roles are in folder roles
at the root of the repo and such that roles
documentation are include in the final documentation.
subrepo:
# Folder where there are subrepo
roles:
# Nav entry in mkdocs.yml from where the roles documentations will be
# include. If the entry does not exists, it will be automatically added at
# the end of the `nav`
nav_entry: "Roles"
# Specify that the role will be include to the final documentation
internal:
# Provide a list of repo information
- name: role_name_1
nav_entry: My Role 1
# You can provided both https or ssh url, but https is prefered for CI
# to better work
git_url: https://gitdomain.tld/namespace/subnamespace/my_role_name_1
- name: role_name_2
nav_entry: My Role 2
# You can provided both https or ssh url, but https is prefered for CI
# to better work
git_url: https://gitdomain.tld/namespace/subnamespace/my_role_name_2
If you want to add link to external documentation, i.e. a link to the home page
will be included in the nav
of the main repo but their own nav
will not be
included, this can also be done with the file docs/_data/subrepo.yaml
.
An example could be a main repo simply providing entry point to other repos,
such as repo holding base content of
docs.romaindeville.fr. Below is an example of the
content of such subrepo.yaml
file:
subrepo:
# Folder where there are subrepo
programs:
# Nav entry in mkdocs.yml from where the roles documentations will be
# include. If the entry does not exists, it will be automatically added at
# the end of the `nav`
nav_entry: "My Programs"
# Specify repos which documentation will be external
external:
# Provide a list of repo information
- name: my_first_repo
nav_entry: Example of First External repo
# You can provided both https or ssh url, but https is prefered for CI
# to better work
git_url: https://gitdomain.tld/namespace/subnamespace/my_first_repo.git
# Link to the external documentation, can be relative to the root of
#the documentation of a full https link.
online_url: /relative/to/root/documentation/
- name: my_second_repo
nav_entry: Example of Second External repo
# You can provided both https or ssh url, but https is prefered for CI
# to better work
git_url: https://gitdomain.tld/namespace/subnamespace/my_second_repo.git
# Link to the external documentation, can be relative to the root of
#the documentation of a full https link.
online_url: https://domain.tld/full/external/link/
Of course, both internal
and external
can be used as shown below (click to
reveal).
Example
subrepo:
# Folder where there are subrepo
roles:
# Nav entry in mkdocs.yml from where the roles documentations will be
# include. If the entry does not exists, it will be automatically added at
# the end of the `nav`
nav_entry: "Roles"
# Specify that the role will be include to the final documentation
internal:
# Provide a list of repo information
- name: role_name_1
nav_entry: My Role 1
# You can provided both https or ssh url, but https is prefered for CI
# to better work
git_url: https://gitdomain.tld/namespace/subnamespace/my_role_name_1
- name: role_name_2
nav_entry: My Role 2
# You can provided both https or ssh url, but https is prefered for CI
# to better work
# Specify repos which documentation will be external
external:
# Provide a list of repo information
- name: my_first_role
nav_entry: Example of First External Role
# You can provided both https or ssh url, but https is prefered for CI
# to better work
git_url: https://gitdomain.tld/namespace/subnamespace/my_first_role.git
# Link to the external documentation, can be relative to the root of
#the documentation of a full https link.
online_url: /relative/to/root/documentation/
programs:
nav_entry: "My Programs"
# Specify repos which documentation will be external
external:
# Provide a list of repo information
- name: my_first_repo
nav_entry: Example of First External repo
# You can provided both https or ssh url, but https is prefered for CI
# to better work
git_url: https://gitdomain.tld/namespace/subnamespace/my_first_repo.git
# Link to the external documentation, can be relative to the root of
#the documentation of a full https link.
online_url: /relative/to/root/documentation/
- name: my_second_repo
nav_entry: Example of Second External repo
# You can provided both https or ssh url, but https is prefered for CI
# to better work
git_url: https://gitdomain.tld/namespace/subnamespace/my_second_repo.git
# Link to the external documentation, can be relative to the root of
#the documentation of a full https link.
online_url: https://domain.tld/full/external/link/
Thus, when rendering the documentation, the script docs/_data/plugins.py
will
check if folders roles/{role_name_1,role_name_2}
exists. If they exists and
are git repo, script will pull them to get the last version. If they do not
exists, the will be cloned.
Finally, the script docs/_data/plugins.py
will update the nav
of the
documentation with these repos and will load file docs/_data/repo.yaml
of each repo allowing to access to the repo informations.
Extra variables
All of the above files will create variables which can be used in your
documentation using mkdocs-macros-plugin. If you want to
add extra variables which are not in vars.yaml
, nor repo.yaml
, neither in
subrepo.yaml
, you can do it by settings them in a file
docs/_data/extra.yaml
. Indeed, previously mentionned filed will be checked
against a schema (provided in docs/_data/{repo,subrepo,vars}.schema.yaml
),
thus do not allow extra variables to ensure stability of script
docs/_data/plugins.py
while file docs/_data/extra.yaml
is loaded as it is
without schema control.
Variable usage
Finally, as describe above some variables are used for the configuration to render documentation. But they can also be use in your markdown documentation files using jinja template. For instance, below is a basic content of a markdown file showing the name of the main repo, its description and a list of roles and programs with their description.
<!-- Print the name of the repo -->
# {{ my_repo_slug.name }}
<!-- Print the desc of the repo -->
{{ my_repo_slug.desc }}
<!-- Print a section and a table with repo information from subrepo -->
{%- for i_key in subrepo %}
<!-- Print the title of the section from `nav_entry` in subrepo -->
# {{ subrepo[i_key].nav_entry }}
<!-- Start the table with repo information -->
| Name | Description |
| ---- | ----------- |
{%- for i_repo_type in subrepo[i_key] %}
{%- if i_repo_type in ("external","internal") %}
{%- for i_repo in subrepo[i_key][i_repo_type] %}
{# Get the content of the dictionary #}
{%- set curr_repo = subs(i_repo.name) %}
| {{ curr_repo.name }} | {{ curr_repo.desc }}
{%- endfor %}
{%- endif %}
{%- endfor %}
{%- endfor %}
My Main Repo Name
Description of my Main Repo
Roles
Name | Description |
---|---|
Role Name 1 | Description of the Role Name 1 |
Role Name 2 | Description of the Role Name 2 |
My First Role | Description of My First Role |
My Programs
Name | Description |
---|---|
My First Repo | Description of My First Repo |
My Second Repo | Description of My Second Repo |
You are now ready to write your documentation. Juste remember to not update content between markdown tags.
Moreover, later the main template may get upgraded (like adding new feature or providing new template content), to automatically apply this upgrade to your documentation see Upgrade.
And finally, you may want to provide your own template, with custom CSS for instance, or pre-fill index documentation page, to do so, set Setup Your Own Template