{"componentChunkName":"component---src-gatsby-theme-mdx-deck-templates-deck-js","path":"/slides/best-practices","matchPath":"slides/best-practices/*","result":{"data":{"site":{"siteMetadata":{"siteUrl":"https://rohit.page"}},"deck":{"id":"f02ac13c-a388-5939-a2c0-1b4bc03226d1","body":"function _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/* @jsx mdx */\nconst Color = ColorFn('#E05735');\nconst theme = selected;\n\nconst ImageIcon = ({\n  src\n}) => {\n  return mdx(\"div\", {\n    style: {\n      backgroundColor: 'white',\n      width: '6vw',\n      height: '6vw',\n      display: 'inline-grid',\n      padding: '10px',\n      border: 'white',\n      borderRadius: '15px',\n      alignContent: 'center'\n    }\n  }, mdx(\"img\", {\n    src: src\n  }));\n};\n\nconst _frontmatter = {\n  \"title\": \"Best Practices\",\n  \"excerpt\": \"Versioning, Changelogs, and more..\",\n  \"draft\": false,\n  \"date\": \"2020-10-01T14:20:00.000+05:30\"\n};\n\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n  console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\");\n  return mdx(\"div\", props);\n};\n\nconst layoutProps = {\n  Color,\n  theme,\n  ImageIcon,\n  _frontmatter\n};\nconst MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  let {\n    components\n  } = _ref,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Best Practices`), mdx(Appear, {\n    mdxType: \"Appear\"\n  }, mdx(\"div\", null, mdx(Color, {\n    mdxType: \"Color\"\n  }, \"Versioning, Changelogs, and more...\")), mdx(\"div\", null, \"2020-10-01\"))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `Hello everyone!`), mdx(\"p\", null, `Today I'm going to talk about how I'm managing branches, versioning, and releases on my Project.\nHopefully you can take some inspiration from this and implement something for your own project or improve it.`)), mdx(\"hr\", null), mdx(Image, {\n    src: \"/images/IMG_20181224_165017.jpg\",\n    style: {\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      color: 'black'\n    },\n    mdxType: \"Image\"\n  }, mdx(\"div\", {\n    style: {\n      position: 'relative',\n      top: '-80px'\n    }\n  }, mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `About Me 👨‍💻`), mdx(\"h4\", null, mdx(\"a\", {\n    href: \"https://twitter.com/rohit_gohri\",\n    target: \"_blank\",\n    style: {\n      color: 'black',\n      textDecoration: 'none'\n    }\n  }, mdx(Icon, {\n    icon: faTwitter,\n    mdxType: \"Icon\"\n  }), ` - @rohit_gohri`)), mdx(\"h4\", null, mdx(\"a\", {\n    href: \"https://github.com/rohit-gohri\",\n    target: \"_blank\",\n    style: {\n      color: 'black',\n      textDecoration: 'none'\n    }\n  }, mdx(Icon, {\n    icon: faGithub,\n    mdxType: \"Icon\"\n  }), ` - rohit-gohri`))))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `First, a little about me. My name is Rohit Gohri, I am a full stack developer currently working in Collegedunia, Gurgaon.\nI have a keen interest in DevOps, working on devloper tooling, and I love optimising developer workflows.`)), mdx(\"hr\", null), mdx(Small, {\n    mdxType: \"Small\"\n  }, mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h2\", null, `Branching Strategies `, mdx(Icon, {\n    icon: GitPullRequestIcon,\n    mdxType: \"Icon\"\n  })), mdx(\"p\", null, `Git Flow, GithHub Flow and GitLab Flow`))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }), mdx(\"hr\", null), mdx(Image, {\n    src: \"/images/gitflow.png\",\n    size: \"contain\",\n    mdxType: \"Image\"\n  }, \"GitFlow\"), mdx(\"hr\", null), mdx(Image, {\n    src: \"/images/github_flow.png\",\n    size: \"contain\",\n    mdxType: \"Image\"\n  }, \"GitHubFlow\"), mdx(\"hr\", null), mdx(Image, {\n    src: \"/images/gitlab_flow.png\",\n    size: \"contain\",\n    mdxType: \"Image\"\n  }, \"GitLabFlow\"), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h2\", null, `So, what should you choose?`), mdx(\"h3\", null, `It depends... Do you need:`)), mdx(\"ul\", null, mdx(Appear, {\n    mdxType: \"Appear\"\n  }, mdx(\"li\", null, \"Long running release branches? - Git Flow\"), mdx(\"li\", null, \"Environment branches? - GitLab Flow\"), mdx(\"li\", null, \"Only a single main branch? - GitHub Flow\"))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Long running release branches: Git flow is probably the best bet`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Environment branches: One branch each for stage, pre-prod and production? GitLab Flow is probably for you`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Only a single main branch: Github flow seems perfect, main branches and feature branches.`))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h2\", null, `Versioning`)), mdx(\"ul\", null, mdx(Appear, {\n    mdxType: \"Appear\"\n  }, mdx(\"li\", null, \"SemVer: Semantic Versioning\"), mdx(\"li\", null, \"CalVer: Calendar Versioning\"), mdx(\"li\", null, \"Weird Versioning\"))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `There are many approaches to versioning software, as there for the branching model, you may choose to inrement versions:`), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `According to things that have changed since the last release, this is the basis for semantic versioning(SemVer). eg. Major npm modules, android`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `According to time when the version is being released, basis for CalVer. eg. Ubuntu, AWS APIs`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `There are also weird versioning systems like NodeJS itself, which has alternating LTS and Current releases (odd/even).`))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Why Version?`), mdx(\"ul\", null, mdx(Appear, {\n    mdxType: \"Appear\"\n  }, mdx(\"li\", null, \"Maintain History\"), mdx(\"li\", null, \"Easier to revert/monitor/announce features\"), mdx(\"li\", null, \"Better plan your roadmap\")))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Maintain history of the project, easier to see important milestones of the project.`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `When combined with Logging and Monitoring for the app, can see versions as markers in the history\nand see any associated spikes in error rates or performance drop.`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Easier to know exactly what is going in the next release as a TL`))), mdx(\"hr\", null), mdx(Image, {\n    src: \"/images/semver.png\",\n    size: \"contain\",\n    style: {\n      display: 'flex',\n      justifyContent: 'center',\n      color: 'black'\n    },\n    mdxType: \"Image\"\n  }, \"SemVer\"), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `How to do it?`), mdx(\"ul\", null, mdx(Appear, {\n    mdxType: \"Appear\"\n  }, mdx(\"li\", null, \"Git tags\"), mdx(\"li\", null, \"Package Managers: npm,pip,gradle,etc.\"), mdx(\"li\", null, \"For monorepos: lerna, rush, etc.\"), mdx(\"li\", null, \"Something custom?\")))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `For a start you can just start tagging your releases in Git and creating a release in GitLab`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `If your package manager supports maintaining versions and publishing then that's the best bet`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `For versioning multiple projects, something like a monorepo, there are special tools there`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Something custom might be better for non semantic-versioning release strategies`))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Mini Quiz`)), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `We are going to be hosting a small quiz about whatever we have learned so far.`)), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Quiz`), mdx(\"h3\", null, `Link: `, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://forms.gle/MXMpHWjL12Kz6k616\"\n  }), `https://forms.gle/MXMpHWjL12Kz6k616`))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(Color, {\n    mdxType: \"Color\"\n  }, \"Send link as message at this time\"), mdx(\"p\", null, `I have prepared a quiz/survey regarding whatever we have learned`)), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Let's see the quiz`)), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `Screen share the quiz and wait for people to answer`)), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"p\", null, `Let's see how all of you did`)), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Changelogs`), mdx(\"h2\", null, `How to keep a changelog`)), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `Changelogs are notes describing the changes present in each release. They could be small and concise, referring the corresponding issues closed and MRs merged.\nOr they could be more like release notes, describing the significant changes in detail and how they affect the users.`), mdx(\"p\", null, `You can also separate these two, publish small, concise changelogs internally and write a blog post for release notes.`)), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, mdx(\"a\", _extends({\n    parentName: \"h1\"\n  }, {\n    \"href\": \"https://keepachangelog.com/en/1.0.0/\"\n  }), `Keep a Changelog`), ` Format`)), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `This is just one of the many formats. There are others available, conventional commits and changelogs is one popular one.\nYou can also make your own.`)), mdx(\"hr\", null), mdx(CodeSurfer, {\n    theme: codeTheme,\n    title: \"Sample Changelog file\",\n    mdxType: \"CodeSurfer\"\n  }, mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-md\",\n    \"metastring\": \"7:18 title=\\\"Last Version Changelog\\\" file=../data/txt/sample_changelog_empty.md\",\n    \"7:18\": true,\n    \"title\": \"\\\"Last\",\n    \"Version\": true,\n    \"Changelog\\\"\": true,\n    \"file\": \"../data/txt/sample_changelog_empty.md\"\n  }), `## [Unreleased]\n\n> NOTE: ⬇⬇ Add below this ⬇⬇\n\n> NOTE: ⬆⬆ And above this ⬆⬆\n\n## [0.20.0] - 2020-09-11\n\n### Added\n\n- Allowed special characters in goal value (!164) - MMP-498\n\n### Changed\n\n- User status can be changed to INACTIVE - MMP-535\n- Stats refactor (!162) - MMP-541\n- Don't init services unless required (!181) - MMP-564\n`)), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-md\",\n    \"metastring\": \"1:6 title=\\\"Unreleased section\\\" file=../data/txt/sample_changelog_empty.md\",\n    \"1:6\": true,\n    \"title\": \"\\\"Unreleased\",\n    \"section\\\"\": true,\n    \"file\": \"../data/txt/sample_changelog_empty.md\"\n  }), `## [Unreleased]\n\n> NOTE: ⬇⬇ Add below this ⬇⬇\n\n> NOTE: ⬆⬆ And above this ⬆⬆\n\n## [0.20.0] - 2020-09-11\n\n### Added\n\n- Allowed special characters in goal value (!164) - MMP-498\n\n### Changed\n\n- User status can be changed to INACTIVE - MMP-535\n- Stats refactor (!162) - MMP-541\n- Don't init services unless required (!181) - MMP-564\n`)), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-md\",\n    \"metastring\": \"1:10 title=\\\"Open an MR\\\" file=../data/txt/sample_changelog.md\",\n    \"1:10\": true,\n    \"title\": \"\\\"Open\",\n    \"an\": true,\n    \"MR\\\"\": true,\n    \"file\": \"../data/txt/sample_changelog.md\"\n  }), `## [Unreleased]\n\n> NOTE: ⬇⬇ Add below this ⬇⬇\n\n### Changed\n\n- Replaced IP2location with MaxMind for geo services (!167) - MMP-536\n\n> NOTE: ⬆⬆ And above this ⬆⬆\n\n## [0.20.0] - 2020-09-11\n\n### Added\n\n- Allowed special characters in goal value (!164) - MMP-498\n\n### Changed\n\n- User status can be changed to INACTIVE - MMP-535\n- Stats refactor (!162) - MMP-541\n- Don't init services unless required (!181) - MMP-564\n`))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Sprinkle in some scripts and CI/CD`)), mdx(\"hr\", null), mdx(CodeSurfer, {\n    theme: codeTheme,\n    title: \"Changed Changelog file\",\n    mdxType: \"CodeSurfer\"\n  }, mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-md\",\n    \"metastring\": \"1:10 title=\\\"Merge\\\" file=../data/txt/sample_changelog.md\",\n    \"1:10\": true,\n    \"title\": \"\\\"Merge\\\"\",\n    \"file\": \"../data/txt/sample_changelog.md\"\n  }), `## [Unreleased]\n\n> NOTE: ⬇⬇ Add below this ⬇⬇\n\n### Changed\n\n- Replaced IP2location with MaxMind for geo services (!167) - MMP-536\n\n> NOTE: ⬆⬆ And above this ⬆⬆\n\n## [0.20.0] - 2020-09-11\n\n### Added\n\n- Allowed special characters in goal value (!164) - MMP-498\n\n### Changed\n\n- User status can be changed to INACTIVE - MMP-535\n- Stats refactor (!162) - MMP-541\n- Don't init services unless required (!181) - MMP-564\n`)), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-md\",\n    \"metastring\": \"1:12 title=\\\"Release Patch\\\" file=../data/txt/sample_changelog_released.md\",\n    \"1:12\": true,\n    \"title\": \"\\\"Release\",\n    \"Patch\\\"\": true,\n    \"file\": \"../data/txt/sample_changelog_released.md\"\n  }), `## [Unreleased]\n\n> NOTE: ⬇⬇ Add below this ⬇⬇\n\n> NOTE: ⬆⬆ And above this ⬆⬆\n\n## [0.20.1] - 2020-10-01\n\n### Changed\n\n- Replaced IP2location with MaxMind for geo services (!167) - MMP-536\n\n## [0.20.0] - 2020-09-11\n\n### Added\n\n- Allowed special characters in goal value (!164) - MMP-498\n\n### Changed\n\n- User status can be changed to INACTIVE - MMP-535\n- Stats refactor (!162) - MMP-541\n- Don't init services unless required (!181) - MMP-564\n`))), mdx(\"hr\", null), mdx(Image, {\n    src: \"/images/gitlab_release.png\",\n    size: \"contain\",\n    mdxType: \"Image\"\n  }), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Some Other Best Practices`)), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h3\", null, `Automate the boring parts (shameless plug)`), mdx(\"h2\", null, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"https://rohit.page/slides/ci\"\n  }), `Intro to CI/CD`))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h3\", null, `Document Everything`), mdx(\"ul\", null, mdx(Appear, {\n    mdxType: \"Appear\"\n  }, mdx(\"li\", null, mdx(\"a\", {\n    href: \"https://app.diagrams.net/\"\n  }, \"Architecture and Flow Diagrams\")), mdx(\"li\", null, \"List of Active Services/Environments\"), mdx(\"li\", null, \"How To Deploy Each One of Them?\"), mdx(\"li\", null, \"How to Debug in Production?\"), mdx(\"li\", null, \"Using the Logging, Monitoring, and Alerts infrastructure\"), mdx(\"li\", null, mdx(Color, {\n    mdxType: \"Color\"\n  }, \"Minutes of Meetings\"))))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h3\", null, `And then turn those into KTs or Blog Posts`)), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Any Questions?`)), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(Left, {\n    mdxType: \"Left\"\n  }, mdx(\"h2\", null, `Links`), mdx(\"h3\", null, `Made With`), mdx(\"h4\", null, `Mdx-Deck: `, mdx(\"a\", _extends({\n    parentName: \"h4\"\n  }, {\n    \"href\": \"https://github.com/jxnblk/mdx-deck/\"\n  }), `https://github.com/jxnblk/mdx-deck/`)), mdx(\"h4\", null, `Code Surfer: `, mdx(\"a\", _extends({\n    parentName: \"h4\"\n  }, {\n    \"href\": \"https://github.com/pomber/code-surfer\"\n  }), `https://github.com/pomber/code-surfer`)))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(Left, {\n    mdxType: \"Left\"\n  }, mdx(\"h2\", null, `References`), mdx(\"h4\", null, `GitLab Flow: `, mdx(\"a\", _extends({\n    parentName: \"h4\"\n  }, {\n    \"href\": \"https://docs.gitlab.com/ee/topics/gitlab_flow.html\"\n  }), `https://docs.gitlab.com/ee/topics/gitlab_flow.html`)), mdx(\"h4\", null, `Keep a changelog: `, mdx(\"a\", _extends({\n    parentName: \"h4\"\n  }, {\n    \"href\": \"https://keepachangelog.com/en/1.0.0/\"\n  }), `https://keepachangelog.com/en/1.0.0/`)))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(Left, {\n    mdxType: \"Left\"\n  }, mdx(\"h2\", null, `Links`), mdx(\"h5\", null, `🖼 Presentation`), mdx(\"h4\", null, mdx(\"a\", _extends({\n    parentName: \"h4\"\n  }, {\n    \"href\": \"https://rohit.page/slides/best-practices/\"\n  }), `https://rohit.page/slides/best-practices/`)), mdx(\"h5\", null, `Social`), mdx(\"h4\", null, mdx(\"a\", {\n    href: \"https://twitter.com/rohit_gohri\",\n    target: \"_blank\",\n    style: {\n      color: 'white',\n      textDecoration: 'none'\n    }\n  }, mdx(Icon, {\n    icon: faTwitter,\n    mdxType: \"Icon\"\n  }), ` - @rohit_gohri`)), mdx(\"h4\", null, mdx(\"a\", {\n    href: \"https://github.com/rohit-gohri\",\n    target: \"_blank\",\n    style: {\n      color: 'white',\n      textDecoration: 'none'\n    }\n  }, mdx(Icon, {\n    icon: faGithub,\n    mdxType: \"Icon\"\n  }), ` - rohit-gohri`)))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `The End`), mdx(\"h1\", null, `🥳`)));\n}\n;\nMDXContent.isMDXComponent = true;","slug":"slides/best-practices"}},"pageContext":{"matchPath":"slides/best-practices/*","id":"f02ac13c-a388-5939-a2c0-1b4bc03226d1","slug":"slides/best-practices","title":"Best Practices","headerImg":"photo_2020-01-05_20-24-37.jpg"}},"staticQueryHashes":[]}