<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nitish Gadangi</title>
    <description>The latest articles on DEV Community by Nitish Gadangi (@nitishgadangi).</description>
    <link>https://dev.to/nitishgadangi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F374477%2Fdfff7429-d59a-44e2-80b9-60e36a979f66.jpeg</url>
      <title>DEV Community: Nitish Gadangi</title>
      <link>https://dev.to/nitishgadangi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nitishgadangi"/>
    <language>en</language>
    <item>
      <title>Android CI/CD with GitLab — Slack bot that can build Apks on the fly.</title>
      <dc:creator>Nitish Gadangi</dc:creator>
      <pubDate>Sun, 02 May 2021 06:42:57 +0000</pubDate>
      <link>https://dev.to/nitishgadangi/android-ci-cd-with-gitlab-slack-bot-that-can-build-apks-on-the-fly-50k8</link>
      <guid>https://dev.to/nitishgadangi/android-ci-cd-with-gitlab-slack-bot-that-can-build-apks-on-the-fly-50k8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I recently realized most of the Engineers at our workplace have stuck in this constant loop of Building Apks and passing it over to the QA team on Slack. All that we do every time is, manually build the Apk from the feature branch which we are working on and upload it to Slack for the QA team to get it tested. If any changes come in between or later the loop goes on again. You got the point right! So, Why do it manually when you can make it automated. 🤷‍♂️&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So let's use the power of GitLab CI and combine it with Slack API to build a bot that will give you the list of all the available branches on our repo, and on select, the corresponding repo will be built and Apk will be uploaded to Slack.&lt;/p&gt;

&lt;h1&gt;
  
  
  Goals
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt; Interactive Slack-bot that displays all available branches on the repo. (We will be using &lt;a href="https://api.slack.com/legacy/message-menus"&gt;Message Menus&lt;/a&gt; from Slack API)&lt;/li&gt;
&lt;li&gt; Setup a GitLab CI with a job that will run only when &lt;a href="https://docs.gitlab.com/ee/ci/triggers/"&gt;triggered&lt;/a&gt; by our Slack-bot.&lt;/li&gt;
&lt;li&gt; Automatically build app variants on CI for selected repo on slack and upload it back to slack.&lt;/li&gt;
&lt;li&gt; Additionally, let's add few more features like options to check the status of the CI Job. Help command that provides instructions on how to use the bot. (We will be using &lt;a href="https://api.slack.com/interactivity/slash-commands"&gt;slash commands&lt;/a&gt; from Slack API).&lt;/li&gt;
&lt;li&gt; Finally, let's ensure that the Specific user who requested for Apk is pinged when the Apk build is successfully finished.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  TL;DR
&lt;/h1&gt;

&lt;p&gt;If you are right way interested to dig into code. Here is the spoiler. Also, you can show right to the bottom to check out the final functionality.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/NitishGadangi"&gt;
        NitishGadangi
      &lt;/a&gt; / &lt;a href="https://github.com/NitishGadangi/apk-dispatcher-slack-bot"&gt;
        apk-dispatcher-slack-bot
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🤖 Slack Bot that uses the power of GitlabCI to build and give you the APKs from Gitlab for specified branches
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h1&gt;
  
  
  Required Ingredients
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt; We need a CI/CD instance for this. Fortunately, GitLab has a simple and free CI/CD system that is available in private repositories.&lt;/li&gt;
&lt;li&gt; You must have permission to create a new Slack App and launch it in your Workspace.&lt;/li&gt;
&lt;li&gt; As we are going to use Slash commands for Slack-bot, we need an HTTP instance that responds to calls from Slack. (We will be using a simple Node.js app deployed on Heroku)&lt;/li&gt;
&lt;li&gt; Obviously some basic understanding of how CI/CD works and some knowledge on Node.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Let's start cooking…
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n2K8Gojc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/3548/1%2A0uoIFZUYSi680yq4-BQBmA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n2K8Gojc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/3548/1%2A0uoIFZUYSi680yq4-BQBmA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  GitLab Setup
&lt;/h2&gt;

