<?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: DevCloud Ninjas Scrolls</title>
    <description>The latest articles on DEV Community by DevCloud Ninjas Scrolls (@devcloudninjas).</description>
    <link>https://dev.to/devcloudninjas</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%2Forganization%2Fprofile_image%2F9557%2F5765b0df-fa81-4424-ac81-15f1d5846bf8.png</url>
      <title>DEV Community: DevCloud Ninjas Scrolls</title>
      <link>https://dev.to/devcloudninjas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devcloudninjas"/>
    <language>en</language>
    <item>
      <title>End to End CI/CD pipeline using GitHub Actions for Android Application</title>
      <dc:creator>Lionel♾️☁️</dc:creator>
      <pubDate>Fri, 13 Dec 2024 18:39:19 +0000</pubDate>
      <link>https://dev.to/devcloudninjas/end-to-end-cicd-pipeline-using-github-actions-for-android-application-36i5</link>
      <guid>https://dev.to/devcloudninjas/end-to-end-cicd-pipeline-using-github-actions-for-android-application-36i5</guid>
      <description>&lt;p&gt;&lt;em&gt;In this article, you will get a brief idea about how to create an End to End CI/CD Pipeline using GitHub Actions for an Android Application&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Project Source Code&lt;/strong&gt; : &lt;a href="https://github.com/devcloudninjas/DevOps-Projects/tree/master/DevOps%20Project-14" rel="noopener noreferrer"&gt;LINK&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Here, we will be covering some use cases like how to trigger one workflow from another workflow, how to run 2 jobs which depends upon each other, how to add public ip of GitHub Actions in security groups of Jfrog which is running in an EC2 , on port 8082 — so that GitHub Actions can access Jfrog to upload the .apk file into repository, how to integrate SonarQube , Teams with GitHub Actions , how to create a cron job in workflow, how to delete artifacts which are created during the workflow in GitHub Actions, how to clean caches in GitHub Actions which gets created every time your run a workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Step by Step Process :&lt;/strong&gt;
&lt;/h2&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%2Ffq4l9eqh941rpucbj5y7.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%2Ffq4l9eqh941rpucbj5y7.png" alt="IMG" width="736" height="397"&gt;&lt;/a&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%2F00g1mr4a2szqyjkl18zm.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%2F00g1mr4a2szqyjkl18zm.png" alt="IMG" width="736" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To create a workflow, go to Actions in your GitHub Repository and choose a template yml file or click “&lt;strong&gt;set up a workflow yourself&lt;/strong&gt;” — for me I have chosen Android CI as my application is android application.&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%2Fmjotveksxh4sf1knilxn.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%2Fmjotveksxh4sf1knilxn.png" alt="IMG" width="736" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This basic template you will get to do CI part of Android Application.&lt;/p&gt;

&lt;p&gt;Let me explain you some of the terms used in workflow file:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;name&lt;/strong&gt; : The name of the workflow as it will appear in the “Actions” tab of the GitHub repository. Like here it is “&lt;strong&gt;Android CI”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;on:&lt;/strong&gt; Specifies the trigger for this workflow. So here the workflow will be triggered when there is a &lt;strong&gt;push event&lt;/strong&gt; in “&lt;strong&gt;main&lt;/strong&gt;” branch and &lt;strong&gt;pull_request&lt;/strong&gt; event in “&lt;strong&gt;main&lt;/strong&gt;” branch&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;jobs&lt;/strong&gt;: A workflow job is a set of steps that execute on the same runner. We can have multiple jobs in a single workflow yml file. Groups together all the jobs that run in the &lt;code&gt;Android CI&lt;/code&gt; workflow. Here, in the example there is a single job whose name is &lt;strong&gt;build&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;runs-on&lt;/strong&gt;: Configures the job to run on the latest version of an &lt;strong&gt;Ubuntu Linux runner&lt;/strong&gt;. This means that the job will execute on a fresh virtual machine hosted by GitHub. You can use windows and macOS runner too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;steps:&lt;/strong&gt; Groups together all the steps that run in the &lt;code&gt;build&lt;/code&gt; job. Each item nested under this section is a separate action or shell script.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;uses: actions/checkout@v3 :&lt;/strong&gt; The &lt;code&gt;uses&lt;/code&gt; keyword specifies that this step will run &lt;code&gt;v3&lt;/code&gt; of the &lt;code&gt;actions/checkout&lt;/code&gt; action. This is an action that checks out your repository onto the runner, allowing you to run scripts or other actions against your code (such as build and test tools). You should use the checkout action any time your workflow will run against the repository's code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;uses: actions/setup-java@v3 :&lt;/strong&gt; This step uses the &lt;code&gt;actions/setup-java@v3&lt;/code&gt; action to install the specified version of the JDK (this example uses v11) of distribution: 'temurin'&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;run: chmod +x gradlew:&lt;/strong&gt; The &lt;code&gt;run&lt;/code&gt; keyword tells the job to execute a command on the runner. In this case, you are granting execute permission for gradlew&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;run: ./gradlew build:&lt;/strong&gt; In this case you are building the code using gradle&lt;/p&gt;

