<?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: ShivangDholaria</title>
    <description>The latest articles on DEV Community by ShivangDholaria (@shivangdholaria).</description>
    <link>https://dev.to/shivangdholaria</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%2F459478%2F6f74804c-1839-4282-8390-524a5c3a8b2a.png</url>
      <title>DEV Community: ShivangDholaria</title>
      <link>https://dev.to/shivangdholaria</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shivangdholaria"/>
    <language>en</language>
    <item>
      <title>CI/CD in Action: Deploying an Application from Code to Cloud</title>
      <dc:creator>ShivangDholaria</dc:creator>
      <pubDate>Fri, 07 Mar 2025 20:00:57 +0000</pubDate>
      <link>https://dev.to/shivangdholaria/cicd-in-action-deploying-an-application-from-code-to-cloud-20ol</link>
      <guid>https://dev.to/shivangdholaria/cicd-in-action-deploying-an-application-from-code-to-cloud-20ol</guid>
      <description>&lt;p&gt;Hey all, In this post, I will be sharing a complete guide to CI-CD. This will be a multi-part series where I will talk through testing and deploying applications locally to all the way on the cloud.&lt;/p&gt;

&lt;p&gt;Stay tuned for this! I am linking all the parts down below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://dev.to/shivangdholaria/deploying-locally-a-developers-guide-before-cicd-2a3a"&gt;Deploying Locally: A Developer’s Guide Before CI/CD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/shivangdholaria/deploying-a-spring-boot-application-on-aws-a-complete-guide-5h13"&gt;Deploying a Spring Boot Application on AWS: A Complete Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;Continuous Integration: Automating Builds via CodePipeline and CodeBuild&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;Continuous Deployment: Automating Application Releases via CodeBuild&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>cicd</category>
      <category>cloud</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Deploying a Spring Boot Application on AWS: A Complete Guide</title>
      <dc:creator>ShivangDholaria</dc:creator>
      <pubDate>Fri, 07 Mar 2025 20:00:05 +0000</pubDate>
      <link>https://dev.to/shivangdholaria/deploying-a-spring-boot-application-on-aws-a-complete-guide-5h13</link>
      <guid>https://dev.to/shivangdholaria/deploying-a-spring-boot-application-on-aws-a-complete-guide-5h13</guid>
      <description>&lt;p&gt;Now that our application is running perfectly in the local environment, lets move it to the cloud. My preferred choice for cloud provider is AWS since its widely used and provides with 12-month of free usage. &lt;/p&gt;

&lt;h1&gt;
  
  
  Setting the cloud Infrastructure
&lt;/h1&gt;

&lt;p&gt;I am assuming that you will an account in AWS and logged into it. If not, then it is really easy to setup the account. And yes, if you are creating an account for the first time, you will be needing a credit/debit card since it will use it for verification purposes. You will see a small amount debited, which will be refunded the next day once the account creation is successful.&lt;/p&gt;

&lt;p&gt;Now that you are logged into your AWS account, we will be going to our server which will host our application. Creating it is simple, just navigate to EC2 from search bar.&lt;/p&gt;

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

