{
    "componentChunkName": "component---src-templates-docs-js",
    "path": "/vecka5-versionshantering/gitlab-fran-krav-till-implementation",
    "result": {"data":{"site":{"siteMetadata":{"title":"Linnéuniversitetet","language":"sv","courseCode":"1DV613"}},"mdx":{"fields":{"id":"1b862475-42d6-5f0c-b198-00c3acc7839c","title":"GitLab - Från krav till implementation","slug":"/vecka5-versionshantering/gitlab-fran-krav-till-implementation"},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"GitLab - Från krav till implementation\",\n  \"metaTitle\": \"1DV613 | GitLab - Från krav till implementation\",\n  \"metaDescription\": \"metaDescription\",\n  \"order\": 3\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h2\", null, \"TL;DR\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Epics = anv\\xE4ndarkrav (varf\\xF6r)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Issues = systemkrav (vad)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Milestones = tid/iterationer (n\\xE4r)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Branch/MR = implementation (hur)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Sub-issues = detaljnedbrytning vid behov\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Iteration cadence = 1 vecka (standardrytm f\\xF6r hur ofta milestones skapas och avslutas)\")), mdx(\"hr\", null), mdx(\"p\", null, \"Detta dokument beskriver en rekommenderad arbetsmodell i GitLab som visar hur man g\\xE5r fr\\xE5n \\xF6vergripande anv\\xE4ndarkrav till konkret implementation i kod. Exemplet utg\\xE5r fr\\xE5n ett vanligt scenario: \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"inloggning (login)\"), \".\"), mdx(\"p\", null, \"M\\xE5let \\xE4r att skapa en tydlig sp\\xE5rbar kedja:\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"Anv\\xE4ndarkrav \\u2192 Epics \\u2192 Systemkrav (Issues) \\u2192 Delkrav (Sub-issues) \\u2192 Implementation (Branch + MR)\")), mdx(\"hr\", null), mdx(\"h1\", null, \"1. \\xD6vergripande niv\\xE5 \\u2013 Epic (Anv\\xE4ndarkrav)\"), mdx(\"h2\", null, \"Vad \\xE4r en Epic?\"), mdx(\"p\", null, \"En Epic representerar ett \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"anv\\xE4ndarbehov eller ett \\xF6vergripande m\\xE5l\"), \". Den ska inte beskriva implementation, utan syftet med funktionaliteten.\"), mdx(\"h2\", null, \"Exempel (Login)\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Epic: Anv\\xE4ndare ska kunna autentisera sig i systemet\")), mdx(\"h3\", null, \"Beskrivning:\"), mdx(\"p\", null, \"Som anv\\xE4ndare vill jag kunna logga in i systemet f\\xF6r att f\\xE5 tillg\\xE5ng till skyddade resurser och personlig funktionalitet.\"), mdx(\"h3\", null, \"Typiska egenskaper:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Funktionellt m\\xE5l\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Teknikoberoende\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Kan brytas ner i flera systemdelar\")), mdx(\"hr\", null), mdx(\"h1\", null, \"2. Mellanniv\\xE5 \\u2013 Issues (Systemkrav)\"), mdx(\"h2\", null, \"Vad \\xE4r ett issue?\"), mdx(\"p\", null, \"Ett issue representerar ett \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"konkret systemkrav eller funktion\"), \" som beh\\xF6vs f\\xF6r att uppfylla en epic.\"), mdx(\"h2\", null, \"Exempel (kopplat till Login Epic)\"), mdx(\"h3\", null, \"Issue 1: Skapa autentiseringsendpoint\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"POST /login endpoint\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Tar emot anv\\xE4ndarnamn och l\\xF6senord\")), mdx(\"h3\", null, \"Issue 2: Validera anv\\xE4ndaruppgifter\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Kontrollera att input \\xE4r korrekt\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Hantera felmeddelanden\")), mdx(\"h3\", null, \"Issue 3: Generera JWT-token\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Skapa token vid lyckad inloggning\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Inkludera user-id och claims\")), mdx(\"h3\", null, \"Issue 4: L\\xF6senordshantering\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Hasha l\\xF6senord vid j\\xE4mf\\xF6relse\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"S\\xE4ker lagring och verifiering\")), mdx(\"hr\", null), mdx(\"h1\", null, \"3. Nedbrytning \\u2013 Sub-issues (detaljkrav)\"), mdx(\"h2\", null, \"Vad \\xE4r en sub-issue?\"), mdx(\"p\", null, \"En sub-issue \\xE4r ett \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"separat issue som \\xE4r kopplat som barn till ett st\\xF6rre issue\"), \". Den anv\\xE4nds n\\xE4r ett systemkrav \\xE4r f\\xF6r stort eller komplext.\"), mdx(\"h2\", null, \"Exempel (f\\xF6r Issue: Generera JWT-token)\"), mdx(\"h3\", null, \"Sub-issue 3.1: Skapa tokenstruktur\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Definiera payload (userId, exp, role)\")), mdx(\"h3\", null, \"Sub-issue 3.2: Implementera signering\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Anv\\xE4nd hemlig nyckel\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Implementera signeringslogik\")), mdx(\"h3\", null, \"Sub-issue 3.3: Hantera token expiration\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"S\\xE4tt giltighetstid\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Hantera utg\\xE5ngna tokens\")), mdx(\"hr\", null), mdx(\"h1\", null, \"4. Planering \\xF6ver tid \\u2013 Milestones (Iterationer)\"), mdx(\"h2\", null, \"Vad \\xE4r en Milestone?\"), mdx(\"p\", null, \"En milestone anv\\xE4nds f\\xF6r att \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"tidsbinda arbete\"), \" och skapa iterationer (t.ex. sprintar). Den kopplar ihop planering och genomf\\xF6rande \\xF6ver tid.\"), mdx(\"h2\", null, \"Syfte:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Skapa iterationer (Iteration 1, 2, 3...)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"F\\xF6lja progression i projektet\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Samla issues som ska f\\xE4rdigst\\xE4llas inom ett tidsintervall\")), mdx(\"h2\", null, \"Exempel (Login-projekt)\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Milestone: Iteration 1 \\u2013 Grundl\\xE4ggande autentisering\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Skapa login-endpoint\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Validera anv\\xE4ndare\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Generera JWT\")), mdx(\"p\", null, \"\\uD83D\\uDC49 Alla relaterade issues kopplas till denna milestone\"), mdx(\"h2\", null, \"Arbetsregel:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Varje issue ska alltid kopplas till en milestone\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Milestone anv\\xE4nds f\\xF6r att se \\\"vad ska vara klart n\\xE4r\\\"\")), mdx(\"hr\", null), mdx(\"h1\", null, \"5. Implementation \\u2013 Branch och Merge Request\"), mdx(\"h2\", null, \"Vad h\\xE4nder h\\xE4r?\"), mdx(\"p\", null, \"Detta \\xE4r den tekniska implementeringen kopplad till ett issue (eller sub-issue).\"), mdx(\"h2\", null, \"Arbetsfl\\xF6de:\"), mdx(\"h3\", null, \"1. Skapa branch fr\\xE5n issue\"), mdx(\"p\", null, \"Exempel:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"feature/login-jwt-token\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"feature/login-endpoint\"))), mdx(\"h3\", null, \"2. Implementera funktionalitet\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Skriv kod i branch\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"F\\xF6lj definierade krav fr\\xE5n issue/sub-issue\")), mdx(\"h3\", null, \"3. Skapa Merge Request (MR)\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Koppla MR till issue\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Beskriv vad som \\xE4r implementerat\")), mdx(\"h3\", null, \"4. Review och merge\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Kod granskas\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Merge till main\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Issue st\\xE4ngs automatiskt eller manuellt\")), mdx(\"hr\", null), mdx(\"h1\", null, \"6. Hela kedjan (sammanfattning)\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-text\"\n  }, \"EPIC\\n(Anv\\xE4ndare ska kunna logga in)\\n        \\u2193\\nISSUES\\n(Endpoint, validering, JWT, l\\xF6senord)\\n        \\u2193\\nSUB-ISSUES\\n(tokenstruktur, signering, expiration)\\n        \\u2193\\nBRANCH\\n(feature/login-jwt-token)\\n        \\u2193\\nMERGE REQUEST\\n        \\u2193\\nMAIN + CLOSED ISSUE\\n\")), mdx(\"hr\", null), mdx(\"h1\", null, \"7. Viktiga principer\"), mdx(\"h2\", null, \"\\u2714 Ett tydligt syfte per niv\\xE5\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Epic = varf\\xF6r\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Issue = vad\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Sub-issue = detaljerat vad\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Branch = hur\")), mdx(\"h2\", null, \"\\u2714 Sp\\xE5rbarhet \\xE4r centralt\"), mdx(\"p\", null, \"All kod ska kunna sp\\xE5ras tillbaka till:\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"krav \\u2192 issue \\u2192 kod\")), mdx(\"h2\", null, \"\\u2714 Undvik \\xF6verkomplexitet\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Anv\\xE4nd sub-issues endast n\\xE4r det beh\\xF6vs\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"H\\xE5ll issues hanterbara\")), mdx(\"hr\", null), mdx(\"h1\", null, \"8. Rekommenderad studentpraxis\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"B\\xF6rja alltid med Epic (om funktion \\xE4r st\\xF6rre \\xE4n en enkel uppgift)\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Bryt ner i issues\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Bryt endast ner vidare i sub-issues om n\\xF6dv\\xE4ndigt\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Implementera alltid via branch + MR\")), mdx(\"hr\", null), mdx(\"h1\", null, \"9. Syftet med modellen\"), mdx(\"p\", null, \"Denna struktur hj\\xE4lper till att:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Skapa tydlig kravhantering\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Undvika \\u201Ckod f\\xF6rst\\u201D-arbete\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Ge sp\\xE5rbarhet i projekt\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Efterlikna professionell mjukvaruutveckling\")), mdx(\"hr\", null), mdx(\"h1\", null, \"\\uD83D\\uDDD3\\uFE0F Veckofl\\xF6de \\u2013 Exempel (1 iteration = 1 vecka)\"), mdx(\"p\", null, \"Detta \\xE4r ett konkret exempel p\\xE5 hur en iteration (milestone) kan se ut i praktiken \\xF6ver en vecka.\"), mdx(\"hr\", null), mdx(\"h2\", null, \"\\uD83D\\uDCC5 M\\xE5ndag \\u2013 Planering\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Ny milestone (Iteration X) startas\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Issues v\\xE4ljs ut fr\\xE5n backlog\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Varje issue kopplas till milestone\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"F\\xF6rdelning av arbete\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Nya branches planeras (men inte alltid skapade \\xE4n)\")), mdx(\"p\", null, \"\\uD83D\\uDC49 Fokus: \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Vad ska g\\xF6ras denna vecka?\")), mdx(\"hr\", null), mdx(\"h2\", null, \"\\uD83D\\uDEE0\\uFE0F Tisdag\\u2013Onsdag \\u2013 Implementation\"), mdx(\"p\", null, \"Per-issue-loopen (branch \\u2192 commits \\u2192 MR) sker i \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"jobba-med-git\"\n  }, \"Jobba med Git\"), \" under \\\"Per-issue arbetsfl\\xF6de i GitLab\\\".\"), mdx(\"p\", null, \"\\uD83D\\uDC49 Fokus: \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Bygga funktioner stegvis\")), mdx(\"hr\", null), mdx(\"h2\", null, \"\\uD83D\\uDD00 Torsdag \\u2013 Integration & Review\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Skapa Merge Requests\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Code review (egen eller peer)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Fix av feedback\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Merge av f\\xE4rdiga features\")), mdx(\"p\", null, \"\\uD83D\\uDC49 Fokus: \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"F\\xE5 kod in i main p\\xE5 ett kontrollerat s\\xE4tt\")), mdx(\"hr\", null), mdx(\"h2\", null, \"\\uD83E\\uDDEA Fredag \\u2013 Avslut & Reflektion\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"St\\xE4ng f\\xE4rdiga issues\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Kontrollera milestone-status\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"S\\xE4kerst\\xE4ll att allt \\xE4r merge:at\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Kort reflektion: vad blev klart, vad \\xE5terst\\xE5r?\")), mdx(\"p\", null, \"\\uD83D\\uDC49 Fokus: \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Avsluta iteration och f\\xF6rbereda n\\xE4sta\")), mdx(\"hr\", null), mdx(\"h2\", null, \"\\uD83E\\uDDE0 Sammanfattning\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"M\\xE5ndag = planera\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Tisdag\\u2013Onsdag = bygga\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Torsdag = integrera\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Fredag = avsluta\")), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"Varje vecka \\xE4r en komplett utvecklingscykel (iteration)\")));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"items":[{"url":"#tldr","title":"TL;DR"}]},{"url":"#1-övergripande-nivå--epic-användarkrav","title":"1. Övergripande nivå – Epic (Användarkrav)","items":[{"url":"#vad-är-en-epic","title":"Vad är en Epic?"},{"url":"#exempel-login","title":"Exempel (Login)","items":[{"url":"#beskrivning","title":"Beskrivning:"},{"url":"#typiska-egenskaper","title":"Typiska egenskaper:"}]}]},{"url":"#2-mellannivå--issues-systemkrav","title":"2. Mellannivå – Issues (Systemkrav)","items":[{"url":"#vad-är-ett-issue","title":"Vad är ett issue?"},{"url":"#exempel-kopplat-till-login-epic","title":"Exempel (kopplat till Login Epic)","items":[{"url":"#issue-1-skapa-autentiseringsendpoint","title":"Issue 1: Skapa autentiseringsendpoint"},{"url":"#issue-2-validera-användaruppgifter","title":"Issue 2: Validera användaruppgifter"},{"url":"#issue-3-generera-jwt-token","title":"Issue 3: Generera JWT-token"},{"url":"#issue-4-lösenordshantering","title":"Issue 4: Lösenordshantering"}]}]},{"url":"#3-nedbrytning--sub-issues-detaljkrav","title":"3. Nedbrytning – Sub-issues (detaljkrav)","items":[{"url":"#vad-är-en-sub-issue","title":"Vad är en sub-issue?"},{"url":"#exempel-för-issue-generera-jwt-token","title":"Exempel (för Issue: Generera JWT-token)","items":[{"url":"#sub-issue-31-skapa-tokenstruktur","title":"Sub-issue 3.1: Skapa tokenstruktur"},{"url":"#sub-issue-32-implementera-signering","title":"Sub-issue 3.2: Implementera signering"},{"url":"#sub-issue-33-hantera-token-expiration","title":"Sub-issue 3.3: Hantera token expiration"}]}]},{"url":"#4-planering-över-tid--milestones-iterationer","title":"4. Planering över tid – Milestones (Iterationer)","items":[{"url":"#vad-är-en-milestone","title":"Vad är en Milestone?"},{"url":"#syfte","title":"Syfte:"},{"url":"#exempel-login-projekt","title":"Exempel (Login-projekt)"},{"url":"#arbetsregel","title":"Arbetsregel:"}]},{"url":"#5-implementation--branch-och-merge-request","title":"5. Implementation – Branch och Merge Request","items":[{"url":"#vad-händer-här","title":"Vad händer här?"},{"url":"#arbetsflöde","title":"Arbetsflöde:","items":[{"url":"#1-skapa-branch-från-issue","title":"1. Skapa branch från issue"},{"url":"#2-implementera-funktionalitet","title":"2. Implementera funktionalitet"},{"url":"#3-skapa-merge-request-mr","title":"3. Skapa Merge Request (MR)"},{"url":"#4-review-och-merge","title":"4. Review och merge"}]}]},{"url":"#6-hela-kedjan-sammanfattning","title":"6. Hela kedjan (sammanfattning)"},{"url":"#7-viktiga-principer","title":"7. Viktiga principer","items":[{"url":"#-ett-tydligt-syfte-per-nivå","title":"✔ Ett tydligt syfte per nivå"},{"url":"#-spårbarhet-är-centralt","title":"✔ Spårbarhet är centralt"},{"url":"#-undvik-överkomplexitet","title":"✔ Undvik överkomplexitet"}]},{"url":"#8-rekommenderad-studentpraxis","title":"8. Rekommenderad studentpraxis"},{"url":"#9-syftet-med-modellen","title":"9. Syftet med modellen"},{"url":"#️-veckoflöde--exempel-1-iteration--1-vecka","title":"🗓️ Veckoflöde – Exempel (1 iteration = 1 vecka)","items":[{"url":"#-måndag--planering","title":"📅 Måndag – Planering"},{"url":"#️-tisdagonsdag--implementation","title":"🛠️ Tisdag–Onsdag – Implementation"},{"url":"#-torsdag--integration--review","title":"🔀 Torsdag – Integration & Review"},{"url":"#🧪-fredag--avslut--reflektion","title":"🧪 Fredag – Avslut & Reflektion"},{"url":"#🧠-sammanfattning","title":"🧠 Sammanfattning"}]}]},"parent":{"relativePath":"vecka5-versionshantering/gitlab-fran-krav-till-implementation.md"},"frontmatter":{"metaTitle":"1DV613 | GitLab - Från krav till implementation","metaDescription":"metaDescription","fullWidth":null}},"allMdx":{"edges":[{"node":{"fields":{"slug":"/","title":"🎉 Välkommen till Mjukvaruutvecklingsprojekt (1DV613)"}}},{"node":{"fields":{"slug":"/video-loggar","title":"Videologgar"}}},{"node":{"fields":{"slug":"/studieguiden","title":"Studieguiden"}}},{"node":{"fields":{"slug":"/studieguiden/kommunikationsstrategi","title":"Kommunikationsstrategi"}}},{"node":{"fields":{"slug":"/studieguiden/kursledning","title":"Kursledning"}}},{"node":{"fields":{"slug":"/studieguiden/kursplan","title":"Kursplan och betyg"}}},{"node":{"fields":{"slug":"/studieguiden/litteratur","title":"Kurslitteratur"}}},{"node":{"fields":{"slug":"/studieguiden/schema","title":"Schema och deadlines"}}},{"node":{"fields":{"slug":"/studieguiden/studieanvisningar","title":"Studieanvisningar"}}},{"node":{"fields":{"slug":"/studieguiden/utvarderingar","title":"Kursvärderingar"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/dokumentation","title":"Dokumentation"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision","title":"Vecka 1/2 - Planering och vision"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/todo","title":"📅 Att göra-lista"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/vision","title":"Projektvision"}}},{"node":{"fields":{"slug":"/vecka10-etik","title":"Vecka 10 - Etik & överlämning"}}},{"node":{"fields":{"slug":"/vecka10-etik/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/arbeta-i-projekt","title":"Att arbeta i projekt"}}},{"node":{"fields":{"slug":"/vecka3-krav-test","title":"Vecka 3 - Krav och testning"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/testning","title":"Testning"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/vecka3-krav-test","title":"Kravhantering"}}},{"node":{"fields":{"slug":"/vecka4-implementation/arkitektur","title":"Introduktion till mjukvaruarkitektur"}}},{"node":{"fields":{"slug":"/vecka4-implementation/borja-med-kod","title":"Att börja arbeta med kod"}}},{"node":{"fields":{"slug":"/vecka4-implementation/docker-teori","title":"Introduktion till containers"}}},{"node":{"fields":{"slug":"/vecka4-implementation","title":"Vecka 4 - Implementation"}}},{"node":{"fields":{"slug":"/vecka4-implementation/just-task-it-docker","title":"Introduktion till Docker"}}},{"node":{"fields":{"slug":"/vecka4-implementation/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering/gitlab-fran-krav-till-implementation","title":"GitLab - Från krav till implementation"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering","title":"Vecka 5 - Versionshantering"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering/jobba-med-git","title":"Jobba med Git"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering/versionshantering","title":"Versionshantering"}}},{"node":{"fields":{"slug":"/vecka6-drift/docker-compose-teori","title":"Introduktion till Docker compose"}}},{"node":{"fields":{"slug":"/vecka6-drift","title":"Vecka 6 - Driftsättning"}}},{"node":{"fields":{"slug":"/vecka6-drift/just-task-it-docker-compose","title":"JTI - Docker Compose"}}},{"node":{"fields":{"slug":"/vecka6-drift/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka6-drift/just-task-it-production","title":"JTI - Production"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd/ci-cd","title":"CI/CD"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd","title":"Vecka 7 - CI/CD"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd/just-task-it-deploy-pipeline","title":"JTI - Deploy through a pipeline"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka8-automatiska-test/automatiska-tester","title":"Automatiserad testning"}}},{"node":{"fields":{"slug":"/vecka8-automatiska-test","title":"Vecka 8 - Automatiserad testning"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/extern-updragsgivare/extern-uppdragsgivare-samverkan","title":"Samverkansinformation: studentprojekt med extern uppdragsgivare"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/extern-updragsgivare","title":"Extern uppdragsgivare"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/extern-updragsgivare/vagledning","title":"Vägledning för arbete med extern uppdragsgivare"}}},{"node":{"fields":{"slug":"/vecka9-leverans/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka9-leverans","title":"Vecka 9 - Slutleverans"}}},{"node":{"fields":{"slug":"/vecka8-automatiska-test/todo","title":"Att göra lista"}}}]}},"pageContext":{"id":"1b862475-42d6-5f0c-b198-00c3acc7839c"}},
    "staticQueryHashes": ["253607798","3706406642","710574383"]}