&lt;p&gt;After this , Click on &lt;strong&gt;Start Commit&lt;/strong&gt; and add comment and click Commit. This will create a basic android CI workflow in GitHub Action.&lt;/p&gt;

&lt;p&gt;To create a secret in GitHub Actions  Go to Settings and then click on Secrets and then to Actions and create different secrets .&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%2Fftp9z68ndeuphxuqpqed.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%2Fftp9z68ndeuphxuqpqed.png" alt="IMG" width="736" height="401"&gt;&lt;/a&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%2Ff7meczf6lfidpq31fhm4.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%2Ff7meczf6lfidpq31fhm4.png" alt="IMG" width="736" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s modify the android.yml file : Full Workflow&lt;/p&gt;

&lt;p&gt;Let’s discuss part by part&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%2Ffh9fdkk0vj2ej49a5cre.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%2Ffh9fdkk0vj2ej49a5cre.png" alt="IMG" width="614" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, the workflow is getting triggered whenever we push into the branches “main” or “qa” or “develop” and whenever we pull request into the branches “main” or “qa”.&lt;/p&gt;

&lt;p&gt;You can use environment variables to store information that you want to reference in your workflow. You reference environment variables within a workflow step or an action, and the variables are interpolated on the runner machine that runs your workflow. Commands that run in actions or workflow steps can create, read, and modify environment variables.&lt;/p&gt;

&lt;p&gt;You can define environment variables that are scoped for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The entire workflow, by using &lt;a href="https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#env" rel="noopener noreferrer"&gt;env&lt;/a&gt; at the top level of the workflow file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The contents of a job within a workflow, by using &lt;a href="https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idenv" rel="noopener noreferrer"&gt;jobs.&amp;lt;job_id&amp;gt;.env&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A specific step within a job, by using &lt;a href="https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsenv" rel="noopener noreferrer"&gt;jobs.&amp;lt;job_id&amp;gt;.steps[*].env&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here in the workflow we can have created a env at the top level with variable name as “AWS_DEFAULT_REGION” and assigned value as “ap-south-1”&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%2F5o9yuyvhr9k4ilcmm987.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%2F5o9yuyvhr9k4ilcmm987.png" alt="IMG" width="736" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;uses: actions/checkout@v3 :&lt;/strong&gt; The &lt;code&gt;uses&lt;/code&gt; keyword specifies that this step will run &lt;code&gt;v3&lt;/code&gt; of the &lt;code&gt;actions/checkout&lt;/code&gt; action. This is an action that checks out your repository onto the runner, allowing you to run scripts or other actions against your code (such as build and test tools). You should use the checkout action any time your workflow will run against the repository's code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;uses: actions/setup-java@v3 :&lt;/strong&gt; This step uses the &lt;code&gt;actions/setup-java@v3&lt;/code&gt; action to install the specified version of the JDK (this example uses v11) of distribution: 'temurin'&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%2Fu24ikjqo7klfid6mwvrt.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%2Fu24ikjqo7klfid6mwvrt.png" alt="IMG" width="736" height="116"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;run: chmod +x gradlew:&lt;/strong&gt; The &lt;code&gt;run&lt;/code&gt; keyword tells the job to execute a command on the runner. In this case, you are granting execute permission for gradlew&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%2Fwq44z3put6uljehdsquj.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%2Fwq44z3put6uljehdsquj.png" alt="IMG" width="736" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;run: ./gradlew clean:&lt;/strong&gt; Gradle clean will delete a build directory if already present.&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%2F12jlcxhfxdncrky88ovm.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%2F12jlcxhfxdncrky88ovm.png" alt="IMG" width="736" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;run: ./gradlew lint:&lt;/strong&gt; It will detect poorly structured code that can impact the reliability and efficiency of your Android apps and make your code harder to maintain&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%2Fljwcnpu5fbzbdt1tpw95.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%2Fljwcnpu5fbzbdt1tpw95.png" alt="IMG" width="736" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;run: ./gradlew build:&lt;/strong&gt; A process of building a Gradle project&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%2Fimg9pk26njs6gz7vys5n.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%2Fimg9pk26njs6gz7vys5n.png" alt="IMG" width="736" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;run: ./gradlew jacocoTest:&lt;/strong&gt; The JacocoReport task can be used to generate code coverage reports in different formats&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%2F0of4j1kjx1el5jrpkt9f.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%2F0of4j1kjx1el5jrpkt9f.png" alt="IMG" width="736" height="368"&gt;&lt;/a&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%2F7ee86pry4i6zbdznmyt7.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%2F7ee86pry4i6zbdznmyt7.png" alt="IMG" width="736" height="585"&gt;&lt;/a&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%2Frc8nmhyuo40cs2u1cqlc.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%2Frc8nmhyuo40cs2u1cqlc.png" alt="IMG" width="736" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this step we are integrating GitHub Actions with SonarQube. To make your workflows faster and more efficient, you can create and use caches for dependencies and other commonly reused files.&lt;/p&gt;

&lt;p&gt;In the Cache SonarQube Package Step and Cache Gradle Package we are caching SonarQube packages and Gradle Packages with given path where runner stores the cache. The new cache will use the &lt;code&gt;key&lt;/code&gt; you provided and contains the files you specify in &lt;code&gt;path&lt;/code&gt; and alternative restore key used if no cache hit occurs for &lt;code&gt;key&lt;/code&gt;, these restore keys are used sequentially in the order provided to find and restore a cache.&lt;/p&gt;

