From 40423c3bdc6dcad3cea357760865e11f9ce62f27 Mon Sep 17 00:00:00 2001 From: Moul <moul@moul.re> Date: Tue, 17 Dec 2024 16:23:58 +0100 Subject: [PATCH] Document documentation contribution (#433) --- docs/documentation.md | 63 ++++++++++++++++++++++++ docs/images/mkdocs-material-favicon.png | Bin 0 -> 8365 bytes 2 files changed, 63 insertions(+) create mode 100644 docs/documentation.md create mode 100644 docs/images/mkdocs-material-favicon.png diff --git a/docs/documentation.md b/docs/documentation.md new file mode 100644 index 00000000..15734ccd --- /dev/null +++ b/docs/documentation.md @@ -0,0 +1,63 @@ +# Documentation contribution + +<center> + +</center> + +The project documentation website is based on [MkDocs framework](https://www.mkdocs.org/) and on following theme and plugins: + +- [Mkdocs Material](https://squidfunk.github.io/mkdocs-material/): theme and framework +- [Mike](https://github.com/jimporter/mike): to publish multiple versions +- [MkDocs Coverage](https://github.com/pawamoy/mkdocs-coverage): to integrate coverage report iframe into MkDocs +- [MkDocs GitLab plugin](https://pypi.org/project/mkdocs-gitlab-plugin/): to display links to GitLab references items: used in the changelog page + +Please refer to their respective documentation. + +## Set up + +Install the optional `docs` group: + +``` +poetry install --with docs +``` + +## MkDocs + +Run the website in development mode: + +``` +poetry run mkdocs deploy +``` + +Open [localhost:8000](http://localhost:8000/) in your web browser. + +The preview will be live-updated once you change the documentation. + +## Mike + +Running following command will serve what’s on `pages` branch: + +``` +poetry run mike serve +``` + +This preview won’t be live-updated with your latest changes as it would be with `mkdocs serve`. This is because Mike simply serves what’s built on `pages` branch. + +## Changing the content + +Into `docs` folder, you can find the Markdown source files which can be edited. +`mkdocs.yml` file lists the website structure. + +## Deployment workflow + +Only on `main` branch, a `website` job will be triggered containing the documentation build for a specific version. It creates a commit which is added to `pages` branch with `poetry run mike deploy $version` command. +Then the commit is pushed on the git repository remote from the job with an access token. +The coverage report is integrated in the website build. The artefact is retrieved from the coverage job with `needs:` keyword. + +From `pages` branch, an other pipeline is triggered, publishing the documentation website to [silkaj.duniter.org](https://silkaj.duniter.org) for all versions via GitLab Pages. + +### Access token + +A `git push` is performed from the job to the remote repository via the authorisation provided via an access token set in CI/CD variables. +The access token has to be renew every year, since this is the maximum lifespan we can set for an access token at its creation. +The access token has to be created on a project basis with `repository_write` checked and with Developer role. diff --git a/docs/images/mkdocs-material-favicon.png b/docs/images/mkdocs-material-favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..6771c11c78523f71e951b1a35f944723fcfa4640 GIT binary patch literal 8365 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 aryPom7kDjgulMUe0|q*#+KrmdQU3#By#spy literal 0 HcmV?d00001 -- GitLab