&lt;p&gt;You need to add CI/CD configuration file to you GitLab repo. This can be done by adding &lt;code&gt;**.gitlab-ci.yml**&lt;/code&gt;  file to the Android project root. For further detailed walkthrough you can always go through the documentation &lt;a href="https://gitlab.com/help/ci/quick_start/README"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AZ3AtfFO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/2150/1%2AVbZsz12NQkBYrYZjqHe_EQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AZ3AtfFO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/2150/1%2AVbZsz12NQkBYrYZjqHe_EQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The CI configuration yml file essential consists all the instructions required to run the CI pipeline. For environment setup, we can run the standard Android SDK instance. However, we can use the &lt;a href="https://docs.docker.com/get-started/part2"&gt;Docker image&lt;/a&gt; by &lt;a href="https://github.com/jangrewe/gitlab-ci-android"&gt;Jangrewe&lt;/a&gt; which is pre-configured for Android. Later we need to add remaining instructions that help to build Apk and upload on to slack. Here is how it looks finally.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Before moving further let's look into the above configuration file and understand keyword and their use:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;code&gt;**image:**&lt;/code&gt; This tag is used to specify a Docker image to be used for execution. Gitlab runners will use this Docker image to run the pipeline.&lt;/li&gt;
&lt;li&gt; &lt;code&gt;**cache:**&lt;/code&gt; Caching the Gradle folder significantly reduces the build time when generating multiple builds. The cache will be downloaded and extracted at the beginning and uploaded at the end of every job. &lt;code&gt;${CI_PROJECT_ID}&lt;/code&gt;is the unique project ID in Gitlab.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, we define a &lt;strong&gt;job&lt;/strong&gt; to build a debug APK and its contents are explained below.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;code&gt;**stages:**&lt;/code&gt; This signifies which stage the job belongs to.&lt;/li&gt;
&lt;li&gt; &lt;code&gt;**before_script:**&lt;/code&gt; This is used to set up stuff before the actual work is started. In our case, we set &lt;code&gt;GRADLE_USER_HOME&lt;/code&gt; to avoid using the complete path to gradle, and make the gradlew executable.&lt;/li&gt;
&lt;li&gt; &lt;code&gt;**rules:**&lt;/code&gt; Here, we can define various conditions such that the job runs only when based on these specified &lt;a href="https://docs.gitlab.com/ee/ci/yaml/#rules"&gt;rules&lt;/a&gt;. As we need our job to be running only when triggered manually, we are adding an if condition specifying the &lt;code&gt;$CI_PIPELINE_SOURCE&lt;/code&gt; must be a &lt;a href="https://docs.gitlab.com/ee/ci/triggers/"&gt;trigger&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt; &lt;code&gt;**script:**&lt;/code&gt; The shell script executed by the Gitlab Runner. It is the only mandatory keyword for a job to run.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;  Firstly, we run the command to assemble the debug build&lt;/li&gt;
&lt;li&gt;  After the build is generated, we use &lt;strong&gt;curl,&lt;/strong&gt; a command line tool to transfer data.&lt;/li&gt;
&lt;li&gt;  Also, &lt;code&gt;${SLACK_CHANNEL_ID}&lt;/code&gt; and &lt;code&gt;${SLACK_REFERRER_ID}&lt;/code&gt; are used to refer to the channel from where user triggered the pipeline and the corresponding user id for mentioning him to give a notification. These two variables will be sent by our Node.js App which inturn is triggered by Slack-bot.&lt;/li&gt;
&lt;li&gt;  Similarly we also used &lt;code&gt;${CI_COMMIT_REF_NAME}&lt;/code&gt; and &lt;code&gt;${CI_PIPELINE_ID}&lt;/code&gt; to add more info to the message along with the Apk.&lt;/li&gt;
&lt;li&gt;  Finally for file upload, Slack defines a pretty easy-to-use &lt;a href="https://api.slack.com/methods/files.upload"&gt;API&lt;/a&gt;. Put the file name of generated APK (for example, &lt;em&gt;app-debug.apk&lt;/em&gt;). If your gradle generates distinct build names as per the build version/type then use the find command with the initial characters of the file, as shown above.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Node.js App setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As we gonna use &lt;a href="https://api.slack.com/interactivity/slash-commands"&gt;slash commands&lt;/a&gt; for our slack bot, we need to have a server application that can respond to incoming requests from slack-api. I would like to keep things as short as possible. Here we go.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Clone this repo (&lt;a href="https://github.com/NitishGadangi/apk-dispatcher-slack-bot"&gt;apk-dispatcher-slack-bot&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt; Here we can observe we will be having the base route as &lt;code&gt;/android&lt;/code&gt; under which there 4 more post routers available.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;/android/actions&lt;/code&gt; is used as Request URL for Interactivity actions in slack. Any interactions interactive components (such as buttons, select menus, and datepickers) will be sent to this end point.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;/android/get_apk&lt;/code&gt; , &lt;code&gt;/android/help&lt;/code&gt; , &lt;code&gt;/android/get_status&lt;/code&gt; are triggered from slash commands and each of it will do corresponding actions and post the response back to slack-api.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also need to provide the environment variables by placing them in .env file or placing in Config vars(in case you use heroku) when deployed. We get back to this part later for now you can deploy the project directly.&lt;/p&gt;

&lt;p&gt;That being said you can always look at the complete code base to get more clarity on what actually happening in the back. Anyway lets move forward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slack App setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lastly, we need to create own slack app for our workspace and link it to our node.js app.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Login to your slack workspace, or create one at &lt;a href="https://slack.com/create#email"&gt;Slack Workspace&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt; Go to the &lt;a href="https://api.slack.com/apps"&gt;Apps&lt;/a&gt; section, and create a new app. All you need to enter is App Name, and select the workspace from drop down. In the first page of App Settings add in basic details of your app under display info section.&lt;/li&gt;
&lt;li&gt; Under Features go to &lt;strong&gt;OAuth &amp;amp; Permissions,&lt;/strong&gt; first install the app to your works space and copy and secure the &lt;code&gt;Bot User OAuth Token.&lt;/code&gt; And below under &lt;strong&gt;Scopes&lt;/strong&gt; section add the following &lt;strong&gt;OAuth Scopes,&lt;/strong&gt; &lt;a href="https://api.slack.com/scopes/commands"&gt;commands&lt;/a&gt; and &lt;a href="https://api.slack.com/scopes/files:write"&gt;files:write&lt;/a&gt; .&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0ENkcb-u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1600/1%2AYSOMyGqiqeZqc6j74QXP4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0ENkcb-u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1600/1%2AYSOMyGqiqeZqc6j74QXP4g.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4. Next go to &lt;strong&gt;Interactivity &amp;amp; Shortcuts&lt;/strong&gt; section under &lt;strong&gt;Features&lt;/strong&gt; . Turn on the &lt;strong&gt;Interactivity&lt;/strong&gt; and paste the &lt;code&gt;/actions&lt;/code&gt; end point of your Node.js App after its deployment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6nTkX71O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1600/1%2AtiuO6FhNkJjw_Gt-WIzi1w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6nTkX71O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1600/1%2AtiuO6FhNkJjw_Gt-WIzi1w.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5. Finally, go to &lt;strong&gt;Slash Commands&lt;/strong&gt; section under features and &lt;strong&gt;Create new command.&lt;/strong&gt; Here we are planning to have 3 slash commands and therefore we have 3 corresponding endpoints in our backend. Add the slash commands, its request URL and the description as required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tZ3j7P6Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1734/1%2AGamNQraj9PoTAyyEcC8GEw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tZ3j7P6Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1734/1%2AGamNQraj9PoTAyyEcC8GEw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Slack App is ready and we are good to go. However, we have to bind together all the pieces in order to make them work together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lets bind all of them…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As we have discussed before, we need to specify the environment variables In our Node App in order to make it functional. Let look in how we can fetch each of those environment variables and later we can place them into &lt;a href="https://devcenter.heroku.com/articles/config-vars"&gt;Config Vars&lt;/a&gt; in out Heroku settings.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;**SLACK_CHANNEL_ACCESS_TOKEN:**&lt;/code&gt; This can be fetched from &lt;strong&gt;OAuth &amp;amp; Permissions&lt;/strong&gt; section from your Slack App setup. It has been discussed above in step-3 of Slack App setup.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;**AUTH_TOKEN:**&lt;/code&gt;  This is basically your GitLab Personal Access Token. You can fetch it from your &lt;a href="https://gitlab.com/-/profile/personal_access_tokens"&gt;GitLab profile preferences → Access token&lt;/a&gt; and create one for you. (scope &lt;code&gt;read_repository&lt;/code&gt; is enough for our use case).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;**TRIGGER_TOKEN:**&lt;/code&gt;  Go to your GitLab repo Settings → CI/CD and under &lt;strong&gt;Pipeline triggers&lt;/strong&gt; , add trigger. Copy the Token and that will be your &lt;code&gt;TRIGGER_TOKEN&lt;/code&gt; . You can read more about triggers from &lt;a href="https://docs.gitlab.com/ee/ci/triggers/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;**PROJECT_ID:**&lt;/code&gt;  Under the same &lt;strong&gt;Pipeline triggers&lt;/strong&gt; section from cUrl copy the project id. You can refer the below image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LXusvfog--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/2076/1%2AAUF7O2_Oj_WsmiN5HoQXTQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LXusvfog--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/2076/1%2AAUF7O2_Oj_WsmiN5HoQXTQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we got all the variables required lets place it in the &lt;a href="https://devcenter.heroku.com/articles/config-vars"&gt;Config Vars&lt;/a&gt; section in Heroku, and the final state looks like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X4LkkjYS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/2042/1%2AHdjvLhHSkEXq7vyF-2EmzA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X4LkkjYS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/2042/1%2AHdjvLhHSkEXq7vyF-2EmzA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finally, lets test the functionality…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Jump on to your slack workspace and invite our all new Slack bot to any channel where you want to use it. Start typing any slack commands by typing &lt;code&gt;**/**&lt;/code&gt;  followed by the command. Slack will automatically start suggesting all the available slash commands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z67Eeilk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1004/1%2AyDSvBriB-_iOvfjx4mxmxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z67Eeilk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1004/1%2AyDSvBriB-_iOvfjx4mxmxw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All three slash commands which we have added before are listed.&lt;/p&gt;

&lt;p&gt;Here we are having 3 slash commands lets test all of them.&lt;/p&gt;

&lt;p&gt;Doing &lt;code&gt;**/help**&lt;/code&gt; will give us the following instructions on how to use the bot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hgsbo2yL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1672/1%2Az_F2whjrfH1dhpPstClQqg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hgsbo2yL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1672/1%2Az_F2whjrfH1dhpPstClQqg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Doing &lt;code&gt;**/get_apk**&lt;/code&gt;  will prompt you with a drop-down menu asking you to select a branch from which you want to get build and get the apk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---lyfuoed--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1694/1%2AB3OsguD_Bdi8EleEwkqS4A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---lyfuoed--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1694/1%2AB3OsguD_Bdi8EleEwkqS4A.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you select any branch it will give you details about the branch selected and estimated time for the build. Also a ticked_id is provided which can be later used to know the status of the pipeline if required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o5-dzY4O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1672/1%2ANzl1EmrJk6gT_kaMktdbAg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o5-dzY4O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1672/1%2ANzl1EmrJk6gT_kaMktdbAg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The given ticked_id can be use in combination with &lt;code&gt;**/get_status**&lt;/code&gt;  to know the status of the build process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yB0n_QEG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1684/1%2ADnFGT5a3NQoVo9P9K4eu9w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yB0n_QEG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1684/1%2ADnFGT5a3NQoVo9P9K4eu9w.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, once the build has finished the bot will ping you with the final Apk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T57XcP5E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1676/1%2AeedzaHYr-yKBzUif5wHwaQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T57XcP5E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1676/1%2AeedzaHYr-yKBzUif5wHwaQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yeah! That's the whole App that we have built. You can always extend it further by adding more slash commands or adding more instructions to the CI config. Anyway, I would say this is more than enough.&lt;/p&gt;

&lt;p&gt;That being said I hope you have understood the whole build and hope you like this implementation. In case of any doubts comment down below.&lt;/p&gt;

&lt;p&gt;Finally, I would like to attach two other Medium articles which broadly helped me during the whole process. Credits to them too. 🎉&lt;/p&gt;

</description>
      <category>android</category>
      <category>slack</category>
      <category>bot</category>
      <category>cicd</category>
    </item>
    <item>
      <title>MLH Fellowship: Memories that I always love to bring back.</title>
      <dc:creator>Nitish Gadangi</dc:creator>
      <pubDate>Thu, 14 Jan 2021 12:56:15 +0000</pubDate>
      <link>https://dev.to/nitishgadangi/mlh-fellowship-memories-that-i-always-love-to-bring-back-3l15</link>
      <guid>https://dev.to/nitishgadangi/mlh-fellowship-memories-that-i-always-love-to-bring-back-3l15</guid>
      <description>&lt;p&gt;So, You know they say “part of the journey is the end” right? So, this October 2020, I started a small journey alongside the journey of shaping the better me. A journey with Major League Hacking and 12 strangers turned friends.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff8wvis7jwxyrnmkh94vh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff8wvis7jwxyrnmkh94vh.jpg" alt="Fellow Map"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not gonna lie, the day I woke up and saw my acceptance mail,  it felt so unreal that I pinched myself, just to confirm I am not in a dream. And Yes! it's real that I am one among those 170 Fellows who got selected from 22 countries and 30k+ applications. Every moment that Nitish experienced till this day is pretty darn real.&lt;/p&gt;

&lt;p&gt;If you haven't read about the back story of me, getting selected for the MLH Fellowship, I highly recommend you to go through that article before proceeding further. (Trust me it's nowhere less than a Thriller story 😉)&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/nitishgadangi" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F374477%2Fdfff7429-d59a-44e2-80b9-60e36a979f66.jpeg" alt="nitishgadangi"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/nitishgadangi/i-selected-for-mlh-fellowship-twice-but-accepted-once-36i5" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I selected for MLH Fellowship twice but accepted once.!&lt;/h2&gt;
      &lt;h3&gt;Nitish Gadangi ・ Dec 24 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#mlhgrad&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;I am writing this article because there are some amazing moments that I wanted to look back and appreciate what I and my friends were able to learn and achieve in those 12 weeks of Fellowship. It can also give you an insider perspective of being an MLH Fellow. So sit back and hold tight while I take you through my MLH Fellowship Experience. 🚀&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  First things first, Whats is MLH Fellowship?
