{
    "componentChunkName": "component---src-templates-docs-js",
    "path": "/deploy-scalable-software/assignment-2",
    "result": {"data":{"site":{"siteMetadata":{"title":"Linnaeus University","language":"en","courseCode":"2DV013"}},"mdx":{"fields":{"id":"8a708a9a-aff7-54b5-8558-3ce140ea3123","title":"Assignment 2","slug":"/deploy-scalable-software/assignment-2"},"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\": \"Assignment 2\",\n  \"metaTitle\": \"2DV013 | Deploy scalable software | Assignment 2\",\n  \"metaDescription\": \"An overview of Assignment 2\",\n  \"order\": 1\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(\"p\", null, \"Use actionhub to generate your repo for this assignment. The repo is called \\\"Assignment 2 - Deploy scalable software\\\" in actionhub. The repo will then be generated for you in your private group in this course.\"), mdx(\"p\", null, \"You submit Assignment 2 by a merge request (MR).\"), mdx(\"h2\", null, \"What the assignment is about\"), mdx(\"p\", null, \"You build and deploy \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Cloudbook\"), \", a guestbook for cloud reports. Visitors say what cloud they see right now, the reports are stored in MongoDB, and Redis counts them. The app itself is small on purpose. The point of the assignment is everything around it: how software gets from your computer to a running, scalable system in the cloud.\"), mdx(\"p\", null, \"You start with a single static page and end with an Express app, a database and a counter, running on a Kubernetes cluster of three servers in the university cloud, released by pushing a Git tag.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"a static page  \\u2192  a server  \\u2192  a container  \\u2192  databases\\n  \\u2192  Kubernetes  \\u2192  a real cluster  \\u2192  releases\\n\")), mdx(\"h2\", null, \"How it is organised\"), mdx(\"p\", null, \"The work is split into six weeks, and each week has its own page with a plan, slide decks and reading material. Start with \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"./week-1\"\n  }, \"Week 1\"), \".\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Issues.\"), \" The tasks are issues in your project, labelled with the week and as \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"Mandatory\"), \" or \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"Optional\"), \". Work through them in order, because each one builds on the one before. Every issue says what to do, why, and how to check that it works.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Repository.\"), \" Your project is the one place for code, infrastructure files, pipeline and manifests. The \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"docs/\"), \" folder in it has reference material per tool, and \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"docs/TROUBLESHOOTING.md\"), \" lists common symptoms.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Weekly reports.\"), \" After each week you fill in \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"report/week-N.md\"), \": what you did, what you learned, and a few questions to answer in your own words. The six reports are part of your submission.\")), mdx(\"h2\", null, \"What you need\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Access to the university's OpenStack cloud (see \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"../infrastructure/overview\"\n  }, \"Infrastructure\"), \"). Each server needs 2 GB of memory, and your project has room for three servers.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Node.js 24 or later, Git, and Docker with Docker Compose on your own computer.\")), mdx(\"h2\", null, \"What you build, week by week\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Week\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"You end up with\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"1\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"A server created by code, a pipeline that deploys on a tag, and HTTPS\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"2\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"An Express app in a Docker image, built and run by the pipeline\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"3\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"MongoDB and Redis, started locally with Docker Compose\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"4\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The whole app in a local Kubernetes cluster (minikube)\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"5\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"A real k3s cluster with three nodes, storage and health checks\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"6\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Releases from the pipeline without downtime, and a tear-down of the cluster\")))), mdx(\"p\", null, \"In weeks 3 and 4 you work locally and do not deploy. The server has no databases until the cluster exists.\"), mdx(\"h2\", null, \"Submit by an MR\"), mdx(\"p\", null, \"When you are all done, create an MR for your project.\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Navigate to your project.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Click \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"Code -> Merge requests\"), \".\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Click \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"New merge request\"), \".\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Choose \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"main\"), \" as source branch and \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"lnu/submit\"), \" as target branch.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Click \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"Compare branches and continue\"), \".\")), mdx(\"p\", null, \"Then set up the MR with details.\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Set title to \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"SUBMIT: Assignment 2\"), \".\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"In description, fill in the details in the MR template.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Select the milestone you are submitting to, make sure it is related to Assignment 2.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Select the label \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"Submitted\"), \", or \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"Re-submitted\"), \" if this is a new submission after feedback.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Leave all else as their default values.\")), mdx(\"p\", null, \"Watch the pipeline of the MR, it should go green, otherwise inspect and fix it. The MR is made from \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"main\"), \", so pushing a fix to \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"main\"), \" starts a new pipeline.\"), mdx(\"h2\", null, \"Deadlines (Milestones)\"), mdx(\"p\", null, \"You can see the deadlines for submissions on GitLab, they are documented as milestones.\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://gitlab.lnu.se/groups/2dv013/-/milestones?search_title=%22Assignment+2%22&sort=due_date_asc\"\n  }, \"GitLab Deadlines / Milestones f\\xF6r Assignment 2\"))));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#what-the-assignment-is-about","title":"What the assignment is about"},{"url":"#how-it-is-organised","title":"How it is organised"},{"url":"#what-you-need","title":"What you need"},{"url":"#what-you-build-week-by-week","title":"What you build, week by week"},{"url":"#submit-by-an-mr","title":"Submit by an MR"},{"url":"#deadlines-milestones","title":"Deadlines (Milestones)"}]},"parent":{"relativePath":"deploy-scalable-software/assignment-2.md"},"frontmatter":{"metaTitle":"2DV013 | Deploy scalable software | Assignment 2","metaDescription":"An overview of Assignment 2","fullWidth":null}},"allMdx":{"edges":[{"node":{"fields":{"slug":"/deploy-scalable-software","title":"02 - Deploy scalable software"}}},{"node":{"fields":{"slug":"/deploy-scalable-software/assignment-2","title":"Assignment 2"}}},{"node":{"fields":{"slug":"/deploy-scalable-software/week-1","title":"Week 1: Provision and deploy a server"}}},{"node":{"fields":{"slug":"/","title":"Cloud Native Applications (2DV013)"}}},{"node":{"fields":{"slug":"/deploy-scalable-software/week-2","title":"Week 2: A server app in a container"}}},{"node":{"fields":{"slug":"/deploy-scalable-software/week-3","title":"Week 3: Databases and Compose"}}},{"node":{"fields":{"slug":"/group-project/assignment-3","title":"Assignment 3"}}},{"node":{"fields":{"slug":"/deploy-scalable-software/week-4","title":"Week 4: Kubernetes locally"}}},{"node":{"fields":{"slug":"/group-project/kravspec-egen","title":"Kravspec (egen)"}}},{"node":{"fields":{"slug":"/group-project/kravspec-standard","title":"Kravspec (standard)"}}},{"node":{"fields":{"slug":"/group-project/letter-to-customer","title":"Brev till företagskontakt"}}},{"node":{"fields":{"slug":"/group-project/week-12","title":"Course week 12: Project kick-off"}}},{"node":{"fields":{"slug":"/group-project/week-20","title":"Course week 20: Delivery and presentation"}}},{"node":{"fields":{"slug":"/deploy-scalable-software/week-5","title":"Week 5: A real cluster"}}},{"node":{"fields":{"slug":"/group-project","title":"03 - Group Project"}}},{"node":{"fields":{"slug":"/deploy-scalable-software/week-6","title":"Week 6: Release and wrap up"}}},{"node":{"fields":{"slug":"/infrastructure/assignment","title":"Assignment 1"}}},{"node":{"fields":{"slug":"/infrastructure/cloud","title":"University Cloud"}}},{"node":{"fields":{"slug":"/infrastructure","title":"01 - Infrastructure"}}},{"node":{"fields":{"slug":"/infrastructure/wsl","title":"WSL"}}},{"node":{"fields":{"slug":"/study-guide/communication","title":"Communication"}}},{"node":{"fields":{"slug":"/study-guide/exams","title":"Exams"}}},{"node":{"fields":{"slug":"/infrastructure/overview","title":"Overview"}}},{"node":{"fields":{"slug":"/study-guide/expectations","title":"Expectations"}}},{"node":{"fields":{"slug":"/study-guide","title":"Study Guide"}}},{"node":{"fields":{"slug":"/study-guide/instructors","title":"Instructors"}}},{"node":{"fields":{"slug":"/study-guide/readings","title":"Readings"}}},{"node":{"fields":{"slug":"/what-is-cloud-native","title":"0 - What is cloud native?"}}},{"node":{"fields":{"slug":"/what-is-cloud-native/overview","title":"Overview"}}},{"node":{"fields":{"slug":"/study-guide/registration","title":"Registration"}}}]}},"pageContext":{"id":"8a708a9a-aff7-54b5-8558-3ce140ea3123"}},
    "staticQueryHashes": ["253607798","3706406642","710574383"]}