&lt;p&gt;Open it and click on launch instance, You will see this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq79ro4o4211799jednms.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq79ro4o4211799jednms.png" alt="EC2 Launch screen" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Given any name you want to your server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4y6ebfz5pw89bpruezy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4y6ebfz5pw89bpruezy.png" alt="Server name" width="800" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select Ubuntu from Application and OS images and keep the default as is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8c0nberu6a5j8r126pr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8c0nberu6a5j8r126pr.png" alt="OS selection" width="800" height="527"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keep the instance type as t2.micro as it is free tier eligible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6573lmmxem61fvm67he8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6573lmmxem61fvm67he8.png" alt="Image description" width="800" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For key-pair, if you already have one, select that. If not click &lt;code&gt;create new pair&lt;/code&gt; and create one by keeping the defaults as is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyemnrx11nxdvrn5h8wfx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyemnrx11nxdvrn5h8wfx.png" alt="Key-pair creation" width="669" height="654"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keep the network settings default too. Make sure that &lt;code&gt;Allow SSH traffic from&lt;/code&gt; is enabled and &lt;code&gt;Anywhere&lt;/code&gt; is selected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuap0vxa4o4q697mu2ov0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuap0vxa4o4q697mu2ov0.png" alt="Network Settings" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now click on &lt;code&gt;launch instance&lt;/code&gt; to create your server. You will see this once the creation is successful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ksn80zo1md5w8v6so6d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ksn80zo1md5w8v6so6d.png" alt="Instance creation successful" width="800" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once created, wait till you see your &lt;code&gt;status check&lt;/code&gt; as &lt;code&gt;2/2 checks passed&lt;/code&gt;. This confirms that the server is now fully up and running.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fixc9w14daqdqdv83niqn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fixc9w14daqdqdv83niqn.png" alt="Instance check pass" width="800" height="95"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now lets log into the server and deploy our applicatio. Click on the server and then click on connect.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5ztcq4gk5lqbjmbg1f1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5ztcq4gk5lqbjmbg1f1.png" alt="Connect to instance" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will see any options. Do the following if you are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Windows user, setting the permission on the key is a tricky process, so we will use the EC2 Instance Connect option.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmx62b4qd6nzukf21yoma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmx62b4qd6nzukf21yoma.png" alt="Instance connect" width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Linux/Mac user, open the SSH client option and follow through the steps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4jl2ofyj6z50zs562j8z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4jl2ofyj6z50zs562j8z.png" alt="Instance Connect" width="800" height="241"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once connected, you should be able to see this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc1dvbps6qw4u8i61o5m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc1dvbps6qw4u8i61o5m.png" alt="Connect log in" width="772" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;sudo apt update&lt;/code&gt; command to update the packages for the server.&lt;/p&gt;

&lt;p&gt;Before cloning your repo, you will first need to install java. We wont be installing maven as the repo has a &lt;code&gt;mvnw&lt;/code&gt; executable, which a maven wrapper. Install java using the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt install openjdk-21-jre-headless -y&lt;/code&gt;&lt;br&gt;
&lt;code&gt;sudo apt install openjdk-21-jdk-headless -y&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Once installed, clone the repo and cd into it. Make the &lt;code&gt;mvnw&lt;/code&gt; executable by using the following:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo chmod +x mvnw&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;One more step and we are done, just enter the API key in the &lt;code&gt;application.properties&lt;/code&gt; file and save it. Now just enter the command to run the application.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;./mvnw spring-boot:run&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Once you run that command, you will see successful execution. You will be thinking now if I open the browser and type &lt;code&gt;localhost:&amp;lt;PORT&amp;gt;&lt;/code&gt;, I should be able to see the application running. Well, the short answer is no since you are running a different machine. &lt;/p&gt;

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

&lt;p&gt;To access it, you need to enter the server's public IP followed by the port number to access it. Type the public IP address (which you can find at the homepage on Instance), followed by the port number in the browser. You still won't see the application since by default our server blocks any incoming connection to it on that port. To allow them, we need to edit its network rules. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb59i93cw39n7ckd8d98j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb59i93cw39n7ckd8d98j.png" alt="Instance application" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This can be done by editing the security group of the instance. You can find the security group of the instance in its security tab. For me it is &lt;code&gt;launch-wizard-4&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fowf59sm1dwuobg4vtjn1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fowf59sm1dwuobg4vtjn1.png" alt="Security group" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open the security group and then click on &lt;code&gt;edit inbound rules&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faggfi8kuodu6qi61462p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faggfi8kuodu6qi61462p.png" alt="Inbound rules" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on &lt;code&gt;add rule&lt;/code&gt;, keep the type as &lt;code&gt;Custom TCP&lt;/code&gt;, Port range as &lt;code&gt;your port number&lt;/code&gt; (I have kept mine as &lt;code&gt;8001&lt;/code&gt; since thats the port which my application uses), Source as &lt;code&gt;Anywhere&lt;/code&gt; and click on search bar next to it and select the CIDR range as &lt;code&gt;0.0.0.0/0&lt;/code&gt; and &lt;code&gt;Save rules&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffi3woves4errooerqgj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffi3woves4errooerqgj0.png" alt="Image description" width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you are done, you should see the added rule, and now your app should be opening.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F315qeqla43rei530rpxy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F315qeqla43rei530rpxy.png" alt="App running in instance" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In &lt;a href=""&gt;part 3&lt;/a&gt; we will be discussing the automation process.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Deploying Locally: A Developer’s Guide Before CI/CD</title>
      <dc:creator>ShivangDholaria</dc:creator>
      <pubDate>Mon, 03 Mar 2025 21:16:13 +0000</pubDate>
      <link>https://dev.to/shivangdholaria/deploying-locally-a-developers-guide-before-cicd-2a3a</link>
      <guid>https://dev.to/shivangdholaria/deploying-locally-a-developers-guide-before-cicd-2a3a</guid>
      <description>&lt;p&gt;This is the first part of a series where I'll guide you through deploying an app locally before moving to the cloud.&lt;/p&gt;