&lt;/h2&gt;

&lt;p&gt;In the words of MLH, “&lt;a href="https://fellowship.mlh.io/" rel="noopener noreferrer"&gt;&lt;em&gt;MLH Fellowship&lt;/em&gt;&lt;/a&gt; &lt;em&gt;is an internship alternative by Major League Hacking (powered by GitHub and Facebook) where students contribute to open source projects that are used by millions of developers worldwide.&lt;/em&gt;”&lt;/p&gt;

&lt;p&gt;In simple terms, it's more of a mixed bag of good things that are picked from Internship, opensource, mentorship, and hackathons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ok Now, let's get into the real experience…!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Oct 6, 2020 (10 AM IST): Day1, the first-ever official meet (of course on Zoom) after filling and signing up all the required onboarding docs. This day I got to meet all our amazing pod mates and equally amazing pod leader.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Interaction session:&lt;/strong&gt; This meeting is intended to get everyone to connect with each other and it was planned so well that it exactly reassembled those initial ragging (sorry interaction**) sessions with my seniors in my first year of BTech 😂. All the 12 Fellows of the pod are randomly distributed into 6 different rooms, i.e 2 per each where each one has to get to know about the other in such a way that he/she should introduce the other person to the whole pod in the best way possible and the same goes with everyone.&lt;/p&gt;

