{
    "componentChunkName": "component---src-templates-doc-tsx",
    "path": "/docs/3.9.x/en/development/architecture-overview/",
    "result": {"data":{"navigation":{"nodes":[{"section":"Getting started","entries":[{"frontmatter":{"title":"Installation","subtitle":"Installation of scm-manager","partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/installation/"}},{"frontmatter":{"title":"First Startup","subtitle":"Administration User Creation","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/first-startup/"}},{"frontmatter":{"title":"Migrate from v1 to v3","subtitle":"How to use the Migration-Wizard","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/migrate-scm-manager-from-v1/"}},{"frontmatter":{"title":"Migrate from v2 to v3","subtitle":"Changes in the configuration","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/migrate-scm-manager-from-v2/"}},{"frontmatter":{"title":"Import existing repositories","subtitle":"How to import existing repositories into SCM-Manager","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/import/"}},{"frontmatter":{"title":"Frequently Asked Questions","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/faq/"}},{"frontmatter":{"title":"Known Issues","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/known-issues/"}}]},{"section":"User-oriented","entries":[{"frontmatter":{"title":"Repository","subtitle":null,"partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/user/repo/"}},{"frontmatter":{"title":"User","subtitle":null,"partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/user/user/"}},{"frontmatter":{"title":"Groups","subtitle":null,"partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/user/group/"}},{"frontmatter":{"title":"Administration","subtitle":null,"partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/user/admin/"}},{"frontmatter":{"title":"Profile","subtitle":null,"partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/user/profile/"}},{"frontmatter":{"title":"Notifications","subtitle":null,"partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/user/notification/"}},{"frontmatter":{"title":"CLI Client","subtitle":null,"partiallyActive":true},"fields":{"slug":"/docs/3.9.x/en/user/cli/"}},{"frontmatter":{"title":"Shortcuts","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/user/shortcuts/"}}]},{"section":"Administration","entries":[{"frontmatter":{"title":"Base Directory","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/administration/basedirectory/"}},{"frontmatter":{"title":"Logging","subtitle":"Configuration and locations of SCM-Manager logging","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/administration/logging/"}},{"frontmatter":{"title":"SCM-Server Configuration","subtitle":"Various configuration options for the SCM-Server","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/administration/scm-server/"}},{"frontmatter":{"title":"Reverse Proxy","subtitle":"How to use SCM-Manager with common reverse proxies","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/administration/reverse-proxies/"}},{"frontmatter":{"title":"Caching for Working Directories","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/administration/workdir_caching/"}}]},{"section":"Development","entries":[{"frontmatter":{"title":"Intellij IDEA Configuration","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/intellij-idea-configuration/"}},{"frontmatter":{"title":"Building SCM-Manager from Source","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/build-from-source/"}},{"frontmatter":{"title":"Architecture overview","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/architecture-overview/"}},{"frontmatter":{"title":"Common pitfall occurred while developing the SCM V2","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/ui-common-pitfall/"}},{"frontmatter":{"title":"Permission Concept","subtitle":"Fine-grained permission for SCM-Manager v2","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/permission-concept/"}},{"frontmatter":{"title":"Decision Table","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/decision-table/"}},{"frontmatter":{"title":"Error Handling","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/error-handling/"}},{"frontmatter":{"title":"Styleguide","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/styleguide/"}},{"frontmatter":{"title":"Testing Guide","subtitle":"Howto write tests for SCM-Manager","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/testing-guide/"}},{"frontmatter":{"title":"Integration Tests","subtitle":"How to run integration tests","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/integration-tests/"}},{"frontmatter":{"title":"UI-Extensions","subtitle":"How to extend the SCM-Manager UI with plugins","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/ui-extensions/"}},{"frontmatter":{"title":"I18n","subtitle":"Howto do internationalization","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/i18n/"}},{"frontmatter":{"title":"Building Forms","subtitle":"Howto build forms for SCM-Manager","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/building-forms/"}},{"frontmatter":{"title":"Javadoc","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/javadoc/"}},{"frontmatter":{"title":"CLI Guidelines","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/cli-guideline/"}},{"frontmatter":{"title":"Definition of Done","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/definition-of-done/"}},{"frontmatter":{"title":"DOD for UI development","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/ui-dod/"}}]},{"section":"Plugin Development","entries":[{"frontmatter":{"title":"Create a plugin","subtitle":"Create a new SCM-Manager plugin","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/plugins/create/"}},{"frontmatter":{"title":"Migrate a v1 plugin","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/plugins/migrate-plugin-from-v1/"}},{"frontmatter":{"title":"Extension Points","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/plugins/extension-points/"}},{"frontmatter":{"title":"i18n for Plugins","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/plugins/i18n-for-plugins/"}},{"frontmatter":{"title":"Plugin Descriptor","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/plugins/plugin-descriptor/"}},{"frontmatter":{"title":"SCM-Manager v2 Plugin Development","subtitle":null,"partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/plugins/plugin-development/"}},{"frontmatter":{"title":"Publish","subtitle":"Publish your Plugin","partiallyActive":null},"fields":{"slug":"/docs/3.9.x/en/development/plugins/publish/"}}]}]},"versions":{"group":[{"fieldValue":"1.0.x"},{"fieldValue":"1.x"},{"fieldValue":"2.0.x"},{"fieldValue":"2.1.x"},{"fieldValue":"2.10.x"},{"fieldValue":"2.11.x"},{"fieldValue":"2.12.x"},{"fieldValue":"2.13.x"},{"fieldValue":"2.14.x"},{"fieldValue":"2.15.x"},{"fieldValue":"2.16.x"},{"fieldValue":"2.17.x"},{"fieldValue":"2.18.x"},{"fieldValue":"2.19.x"},{"fieldValue":"2.2.x"},{"fieldValue":"2.20.x"},{"fieldValue":"2.21.x"},{"fieldValue":"2.22.x"},{"fieldValue":"2.23.x"},{"fieldValue":"2.24.x"},{"fieldValue":"2.25.x"},{"fieldValue":"2.26.x"},{"fieldValue":"2.27.x"},{"fieldValue":"2.28.x"},{"fieldValue":"2.29.x"},{"fieldValue":"2.3.x"},{"fieldValue":"2.30.x"},{"fieldValue":"2.31.x"},{"fieldValue":"2.32.x"},{"fieldValue":"2.33.x"},{"fieldValue":"2.34.x"},{"fieldValue":"2.35.x"},{"fieldValue":"2.36.x"},{"fieldValue":"2.37.x"},{"fieldValue":"2.38.x"},{"fieldValue":"2.39.x"},{"fieldValue":"2.4.x"},{"fieldValue":"2.40.x"},{"fieldValue":"2.41.x"},{"fieldValue":"2.42.x"},{"fieldValue":"2.43.x"},{"fieldValue":"2.44.x"},{"fieldValue":"2.45.x"},{"fieldValue":"2.46.x"},{"fieldValue":"2.47.x"},{"fieldValue":"2.48.x"},{"fieldValue":"2.5.x"},{"fieldValue":"2.6.x"},{"fieldValue":"2.7.x"},{"fieldValue":"2.8.x"},{"fieldValue":"2.9.x"},{"fieldValue":"3.0.x"},{"fieldValue":"3.1.x"},{"fieldValue":"3.10.x"},{"fieldValue":"3.11.x"},{"fieldValue":"3.2.x"},{"fieldValue":"3.3.x"},{"fieldValue":"3.4.x"},{"fieldValue":"3.5.x"},{"fieldValue":"3.6.x"},{"fieldValue":"3.7.x"},{"fieldValue":"3.8.x"},{"fieldValue":"3.9.x"}]},"languages":{"group":[{"fieldValue":"de"},{"fieldValue":"en"}]},"markdownRemark":{"html":"<h2 id=\"introduction\" style=\"position:relative;\"><a href=\"#introduction\" aria-label=\"introduction permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Introduction</h2>\n<p>This document does not describe the modules of SCM-Manager nor does it explain the technologies that are used.\nIt simply shows which application layers exist in the SCM-Manager and how they are connected.</p>\n<h2 id=\"technology-stack\" style=\"position:relative;\"><a href=\"#technology-stack\" aria-label=\"technology stack permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Technology stack</h2>\n<h3 id=\"overview\" style=\"position:relative;\"><a href=\"#overview\" aria-label=\"overview permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Overview</h3>\n<p>SCM-Manager is mainly written in Java and Typescript. In the chart below the core technologies are listed.\nSelf-written libraries like \"spotter\", our annotation processor or ui-components are not included in this overview.\nThey are kinda part of the product instead of own technologies/libraries.</p>\n<p><img src=\"https://www.plantuml.com/plantuml/svg/XLFBKkCm4BpdAro-k_ONI4ms8KiWPGauJ-J1KLdMUFN8HaNnxoWfIvZJdZplRisqxwm3u_oW2bRlgprewD0K7CL9aw8k5Co1w1SB9vt2_zIyasfZeZmOwWmCWzHTyGYwyx7UbX-B-D6kQ124csmUHhJ2o345Td26oTnGCWpHEIm-Cy1lGzgXRjF4bLT3wYfluwk_7aqeVyPEH7trJcR8SUQ2mhOID8oaOyJcp1QXLMYjbyMlee5MNieP0OR26-b28i1EqYIskpUUQ97N8jHWu-PcpIL7w-9gya9sNilq_Zs9Nhey2ut5C3br64rab5CszIp_WNHIHJvpbFNvDkzsh26Q6UuHkm7qhFIrPfdA9ZDXhqz_vFmisyryVBDcl5WU7k9wxlbp7hw7qJhZyu6tIxv-Nh84JSEH-ibPjzAIpW2Y__QQ-3W46tBoqh0v-27kHSOIBJ3Yro1EF_O9brMIZh_gwRjpvQLgEP6o7rbSrqDFpXiUnwkI9n5mLhsC4O1xSoI38zqqS1UL5_-NBm00\" alt=\"PlantUML\"></p>\n<p><img src=\"https://www.plantuml.com/plantuml/svg/JSvT2eCm40JWzvmYU8RUe7ye2WLxWNGTOrhTI5mBKhnxVJ2Ins4_PhRrVOEWimj6S0EcHUVy1edpdFsKiM3HzzaHrAfKk-idXh4t0drbwnW7hEP937MfBRtTY8rYYoz3dptLvUrK9BX6-294Mq1aIMThc41T7DL7vqpWTBE214VJyPMZu0S8GcBEPHxl3qUUUgVMFm00\" alt=\"PlantUML\"></p>\n<h2 id=\"integrations\" style=\"position:relative;\"><a href=\"#integrations\" aria-label=\"integrations permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Integrations</h2>\n<h3 id=\"internal-and-external-integrations\" style=\"position:relative;\"><a href=\"#internal-and-external-integrations\" aria-label=\"internal and external integrations permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Internal and external integrations</h3>\n<p>Integration is one main feature of SCM-Manager as we support different kinds of integrations to optimize workflows.\nThe important point is that integration should not be built directly to SCM-Manager core but most parts are outsourced to plugins.</p>\n<h3 id=\"ci-integration-example\" style=\"position:relative;\"><a href=\"#ci-integration-example\" aria-label=\"ci integration example permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>CI Integration Example</h3>\n<p>As you can see besides the SCM-Manager core we have several plugins which manage the communication between each other and the external systems.\nTo prevent confusion it should be clarified that we actually have two different Jenkins plugins.\nThe first one which runs on the SCM-Manager server, and the second one named <code class=\"language-text\">Jenkins-SCM-Manager-Plugin</code> which is a Jenkins plugin.</p>\n<p>The following shows the general flow, where a Jenkins build is triggered by a change of a pull request and the result of\nthe build is sent back to the SCM-Manager:</p>\n<ol>\n<li>The <code class=\"language-text\">Review plugin</code> notifies the <code class=\"language-text\">Jenkins plugin</code> as a new pull request was created.</li>\n<li>The <code class=\"language-text\">Jenkins plugin</code> sends a build notification to the <code class=\"language-text\">Jenkins-SCM-Manager-Plugin</code> which is installed on the Jenkins Server.</li>\n<li>The <code class=\"language-text\">Jenkins-SCM-Manager-Plugin</code> processes the build notification and creates a new build job for our pull request.</li>\n<li>As soon as the build is finished, the <code class=\"language-text\">Jenkins-SCM-Manager-Plugin</code> checks for the build result.</li>\n<li>The build result is reported to the <code class=\"language-text\">CI plugin</code>. This is required to show the CI status on the pull request in SCM-Manager.</li>\n<li>During the Jenkins build an external Sonar analysis was triggered.</li>\n<li>After the analysis is done, Sonar reports the results to the <code class=\"language-text\">Sonar plugin</code>.</li>\n<li>Finally, the <code class=\"language-text\">Sonar plugin</code> processes the analysis results and creates a related CI status via the <code class=\"language-text\">CI plugin</code>.</li>\n</ol>\n<p><img src=\"https://www.plantuml.com/plantuml/svg/VL9BQyCm3BxhLuZSlR7tsA4KSkgWC9RZsC4aMl2MECLskiFeVvzSExPBno07wNjOdqJMradZvd70fjwAhTIo9uFr1ZVQKM-aKvEs04wvWVwNV1WvdaX-055F7M5LJuOgb1PRBXZbBwjVXhbNsderujipwI_kCA3ltlGPe5qGD9EMfgIj1oB9eGgcLH5-fRsYxv8oHyJJ1pWisUFid7i9qv3PawcAC92ZYc9bSHxRjkCkZmZfyuJGX_Slws6Qkohjv5t-O7YnIdcNFjt40zp78ooqtnoY1uN8Udp2AqXDmVYOJ5v3sHSySpSBzuVlzip74HY_WnFJCIR3zn2gX7dj0yGosny1rgGx_Zr_0G00\" alt=\"PlantUML\"></p>\n<h2 id=\"front-to-back\" style=\"position:relative;\"><a href=\"#front-to-back\" aria-label=\"front to back permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Front to Back</h2>\n<h3 id=\"frontend\" style=\"position:relative;\"><a href=\"#frontend\" aria-label=\"frontend permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Frontend</h3>\n<p>SCM-Manager has a modern UI which is built with <a href=\"https://github.com/facebook/react\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React</a>.\nThe frontend is detached from the server and communicates mainly over REST requests with the SCM server.</p>\n<h3 id=\"rest-layer\" style=\"position:relative;\"><a href=\"#rest-layer\" aria-label=\"rest layer permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>REST Layer</h3>\n<p>The REST layer of SCM-Manager is built with <a href=\"https://blog.restcase.com/4-maturity-levels-of-rest-api-design/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">maturity level 3</a>\nand also uses <a href=\"https://en.wikipedia.org/wiki/HATEOAS\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">HATEOAS</a>. This means the data output can be enriched with links and embedded data.\nThe links are enriched based on the permissions the user has, and the functionality which is available.\nSCM-Manager uses this pattern to show the ui elements in the frontend based on which links exist on the data object.</p>\n<h3 id=\"service-layer\" style=\"position:relative;\"><a href=\"#service-layer\" aria-label=\"service layer permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Service Layer</h3>\n<p>The service layer is the middle part in the backend, so to speak.\nAfter the server receives a request, the REST layer invokes some kind of service.\nThe service layer consists largely of the business logic.</p>\n<h3 id=\"repository-command-layer\" style=\"position:relative;\"><a href=\"#repository-command-layer\" aria-label=\"repository command layer permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Repository Command Layer</h3>\n<p>One of the main services is the repository service. Underneath this special service the repository command api layer is located.\nThis service provides an abstract api that version control systems like Git, Mercurial and Subversion can implement.\nThe repository service gets initialized for a specific repository and uses the concrete command implementation for the repository type.\nA typical repository command can be given a specific request object if needed, which is built beforehand using the builder pattern.</p>\n<h3 id=\"dao-layer\" style=\"position:relative;\"><a href=\"#dao-layer\" aria-label=\"dao layer permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>DAO Layer</h3>\n<p>SCM-Manager provides a DAO (data access object) layer to persist data like users or the repository metadata.</p>\n<h3 id=\"store-layer\" style=\"position:relative;\"><a href=\"#store-layer\" aria-label=\"store layer permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Store Layer</h3>\n<p>For data persistence beneath the DAO layer, the store layer should be used.\nDifferent types of stores can persist data globally or repository specific.</p>\n<h4 id=\"sqlite-persistence-layer\" style=\"position:relative;\"><a href=\"#sqlite-persistence-layer\" aria-label=\"sqlite persistence layer permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>SQLite Persistence Layer</h4>\n<p>SCM-Manager has introduced a dedicated SQLite persistence layer for specific metadata, including repository-specific data like pull requests\nand global or cross-repository data such as metadata used by plugins (e.g., the landing page plugin).\nThis new persistence approach addresses performance challenges inherent to XML storage, particularly for frequently changing or extensive data.\nSQLite was selected due to its performance benefits, cross-platform compatibility, and embedded usage without requiring a separate database server.</p>\n<p>The SQLite persistence layer maintains compatibility with existing SCM-Manager functionalities like data export/import,\nautomatic cleanup, and querying across multiple entries and repositories.\nIt also preserves simplicity in installation, usage, and plugin integration.</p>\n<p>Further details about the SQLite-based persistence layer and its architecture can be found in the <a href=\"../storage\">SQLite Documentation</a>.</p>\n<h2 id=\"examples\" style=\"position:relative;\"><a href=\"#examples\" aria-label=\"examples permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Examples</h2>\n<h3 id=\"fetch-all-repositories\" style=\"position:relative;\"><a href=\"#fetch-all-repositories\" aria-label=\"fetch all repositories permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Fetch all repositories</h3>\n<p>One of the main pages in SCM-Manager is the repository overview.\nTo show all available repositories the following actions in frontend and backend are executed.</p>\n<p><img src=\"https://www.plantuml.com/plantuml/svg/XPBD3e8m48JlFiN6anvy0MDC2E9VL0nu9rKsfAQqs5OJtjuIbKA1UDtkV3ipwLeAhf6dC5j2x1-JA8WlYNVUpM4JN232nnELXd66scCima8egeMag2RJyQWfg03rUvaS2ISPoZdqAKVTHKU-yiAVjBrk7c0sS2f2_PHS0M4CPEDWxxbEtbhz8fIHAyCsmydQGFg2CRnfAhYX5qNb92V5n8uNTddP2jDHTagqE3jswllesi8UIxzuYlBCPCkhSMeZbdzy3TTbodPXfYyW2hRU0SJrRaXkVOQs_duyIx9Uu5OR-08gt3uEJsy0\" alt=\"PlantUML\"></p>\n<h3 id=\"create-new-branch\" style=\"position:relative;\"><a href=\"#create-new-branch\" aria-label=\"create new branch permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Create new branch</h3>\n<p>Another core function of SCM-Manager is to create new branches using the Web UI.\nCreating a new branch over the SCM-Manager UI would lead to the following actions.\nThe SCM-Manager Subversion API does not support the branch and branches commands, so this feature is not available for Subversion repositories.</p>\n<p><img src=\"https://www.plantuml.com/plantuml/svg/hPJHRe8m58Rl-nGdNg69By354dMQU35dm7jIoz6HGSlQukRR3rOKI2bZcNSqFVz_pjU_PIC5ryXZc3z1k7g9WdLuY1RxhG_xr_000NuKg3HCc4IgSK8eqycb_EeKa_QYSWem5ohHGbwZ4EKbOHXjIcMvzi4uUKt9j35rwuXxgxyXp6P36fXRm07gGd85ygu2PLGanZ4ZZZW67ywebv9ozePg9RACyjWRF80UYChwvX7L9j6oID8OPJ_s0EsnDW9cZE1eZ8QPRLRNG1tYDgfBG9neRWYQfdUGzk3E7jRuNTzImzwt9oD_5gXsGY_IykB6r_LNelGVe_v_q0-A-J4Xsn6VfCYyKCk4do6d4hcsWhOY6Ejj9h-vczMEPZWbyeUjOUJuMU_RT-2NzcN_JVqdhFnKBhZgFFjs-JS0\" alt=\"PlantUML\"></p>","description":"Introduction This document does not describe the modules of SCM-Manager nor does it explain the technologies that are used.\nIt simply shows which application…","tableOfContents":"<ul>\n<li>\n<p><a href=\"#introduction\">Introduction</a></p>\n</li>\n<li>\n<p><a href=\"#technology-stack\">Technology stack</a></p>\n<ul>\n<li><a href=\"#overview\">Overview</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#integrations\">Integrations</a></p>\n<ul>\n<li><a href=\"#internal-and-external-integrations\">Internal and external integrations</a></li>\n<li><a href=\"#ci-integration-example\">CI Integration Example</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#front-to-back\">Front to Back</a></p>\n<ul>\n<li>\n<p><a href=\"#frontend\">Frontend</a></p>\n</li>\n<li>\n<p><a href=\"#rest-layer\">REST Layer</a></p>\n</li>\n<li>\n<p><a href=\"#service-layer\">Service Layer</a></p>\n</li>\n<li>\n<p><a href=\"#repository-command-layer\">Repository Command Layer</a></p>\n</li>\n<li>\n<p><a href=\"#dao-layer\">DAO Layer</a></p>\n</li>\n<li>\n<p><a href=\"#store-layer\">Store Layer</a></p>\n<ul>\n<li><a href=\"#sqlite-persistence-layer\">SQLite Persistence Layer</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p><a href=\"#examples\">Examples</a></p>\n<ul>\n<li><a href=\"#fetch-all-repositories\">Fetch all repositories</a></li>\n<li><a href=\"#create-new-branch\">Create new branch</a></li>\n</ul>\n</li>\n</ul>","frontmatter":{"title":"Architecture overview","subtitle":null,"displayToc":null,"description":null,"keywords":null,"image":null}}},"pageContext":{"slug":"/docs/3.9.x/en/development/architecture-overview/","version":"3.9.x","latestVersion":"3.11.x","latestPageVersion":"3.11.x","language":"en","relativePath":"/development/architecture-overview/","canonicalPath":"/docs/latest/en/development/architecture-overview/","latestRootPath":"/docs/3.11.x/en/"}},
    "staticQueryHashes": ["1973669194","2742214048","2956773653","2957019495","698804963"]}