&lt;p&gt;In the next step we are doing code analysis using SonarQube. We have added environment variables whose values are as secrets which you can use in your workflows as environment variables.&lt;/p&gt;

&lt;p&gt;The secrets in GitHub Actions are defined as {{ secrets.secret_name }}. Here we have added SonarQube Token and SonarQube URL as secrets. Then we are running the command in runner as “./gradlew sonarqube” and passing the projectkey.&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%2Fxm75r9314aqhksu2371e.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%2Fxm75r9314aqhksu2371e.png" alt="IMG" width="736" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In build.gradle we have added the plugins for SonarQube&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%2F8152qjlyso7s0gp25krs.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%2F8152qjlyso7s0gp25krs.png" alt="IMG" width="736" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can see that SonarQube analysis is passed and coverage report is greater than 80%&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%2Fd0s0v3c9yfukw8rya7jm.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%2Fd0s0v3c9yfukw8rya7jm.png" alt="IMG" width="736" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the next step “Date and Time” , we have evaluated date and time using Linux command and created outputs in the step by writing to stdout in the format of ::set-output name=&amp;lt;name&amp;gt;::&amp;lt;value&amp;gt;. A step can have multiple outputs. Steps that create outputs must have unique ids.&lt;/p&gt;

&lt;p&gt;current_date_time::$(date +”%d-%m-%Y-%H-%M-%S”)  Here current_date_time variable is in the format of %d : Day of the month , %m : Month , %Y : Year , %H : Hour, %M : Minutes, %S : Seconds&lt;/p&gt;

&lt;p&gt;Here, the output name is “current_date_time” and id of the step of “Date and Time” is “date” which is unique name in the workflow.&lt;/p&gt;

&lt;p&gt;To use this parameter in the job we can use in the way {{ steps.&amp;lt;step-id&amp;gt;.outputs.&amp;lt;output-name&amp;gt; }} . Here in the example it is {{ steps.date.outputs.current_date_time }}&lt;/p&gt;

&lt;p&gt;In the next step “Copy APK files to a directory” we are creating a directory structure to store the Debug and Release APK files in the format&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apk-files &amp;gt; debug &amp;gt; app-debug-11–11–2022–09–09–12–36.apk&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apk-files &amp;gt; release&amp;gt; app-release-unsigned-11–11–2022–09–09–12–36.apk&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In the last step “Upload apk-files” Directory we are uploading artifactory — APK Files which we created so that in the deploy “job” we can download this artifactory as it will be using a new ubuntu runner. Here {{ github.workspace }} is default path for the checkout action. The path which we want to upload is the apk-files directory and if-no-files is present in the path , then ignore this step.&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%2Fdrndl1z1dyrh92sc829c.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%2Fdrndl1z1dyrh92sc829c.png" alt="IMG" width="736" height="278"&gt;&lt;/a&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%2Fptjub8hm9h3ck237ahks.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%2Fptjub8hm9h3ck237ahks.png" alt="IMG" width="736" height="399"&gt;&lt;/a&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%2Ftfvskbre2weqv3ybegt1.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%2Ftfvskbre2weqv3ybegt1.png" alt="IMG" width="736" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this step we are integrating teams with GitHub Actions. This action take your GitHub token and the webhook URL which is generated during the configuration part .&lt;/p&gt;

&lt;p&gt;Create a teams channel add people who should be notified for workflow success and fail steps . Click Connectors in the channel and then choose “Incoming Webhook” and add and then configure and then add a name and copy the URL and paste it as a secret in your GitHub Secrets and use it in your workflow.&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%2Fu5vw8c8aqznibnh5cbmq.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%2Fu5vw8c8aqznibnh5cbmq.png" alt="IMG" width="736" height="700"&gt;&lt;/a&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%2Fgqvz5h52611a7tf9291c.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%2Fgqvz5h52611a7tf9291c.png" alt="IMG" width="736" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you see the last part, we are creating an outputs variable name as “CURRENT_DATE_TIME” and passing the date time value . Since this variable we want to use in another job “deploy” . To pass any variables from 2 different jobs we need to create output values 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%2F65j2ocdxitwp5qu9x8dn.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%2F65j2ocdxitwp5qu9x8dn.png" alt="IMG" width="736" height="638"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then we are creating another job named as “deploy” where we are adding our CD part of the Workflow.&lt;/p&gt;

&lt;p&gt;Here &lt;strong&gt;“needs” : build&lt;/strong&gt; means after successfully executing the “build” job only this “deploy” job will run.&lt;/p&gt;

&lt;p&gt;Then the if condition is telling that if branches are “qa” or “master” then only this steps will run inside the runner.&lt;/p&gt;