&lt;p&gt;Once it's done we got to went on to decide a name for our pod 1.0.2. The theme is ‘Birds’. After enough brainstorming decided to go with BitLoons. And yeah later we also designed a logo for the same 😅.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fslon06k6l9i0gr1rdhl0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fslon06k6l9i0gr1rdhl0.jpg" alt="BitLoons"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next days of the week, we need to schedule mandatory one-on-one calls with every other pod mate in order to get to know each other (yeah that is 12 calls of 30mins each). But trust me these meetings not just allowed us to get to know each other but quickly established a bond with each other so well.&lt;/p&gt;

&lt;p&gt;Along with that, we have to work on a project for the Orientation hackathon with a team of 3 (which again is randomly selected). If you want to have a look at what our team has worked on, check this out.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/MLH-Fellowship" rel="noopener noreferrer"&gt;
        MLH-Fellowship
      &lt;/a&gt; / &lt;a href="https://github.com/MLH-Fellowship/CovidAid" rel="noopener noreferrer"&gt;
        CovidAid
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🔗 Community driven platform for Connecting communities through Intergenerational collaboration 
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;By the end of the week2, we are done with Hackathon and got assigned to the respective projects which we are supposed to work on in the next coming weeks. But this is where the actual fun begins…&lt;/p&gt;