&lt;p&gt;The assumption is that you already have an app built and are ready for deployment. I'll be skipping the testing phase as the app for this demonstration is simple enough not to require extensive testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Project Set-up
&lt;/h2&gt;

&lt;p&gt;Before we begin, ensure you have: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Java installed on &lt;a href="https://www.baeldung.com/openjdk-windows-installation" rel="noopener noreferrer"&gt;windows&lt;/a&gt;, &lt;a href="https://www.baeldung.com/java-macos-installation" rel="noopener noreferrer"&gt;MacOS&lt;/a&gt;, &lt;a href="https://www.baeldung.com/ubuntu-install-jdk" rel="noopener noreferrer"&gt;Linux&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.baeldung.com/install-maven-on-windows-linux-mac" rel="noopener noreferrer"&gt;Maven set up&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this tutorial, I've created a simple Weather App. You can fork the repository &lt;a href="https://github.com/ShivangDholaria/Weather-App" rel="noopener noreferrer"&gt;from here&lt;/a&gt;. It is a really super simple application. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important Note:&lt;/strong&gt; After cloning the repo, you'll need to add your API key from &lt;a href="https://openweathermap.org/" rel="noopener noreferrer"&gt;OpenWeather&lt;/a&gt; as the application requires it. Once you have your API key, add it to the application.properties file, which is located inside the &lt;code&gt;src/main/resources&lt;/code&gt; directory, where the api.key field is located. The API is free; you don't have to pay for anything.&lt;/p&gt;