&lt;p&gt;Then again in the steps checkout repository is happening and in the next step “Download apk-files Artifactory” , we are downloading the artifact which we just uploaded in “build” job. We have mentioned the path where we need to download the artifact&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%2Fqqi7395iisojoy632pst.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%2Fqqi7395iisojoy632pst.png" alt="IMG" width="736" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then in “Display structure of downloaded files” step we are checking the directory structure of downloaded artifacts.&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%2F2darr9rmomjdplmriuqr.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%2F2darr9rmomjdplmriuqr.png" alt="IMG" width="736" height="383"&gt;&lt;/a&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%2F2x4w4dquhwuz2p8h8mzu.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%2F2x4w4dquhwuz2p8h8mzu.png" alt="IMG" width="736" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the next step “Public IP of GitHub Hosted Runner”  we are generating the Public IP of the GitHub Hosted Runner by using the action &lt;a href="//mailto:haythem/public-ip@1.3"&gt;haythem/public-ip@1.3&lt;/a&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%2Fod57aeudqxs0hlcc5mgh.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%2Fod57aeudqxs0hlcc5mgh.png" alt="IMG" width="660" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then in the next step we are adding the Public IP to Security Group in which Jfrog is running in the EC2 Instance so that GitHub Actions can access the Jfrog Page at 8082 using AWS CLI Commands “authorize-security-group-ingress”. For this we need to create a user with having EC2 Full Access permission and give programmatic access to get access_key_id and secret_access_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%2F6t41ebwc4a0muvx6aneq.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%2F6t41ebwc4a0muvx6aneq.png" alt="IMG" width="736" height="265"&gt;&lt;/a&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%2F8iz03fu3o681vgauolc6.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%2F8iz03fu3o681vgauolc6.png" alt="IMG" width="736" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the first step we are downloading the Jfrog CLI with latest version. Add the JF_URL which is the URL of the artifactory where we are storing the .apk files and access token which we can create in Admin → User Management → Access Token .&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%2F3yyvkp3vz3mc3s96pbd8.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%2F3yyvkp3vz3mc3s96pbd8.png" alt="IMG" width="736" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also set the “Password Encryption Policy” to Unsupported for demo purpose.&lt;/p&gt;

&lt;p&gt;Then in the next step we are creating folders for QA and Master Branch. Where in script we are using if and else condition , that if GitHub branch is qa then we will create a directory QA in apk-files directory else master. Now the directory structure will be like:&lt;/p&gt;

&lt;p&gt;apk-files &amp;gt; qa &amp;gt; debug &amp;gt; app-debug-11–11–2022–09–09–12–36.apk&lt;/p&gt;

&lt;p&gt;apk-files &amp;gt; qa&amp;gt; release&amp;gt; app-release-unsigned-11–11–2022–09–09–12–36.apk&lt;/p&gt;

&lt;p&gt;OR&lt;/p&gt;

&lt;p&gt;apk-files &amp;gt; master &amp;gt; debug &amp;gt; app-debug-11–11–2022–09–09–12–36.apk&lt;/p&gt;

&lt;p&gt;apk-files &amp;gt; master &amp;gt; release&amp;gt; app-release-unsigned-11–11–2022–09–09–12–36.apk&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%2Fy59twf63hmoblfaqsrn9.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%2Fy59twf63hmoblfaqsrn9.png" alt="IMG" width="736" height="265"&gt;&lt;/a&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%2Fkj0ar13ojaekro3t3t34.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%2Fkj0ar13ojaekro3t3t34.png" alt="IMG" width="736" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the step “Upload APK files to Jfrog” we are using Jfrog CLI commands to upload apk files from Ubuntu Runner to Jfrog Artifactory –&amp;gt; “android-artifact”&lt;/p&gt;

&lt;p&gt;jf rt u — url ${{ secrets.JF_URL }} — user ${{ secrets.JF_USER }} — password ${{ secrets.JF_PASSWORD }} apk-files/qa/debug/app-debug-${{ needs.build.outputs.CURRENT_DATE_TIME }}.apk android-artifact/&lt;/p&gt;

&lt;p&gt;Here, u means upload , — url means Artifactory Repository URL (android-artifact) one, — user means Username of Jfrog UI and –password means Password of Jfrog UI , &amp;lt;path of the file want to upload&amp;gt; &amp;lt;artifact-repo-name&amp;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%2F7m4zkmhgflta95r0f5l6.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%2F7m4zkmhgflta95r0f5l6.png" alt="IMG" width="736" height="291"&gt;&lt;/a&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%2Foeawsgg5xj24qdrqaqc3.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%2Foeawsgg5xj24qdrqaqc3.png" alt="IMG" width="736" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This URL to file is the JF_URL which we need to add a secret in GitHub Actions.&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%2Fvaihjr0jtcirc3wmgrf7.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%2Fvaihjr0jtcirc3wmgrf7.png" alt="IMG" width="736" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then in the next step , we are removing the GitHub Actions Public IP from the security group of Jfrog EC2 Instance . if: always() make sure that this step runs always although if any steps fails.&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%2Ftfjv3j9jckjhkolhbqhk.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%2Ftfjv3j9jckjhkolhbqhk.png" alt="IMG" width="736" height="80"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then in the last step we are sending notifications to teams. You can see all these information will go to teams.&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%2Fx1gd7zy3qv0ni87vplfm.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%2Fx1gd7zy3qv0ni87vplfm.png" alt="IMG" width="736" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Case&lt;/strong&gt; : If we want to delete the caches which are formed after running each workflow&lt;/p&gt;