&lt;h2&gt;
  
  
  Here is how a standard week looks like:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;StandUp:&lt;/strong&gt; where we discuss what we have been doing since yesterday, what we are planning do today, and also about the blockers and shoutouts if any. Here is a demo version for you...&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fda8i2z6cag7h7bw57kjr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fda8i2z6cag7h7bw57kjr.jpg" alt="standup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Show &amp;amp; Tells:&lt;/strong&gt; where every week each fellow gets a chance to demo something interesting to the whole pod (preferably non-technical but not always). We discussed Novels, Art, Maths, Design, Inclusiveness... Here is one about paradoxes in Mathematics by Garima.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0gbg3hlqrnhnksl1w875.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0gbg3hlqrnhnksl1w875.jpg" alt="Show and Tell"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retrospectives:&lt;/strong&gt; Retros were the most valuable times in the fellowship as we used to reflect on our traffic lights for the week i.e., what went wrong (Reds), what can be improved (Yellows), and what we did well (Greens).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team Building Activities:&lt;/strong&gt; These are the most interesting ones ever, I can only wish we had more of these. Basically, these are some games/activities which help in building team participation. Scavenger Hunt, Guess the Lie, are some of them.&lt;/p&gt;

&lt;p&gt;A small sneak peek: Guess the Lie | Scavenger hunt&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxssmbkgskfw49kjtug6e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxssmbkgskfw49kjtug6e.jpg" alt="Team Building"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weekly Mentor Meet:&lt;/strong&gt; We get to meet our mentors &lt;a href="https://www.linkedin.com/in/cory-massaro-94403465/" rel="noopener noreferrer"&gt;Cory Massaro&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/chrisewald8/" rel="noopener noreferrer"&gt;Chris Ewald&lt;/a&gt; where we discuss the progress of the project and the blockers with the maintainer. We also had an amazing Meditation session with Chris 🧘‍♂️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv7a5u6ipjfy3gq831l6a.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv7a5u6ipjfy3gq831l6a.JPG" alt="Mentor meet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer Round Table:&lt;/strong&gt; In a  typical round table conference, we would have an open discussion within our pod on a predecided topic (mostly non-technical).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fyno0fjczwsjlstz211ap.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fyno0fjczwsjlstz211ap.jpg" alt="Dev Round Table"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally last but not the least, &lt;strong&gt;the late-night gaming sessions&lt;/strong&gt; where we hang out on discord and play AmongUs, Skribble, CodeWords to an extent where I got trained to be a Pro Skribble player in no time 😂 (still can't beat Kunal, Ayush).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fy2ga3i77gy1g76294s9g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fy2ga3i77gy1g76294s9g.jpg" alt="Skribble"&gt;&lt;/a&gt;&lt;br&gt;
Sorry, unable to find any screenshots of AmongUs or Codewords 😅&lt;/p&gt;