&lt;p&gt;Open your preferred IDE (I'm using VS Code) and load the application. Your project structure should look something like this:&lt;/p&gt;

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

&lt;p&gt;Also update the &lt;code&gt;api.key&lt;/code&gt; value with your OpenWeather API key.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5q5ru6gld2kjyag8vqq2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5q5ru6gld2kjyag8vqq2.png" alt="Api-key location" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once done, open the integrated terminal and run the &lt;code&gt;mvn spring-boot:run&lt;/code&gt; command and see if the application runs perfectly. It should run perfectly; if not, write in the comment what went wrong, and I will try to help you out. You should see the following output once the execution starts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvv2e479p8p3cgw14v9j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvv2e479p8p3cgw14v9j.png" alt="Successful application launch" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am using port 8001 for this project, but if the port is occupied by another process, you can change it and update the &lt;code&gt;server.port&lt;/code&gt; value in the &lt;code&gt;application.properties&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Open up a browser and enter the URL &lt;code&gt;localhost:&amp;lt;YOUR PORT NUMBER&amp;gt;&lt;/code&gt; in this case &lt;code&gt;localhost:8001&lt;/code&gt; and you will have the app running.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpnciuawnn95hbl5nli9n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpnciuawnn95hbl5nli9n.png" alt="Weather app in browser" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter any city that you want to check the weather in, and it will show you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;Now that we have the application working locally, it's time to deploy it to the cloud.&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;Continue to Part 2&lt;/a&gt; for the cloud deployment guide.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cicd</category>
      <category>devops</category>
    </item>
    <item>
      <title>EventLoop vs. ThreadPool: Which One Should You Use and When?</title>
      <dc:creator>ShivangDholaria</dc:creator>
      <pubDate>Wed, 26 Feb 2025 01:51:01 +0000</pubDate>
      <link>https://dev.to/shivangdholaria/eventloop-vs-threadpool-which-one-should-you-use-and-when-3j25</link>
      <guid>https://dev.to/shivangdholaria/eventloop-vs-threadpool-which-one-should-you-use-and-when-3j25</guid>
      <description>&lt;p&gt;Ever wondered how apps handle multiple tasks at once? That’s where ThreadPools and EventLoops come in. One uses multiple threads to juggle tasks, while the other relies on an async, non-blocking approach. But which one should you use?&lt;/p&gt;

&lt;p&gt;In this post, we’ll break down ThreadPools vs. EventLoops, how they work, and when to pick one over the other—without the boring theory. Let’s dive in!&lt;/p&gt;

&lt;h1&gt;
  
  
  ThreadPool
&lt;/h1&gt;

&lt;p&gt;Simply put, it is a collection of worker threads that are already present, and when a task comes, it is assigned to an available thread. Once the task finishes, the thread is released and made available for other tasks. &lt;/p&gt;

&lt;h2&gt;
  
  
  Pros
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Good for parallelizable tasks&lt;/li&gt;
&lt;li&gt;Reduces overhead for creating and destroying new thread for each task&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cons
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Less efficient for I/O bound as once the pool gets exhausted, the incoming processes need to wait until a thread is available&lt;/li&gt;
&lt;li&gt;Can lead to deadlocks and race conditions if proper synchronization methods are not implemented&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  EventLoop
&lt;/h1&gt;

&lt;p&gt;It is a single-thread mechanism that executes asynchronous processes one at a time. To explain asynchronous processes, they are the processes that execute later in time rather than immediately. &lt;/p&gt;

&lt;p&gt;For example, when you open a stock market app, it fetches data from multiple sources. Since all the data can’t load instantly, the app displays it as it arrives. That’s why stock prices appear one by one—this is an asynchronous process. &lt;/p&gt;

&lt;h2&gt;
  
  
  Pros
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Less overhead since it runs on a single thread&lt;/li&gt;
&lt;li&gt;Good for I/O-bound operations such as network requests, database queries, file I/O, etc&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cons
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Not efficient for CPU-intensive tasks since it will consume a lot of time for execution&lt;/li&gt;
&lt;li&gt;Helps achieve concurrency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So if you want to execute multiple tasks at once, ThreadPool is to-go. &lt;/p&gt;

&lt;p&gt;And want to achieve data consistency? EventLoop is there for you!&lt;/p&gt;

&lt;p&gt;That's it, folks! Let me know in the comment if you found this easy to understand!&lt;/p&gt;

</description>
      <category>java</category>
      <category>programming</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Bash Scripting for Git: How to Fetch All Repo Collaborators Effortlessly</title>
      <dc:creator>ShivangDholaria</dc:creator>
      <pubDate>Fri, 21 Feb 2025 17:56:05 +0000</pubDate>
      <link>https://dev.to/shivangdholaria/bash-scripting-for-git-how-to-fetch-all-repo-collaborators-effortlessly-419i</link>
      <guid>https://dev.to/shivangdholaria/bash-scripting-for-git-how-to-fetch-all-repo-collaborators-effortlessly-419i</guid>
      <description>&lt;p&gt;I am excited to share my first post over here at Dev.to. As the post says, I will be discussing the script that will give the user list of all the collaborators that are currently working on a git repo. It might seem silly since users can check them directly via the Github UI, but what if you are working in a CLI environment? &lt;/p&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;As a team manager or leader, you will be responsible for onboarding new hires, managing the workflow of the application, and many more. As the team grows or shrinks, you are the one who needs to keep strict access to the organization's repository. It would be a hassle to go to the Github UI and get the list of all the users who are working on the repo and add or revoke the access. So what I would be showing you is a simple script that would get you the list of all the users who are added as collaborators on the repo.&lt;/p&gt;

&lt;h1&gt;
  
  
  Prerequisites
&lt;/h1&gt;

&lt;p&gt;First of all, you need to have git installed in your system. If you dont have it installed, you can install it via &lt;a href="https://git-scm.com/downloads" rel="noopener noreferrer"&gt;this link.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Once downloaded, you will need to configure it. You can find more on how to configure it &lt;a href="https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup" rel="noopener noreferrer"&gt;here.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;TL;DR for configuration - Use the command &lt;code&gt;git config --global user.name "Your github login username"&lt;/code&gt; to add your username to the tool and &lt;code&gt;git config --global user.name "Your github login email"&lt;/code&gt; to add your associated email.&lt;br&gt;
Once done, run the script to get all the collaborators.&lt;/p&gt;

&lt;p&gt;Also have &lt;code&gt;jq&lt;/code&gt; installed since the response when using the Github API will be in JSON,  &lt;code&gt;jq&lt;/code&gt; will help us parse it. Installing it is simple; just run &lt;code&gt;sudo apt install jq&lt;/code&gt; on Linux or &lt;code&gt;brew install jq&lt;/code&gt; on Mac. For windows, &lt;br&gt;
Open the PowerShell terminal and run this command &lt;code&gt;choco install jq&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;After all is installed, you need to create and set 2 environment variables named &lt;code&gt;username&lt;/code&gt; and &lt;code&gt;token&lt;/code&gt; which will be needed when we run our script. The &lt;code&gt;username&lt;/code&gt; variable will contain your Github username used for logging into the account and &lt;code&gt;token&lt;/code&gt; is the account token used for accessing. You can create the token by following &lt;a href="https://www.geeksforgeeks.org/how-to-generate-personal-access-token-in-github/" rel="noopener noreferrer"&gt;this article.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Make sure NOT TO EXPOSE THE TOKEN because anyone with that token can use your account, so play safe.&lt;/p&gt;
&lt;h1&gt;
  
  
  Script Rundown
&lt;/h1&gt;

&lt;p&gt;Here's the scipt that will give is the list of all the collaborators for a given repo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash

# Function to display usage information
function show_help {
    echo "Usage: $0 &amp;lt;repo_owner&amp;gt; &amp;lt;repo_name&amp;gt;"
    echo "Example: $0 octocat hello-world"
    echo "Lists all users with read access to the specified GitHub repository."
    echo "Requires GitHub personal access token to be set in environment variable 'token'"
    exit 1
}

# Show help if no arguments provided
[ $# -ne 2 ] &amp;amp;&amp;amp; show_help

# GitHub API URL
API_URL="https://api.github.com"

# GitHub username and personal access token
USERNAME=$username
TOKEN=$token

# User and Repository information
REPO_OWNER=$1
REPO_NAME=$2

# Function to make a GET request to the GitHub API
function github_api_get {
    local endpoint="$1"
    local url="${API_URL}/${endpoint}"

    # Send a GET request to the GitHub API with authentication
    curl -s -u "${USERNAME}:${TOKEN}" "$url"
}

# Function to list users with read access to the repository
function list_users_with_read_access {
    local endpoint="repos/${REPO_OWNER}/${REPO_NAME}/collaborators"

    # Fetch the list of collaborators on the repository
    collaborators="$(github_api_get "$endpoint" | jq -r '.[] | select(.permissions.pull == true) | .login')"

    # Display the list of collaborators with read access
    if [[ -z "$collaborators" ]]; then
        echo "No users with read access found for ${REPO_OWNER}/${REPO_NAME}."
    else
        echo "Users with read access to ${REPO_OWNER}/${REPO_NAME}:"
        echo "$collaborators"
    fi
}

# Main script

echo "Listing users with read access to ${REPO_OWNER}/${REPO_NAME}..."
list_users_with_read_access
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lets go through the script.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Firstly, it's just a basic setup which will display the usage of script.&lt;/li&gt;
&lt;li&gt;Moving on, We see that the script will need 2 arguments, namely the repo owner and repo name. This is how a repo looks like &lt;code&gt;https://github.com/username/repo-name&lt;/code&gt;, pass those 2 as the parameters.&lt;/li&gt;
&lt;li&gt;The 2 functions are where magic happens. The function &lt;code&gt;github_api_get&lt;/code&gt; is where we build the GET request using the Github API and &lt;code&gt;list_users_with_read_access&lt;/code&gt; is where we get the list of all the users who have access to the repo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please keep this in mind when using this script; you yourself must have the permission to access the repo otherwise, you won't be able to get other users.&lt;/p&gt;

</description>
      <category>bash</category>
      <category>devops</category>
      <category>github</category>
      <category>git</category>
    </item>
  </channel>
</rss>