&lt;p&gt;Here, we are using workflow_run command  It allows you to execute a workflow based on execution or completion of another workflow. So, here we are telling that “Clear Cache” Workflow will run only when workflow “Android CI and CD” workflow will complete (type of activity) successfully. Then we add &lt;code&gt;permissions&lt;/code&gt; as write in a top-level key, to apply to all jobs in the workflow. When you add the &lt;code&gt;permissions&lt;/code&gt; key within a specific job, all actions and run commands within that job that use the &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; gain the access rights you specify.&lt;/p&gt;

&lt;p&gt;After that we run a script where we are first listing all Caches using JavaScript command and then we are deleting caches using their ID.&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%2Ffn767476l89ar2m4toq8.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%2Ffn767476l89ar2m4toq8.png" alt="IMG" width="736" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see all the caches got deleted which got created in the previous workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Case&lt;/strong&gt; : If we want to delete the artifacts which are formed when we uploaded the artifacts (apk-files) so that we can pass that directory from build job to deploy job using cron job — Every HOUR&lt;/p&gt;

&lt;p&gt;Here, we are running a cron job which will run every hour and delete all artifacts which got created . Here we are passing the GitHub token in purge-artifacts action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Case&lt;/strong&gt; : How to create Self Hosted Runner and how to configure the self-hosted runner application as a service.&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%2Flq8xrxv8zvxbp4xc75ty.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%2Flq8xrxv8zvxbp4xc75ty.png" alt="IMG" width="736" height="368"&gt;&lt;/a&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%2Fk7wgdpitzqhy884gj3f7.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%2Fk7wgdpitzqhy884gj3f7.png" alt="IMG" width="736" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To create self-hosted runner , Go to Settings  Actions  Runner and click create and select the type of OS you have . For me I am choosing Linux OS.&lt;/p&gt;

&lt;p&gt;Run the commands which you get here.&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%2F5tipyumxfczb9fjbe7yo.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%2F5tipyumxfczb9fjbe7yo.png" alt="IMG" width="736" height="114"&gt;&lt;/a&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%2Fj8sbxt5vakfvs0zglisl.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%2Fj8sbxt5vakfvs0zglisl.png" alt="IMG" width="736" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add all the values when asking about Runner Registration.&lt;/p&gt;

&lt;p&gt;To connect to the Runner we need to start the run.sh file&lt;/p&gt;

&lt;p&gt;We can see that the runner is up and running now.&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%2Fyoqngd9eyjaiou81twlz.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%2Fyoqngd9eyjaiou81twlz.png" alt="IMG" width="736" height="228"&gt;&lt;/a&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%2Fbkrs7r3fjio3s436h3e8.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%2Fbkrs7r3fjio3s436h3e8.png" alt="IMG" width="736" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to configure the self-hosted runner application as a service so that the runner is up and running if your Linux machine is up and running&lt;/p&gt;

&lt;p&gt;Run these commands :&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Installing the service&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;1. Stop the self-hosted runner application if it is currently running.&lt;/p&gt;

&lt;p&gt;2. Install the service with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./svc.sh &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3. Alternatively, the command takes an optional &lt;code&gt;user&lt;/code&gt; argument to install the service as a different user.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./svc.sh &lt;span class="nb"&gt;install &lt;/span&gt;USERNAME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;strong&gt;Starting the service&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Start the service with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./svc.sh start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;strong&gt;Checking the status of the service&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Check the status of the service with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./svc.sh status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F5azjpk088hat5lxs9rf0.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%2F5azjpk088hat5lxs9rf0.png" alt="IMG" width="736" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want test with Android Application and want all codes : &lt;a href="https://github.com/devcloudninjas/DevOps-Projects/tree/master/DevOps%20Project-14" rel="noopener noreferrer"&gt;Check this out&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/devcloudninjas" rel="noopener noreferrer"&gt;Buy me a coffee :)&lt;/a&gt; ← — — If you like my articles&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%2Fu60tsvw4tqzk7ebg7mtm.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%2Fu60tsvw4tqzk7ebg7mtm.png" alt="IMG" width="736" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>android</category>
      <category>devops</category>
      <category>cicd</category>
    </item>
    <item>
      <title>DevOps from 0 to Hero - for Freshers</title>
      <dc:creator>Lionel♾️☁️</dc:creator>
      <pubDate>Sun, 20 Oct 2024 08:32:44 +0000</pubDate>
      <link>https://dev.to/devcloudninjas/devops-from-0-to-hero-for-freshers-3mj4</link>
      <guid>https://dev.to/devcloudninjas/devops-from-0-to-hero-for-freshers-3mj4</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DevOps&lt;/strong&gt; is a transformative culture and set of practices that bring together &lt;strong&gt;software development (Dev) and IT operations (Ops)&lt;/strong&gt;. It aims to shorten the &lt;strong&gt;development lifecycle, deliver continuous integration and continuous delivery (CI/CD),&lt;/strong&gt; and ensure high software quality. If you're a fresher with zero knowledge in DevOps, &lt;strong&gt;this guide will help you get started on your journey to becoming a proficient DevOps engineer&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Step-by-Step Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Understand the Basics
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1.1 What is DevOps?
&lt;/h4&gt;