&lt;p&gt;In the Midway of the Fellowship, there is another &lt;a href="https://devpost.com/software/project-folio" rel="noopener noreferrer"&gt;Hackthon&lt;/a&gt; and also the very famous and highly exciting CTF challenge which is conducted in the final week of the Fellowship. In simple terms, those events were just continuous adrenaline rush and equally helping us to explore all new tech.&lt;br&gt;&lt;br&gt;
Here is a snapshot of the MLH CTF leaderboard where our team (flag captured) managed to stay on top 😁 for a while. Special credits to &lt;a href="https://www.linkedin.com/in/iamabhishek0/" rel="noopener noreferrer"&gt;Abhishek&lt;/a&gt; for staying up all night to solve those challs which were dropped in the late night.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuu2zmfyulffgbz3btdua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuu2zmfyulffgbz3btdua.png" alt="CTF"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are several other optional tech events and workshops going on every week. All these events are continuously added to the calendar, so one thing which you instantly learn after coming to Fellowship is good calendar habits. Every day soon after we wake up, can look at the calendar and plan our schedule accordingly.&lt;/p&gt;

&lt;p&gt;Also forgot to mention, we were put on to a common &lt;em&gt;MLH Fellowship Discord Server&lt;/em&gt; where fellows from all different pods can interact. We usually used to hang around in the voice channels discussing various things during our free time (which sometimes won't even make sense 😂). Here is one such occasion where &lt;a href="https://awalvie.me/" rel="noopener noreferrer"&gt;Vishesh&lt;/a&gt; is performing a private Magic Session for me and &lt;a href="https://twitter.com/_pandafy_" rel="noopener noreferrer"&gt;Gagan&lt;/a&gt;. (I know you guys are not expecting this to be here 😛).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F59fh0vvvpy895qz2ywtl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F59fh0vvvpy895qz2ywtl.jpg" alt="Magic"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;So when are you guys even working?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Yeah, after all this. It's ok to have this thought in mind. I will try to keep this brief as the blog is about the fellowship experience.&lt;br&gt;&lt;br&gt;
All of us were assigned to various projects and we were actively working on them at the same time. One thing I liked, in particular, was &lt;em&gt;flexible work hours&lt;/em&gt;. There is no constraint to when a fellow must work on the project. By the end of the Fellowship, everyone is supposed to complete the tasks assigned to us. I am assigned to project &lt;a href="https://github.com/JuliaEarth/GeoStats.jl" rel="noopener noreferrer"&gt;GeoStats.jl&lt;/a&gt; which is currently under the JuliaEarth organization. I worked on it with the help of an amazing maintainer &lt;a href="https://www.linkedin.com/in/j%C3%BAlio-hoffimann-834936116/" rel="noopener noreferrer"&gt;Julio Hoffimann&lt;/a&gt; and was able to successfully get by PR merged.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqgvo65qfr9yc429d7xf9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqgvo65qfr9yc429d7xf9.jpg" alt="PR Merged Yay..."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Final thoughts:
&lt;/h2&gt;

&lt;p&gt;MLH fellowship was a new beginning that I never wanted to end but as they say, all good things must come to an end and so here we are. I loved working on my project, made some brilliant friends, learned a lot from them, and left with a lot of memories as a better human being and a step closer towards my goal.&lt;/p&gt;

&lt;p&gt;There is no way we can point to the shortcoming in such an amazing experience but we tried our best to keep the best and worst things of the whole experience together in our final Retrospective. Feel free to zoom in. Or &lt;a href="https://dev-to-uploads.s3.amazonaws.com/i/0qrhfk2nu77yptukncaw.jpg" rel="noopener noreferrer"&gt;Click here&lt;/a&gt; for a better preview.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0qrhfk2nu77yptukncaw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0qrhfk2nu77yptukncaw.jpg" alt="Final Retrospective"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oh yeah! we also got awards. Credits to our Pod leader the very famous &lt;a href="https://twitter.com/kush_kunal" rel="noopener noreferrer"&gt;Kunal Kushwaha&lt;/a&gt; 🤩&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9ptftzog7v62tinbshdu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9ptftzog7v62tinbshdu.png" alt="Awards"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have read all the way down till here, I hope you have enjoyed the tour, I tried my best to convey the experience as visually as possible. Thank you! Reach me out with your suggestions, as always my inbox is waiting for your feedback 😁.&lt;/p&gt;

&lt;p&gt;In final words, This blog is not just to share my memories or experiences but to show, how well the MLH Fellowship is planned and executed perfectly to help us learn various aspects of the current day Software Engineering, yet keeping it fun, exciting, and keeping us continuously engaged with the opensource contributions.&lt;/p&gt;

&lt;p&gt;If interested, you can also apply for MLH Fellowship at &lt;a href="https://fellowship.mlh.io/" rel="noopener noreferrer"&gt;https://fellowship.mlh.io/&lt;/a&gt;. We also did a live-stream sharing our experiences. You can check that out here.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Kc7ZZYzDdLw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Finally, Thanks for bearing with me 😅! Without further a do, In the name of MLH Tradition - let's clap this out 👏&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmf9xvnbvjztpzrxdsx7g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmf9xvnbvjztpzrxdsx7g.jpg" alt="Clap Out"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>mlhgrad</category>
      <category>opensource</category>
      <category>github</category>
      <category>career</category>
    </item>
    <item>
      <title>I selected for MLH Fellowship twice but accepted once.!</title>
      <dc:creator>Nitish Gadangi</dc:creator>
      <pubDate>Thu, 24 Dec 2020 07:44:00 +0000</pubDate>
      <link>https://dev.to/nitishgadangi/i-selected-for-mlh-fellowship-twice-but-accepted-once-36i5</link>
      <guid>https://dev.to/nitishgadangi/i-selected-for-mlh-fellowship-twice-but-accepted-once-36i5</guid>
      <description>&lt;p&gt;As I just finished my journey as MLH Fellow, I tried to look back where it all started, and trust me it is no more than a Thriller Movie with enough plot twists. Here is the back story of how I almost got selected for the first iteration of MLH Fellowship and missed it because of Gmail.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkhu0yzgwslmkj9bfeki4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkhu0yzgwslmkj9bfeki4.jpg" alt="Header"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I’m writing about this today, because it is one of those phases of my life where I almost questioned my decisions and thought I need to change my paths. I want to look back and appreciate how I got through all of these. So sit back and watch me giving a walkthrough.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;May 4, 2020: The day GSoC 2020 results were out. The first time in my life I cried the whole night for a failure that I never expected. It felt like something which is almost within my hands has been taken away. Maybe, at that instance, I haven’t prepared to face a negative result. And the other thing is I already missed few opportunities because of Covid and got rejected for 3 interviews just in the final rounds. Several other weird reasons added up and kicked the optimism out of me.&lt;/p&gt;

&lt;p&gt;May 5, 2020: The exact next day morning. Holding up my self-confidence I started scrolling through my LinkedIn feed watching all the posts about GSoC selection. Suddenly one of the maintainers (&lt;a href="https://www.linkedin.com/in/prudhvir3ddy/" rel="noopener noreferrer"&gt;Prudhvi Reddy&lt;/a&gt;) of the projects which I contributed before dropped a message about the opensource program from MLH. I went through the article in the &lt;a href="https://dev.to/devteam/dev-is-participating-in-the-mlh-fellowship-powered-by-github-5afk"&gt;dev.to&lt;/a&gt; and got to know this is something more exciting than other similar opensource programs. Without any second thought, I filled out the application form. All my hopes which buried into ashes the last night are live again. 😂&lt;/p&gt;

&lt;p&gt;May 15, 2020: A message to schedule my first interview dropped into my Mailbox. I quickly filled in details and confirmed the slots. I got a slot on 20th and successfully finished my interview. It really went smooth and within no time I received a reply to fill in a form with details about my Github profile and asked me to submit one of my projects with a suitable tech stack mentioned. I know this form is for filtering students to technical interview, so I submitted one of the most popular projects I have worked on.&lt;/p&gt;

&lt;p&gt;Everything is going super smooth. It was told to me that, I will be hearing back with a rejection or a call for a technical interview in the next 2–3 days.&lt;/p&gt;

&lt;p&gt;May 23, 2020: It's already 4 days and I am really terrified, neither I got a rejection mail nor a call for the next interview. I became more scared and almost confirmed about rejection as I went through the Fellowship &lt;a href="https://www.reddit.com/r/csMajors/comments/gdmymj/mlh_fellowship/" rel="noopener noreferrer"&gt;Reddit thread&lt;/a&gt; where people discussing their technical interview experiences and rejections. Until I realized that there is something to do with Gmail.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftfnio9f3nxd3ggkwbwmo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftfnio9f3nxd3ggkwbwmo.jpg" alt="SPAM scene"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Later that night I realized that I received the mail for Technical Interview on the next day of my previous Interview itself, &lt;strong&gt;but it was landed in Spam 🤦‍♂️&lt;/strong&gt;. I cursed my self so bad for not checking the Spam folder. I have no clue what to do next as there are no slots available for scheduling interviews as it's already the last day of the application period.&lt;/p&gt;

&lt;p&gt;I tried my last luck writing to &lt;a href="https://www.linkedin.com/in/theycallmeswift/" rel="noopener noreferrer"&gt;Mike Swift&lt;/a&gt; (The Founder and CEO of MLH) as it is no fault on both sides (coz, who expects a mail to attend interview lands in Spam). In no time I got a reply to schedule an Interview on the same day but as all the Interviewers are already away, Swift himself took my Interview. Yes! Mike Swift himself !!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl39jxg56ssvmfqso5lgj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl39jxg56ssvmfqso5lgj.png" alt="Swift"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Invitation to attend the Technical Interview&lt;/p&gt;

&lt;p&gt;It was a 25min interview and it went really smooth. I was asked about a few of the code snippets from three of my projects on GitHub. Later we discussed few other things related to Fellowship and how unique it is from other opensource programs. Finally swift told me that &lt;em&gt;I will either be accepted or will be on the waiting list&lt;/em&gt; as the spots are almost filled (as slots are allotted on a rolling basis for the students qualified in the tech interview) and MLH is looking for sponsors to make few more spots available. The final result will be sent to mail within a week.&lt;/p&gt;

&lt;p&gt;Later that weekend, I received two emails updating me that I am still on the waiting list and I will be taken in if any of the accepted applicants opt-outs from the program. Finally, after a week I realized there is no way I will be in, as the Fellowship has already begun. This was another unusual failure and I am not sad this time.&lt;/p&gt;

&lt;p&gt;Right from the next day, I started participating in every random hackathon every weekend. It felt like I want to do something to prove myself. Within 5 weeks I participated in 4 Hackathons and won 3 of them. I also got an Internship offer in an amazing Startup (called &lt;a href="https://www.linkedin.com/company/subconscious101/" rel="noopener noreferrer"&gt;Atom&lt;/a&gt;) for SDE (Android) role. As it is my major tech stack I directly went in. I learned so many things and made several connections that I won't be forgetting in a lifetime. In short, it helped me to shape my development career. I also participated in many more hackathons in the meantime and won a handful of them. &lt;em&gt;I will be writing a separate blog about that experience soon.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Four months passed by and applications for MLH Fellowship (Fall 2020) were out. I applied on the first day again but this time with a fresh new email 😅. (I don't want to land in the SPAM scene again). Turned out there is a plot twist again. But this time it's not from Gmail.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuw1jdq5z4ks8ntb920sw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuw1jdq5z4ks8ntb920sw.jpg" alt="fate"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I was not getting any automated response even after 15days after my application submission, I reached Swift again and got to know that my application has not reached their database at all. It is sure that I have made something wrong on my end as I didn't receive the automated response soon after submission. So I submitted my application again and &lt;em&gt;It's really awesome that Swift still remembers me from the previous SPAM scene&lt;/em&gt;. So he said he will mark my application for faster review.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F84fa8073vjzk66kx007b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F84fa8073vjzk66kx007b.png" alt="email"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Later everything went super smooth and within the next few days I completed all my interviews and received this mail…..! Drum roll, please 🥁🥁🎉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fyhg6butq8unh14ff50dk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fyhg6butq8unh14ff50dk.png" alt="Selected !!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Frankly speaking, after all these hurdles and chaos I never expected this is coming. But it has come in and the next three months were some of the most memorable days in my life, I have made several new friends who helped me to explore a whole new world with several experiences that I surely might not be experiencing anywhere. Trust me MLH is just 💖.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't forget to read the next article where I described the journey in MLH Fellowship. It's more fun and interesting than this tragic article 💯. Something which you shouldn’t be missing.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/nitishgadangi" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F374477%2Fdfff7429-d59a-44e2-80b9-60e36a979f66.jpeg" alt="nitishgadangi"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/nitishgadangi/mlh-fellowship-memories-that-i-always-love-to-bring-back-3l15" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;MLH Fellowship: Memories that I always love to bring back.&lt;/h2&gt;
      &lt;h3&gt;Nitish Gadangi ・ Jan 14 '21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#mlhgrad&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#github&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;If you are someone who read all the way till here bearing my disastrous storytelling talent. Thank you! Reach me out with your suggestions, my inbox is waiting for your feedback 😁.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsbpwge7cvu67m8cgkpxo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsbpwge7cvu67m8cgkpxo.jpg" alt="Me explaining.."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok, now it's finally done..!!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Consider these lines 👇 as post-credit scenes 😂 !!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Few of the instances might seem very easy to get through but they are some of those instances where I understood how hard it would be to get through failures and rise back. Most importantly to stay prepared for both success and failure. I always believe &lt;em&gt;everything happens for a reason&lt;/em&gt; and this is one such phase that made my belief stronger. I would have missed exploring hackathons and also I would have completely missed the opportunity of working in an amazing startup (This is something I believe every developer must begin their career with) if I would have into GSoC or MLH Fellowship on the first attempt itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finally, never take GMail for granted, always use a separate mail for careers and keep checking SPAM mail too…&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>mlhgrad</category>
      <category>career</category>
    </item>
  </channel>
</rss>
