Wikis development guide

Introduced in GitLab 13.5.

Overview

The wiki functionality in GitLab is based on Gollum 4.x. It’s used in Gitaly’s Ruby service, and accessed from the Rails app through Gitaly RPC calls.

Wikis use Git repositories as storage backend, and can be accessed through:

Introduced in GitLab 13.5, wikis are also available for groups, in addition to projects.

Involved Gems

Some notable gems that are used for wikis are:

ComponentDescriptionGem nameGitLab projectUpstream project
gitlabMarkup renderer, depends on various other gemsgitlab-markupgitlab-org/gitlab-markupgithub/markup
gitaly-rubyMain Gollum librarygitlab-gollum-libgitlab-org/gollum-libgollum/gollum-lib
 Gollum Git adapter for Ruggedgitlab-gollum-rugged_adaptergitlab-org/gitlab-gollum-rugged_adaptergollum/rugged_adapter
 Rugged (also used in Gitaly itself)rugged-libgit2/rugged

Notes on Gollum

We only use Gollum as a storage abstraction layer, to handle the mapping between wiki page slugs and files in the repository.

When rendering wiki pages, we don’t use Gollum at all and instead go through a custom Banzai pipeline. This adds some wiki-specific markup, such as Gollum’s [[link]] syntax.

Because we do not make use of most of Gollum’s features, we plan to move away from it entirely at some point. See this epic for reference.

Model classes

The Wiki class is the main abstraction around a wiki repository, it needs to be initialized with a container which can be either a Project or Group:

classDiagram Wiki --> ProjectWiki Wiki --> GroupWiki class Wiki { #container #repository } class ProjectWiki { #project → #container } class GroupWiki { #group → #container }

Some models wrap similar classes from Gitaly and Gollum:

Rails ModelGitaly ClassGollum
WikiGitlab::Git::WikiGollum::Wiki
WikiPage Gitlab::Git::WikiPage, Gitlab::Git::WikiPageVersion Gollum::Page
 Gitlab::Git::WikiFileGollum::File

Only some data is persisted in the database:

ModelDescription
WikiPage::MetaMetadata for wiki pages
WikiPage::SlugCurrent and previous slugs of wiki pages
ProjectRepositoryGitaly storage data for project wikis
GroupWikiRepositoryGitaly storage data for group wikis

Attachments

The web UI uploads attachments through the REST API, which stores the files as commits in the wiki repository.