&lt;p&gt;DevOps is a set of practices that combines software development and IT operations. It emphasizes collaboration, communication, and integration between developers and IT operations teams. DevOps aims to automate and streamline the processes of building, testing, and deploying software.&lt;/p&gt;

&lt;h4&gt;
  
  
  1.2 Core DevOps Principles
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Integration (CI)&lt;/strong&gt;: Regularly merging code changes into a central repository to detect and fix integration issues early.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Delivery (CD)&lt;/strong&gt;: Automating the process of deploying code changes to production after passing rigorous automated tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure as Code (IaC)&lt;/strong&gt;: Managing and provisioning infrastructure through code, enabling version control and automated deployment of infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microservices Architecture&lt;/strong&gt;: Breaking down applications into smaller, independently deployable services for improved scalability and maintainability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring and Logging&lt;/strong&gt;: Implementing robust systems to track application performance and quickly identify issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 🔧 Learn the Foundation Skills
&lt;/h3&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%2Fgifdb.com%2Fimages%2Fhigh%2Fcoding-penguin-i-like-pressing-buttons-puv3coc5z4pkth51.webp" 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%2Fgifdb.com%2Fimages%2Fhigh%2Fcoding-penguin-i-like-pressing-buttons-puv3coc5z4pkth51.webp" alt="coding" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2.1 Basic Programming
&lt;/h4&gt;

&lt;p&gt;Learning a programming language is essential for automating tasks and writing scripts. Some widely used languages in DevOps are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt;: Known for its simplicity and readability, Python is great for scripting and automation.

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.learnpython.org/" rel="noopener noreferrer"&gt;Learn Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Go&lt;/strong&gt;: Gaining popularity in DevOps for its performance and concurrency features.

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.golang.org/" rel="noopener noreferrer"&gt;Learn Go&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;JavaScript&lt;/strong&gt;: Often used in web development and automation tasks.

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.javascript.com/" rel="noopener noreferrer"&gt;Learn JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  2.2 Operating Systems
&lt;/h4&gt;

&lt;p&gt;Understanding operating systems, especially Linux, is crucial as most DevOps tools and environments run on Linux. Learn basic commands, file systems, process management, and networking in Linux.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.tutorialspoint.com/unix/index.htm" rel="noopener noreferrer"&gt;Linux Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2.3 Networking Basics
&lt;/h4&gt;

&lt;p&gt;Understanding networking fundamentals is important for configuring and managing servers, containers, and applications. Learn about IP addresses, DNS, HTTP/HTTPS, firewalls, and load balancers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.cisco.com/c/en/us/solutions/small-business/resource-center/networking/networking-basics.html" rel="noopener noreferrer"&gt;Networking Basics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. 🌿 Dive into Version Control
&lt;/h3&gt;

&lt;h4&gt;
  
  
  3.1 Git
&lt;/h4&gt;

&lt;p&gt;Git is a version control system that tracks changes in source code, allowing multiple developers to work on a project simultaneously without conflicts. Learn the basics of Git commands and workflows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/git/tutorials/learn-git-with-bitbucket-cloud" rel="noopener noreferrer"&gt;Git Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;Official Git Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3.2 GitHub
&lt;/h4&gt;

&lt;p&gt;GitHub is a platform for hosting Git repositories, providing tools for collaborative development, code review, and project management.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://guides.github.com/activities/hello-world/" rel="noopener noreferrer"&gt;GitHub Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. 🔄 Master Continuous Integration and Continuous Delivery (CI/CD)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  4.1 Jenkins
&lt;/h4&gt;

&lt;p&gt;Jenkins is an open-source automation server that helps automate parts of the software development process, including building, testing, and deploying code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.jenkins.io/doc/" rel="noopener noreferrer"&gt;Jenkins Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jenkins.io/" rel="noopener noreferrer"&gt;Jenkins Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4.2 GitLab CI/CD
&lt;/h4&gt;

&lt;p&gt;GitLab CI/CD is a powerful tool integrated with GitLab for automating the entire DevOps lifecycle. Learn how to create and manage CI/CD pipelines.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.gitlab.com/ee/ci/" rel="noopener noreferrer"&gt;GitLab CI/CD Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://about.gitlab.com/" rel="noopener noreferrer"&gt;GitLab Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Explore Configuration Management
&lt;/h3&gt;

&lt;h4&gt;
  
  
  5.1 Ansible
&lt;/h4&gt;

&lt;p&gt;Ansible is an open-source automation tool used for configuration management, application deployment, and task automation. It uses simple, human-readable YAML templates to define automation jobs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.ansible.com/ansible/latest/user_guide/index.html" rel="noopener noreferrer"&gt;Ansible Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ansible.com/" rel="noopener noreferrer"&gt;Ansible Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  5.2 Puppet
&lt;/h4&gt;

&lt;p&gt;Puppet is a configuration management tool that helps automate the provisioning and management of infrastructure.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://puppet.com/docs/puppet/latest/puppet_index.html" rel="noopener noreferrer"&gt;Puppet Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://puppet.com/" rel="noopener noreferrer"&gt;Puppet Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. 🐳 Understand Containerization and Orchestration
&lt;/h3&gt;

