{"componentChunkName":"component---src-gatsby-theme-mdx-deck-templates-deck-js","path":"/slides/ci","matchPath":"slides/ci/*","result":{"data":{"site":{"siteMetadata":{"siteUrl":"https://rohit.page"}},"deck":{"id":"36b6de02-0c8e-59fb-9c7b-8c8be00f3248","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 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\": \"Intro To Continuous Integration (CI)\",\n  \"excerpt\": \"Slides for my talk on CI, with an example for a simple ReactJS application.\",\n  \"date\": \"2020-01-10T12:30:00.000+00:00\"\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  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, `Intro to Continuous Integration (CI)`), mdx(Appear, {\n    mdxType: \"Appear\"\n  }, mdx(\"div\", null, mdx(Tomato, {\n    mdxType: \"Tomato\"\n  }, \"Or how to automate the boring parts?\")))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `Hello everyone!`), mdx(\"p\", null, `Today I'm going to talk about the CI part of CI/CD (Continuous Integration & Continuous Delivery), or as how I like to call it, 'How to automate the boring parts'`)), 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 Collegedunia, Gurgaon. I 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(\"h1\", null, `🕕 🕙 🕛 🕞`), mdx(\"h1\", null, `What Is Continuous Integration?`))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `The process of automating the process of testing/building/etc your code as you `, mdx(\"strong\", {\n    parentName: \"p\"\n  }, `push`), ` it so that`), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `problems get detected early`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `your main branch is never in a broken state, and`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `it is `, mdx(\"strong\", {\n    parentName: \"li\"\n  }, `always`), ` deployable`))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Why should you care`, mdx(Tomato, {\n    mdxType: \"Tomato\"\n  }, `?`)), mdx(Appear, {\n    mdxType: \"Appear\"\n  }, mdx(\"div\", null, mdx(Tomato, {\n    mdxType: \"Tomato\"\n  }, \"Well, have you seen or heard any of these?\")))), mdx(\"hr\", null), mdx(Image, {\n    src: \"/images/works-on-my-machine.jpg\",\n    size: \"contain\",\n    mdxType: \"Image\"\n  }), mdx(\"hr\", null), mdx(Image, {\n    src: \"/images/eslint-red-squiggles.png\",\n    size: \"contain\",\n    mdxType: \"Image\"\n  }), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `So, why should you care?`)), mdx(\"ul\", null, mdx(Appear, {\n    mdxType: \"Appear\"\n  }, mdx(\"li\", null, \"Single Source of Truth\"), mdx(\"li\", null, \"Enforce Rules\"), mdx(\"li\", null, \"Faster/Better Code Reviews\"))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Single source of truth: No more \"But it works on my machine\"`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Enforce common rules for teams: Have a linting config? Have a codestyle? Want to enforce sepecific folder structures? Everything can be checked by the CI`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Faster/Better Code Reviews: Having the basic stuff automatically checked leaves the reviewer to focus on the code`))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h2\", null, `Prerequisites for `, mdx(Tomato, {\n    mdxType: \"Tomato\"\n  }, `CI`))), mdx(\"ul\", null, mdx(Appear, {\n    mdxType: \"Appear\"\n  }, mdx(\"li\", null, \"Automated Setup/Containerization\"), mdx(\"li\", null, \"Testability\"), mdx(\"li\", null, \"Reproducibility\"), mdx(\"li\", null, mdx(Tomato, {\n    mdxType: \"Tomato\"\n  }, \"Culture\")))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `There are some things that your project & team need to have before you start this journey.`), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, `Automated Setup`), `: Using things like `, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://docs.docker.com/engine/docker-overview/\"\n  }), `Docker`), ` to make your code portable and easier to run on any machine and/or environments, or using Infrastructure as Code tools like `, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://docs.ansible.com/ansible/latest/user_guide/quickstart.html\"\n  }), `Ansible`), ` to setup systems in an automated way. Having something like means it will be comparitively easy to setup a CI environment in a similar way.`)), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, `Testability`), `: Your code should be testable in an automatic fashion. Could be unit tests, integration tests, api tests through Postman, or UI testing.`)), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, `Reproducibility`), `: Test results should be same in different environments and on repeated runs`)), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, `Culture`), `: All of this is useless if you or your team members don't follow the process. A failing CI pipeline is useless if the branch gets merged anyway.`))), mdx(\"p\", null, `There are also some implicit ones that aren't mentioned like having a version control system (like Git), a Pull/Merge Request based check-in system, etc.`)), mdx(\"hr\", null), mdx(Invert, {\n    mdxType: \"Invert\"\n  }, mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Tools of the Trade 🧰`), mdx(\"img\", {\n    src: \"/images/ci-providers.jpg\",\n    style: {\n      width: '75vh'\n    }\n  })), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `There are lots of options in the market now.`), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Size`, mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Big (Microsoft - Azure)`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Small (Drone.io)`))), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Model`, mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `SaaS (Azure)`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Self-hosted(Jenkins)`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Both (Drone, Gitlab)`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Mixed: SaaS + Self Hosted Runners (Gitlab/Github).`)))), mdx(\"p\", null, `A lot of them are also free for open source projects! So there is no excuse to not use these on your next personal project.`), mdx(\"p\", null, `There are also small niche tools that plug into your existing infra, eg. DangerJS (adding custom project specific checks), Relative-CI (for comparing bundle-sizes), CodeCov for coverage, CodeClimate, etc. These work alongside/through your option of choice above.`))), mdx(\"hr\", null), mdx(\"h1\", null, `Comparison`), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  })), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  })), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  })), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), mdx(ImageIcon, {\n    src: \"/images/logos/GitHub-Actions.svg\",\n    mdxType: \"ImageIcon\"\n  })), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), mdx(ImageIcon, {\n    src: \"/images/logos/gitlab.svg\",\n    mdxType: \"ImageIcon\"\n  })), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), mdx(ImageIcon, {\n    src: \"/images/logos/jenkins.svg\",\n    mdxType: \"ImageIcon\"\n  })), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), mdx(ImageIcon, {\n    src: \"/images/logos/Travis CI logo.svg\",\n    mdxType: \"ImageIcon\"\n  })))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), mdx(\"strong\", null, `Free Tier`)), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  })), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  })), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `2,000 min/month`), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `2,000 min/month`), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `-`), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `1 concurrent build`)), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), mdx(\"strong\", null, `Type`)), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  })), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  })), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `SaaS`), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `SaaS/Self Hosted`), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `Self Hosted`), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `SaaS`)), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), mdx(\"strong\", null, `Run`)), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  })), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  })), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `Commands + Actions`), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `Docker*`), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `Plugins`), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `Commands`)), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), mdx(\"strong\", null, `Integrations`)), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  })), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  })), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `Github`), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `Gitlab + Any Git server`), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `Any Git server`), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), `Github*`)))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Pipelines & YAML`)), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `The code that runs on every push/event is defined in CI Pipelines. You could have multiple pipelines that run on different events, one for tags, one for pull requests, and one for normal pushes. Different providers have different naming conventions.`), mdx(\"p\", null, `YAML(Yet Another Markup Language) is file format for declaring static information, it is used by a lot of popular Infrastructure as Code tools and most CI providers.\nThe format is different for each service.`)), mdx(\"hr\", null), mdx(\"h1\", null, `Demo`), mdx(\"div\", {\n    style: {\n      display: 'flex',\n      flexDirection: 'column'\n    }\n  }, mdx(\"div\", {\n    style: {\n      display: 'flex',\n      alignItems: 'center',\n      fontSize: '32px'\n    }\n  }, mdx(\"a\", {\n    href: \"https://github.com/rohit-gohri/hello-world-ci\",\n    target: \"_blank\"\n  }, \"https://github.com/rohit-gohri/hello-world-ci\")), mdx(\"span\", null, \"\\xA0\\xA0\\xA0\"), mdx(\"img\", {\n    src: \"/images/qr.png\",\n    style: {\n      width: '30vw'\n    }\n  }), mdx(\"span\", null, \"\\xA0\\xA0\\xA0\")), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(Tomato, {\n    mdxType: \"Tomato\"\n  }, \"Send link as message at this time\"), mdx(\"p\", null, `So for the demo I have already set up a simple repository on Github with create-react-app. It's a simple single page ReactJS frontend application.`), mdx(\"p\", null, `I have added configs for 4 CI providers in that single repo. You can check how they are setup later.`), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Github`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Gitlab`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Drone`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Travis`))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Let's see some pipeline results`)), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `Already have 2 PRs open already (one passing and one failing).\nWait for people to do this.`), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Show some results`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `one failing`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `one passing`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `different providers`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Lastly focus on Github Actions results to associate with next slide`))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `How did this happen?`), mdx(\"p\", null, `Let's look at one example config: `, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, `.github/workflows/nodejs.yml`))), mdx(\"hr\", null), mdx(CodeSurfer, {\n    theme: codeTheme,\n    title: \"nodejs.yml\",\n    mdxType: \"CodeSurfer\"\n  }, mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"title=\\\"nodejs.yml\\\" subtitle=\\\"Github Actions\\\" file=../data/code/nodejs.yml\",\n    \"title\": \"\\\"nodejs.yml\\\"\",\n    \"subtitle\": \"\\\"Github\",\n    \"Actions\\\"\": true,\n    \"file\": \"../data/code/nodejs.yml\"\n  }), `name: Node CI\n\non:\n- pull_request\n- push\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n\n    - name: Use Node.js 12.x\n      uses: actions/setup-node@v1\n      with:\n        node-version: 12.x\n\n    - name: Install node_modules\n      run: |\n        npm ci\n\n    - name: Lint the code\n      run: |\n        npm run lint\n\n    - name: Run tests\n      run: |\n        npm test\n      env:\n        NODE_ENV: test\n\n    - name: Build site\n      run: |\n        npm run build\n`)), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"3:5 title=\\\"When to run\\\" subtitle=\\\"Github Actions\\\" file=../data/code/nodejs.yml\",\n    \"3:5\": true,\n    \"title\": \"\\\"When\",\n    \"to\": true,\n    \"run\\\"\": true,\n    \"subtitle\": \"\\\"Github\",\n    \"Actions\\\"\": true,\n    \"file\": \"../data/code/nodejs.yml\"\n  }), `name: Node CI\n\non:\n- pull_request\n- push\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n\n    - name: Use Node.js 12.x\n      uses: actions/setup-node@v1\n      with:\n        node-version: 12.x\n\n    - name: Install node_modules\n      run: |\n        npm ci\n\n    - name: Lint the code\n      run: |\n        npm run lint\n\n    - name: Run tests\n      run: |\n        npm test\n      env:\n        NODE_ENV: test\n\n    - name: Build site\n      run: |\n        npm run build\n`)), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"10\": true,\n    \"className\": \"language-yaml\",\n    \"metastring\": \"10 title=\\\"Base system image\\\" subtitle=\\\"Github Actions\\\" file=../data/code/nodejs.yml\",\n    \"title\": \"\\\"Base\",\n    \"system\": true,\n    \"image\\\"\": true,\n    \"subtitle\": \"\\\"Github\",\n    \"Actions\\\"\": true,\n    \"file\": \"../data/code/nodejs.yml\"\n  }), `name: Node CI\n\non:\n- pull_request\n- push\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n\n    - name: Use Node.js 12.x\n      uses: actions/setup-node@v1\n      with:\n        node-version: 12.x\n\n    - name: Install node_modules\n      run: |\n        npm ci\n\n    - name: Lint the code\n      run: |\n        npm run lint\n\n    - name: Run tests\n      run: |\n        npm test\n      env:\n        NODE_ENV: test\n\n    - name: Build site\n      run: |\n        npm run build\n`)), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"15:18 title=\\\"Setup NodeJS\\\" subtitle=\\\"Github Actions\\\" file=../data/code/nodejs.yml\",\n    \"15:18\": true,\n    \"title\": \"\\\"Setup\",\n    \"NodeJS\\\"\": true,\n    \"subtitle\": \"\\\"Github\",\n    \"Actions\\\"\": true,\n    \"file\": \"../data/code/nodejs.yml\"\n  }), `name: Node CI\n\non:\n- pull_request\n- push\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n\n    - name: Use Node.js 12.x\n      uses: actions/setup-node@v1\n      with:\n        node-version: 12.x\n\n    - name: Install node_modules\n      run: |\n        npm ci\n\n    - name: Lint the code\n      run: |\n        npm run lint\n\n    - name: Run tests\n      run: |\n        npm test\n      env:\n        NODE_ENV: test\n\n    - name: Build site\n      run: |\n        npm run build\n`)), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"20:22 title=\\\"Run command\\\" subtitle=\\\"Github Actions\\\" file=../data/code/nodejs.yml\",\n    \"20:22\": true,\n    \"title\": \"\\\"Run\",\n    \"command\\\"\": true,\n    \"subtitle\": \"\\\"Github\",\n    \"Actions\\\"\": true,\n    \"file\": \"../data/code/nodejs.yml\"\n  }), `name: Node CI\n\non:\n- pull_request\n- push\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n\n    - name: Use Node.js 12.x\n      uses: actions/setup-node@v1\n      with:\n        node-version: 12.x\n\n    - name: Install node_modules\n      run: |\n        npm ci\n\n    - name: Lint the code\n      run: |\n        npm run lint\n\n    - name: Run tests\n      run: |\n        npm test\n      env:\n        NODE_ENV: test\n\n    - name: Build site\n      run: |\n        npm run build\n`)), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"30:32 title=\\\"Env Var overrides\\\" subtitle=\\\"Github Actions\\\" file=../data/code/nodejs.yml\",\n    \"30:32\": true,\n    \"title\": \"\\\"Env\",\n    \"Var\": true,\n    \"overrides\\\"\": true,\n    \"subtitle\": \"\\\"Github\",\n    \"Actions\\\"\": true,\n    \"file\": \"../data/code/nodejs.yml\"\n  }), `name: Node CI\n\non:\n- pull_request\n- push\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n\n    - name: Use Node.js 12.x\n      uses: actions/setup-node@v1\n      with:\n        node-version: 12.x\n\n    - name: Install node_modules\n      run: |\n        npm ci\n\n    - name: Lint the code\n      run: |\n        npm run lint\n\n    - name: Run tests\n      run: |\n        npm test\n      env:\n        NODE_ENV: test\n\n    - name: Build site\n      run: |\n        npm run build\n`))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `It is written in YAML. This file defines a pipeline that will be run whenever you push your code. Some providers allow triggering multiple pipelines. Let's look a little closer:`), mdx(\"p\", null, `CodeSnippets:`), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, `This is the action (Docker image) which will run for the current stage of the pipeline`), mdx(\"li\", {\n    parentName: \"ol\"\n  }, `Any env variable overrides can be specified`)), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Can be used to turn off some features`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Or Logging/Monitoring/etc.`)), mdx(\"ol\", {\n    \"start\": 3\n  }, mdx(\"li\", {\n    parentName: \"ol\"\n  }, `These are jobs defined that we saw in the UI`))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Let's add a new stage`), mdx(\"p\", null, `report-coverage: `, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, `npx codecov`))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `Now that you have seen a basic pipeline config, and seen the result of one in a project. Let's try to extend it.`), mdx(\"p\", null, `We have some tests already setup already in `, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, `package.json`), `. You can run it through the `, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, `npm run test`), ` cmd.`), mdx(\"p\", null, `We'll adding coverage reports using CodeCov, coverage is the percentage of code that is run during your tests.\nHigher coverage means your tests are checking a higher percentage of code.`), mdx(\"p\", null, `Codecov is an online tool to view these coverage reports with some pretty graphs and compare them across branches and PRs.`)), mdx(\"hr\", null), mdx(CodeSurfer, {\n    theme: codeTheme,\n    mdxType: \"CodeSurfer\"\n  }, mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"28:36 title=\\\"Old File\\\" subtitle=\\\"Github Actions\\\" file=../data/code/nodejs.yml\",\n    \"28:36\": true,\n    \"title\": \"\\\"Old\",\n    \"File\\\"\": true,\n    \"subtitle\": \"\\\"Github\",\n    \"Actions\\\"\": true,\n    \"file\": \"../data/code/nodejs.yml\"\n  }), `name: Node CI\n\non:\n- pull_request\n- push\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n\n    - name: Use Node.js 12.x\n      uses: actions/setup-node@v1\n      with:\n        node-version: 12.x\n\n    - name: Install node_modules\n      run: |\n        npm ci\n\n    - name: Lint the code\n      run: |\n        npm run lint\n\n    - name: Run tests\n      run: |\n        npm test\n      env:\n        NODE_ENV: test\n\n    - name: Build site\n      run: |\n        npm run build\n`)), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"28:41 title=\\\"With coverage\\\" subtitle=\\\"Github Actions\\\" file=../data/code/cover.nodejs.yml\",\n    \"28:41\": true,\n    \"title\": \"\\\"With\",\n    \"coverage\\\"\": true,\n    \"subtitle\": \"\\\"Github\",\n    \"Actions\\\"\": true,\n    \"file\": \"../data/code/cover.nodejs.yml\"\n  }), `name: Node CI\n\non:\n- pull_request\n- push\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n\n    - name: Use Node.js 12.x\n      uses: actions/setup-node@v1\n      with:\n        node-version: 12.x\n\n    - name: Install node_modules\n      run: |\n        npm ci\n\n    - name: Lint the code\n      run: |\n        npm run lint\n\n    - name: Run tests (with coverage)\n      run: |\n        npm test -- --coverage\n      env:\n        NODE_ENV: test\n    \n    - name: Upload coverage\n      run: npx codecov\n      env:\n        CODECOV_TOKEN:  \\${{ secrets.CODECOV_TOKEN }} \n\n    - name: Build site\n      run: |\n        npm run build\n`))), mdx(\"hr\", null), mdx(CodeSurferColumns, {\n    themes: [codeTheme, codeTheme],\n    mdxType: \"CodeSurferColumns\"\n  }, mdx(Step, {\n    title: \"Diff\",\n    mdxType: \"Step\"\n  }, mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"28:36 subtitle=\\\"Old File\\\" file=../data/code/nodejs.yml\",\n    \"28:36\": true,\n    \"subtitle\": \"\\\"Old\",\n    \"File\\\"\": true,\n    \"file\": \"../data/code/nodejs.yml\"\n  }), `name: Node CI\n\non:\n- pull_request\n- push\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n\n    - name: Use Node.js 12.x\n      uses: actions/setup-node@v1\n      with:\n        node-version: 12.x\n\n    - name: Install node_modules\n      run: |\n        npm ci\n\n    - name: Lint the code\n      run: |\n        npm run lint\n\n    - name: Run tests\n      run: |\n        npm test\n      env:\n        NODE_ENV: test\n\n    - name: Build site\n      run: |\n        npm run build\n`)), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"28:41 subtitle=\\\"With coverage\\\" file=../data/code/cover.nodejs.yml\",\n    \"28:41\": true,\n    \"subtitle\": \"\\\"With\",\n    \"coverage\\\"\": true,\n    \"file\": \"../data/code/cover.nodejs.yml\"\n  }), `name: Node CI\n\non:\n- pull_request\n- push\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n\n    - name: Use Node.js 12.x\n      uses: actions/setup-node@v1\n      with:\n        node-version: 12.x\n\n    - name: Install node_modules\n      run: |\n        npm ci\n\n    - name: Lint the code\n      run: |\n        npm run lint\n\n    - name: Run tests (with coverage)\n      run: |\n        npm test -- --coverage\n      env:\n        NODE_ENV: test\n    \n    - name: Upload coverage\n      run: npx codecov\n      env:\n        CODECOV_TOKEN:  \\${{ secrets.CODECOV_TOKEN }} \n\n    - name: Build site\n      run: |\n        npm run build\n`)))), mdx(\"hr\", null), mdx(Image, {\n    src: \"/images/codecov-result.png\",\n    size: \"contain\",\n    mdxType: \"Image\"\n  }), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `This is what it got us.`)), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Some Advanced Usage Patterns`)), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Publishing an npm module`), mdx(\"h3\", null, `On every release`)), mdx(\"hr\", null), mdx(CodeSurfer, {\n    theme: codeTheme,\n    mdxType: \"CodeSurfer\"\n  }, mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"3:6 title=\\\"On every tag\\\" subtitle=\\\"Github Actions\\\" file=../data/code/npm.nodejs.yml\",\n    \"3:6\": true,\n    \"title\": \"\\\"On\",\n    \"every\": true,\n    \"tag\\\"\": true,\n    \"subtitle\": \"\\\"Github\",\n    \"Actions\\\"\": true,\n    \"file\": \"../data/code/npm.nodejs.yml\"\n  }), `name: Node CI with Publish\n\non:\n  push:\n    tags:\n      - 'v*'\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n\n    - name: Use Node.js 12.x\n      uses: actions/setup-node@v1\n      with:\n        node-version: 12.x\n        registry-url: 'https://registry.npmjs.org'\n\n    - name: Install node_modules\n      run: |\n        npm ci\n\n    - name: Lint the code\n      run: |\n        npm run lint\n\n    - name: Run tests\n      run: |\n        npm test\n      env:\n        NODE_ENV: test\n\n    - name: Build site\n      run: |\n        npm run build\n    \n    - name: Publish to npm\n      run: npm publish\n      env:\n        NODE_AUTH_TOKEN: \\${{ secrets.NPM_TOKEN }}\n`)), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"40:43 title=\\\"Publish NPM Package\\\" subtitle=\\\"Github Actions\\\" file=../data/code/npm.nodejs.yml\",\n    \"40:43\": true,\n    \"title\": \"\\\"Publish\",\n    \"NPM\": true,\n    \"Package\\\"\": true,\n    \"subtitle\": \"\\\"Github\",\n    \"Actions\\\"\": true,\n    \"file\": \"../data/code/npm.nodejs.yml\"\n  }), `name: Node CI with Publish\n\non:\n  push:\n    tags:\n      - 'v*'\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n\n    - name: Use Node.js 12.x\n      uses: actions/setup-node@v1\n      with:\n        node-version: 12.x\n        registry-url: 'https://registry.npmjs.org'\n\n    - name: Install node_modules\n      run: |\n        npm ci\n\n    - name: Lint the code\n      run: |\n        npm run lint\n\n    - name: Run tests\n      run: |\n        npm test\n      env:\n        NODE_ENV: test\n\n    - name: Build site\n      run: |\n        npm run build\n    \n    - name: Publish to npm\n      run: npm publish\n      env:\n        NODE_AUTH_TOKEN: \\${{ secrets.NPM_TOKEN }}\n`))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"p\", null, `NPM modules can automatically be published after building and testing on every git tag release.`)), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Publishing docs to Github Pages`), mdx(\"h3\", null, `On every release`)), mdx(\"hr\", null), mdx(CodeSurfer, {\n    theme: codeTheme,\n    mdxType: \"CodeSurfer\"\n  }, mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"10:16 title=\\\"Build Docs\\\" subtitle=\\\"Drone.io\\\" file=../data/code/docs.drone.yml\",\n    \"10:16\": true,\n    \"title\": \"\\\"Build\",\n    \"Docs\\\"\": true,\n    \"subtitle\": \"\\\"Drone.io\\\"\",\n    \"file\": \"../data/code/docs.drone.yml\"\n  }), `kind: pipeline\nname: default\n\nsteps:\n- name: install\n  image: node:12\n  commands:\n  - yarn\n\n- name: docs\n  image: node:12\n  commands:\n  - yarn docs\n  when:\n    event:\n    - tag\n\n- name: commit-and-push-docs\n  image: docker:git\n  environment:\n    GITHUB_TOKEN:\n      from_secret: github_token\n  commands:\n    - git add docs\n    - git commit -m \"Updating docs, \\`date\\`\"\n    - git remote add origin-docs https://$GITHUB_TOKEN@github.com/$DRONE_REPO.git\n    - git push --set-upstream origin-docs master\n  when:\n    event:\n    - tag\n`)), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"18:30 title=\\\"Publish Docs\\\" subtitle=\\\"Drone.io\\\" file=../data/code/docs.drone.yml\",\n    \"18:30\": true,\n    \"title\": \"\\\"Publish\",\n    \"Docs\\\"\": true,\n    \"subtitle\": \"\\\"Drone.io\\\"\",\n    \"file\": \"../data/code/docs.drone.yml\"\n  }), `kind: pipeline\nname: default\n\nsteps:\n- name: install\n  image: node:12\n  commands:\n  - yarn\n\n- name: docs\n  image: node:12\n  commands:\n  - yarn docs\n  when:\n    event:\n    - tag\n\n- name: commit-and-push-docs\n  image: docker:git\n  environment:\n    GITHUB_TOKEN:\n      from_secret: github_token\n  commands:\n    - git add docs\n    - git commit -m \"Updating docs, \\`date\\`\"\n    - git remote add origin-docs https://$GITHUB_TOKEN@github.com/$DRONE_REPO.git\n    - git push --set-upstream origin-docs master\n  when:\n    event:\n    - tag\n`))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Docs can be generated from a Swagger file, JSDoc/JavaDoc, Postman collection etc.`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `And published to free static hosting like github pages, netlify, etc.`))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Code Deployments`), mdx(\"h3\", null, `Using PM2's deploy feature`)), mdx(\"hr\", null), mdx(CodeSurfer, {\n    theme: codeTheme,\n    mdxType: \"CodeSurfer\"\n  }, mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"38:41 title=\\\"Deploy the Code\\\" subtitle=\\\"Gitlab CI\\\" file=../data/code/trigger.gitlab-ci.yml\",\n    \"38:41\": true,\n    \"title\": \"\\\"Deploy\",\n    \"the\": true,\n    \"Code\\\"\": true,\n    \"subtitle\": \"\\\"Gitlab\",\n    \"CI\\\"\": true,\n    \"file\": \"../data/code/trigger.gitlab-ci.yml\"\n  }), `# http://docs.gitlab.com/ce/ci/yaml/README.html\n\n# https://hub.docker.com/r/library/node/tags/\nimage: node:12\n\nvariables:\n  CI: \"true\"\n  NODE_ENV: \"test\"\n\ncache:\n  paths:\n    - node_modules/\n\nbefore_script:\n  - npm install --unsafe-perm\n\nstages:\n  - test\n  - build\n  - deploy\n  - downstream\n\ntest:\n  stage: test\n  script:\n    - npm test\n\nlint:\n  stage: test\n  script:\n    - npm run lint\n\nbuild:\n  stage: build\n  script:\n    - npm run build\n\ndeploy:\n  stage: deploy\n  script:\n    - pm2 deploy dev\n\ntrigger-consumer:\n  stage: downstream\n  trigger: user/api-consumer\n      \ntrigger-frontend:\n  stage: downstream\n  trigger: \n    project: user/project-frontend\n    branch: dev\n`))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Automated deploys can be initiated by the CI`), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `SSH keys and other secrets can be provided through env variables`))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `Trigger Other Pipelines`), mdx(\"h3\", null, `Perform integration tests across API and frontend`)), mdx(\"hr\", null), mdx(CodeSurfer, {\n    theme: codeTheme,\n    mdxType: \"CodeSurfer\"\n  }, mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yaml\",\n    \"metastring\": \"43:51 title=\\\"Trigger Downstream Pipelines\\\" subtitle=\\\"Gitlab CI\\\" file=../data/code/trigger.gitlab-ci.yml\",\n    \"43:51\": true,\n    \"title\": \"\\\"Trigger\",\n    \"Downstream\": true,\n    \"Pipelines\\\"\": true,\n    \"subtitle\": \"\\\"Gitlab\",\n    \"CI\\\"\": true,\n    \"file\": \"../data/code/trigger.gitlab-ci.yml\"\n  }), `# http://docs.gitlab.com/ce/ci/yaml/README.html\n\n# https://hub.docker.com/r/library/node/tags/\nimage: node:12\n\nvariables:\n  CI: \"true\"\n  NODE_ENV: \"test\"\n\ncache:\n  paths:\n    - node_modules/\n\nbefore_script:\n  - npm install --unsafe-perm\n\nstages:\n  - test\n  - build\n  - deploy\n  - downstream\n\ntest:\n  stage: test\n  script:\n    - npm test\n\nlint:\n  stage: test\n  script:\n    - npm run lint\n\nbuild:\n  stage: build\n  script:\n    - npm run build\n\ndeploy:\n  stage: deploy\n  script:\n    - pm2 deploy dev\n\ntrigger-consumer:\n  stage: downstream\n  trigger: user/api-consumer\n      \ntrigger-frontend:\n  stage: downstream\n  trigger: \n    project: user/project-frontend\n    branch: dev\n`))), mdx(Notes, {\n    mdxType: \"Notes\"\n  }, mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Pipelines can be triggered for dependent projects after every release`))), 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, `Links`), mdx(\"h5\", null, `🖼 Presentation`), mdx(\"h4\", null, mdx(\"a\", _extends({\n    parentName: \"h4\"\n  }, {\n    \"href\": \"https://rohit.page/slides/ci\"\n  }), `https://rohit.page/slides/ci`)), mdx(\"h5\", null, `💻 Repository`), mdx(\"h4\", null, mdx(\"a\", _extends({\n    parentName: \"h4\"\n  }, {\n    \"href\": \"https://github.com/rohit-gohri/hello-world-ci\"\n  }), `https://github.com/rohit-gohri/hello-world-ci`)), 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(\"p\", null, `My presentation is also a js project (built with mdx-deck). Feel free to check it out and suggest any changes.`), mdx(\"p\", null, `Links:`), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Repo: `, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://github.com/rohit-gohri/hello-world-ci\"\n  }), `https://github.com/rohit-gohri/hello-world-ci`)), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Slides: `, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://rohit.page/slides/ci\"\n  }), `https://rohit.page/slides/ci`)), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Twitter: `, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://twitter.com/rohit_gohri\"\n  }), `https://twitter.com/rohit_gohri`)), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Github: `, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://github.com/rohit-gohri\"\n  }), `https://github.com/rohit-gohri`)), mdx(\"li\", {\n    parentName: \"ul\"\n  }, `Getting Started: `, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://help.github.com/en/actions/getting-started-with-github-actions\"\n  }), `https://help.github.com/en/actions/getting-started-with-github-actions`)))), mdx(\"hr\", null), mdx(Center, {\n    mdxType: \"Center\"\n  }, mdx(\"h1\", null, `The End`), mdx(\"h1\", null, `🥳`)));\n}\n;\nMDXContent.isMDXComponent = true;","slug":"slides/ci"}},"pageContext":{"matchPath":"slides/ci/*","id":"36b6de02-0c8e-59fb-9c7b-8c8be00f3248","slug":"slides/ci","title":"Intro to Continuous Integration (CI)","headerImg":"photo_2020-01-05_20-24-37.jpg"}},"staticQueryHashes":[]}