&lt;h4&gt;
  
  
  6.1 Docker
&lt;/h4&gt;

&lt;p&gt;Docker is a platform for developing, shipping, and running applications inside containers. Containers are lightweight, portable, and consistent environments that ensure applications run the same way regardless of where they are deployed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/get-started/" rel="noopener noreferrer"&gt;Docker Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  6.2 Kubernetes
&lt;/h4&gt;

&lt;p&gt;Kubernetes is an open-source container orchestration platform that automates the deployment, scaling, and management of containerized applications. It helps manage containerized applications in a clustered environment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/home/" rel="noopener noreferrer"&gt;Kubernetes Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/" rel="noopener noreferrer"&gt;Kubernetes Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  7. ☁️ Explore Cloud Platforms
&lt;/h3&gt;

&lt;h4&gt;
  
  
  7.1 AWS (Amazon Web Services)
&lt;/h4&gt;

&lt;p&gt;AWS is a comprehensive cloud computing platform offering a wide range of services, including compute, storage, and databases. Learn the basics of AWS services such as EC2 (virtual servers), S3 (object storage), RDS (relational databases), and Lambda (serverless computing).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/training/" rel="noopener noreferrer"&gt;AWS Training&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;AWS Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  7.2 Azure
&lt;/h4&gt;

&lt;p&gt;Azure is Microsoft's cloud computing platform that provides a variety of cloud services, including those for compute, analytics, storage, and networking. Familiarize yourself with Azure's offerings and capabilities.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/learn/paths/azure-fundamentals/" rel="noopener noreferrer"&gt;Azure Fundamentals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/" rel="noopener noreferrer"&gt;Azure Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  7.3 Google Cloud Platform (GCP)
&lt;/h4&gt;

&lt;p&gt;GCP is Google's cloud computing service, offering a range of services such as compute, storage, and machine learning. Learn about GCP's infrastructure and services.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/training" rel="noopener noreferrer"&gt;GCP Training&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/" rel="noopener noreferrer"&gt;GCP Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. Learn Infrastructure as Code (IaC)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  8.1 Terraform
&lt;/h4&gt;

&lt;p&gt;Terraform is an open-source tool for building, changing, and versioning infrastructure safely and efficiently. It allows you to define and provision infrastructure using a high-level configuration language.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.terraform.io/docs/index.html" rel="noopener noreferrer"&gt;Terraform Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.terraform.io/" rel="noopener noreferrer"&gt;Terraform Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9. 📊 Implement Monitoring and Logging
&lt;/h3&gt;

&lt;h4&gt;
  
  
  9.1 Prometheus
&lt;/h4&gt;

&lt;p&gt;Prometheus is an open-source monitoring system and time-series database that is well-suited for monitoring containerized applications.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://prometheus.io/docs/introduction/overview/" rel="noopener noreferrer"&gt;Prometheus Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prometheus.io/" rel="noopener noreferrer"&gt;Prometheus Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  9.2 ELK Stack (Elasticsearch, Logstash, Kibana)
&lt;/h4&gt;

&lt;p&gt;The ELK Stack is a powerful set of tools for searching, analyzing, and visualizing log data. Elasticsearch stores and indexes log data, Logstash processes it, and Kibana visualizes it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/what-is/elk-stack" rel="noopener noreferrer"&gt;ELK Stack Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/" rel="noopener noreferrer"&gt;Elastic Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  10. Get Hands-On Experience
&lt;/h3&gt;

&lt;h4&gt;
  
  
  10.1 Build Projects
&lt;/h4&gt;

&lt;p&gt;Apply what you've learned by working on real projects. Here are some ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build a complete CI/CD pipeline for a sample application&lt;/li&gt;
&lt;li&gt;Deploy a microservices architecture on Kubernetes&lt;/li&gt;
&lt;li&gt;Implement a multi-cloud disaster recovery solution&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Practical experience is crucial for mastering DevOps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  11. 🤝 Join the Community
&lt;/h3&gt;

&lt;p&gt;Participate in DevOps communities, forums, and meetups to learn from others, share your experiences, and stay updated on industry trends.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://devops.stackexchange.com/" rel="noopener noreferrer"&gt;DevOps Stack Exchange&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/devops/" rel="noopener noreferrer"&gt;DevOps Subreddit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  12. 📚 Continuous Learning
&lt;/h3&gt;

&lt;h4&gt;
  
  
  12.1 Online Courses
&lt;/h4&gt;

&lt;p&gt;Enroll in online courses to deepen your understanding and keep your skills up-to-date. Many platforms offer comprehensive DevOps courses taught by industry experts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.coursera.org/courses?query=devops" rel="noopener noreferrer"&gt;Coursera DevOps Courses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/topic/devops/" rel="noopener noreferrer"&gt;Udemy DevOps Courses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  12.2 Books
&lt;/h4&gt;

&lt;p&gt;Read books on DevOps practices, tools, and methodologies. Some highly recommended books are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;The Phoenix Project&lt;/em&gt; by Gene Kim, Kevin Behr, and George Spafford: A novel about IT, DevOps, and helping your business win.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The DevOps Handbook&lt;/em&gt; by Gene Kim, Jez Humble, Patrick Debois, and John Willis: How to create world-class agility, reliability, and security in technology organizations.&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;DevOps is not just about tools, but also about fostering a culture of collaboration, continuous improvement, and shared responsibility. Embrace the DevOps mindset in your work and interactions with team members.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📚 Security in DevOps (DevSecOps)
&lt;/h2&gt;

&lt;p&gt;As you progress in your DevOps journey, don't forget to integrate security practices into your workflows. DevSecOps emphasizes the importance of building security into every stage of the development process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Career Paths in DevOps
&lt;/h2&gt;

&lt;p&gt;DevOps offers various career paths and specializations. Some roles you might consider as you progress in your career include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DevOps Engineer&lt;/li&gt;
&lt;li&gt;Site Reliability Engineer (SRE)&lt;/li&gt;
&lt;li&gt;Cloud Architect&lt;/li&gt;
&lt;li&gt;Automation Specialist&lt;/li&gt;
&lt;li&gt;DevSecOps Engineer&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;p&gt;To deepen your understanding of specific DevOps topics, here are some in-depth articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/continuous-delivery/principles/continuous-integration-vs-delivery-vs-deployment" rel="noopener noreferrer"&gt;The Comprehensive Guide to CI/CD Pipelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/articles/microservices.html" rel="noopener noreferrer"&gt;Microservices Architecture: A Comprehensive Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hashicorp.com/resources/what-is-infrastructure-as-code" rel="noopener noreferrer"&gt;Infrastructure as Code: What It Is and Why It Matters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes" rel="noopener noreferrer"&gt;The Ultimate Guide to Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  DevOps Podcasts and YouTube Channels
&lt;/h2&gt;

&lt;p&gt;Stay up-to-date with the latest in DevOps through these popular podcasts and YouTube channels:&lt;/p&gt;

&lt;h3&gt;
  
  
  Podcasts:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://devopscafe.org/" rel="noopener noreferrer"&gt;DevOps Cafe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.shipitshow.com/" rel="noopener noreferrer"&gt;The Ship It Show&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.arresteddevops.com/" rel="noopener noreferrer"&gt;Arrested DevOps&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  YouTube Channels:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/c/DevOpsToolkit" rel="noopener noreferrer"&gt;DevOps Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/c/TechWorldwithNana" rel="noopener noreferrer"&gt;TechWorld with Nana&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UCT-nPlVzJI-ccQXlxjSvJmw" rel="noopener noreferrer"&gt;AWS Online Tech Talks&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  A Day in the Life of a DevOps Engineer
&lt;/h2&gt;

&lt;p&gt;To give you a practical perspective of what it's like to work as a DevOps engineer, here's a typical day:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Activity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8:00 AM&lt;/td&gt;
&lt;td&gt;Start the day by checking monitoring dashboards for any overnight issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9:00 AM&lt;/td&gt;
&lt;td&gt;Attend the daily stand-up meeting with the development team to discuss ongoing projects and potential blockers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:00 AM&lt;/td&gt;
&lt;td&gt;Work on automating a deployment process using Jenkins and Ansible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12:00 PM&lt;/td&gt;
&lt;td&gt;Lunch break and catch up on the latest DevOps news and trends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1:00 PM&lt;/td&gt;
&lt;td&gt;Troubleshoot a production issue reported by the operations team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3:00 PM&lt;/td&gt;
&lt;td&gt;Collaborate with developers to optimize a Docker container for a new microservice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4:00 PM&lt;/td&gt;
&lt;td&gt;Review and merge pull requests for infrastructure-as-code changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5:00 PM&lt;/td&gt;
&lt;td&gt;Document the day's work and plan for tomorrow's tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;This schedule can vary greatly depending on the organization and current projects, but it gives you an idea of the diverse tasks a DevOps engineer might handle in a day.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Learning DevOps from scratch may seem daunting, but with the right approach and resources, you can master the essential skills and become a proficient DevOps engineer. Follow this step-by-step guide, practice consistently, and engage with the DevOps community to accelerate your learning journey.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stay curious, and embrace the DevOps mindset to drive innovation and efficiency in software development and operations!&lt;/strong&gt; 🎉&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;em&gt;Thank you for reading our blog …:)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;© &lt;strong&gt;Copyrights:&lt;/strong&gt; &lt;a href="https://t.me/devcloudninjas" rel="noopener noreferrer"&gt;&lt;strong&gt;DevCloudNinjas&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Join Our &lt;a href="https://t.me/devcloudninjas" rel="noopener noreferrer"&gt;&lt;strong&gt;Telegram Community&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;||&lt;/strong&gt; &lt;a href="https://github.com/devcloudninjas" rel="noopener noreferrer"&gt;&lt;strong&gt;Follow us for more&lt;/strong&gt;&lt;/a&gt; DevOps Content.
&lt;/h3&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%2Fuploads%2Farticles%2Fgz7oxsordnr5imq3cxua.gif" 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%2Fuploads%2Farticles%2Fgz7oxsordnr5imq3cxua.gif" alt="meh" width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloud</category>
      <category>newbie</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
