<?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: lotanna obianefo</title>
    <description>The latest articles on DEV Community by lotanna obianefo (@lotanna_obianefo).</description>
    <link>https://dev.to/lotanna_obianefo</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2948194%2Ff50ef024-0b79-4753-bbd2-086f89d51ebc.png</url>
      <title>DEV Community: lotanna obianefo</title>
      <link>https://dev.to/lotanna_obianefo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lotanna_obianefo"/>
    <language>en</language>
    <item>
      <title>Inside .git, Objects &amp; Hashing</title>
      <dc:creator>lotanna obianefo</dc:creator>
      <pubDate>Mon, 22 Jun 2026 15:02:37 +0000</pubDate>
      <link>https://dev.to/lotanna_obianefo/inside-git-objects-hashing-44gc</link>
      <guid>https://dev.to/lotanna_obianefo/inside-git-objects-hashing-44gc</guid>
      <description>&lt;p&gt;Understanding what happens inside the hidden &lt;strong&gt;&lt;em&gt;.git&lt;/em&gt;&lt;/strong&gt; directory is one of the most important steps toward mastering Git. It helps explain why Git is fast, reliable, and capable of tracking millions of changes across large software projects.&lt;/p&gt;

&lt;p&gt;When you initialize a repository with &lt;strong&gt;&lt;em&gt;git init&lt;/em&gt;&lt;/strong&gt; Git creates a hidden directory called &lt;strong&gt;&lt;em&gt;.git/&lt;/em&gt;&lt;/strong&gt;. It contains everything Git needs to track changes, manage versions, store commit history, and maintain the overall state of your project.&lt;/p&gt;

&lt;p&gt;Git &lt;strong&gt;&lt;em&gt;Objects&lt;/em&gt;&lt;/strong&gt; is the building blocks that make up your repository. Together, they allow Git to efficiently store and track project history. &lt;strong&gt;&lt;em&gt;Object&lt;/em&gt;&lt;/strong&gt; is the basic unit of storage used internally by Git. Every piece of information in a repository is stored as one of these four object types;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blob for Storing file contents&lt;/li&gt;
&lt;li&gt;Tree for Storing directory and file structure&lt;/li&gt;
&lt;li&gt;Commit for Storing a snapshot of the repository and metadata&lt;/li&gt;
&lt;li&gt;Tag for Storing references to specific releases or versions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Hashing&lt;/em&gt;&lt;/strong&gt; is the process of converting data into a unique, fixed-length identifier called a hash. Git uses the SHA-1 hashing algorithm to generate these identifiers.&lt;br&gt;
This hash acts like a unique fingerprint for the content. If the content changes, even by a single character, Git generates a completely different hash.&lt;/p&gt;

&lt;p&gt;Now let's perform a mini project to help understand these...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initialise &amp;amp; Explore the .git Directory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Initialize a new Git repository and examine the hidden .git directory to understand how Git stores and manages commits, branches, configuration files, and other version control data behind the scenes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Initialise a New Repository&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step creates a new working directory, initializes a Git repository using &lt;strong&gt;&lt;em&gt;git init&lt;/em&gt;&lt;/strong&gt;, and verifies the repository's state with &lt;strong&gt;&lt;em&gt;git status&lt;/em&gt;&lt;/strong&gt;. During initialization, Git generates a hidden &lt;strong&gt;&lt;em&gt;.git&lt;/em&gt;&lt;/strong&gt; directory that contains the internal database and configuration files required for version control.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;&lt;em&gt;git init&lt;/em&gt;&lt;/strong&gt; command is the starting point of every Git workflow. It creates the foundational repository structure that Git uses to store objects, track changes, manage branches, and maintain commit history. Without a &lt;strong&gt;&lt;em&gt;.git&lt;/em&gt;&lt;/strong&gt; directory, Git cannot record versions, store metadata, or perform any version control operations.&lt;/p&gt;

&lt;p&gt;Understanding what git init does behind the scenes helps build a solid foundation for learning Git, as every commit, branch, tag, and repository operation depends on the database structure it creates.&lt;/p&gt;

&lt;p&gt;Every software project should begin with a properly initialized repository. Establishing version control from the start promotes consistency, traceability, and effective collaboration throughout the software development lifecycle.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Creates a new directory (folder).
       mkdir git-internals-lab

      # Changes the current directory.
       cd git-internals-lab

      # Initializes a new Git repository in the current directory.
       git init

      # Shows which files are staged, modified, or untracked your current working state.
       git 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1v4pelsmspk5iydrd9qf.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1v4pelsmspk5iydrd9qf.png" alt="Isfsfsf" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;Tour the .git Directory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step examines the contents of the hidden &lt;strong&gt;&lt;em&gt;.git&lt;/em&gt;&lt;/strong&gt; directory, including key components such as HEAD, config, objects, refs, hooks, and info. It also inspects files like HEAD, which identifies the currently checked-out branch, and config, which stores repository-specific settings.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;&lt;em&gt;.git&lt;/em&gt;&lt;/strong&gt; directory is the core of every Git repository. It contains all the information Git uses to manage version control, including commit history, branches, tags, configuration settings, and object storage. Files such as HEAD act as pointers to the current branch, while the objects directory stores Git's internal database and refs maintains references to branches and tags.&lt;/p&gt;

&lt;p&gt;Understanding the structure of the &lt;strong&gt;&lt;em&gt;.git&lt;/em&gt;&lt;/strong&gt; directory provides valuable insight into how Git operates behind the scenes. This knowledge helps demystify advanced concepts such as branching, rebasing, reflog inspection, repository recovery, and troubleshooting version control issues.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Lists files and directories. -l shows details (permissions, size, date).
       ls .git

      # Displays the contents of Git's HEAD file
       cat .git/HEAD

      # Displays the repository's local configuration file
       cat .git/config

      # lists the contents of the Git refs directory
       ls .git/refs
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzzrm39p15z99825q87h7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzzrm39p15z99825q87h7.png" alt="uyyutytyy" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hashing &amp;amp; Blob Objects&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Generate your first SHA hash and observe how Git converts a file into a content-addressed blob object stored in the object database. The SHA hash acts as a unique identifier based on the file's contents, allowing Git to track and retrieve the file efficiently without relying on its filename or location.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Create a File and Hash It&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Writes "Hello Git" to hello.txt and instructs Git to calculate the file's SHA-1 hash without storing the file as an object. The resulting hash (for example, &lt;strong&gt;&lt;em&gt;9f4d96d5b00d98959ea9960f069585ce42b1349a&lt;/em&gt;&lt;/strong&gt;) serves as a unique content fingerprint that identifies the file based solely on its contents.&lt;/p&gt;

&lt;p&gt;Git tracks data by its hash rather than its filename. Identical content always produces the same hash, while even a one-character modification generates an entirely different hash. This content-addressable design makes Git history tamper-evident, as altering a file changes its hash and invalidates every reference that depends on it.&lt;/p&gt;

&lt;p&gt;Cryptographic hashing helps ensure the integrity and authenticity of repository data.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       # Prints text to the terminal — also used to write to files with &amp;gt; or &amp;gt;&amp;gt;.
        echo 'Hello Git' &amp;gt; hello.txt

       # Runs a Git version control command.
        git hash-object hello.txt
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz71021nlm8wmzgvy6h41.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz71021nlm8wmzgvy6h41.png" alt="rdtrdyftt" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;Write the Blob to the Object Store&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;&lt;em&gt;-w&lt;/em&gt;&lt;/strong&gt; flag tells Git to store the file as a blob object in the &lt;strong&gt;&lt;em&gt;.git/objects&lt;/em&gt;&lt;/strong&gt; directory. Using &lt;strong&gt;&lt;em&gt;find&lt;/em&gt;&lt;/strong&gt; reveals that Git stores the object at &lt;strong&gt;&lt;em&gt;.git/objects/first-2-chars/remaining-38-chars&lt;/em&gt;&lt;/strong&gt;, splitting the hash into a directory and filename to prevent a single directory from containing too many files.&lt;/p&gt;

&lt;p&gt;An object's hash determines its storage location. Identical files produce the same hash and are stored only once, reducing duplication while allowing Git to efficiently manage millions of objects.&lt;/p&gt;

&lt;p&gt;Hash-based directory sharding enables fast object lookups and maintains filesystem performance as repositories grow.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        # Runs a Git version control command.
        git hash-object -w hello.txt

        # Searches for files and directories matching criteria (name, type, size, date, etc.).
        find .git/objects -type f

        # Lists files and directories. -l shows details (permissions, size, date).
         ls .git/objects
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzazur4rak99p2isivxrt.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzazur4rak99p2isivxrt.png" alt="ddfhdtzas" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3&lt;/strong&gt;. &lt;strong&gt;Inspect the Blob with cat-file&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;git cat-file -t&lt;/em&gt;&lt;/strong&gt; displays the object's type (such as blob), while &lt;strong&gt;&lt;em&gt;git cat-file -p&lt;/em&gt;&lt;/strong&gt; prints the object's contents in a human-readable format. Replace the example hash with the hash generated in your environment, the output will be identical if the file contents are the same.&lt;/p&gt;

&lt;p&gt;A blob object stores only the file's contents. it does not contain the filename, directory path, or commit history. This is why multiple files with identical content can reference the same blob object. File names and directory structures are stored separately in tree objects.&lt;/p&gt;

&lt;p&gt;Low-level Git commands such as &lt;strong&gt;&lt;em&gt;cat-file&lt;/em&gt;&lt;/strong&gt; provide valuable insight into Git's internal data model and can assist with troubleshooting, data recovery, and advanced repository management.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             # Runs a Git version control command.
              git cat-file -t 9f4d96d5b00d98959ea9960f069585ce42b1349a

             # Runs a Git version control command.
              git cat-file -p 9f4d96d5b00d98959ea9960f069585ce42b1349a
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft2r6occkpsyjzz74irqs.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft2r6occkpsyjzz74irqs.png" alt="Ifdsggfhs" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commits, Trees &amp;amp; Snapshots&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stage and commit your file, then observe how Git represents a project snapshot using three core object types: blob, tree, and commit.&lt;/p&gt;

&lt;p&gt;In this structure, a blob stores the file contents, a tree represents the directory hierarchy, and a commit ties everything together with metadata such as the author, timestamp, and a reference to the root tree object. This object model is what enables Git’s efficient version tracking and history reconstruction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Stage and Create the First Commit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Configures your Git identity for commit attribution, stages &lt;strong&gt;&lt;em&gt;hello.txt&lt;/em&gt;&lt;/strong&gt;, creates the initial commit, and displays the commit history using the log.&lt;/p&gt;

&lt;p&gt;During this process, Git builds its internal object graph. A blob stores the file content, a tree represents the directory structure, and a commit object references the tree while also capturing metadata such as author, timestamp, and message.&lt;/p&gt;

&lt;p&gt;Specifically, &lt;strong&gt;&lt;em&gt;git add&lt;/em&gt;&lt;/strong&gt; writes the file content as a blob and records it in the staging index, while &lt;strong&gt;&lt;em&gt;git commit&lt;/em&gt;&lt;/strong&gt; converts the staged index into a tree snapshot and then creates a commit object pointing to that tree. Together, these three objects form a single atomic snapshot of the repository state, which becomes the fundamental unit of Git history.&lt;/p&gt;

&lt;p&gt;This supports Operational Excellence by enabling atomic, immutable snapshots that allow safe rollbacks, efficient debugging, and reliable history traversal like bisecting changes.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Sets Git configuration email.
      git config --global user.email 'you@example.com'

      # Sets Git configuration name.
      git config --global user.name 'Your Name'

      # Stages the specified file(s) for the next commit.
      git add hello.txt

      # Creates a new commit with all staged changes and the message after -m.
      git commit -m 'Initial commit'

      # Shows the commit history. --oneline condenses each commit to one line, --graph shows branches visually.
      git log --oneline
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcx0fepssz3at21qr4mwb.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcx0fepssz3at21qr4mwb.png" alt="Idseeq" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;Inspect the Commit Object&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;git rev-parse&lt;/em&gt;&lt;/strong&gt; outputs the SHA-1 (or SHA-256) identifier of the current commit. &lt;strong&gt;&lt;em&gt;git cat-file -t&lt;/em&gt;&lt;/strong&gt; verifies the object type as a commit, while &lt;strong&gt;&lt;em&gt;git cat-file -p&lt;/em&gt;&lt;/strong&gt; displays its full internal structure, including the referenced tree SHA, author and committer metadata, timestamp, parent commit reference(s), and commit message.&lt;/p&gt;

&lt;p&gt;A commit object itself does not store file contents. Instead, it contains metadata (author, committer, timestamps, parent commit SHA, and message) and a single reference to a tree object, which represents the project’s directory snapshot. That tree, in turn, references blob objects that store the actual file contents.&lt;/p&gt;

&lt;p&gt;This supports Security by providing cryptographic identifiers and immutable history, enabling accurate traceability, forensic auditing, and verification of who made each change and when.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Runs a Git version control command.
      git rev-parse HEAD

      # Runs a Git version control command.
      git cat-file -t HEAD

      # Runs a Git version control command.
      git cat-file -p HEAD
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2entwlc2vi7xq0gduviv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2entwlc2vi7xq0gduviv.png" alt="ghfytftj" width="799" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3&lt;/strong&gt;. &lt;strong&gt;Inspect the Tree Object&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;git ls-tree&lt;/em&gt;&lt;/strong&gt; displays the contents of a tree object, which represents a snapshot of a directory in Git. The TREE variable typically resolves to the tree SHA referenced by HEAD, and &lt;strong&gt;&lt;em&gt;git cat-file -p&lt;/em&gt;&lt;/strong&gt; reveals its entries in the format. File mode (e.g., &lt;strong&gt;&lt;em&gt;100644&lt;/em&gt;&lt;/strong&gt;), object type (blob or tree), object SHA, and filename (e.g., &lt;strong&gt;&lt;em&gt;hello.txt&lt;/em&gt;&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;A tree object functions as a mapping between filenames and their corresponding object hashes. It can point either to blob objects (files) or to other tree objects (subdirectories), thereby reconstructing the project’s directory hierarchy. This is the mechanism through which Git restores filenames and directory structure on top of its content-addressable storage. The file mode (such as &lt;strong&gt;&lt;em&gt;100644&lt;/em&gt;&lt;/strong&gt;) represents Unix-style permission metadata.&lt;/p&gt;

&lt;p&gt;This supports Operation by enabling deep inspection of repository structure, which is critical for debugging diffs, analyzing history, and performing precise, targeted history modifications.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Runs a Git version control command.
      git ls-tree HEAD

      # Sets the shell variable TREE so later commands can reference it with $TREE.
      TREE=$(git rev-parse HEAD^{tree})

      # Runs a Git version control command.
      git cat-file -p $TREE
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ygqbn7yzrsod4m8y5hw.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ygqbn7yzrsod4m8y5hw.png" alt="Iuygytftr" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4&lt;/strong&gt;. &lt;strong&gt;Observe Snapshots, Not Deltas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Compares the number of Git objects before and after making a small change to a file. After the second commit, Git typically creates three new objects: a blob containing the updated file content, a tree representing the updated directory structure, and a commit object representing the new repository snapshot. As a result, the total object count increases by three.&lt;/p&gt;

&lt;p&gt;Git's architecture is based on immutable snapshots rather than modifying existing objects. Each commit references a complete tree that represents the state of the repository at a specific point in time. When changes are made, Git creates new objects while preserving all previous ones unchanged. This design allows you to instantly check out historical commits, reliably reconstruct repository states, and maintain a highly resilient version history.&lt;/p&gt;

&lt;p&gt;This supports Reliability by ensuring that every commit is an immutable, independently recoverable snapshot, providing robust protection against data loss and enabling safe rollback to any previous state.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Searches for files and directories matching criteria (name, type, size, date, etc.).
       find .git/objects -type f | wc -l

      # Prints text to the terminal &amp;amp; also used to write to files with &amp;gt; or &amp;gt;&amp;gt;.
       echo 'Another line' &amp;gt;&amp;gt; hello.txt

      # Stages the specified file(s) for the next commit.
       git add hello.txt

      # Creates a new commit with all staged changes and the message after -m.
       git commit -m 'Updated file'

      # Searches for files and directories matching criteria (name, type, size, date, etc.).
       find .git/objects -type f | wc -l
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flkkoteph97gdxmu22qdz.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flkkoteph97gdxmu22qdz.png" alt="ytyruyuyu" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Refs, HEAD &amp;amp; Publishing to GitHub&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Trace the &lt;strong&gt;HEAD&lt;/strong&gt; → &lt;strong&gt;Branch&lt;/strong&gt; → &lt;strong&gt;Commit&lt;/strong&gt; → &lt;strong&gt;Tree&lt;/strong&gt; → &lt;strong&gt;Blob&lt;/strong&gt; reference chain to understand how Git locates and reconstructs a project snapshot. Then push the repository to GitHub and observe how Git transfers all required objects commits, trees, and blobs to the remote repository, preserving the complete history and structure of your project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Trace HEAD and Branch Refs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reads the HEAD file, which typically contains a reference such as ref. &lt;strong&gt;&lt;em&gt;refs/heads/main&lt;/em&gt;&lt;/strong&gt;, and then reads the corresponding branch reference file, which stores the SHA of the latest commit. Running &lt;strong&gt;&lt;em&gt;git rev-parse HEAD&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;git rev-parse main&lt;/em&gt;&lt;/strong&gt; returns the same commit SHA, demonstrating how Git resolves references through a chain of indirection.&lt;/p&gt;

&lt;p&gt;HEAD is a symbolic reference that points to a branch rather than directly to a commit. The branch itself is a lightweight reference that stores the SHA of the latest commit. When a new commit is created, Git generates a new commit object and updates the branch reference to point to it, while HEAD continues to reference the branch. This design makes branches inexpensive to create and update, and also explains detached HEAD state, where HEAD points directly to a commit instead of a branch.&lt;/p&gt;

&lt;p&gt;Understanding how HEAD and branch references work helps prevent common Git issues such as detached HEAD states, lost commits, and accidental branch overwrites.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Runs a Git version control command.
       cat .git/HEAD

       cat .git/refs/heads/main

       git rev-parse HEAD


      # Runs a Git version control command.
       git rev-parse main
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fepehk05e1ydsffhedud7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fepehk05e1ydsffhedud7.png" alt="uhuy7y87y7" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;Set Up SSH Auth and Add a Remote&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Generates an Ed25519 SSH key pair and adds the public key to GitHub (&lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;SSH&lt;/strong&gt; and &lt;strong&gt;GPG keys&lt;/strong&gt;) to enable secure authentication. &lt;br&gt;
Next, registers a GitHub repository as the &lt;strong&gt;&lt;em&gt;origin&lt;/em&gt;&lt;/strong&gt; remote. Before doing so, create an empty repository on GitHub and avoid initializing it with a README, &lt;strong&gt;&lt;em&gt;.gitignore&lt;/em&gt;&lt;/strong&gt;, or license file to prevent conflicts with your local repository.&lt;/p&gt;

&lt;p&gt;A remote is a named reference to another Git repository, allowing Git to exchange commits and objects between locations. Ed25519 SSH keys are the modern standard for Git authentication, providing strong cryptographic security, faster key operations, and passwordless access. Once the origin remote is configured, Git knows where to send (&lt;strong&gt;push&lt;/strong&gt;) and retrieve (&lt;strong&gt;pull&lt;/strong&gt;) repository data.&lt;/p&gt;

&lt;p&gt;SSH key-based authentication replaces password-based workflows with cryptographic identity verification, improving both security and automation compatibility.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Stages the specified file(s) for the next commit.
       ssh-keygen -t ed25519 -C 'you@example.com'

       cat ~/.ssh/id_ed25519.pub

       git remote add origin git@github.com:&amp;lt;YOUR_USERNAME&amp;gt;/git-internals-lab.git

      # Manages remote repository connections (origin, upstream, etc.).
      git remote -v
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8skzcbmvg0mp2reo1lm3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8skzcbmvg0mp2reo1lm3.png" alt="regehterye" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3&lt;/strong&gt;. &lt;strong&gt;Push Every Object to GitHub&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uploads all reachable Git objects blobs, trees, and commits to the remote repository and updates the remote branch reference (e.g., main) to point to your latest commit. The &lt;strong&gt;&lt;em&gt;-u&lt;/em&gt;&lt;/strong&gt; flag sets origin/main as the upstream tracking branch, enabling simplified future push and pull operations. &lt;strong&gt;&lt;em&gt;git ls-remote&lt;/em&gt;&lt;/strong&gt; can be used to inspect and verify the current references stored on the remote.&lt;/p&gt;

&lt;p&gt;A git push operation is fundamentally object replication combined with a reference update. Git ensures that the remote repository stores the exact same objects as your local repository, identified by identical SHA-1 (or SHA-256) hashes. As a result, the commit history, file contents, and directory structure remain fully consistent across environments, meaning GitHub reconstructs the same tree and blob relationships you have locally.&lt;/p&gt;

&lt;p&gt;This supports Reliability by leveraging Git’s distributed architecture, where every clone contains a complete, self-contained history, enabling redundancy, integrity, and full recoverability of the repository state. &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Uploads your local commits to the remote repository.
      git push -u origin main

      # Manages remote repository connections (origin, upstream, etc.).
      git ls-remote origin
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frxyl32rj0fdvaga4hlvq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frxyl32rj0fdvaga4hlvq.png" alt="Ixfvsdvds" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although Git appears simple on the surface, it is powered by a sophisticated object database and hashing system. Every file, directory, and commit is stored as an object identified by a unique hash, allowing Git to efficiently track changes and maintain repository integrity.&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>Local Machine to GitHub Repo</title>
      <dc:creator>lotanna obianefo</dc:creator>
      <pubDate>Tue, 16 Jun 2026 22:22:45 +0000</pubDate>
      <link>https://dev.to/lotanna_obianefo/local-machine-to-github-repo-529c</link>
      <guid>https://dev.to/lotanna_obianefo/local-machine-to-github-repo-529c</guid>
      <description>&lt;p&gt;Version control is a fundamental practice in modern software development and DevOps. It enables developers to track changes, collaborate efficiently, and maintain a complete history of their codebase. One of the most widely used version control systems is Git, while GitHub provides a cloud based platform for storing and managing Git repositories.&lt;/p&gt;

&lt;p&gt;In this project, we will explore the complete process of moving code from a local machine to a GitHub repository. By the end, you will understand how to initialize a Git repository, track changes, create commits, connect to GitHub, and push your code to a remote repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workspace Preparation&lt;/strong&gt;: &lt;/p&gt;

&lt;p&gt;Install the terminal environment and tools required to perform Git operations on Windows or macOS. This environment allows you to execute Git commands for version control, repository management, and collaboration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;GitBash&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Download and install the official Git package for your operating system (Windows, macOS, or Linux). The installer includes Git and the tools required to perform version control operations from the command line.&lt;/p&gt;

&lt;p&gt;Git Bash provides a Unix-like command-line environment on Windows, allowing users to execute Git commands and work with shell utilities commonly used in software development, cloud computing, and DevOps workflows. It offers a consistent experience similar to Linux and macOS terminals, making it an industry standard tool for developers and DevOps engineers.&lt;/p&gt;

&lt;p&gt;Using standardized tools and environments across the software development lifecycle promotes operational excellence by improving consistency, collaboration, and automation. A common command-line interface helps teams reduce environment specific issues, streamline workflows, and maintain reliable development and deployment processes.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       # Visit: https://git-scm.com/downloads
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Global Identity Configuration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before creating commits, configure your global Git profile by setting your username and email address. Git uses this information to identify the author of each commit, ensuring that all changes are correctly attributed to you across your repositories.&lt;/p&gt;

&lt;p&gt;Properly configuring your Git identity improves traceability and accountability, making it easier to track contributions, collaborate with other developers, and maintain an accurate project history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Set Global Username&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Configures your identity in the global &lt;strong&gt;.gitconfig&lt;/strong&gt; file on your local machine, ensuring that all commits are consistently attributed to you.&lt;/p&gt;

&lt;p&gt;Git is a distributed version control system, and every change must be associated with an author identity to support traceability, collaboration, and accountability across teams.&lt;/p&gt;

&lt;p&gt;This follows the principle of operational excellence by maintaining clear ownership, auditability, and a reliable history of changes within the codebase.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git config --global user.name "Your Name"
&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%2Fg1yvs30d998xr2fohut5.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%2Fg1yvs30d998xr2fohut5.png" alt="ihjiugyu" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;Set Global Email&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Associates your email address with all commits made from your local Git environment.&lt;/p&gt;

&lt;p&gt;This email is used by platforms such as GitHub to map your local Git activity to your remote user profile, including your avatar, contribution history, and activity graph.&lt;/p&gt;

&lt;p&gt;From a security and governance perspective, this ensures that every commit is tied to a verifiable identity, supporting authentication, traceability, and accountability within collaborative development workflows.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git config --global user.email "your-email@example.com"
&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%2Fel0lqdbhhdp8mtjo1qhj.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%2Fel0lqdbhhdp8mtjo1qhj.png" alt="ihjiugyutuy" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local Repository Initialization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a dedicated project directory and initialize a Git repository within it.&lt;/p&gt;

&lt;p&gt;This sets up Git's version control framework by creating a hidden .git directory, enabling the project to track file changes, manage revisions, and support collaborative development workflows from the start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Create Project Directory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Creates a new directory named &lt;strong&gt;&lt;em&gt;website&lt;/em&gt;&lt;/strong&gt; and changes the terminal's current working directory to that location.&lt;/p&gt;

&lt;p&gt;Organizing each project in its own dedicated directory helps prevent accidental file modifications, simplifies project management, and maintains a clean and structured development environment.&lt;/p&gt;

&lt;p&gt;This aligns with the principle of Operational Excellence by promoting effective workspace organization, consistency, and maintainability across projects.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Creates a new directory (folder).
      mkdir website

      # Changes the current directory.
      cd website
&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%2Fz0ky43qg9t4lk7j4c16x.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%2Fz0ky43qg9t4lk7j4c16x.png" alt="oihyuft" width="799" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;Initialize Git Engine&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Initializes a Git repository by creating a hidden .git directory, which acts as the local database for storing version history, configuration settings, and metadata related to your project.&lt;/p&gt;

&lt;p&gt;Without this initialization step, Git cannot monitor file changes, record commit history, or provide version control capabilities.&lt;/p&gt;

&lt;p&gt;This supports the principle of Reliability by establishing a solid foundation for change tracking, version management, and recovery from unintended modifications.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Initializes a new Git repository in the current directory.
       git init
&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%2Fck54aw7pdwtr8m1c1ara.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%2Fck54aw7pdwtr8m1c1ara.png" alt="uygyu" width="799" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Artifact Creation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create your first web asset within the project directory.&lt;/p&gt;

&lt;p&gt;This file serves as the foundation of your web application and becomes part of the source code that Git can track, version, and manage throughout the development lifecycle. Starting with a structured project asset helps establish good development and version control practices from the outset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Generate index.html&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Creates an empty file named index.html in the current working directory.&lt;/p&gt;

&lt;p&gt;The index.html file serves as the default entry point for most web servers and static hosting platforms such as GitHub Pages, allowing it to be automatically loaded when a user accesses a website root.&lt;/p&gt;

&lt;p&gt;This follows the principle of Reliability by adhering to standard web conventions, ensuring predictable behavior and consistent application structure across hosting environments.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Creates an empty file or updates the timestamp of an existing one.
       touch index.html
&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%2Fl94dh8jq90td3plaz1ru.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%2Fl94dh8jq90td3plaz1ru.png" alt="ijhuygy" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content Authoring (Vi/Vim)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Learn how to use an industry-standard command-line text editor to create and manage your website content.&lt;/p&gt;

&lt;p&gt;This skill enables you to efficiently edit files directly from the terminal, which is essential for remote development environments, server management, and professional software engineering workflows where graphical editors may not be available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Open File in Vim&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Opens the &lt;strong&gt;&lt;em&gt;index.html&lt;/em&gt;&lt;/strong&gt; file in the Vim text editor for direct modification within the terminal.&lt;/p&gt;

&lt;p&gt;Editing files via the command line is a fundamental skill in DevOps and system administration, particularly in environments where GUI-based editors are unavailable, such as remote servers and containers.&lt;/p&gt;

&lt;p&gt;This aligns with Operational Excellence by promoting proficiency in terminal-based tooling, improving efficiency, and enabling consistent development across diverse environments.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      vi index.html
&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%2Flhi4t8dbzw96flzva6a5.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%2Flhi4t8dbzw96flzva6a5.png" alt="juguuoi" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;Enter Insert Mode&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Switches Vim from Normal Mode to Insert Mode, enabling direct text input and file editing.&lt;/p&gt;

&lt;p&gt;Vim is a modal text editor, meaning different modes are used for navigation and editing. Insert Mode must be explicitly activated before content can be added or modified.&lt;/p&gt;

&lt;p&gt;This supports Operational Excellence by enabling efficient, precise text manipulation through a structured, mode-based editing workflow.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Press 'i' on your keyboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;3&lt;/strong&gt;. &lt;strong&gt;Add Website Content&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Adds the website’s HTML structure and content to the file.&lt;/p&gt;

&lt;p&gt;This markup defines what is rendered in the browser and determines how users will view and interact with the webpage when it is deployed.&lt;/p&gt;

&lt;p&gt;This aligns with Reliability by ensuring the application has a valid, well-defined entry point that can be correctly interpreted and displayed by web browsers.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Paste your HTML content (Resume, Website, etc.)
      # TIP: You can generate a sample resume template!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;4&lt;/strong&gt;. &lt;strong&gt;Save and Exit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The command &lt;strong&gt;&lt;em&gt;:wq&lt;/em&gt;&lt;/strong&gt; in Vim means write and quit, where &lt;strong&gt;&lt;em&gt;w&lt;/em&gt;&lt;/strong&gt; saves the current changes to disk and &lt;strong&gt;&lt;em&gt;q&lt;/em&gt;&lt;/strong&gt; exits the editor.&lt;/p&gt;

&lt;p&gt;Writing ensures that all modifications are persisted to the file system, while quitting returns you to the terminal environment (e.g., Git Bash) to continue executing commands.&lt;/p&gt;

&lt;p&gt;This supports Operational Excellence by promoting safe, intentional file handling and ensuring changes are explicitly saved before exiting the editing session.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # 1. Press 'ESC' to return to Normal Mode
      # 2. Type ':wq' and press Enter
&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%2F1r58q0lj9j4d7dneo4j8.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%2F1r58q0lj9j4d7dneo4j8.png" alt="hjhugyu" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Staging Changes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prepare your authored content for inclusion in a repository snapshot.&lt;/p&gt;

&lt;p&gt;This means organizing and staging your modified files so they are ready to be recorded as part of a Git commit, creating a consistent and trackable version of your project’s current state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Stage the File&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Adds the file from the Working Directory to Git's Staging Area, marking it for inclusion in the next commit.&lt;/p&gt;

&lt;p&gt;The staging area acts as an intermediate layer where changes are selected and reviewed before being permanently recorded in the repository history through a commit. This allows developers to group related changes and maintain controlled, intentional updates.&lt;/p&gt;

&lt;p&gt;This supports Operational Excellence by enabling granular control over the content of commits, improving change management, traceability, and overall code quality.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Stages the specified file(s) for the next commit.
       git add index.html
&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%2F9yw47kwh78og65sx3jbb.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%2F9yw47kwh78og65sx3jbb.png" alt="iyftfrt" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First Commit Snapshot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Record your staged changes as a new commit in the local Git repository.&lt;/p&gt;

&lt;p&gt;A commit creates a permanent snapshot of the files currently in the staging area and stores it in Git's version history. Each commit serves as a checkpoint, allowing you to track progress, review changes, and revert to previous versions if necessary.&lt;/p&gt;

&lt;p&gt;This supports Reliability by maintaining a complete and traceable history of project changes, enabling effective version control and recovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Commit with Message&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Creates a Git commit, which packages all staged changes into a commit object identified by a unique hash and accompanied by a descriptive commit message.&lt;/p&gt;

&lt;p&gt;A commit acts as a permanent snapshot of your project's state at a specific point in time. These snapshots provide a reliable history of changes, making it possible to review progress, compare versions, and revert to a known working state if issues arise later.&lt;/p&gt;

&lt;p&gt;This supports Reliability by enabling point-in-time recovery, preserving historical records, and ensuring traceability throughout the software development lifecycle.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Creates a new commit with all staged changes and the message after -m.
      git commit -m "Create index.html with Vim"
&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%2Fa2y0xyityjobnsbamyxf.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%2Fa2y0xyityjobnsbamyxf.png" alt="jgytyytu" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Establishing the Cloud Link&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Connect your local Git repository to a remote repository hosted on GitHub.&lt;/p&gt;

&lt;p&gt;This establishes a link between your local development environment and the remote repository, enabling you to synchronize code, share changes with collaborators, and back up your project to a centralized version control platform.&lt;/p&gt;

&lt;p&gt;This supports Operational Excellence by facilitating collaboration, maintaining a single source of truth for the codebase, and ensuring changes can be reliably distributed across development teams and environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Add Remote Origin&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Associates the remote alias origin with the URL of your GitHub repository.&lt;/p&gt;

&lt;p&gt;Git is a distributed version control system, which means local repositories operate independently. Before code can be shared or synchronized, you must explicitly define the remote destination where changes will be pushed and retrieved.&lt;/p&gt;

&lt;p&gt;Using a named remote such as origin provides a convenient reference to the repository's URL, simplifying future push, pull, and fetch operations.&lt;/p&gt;

&lt;p&gt;This supports Reliability by ensuring your source code is stored in a highly available remote repository, providing backup, version history preservation, and protection against local data loss.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Stages the specified file(s) for the next commit.
       git remote add origin https://github.com/your-username/your-repo.git
&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%2F4s68aqeznvk4v0p7f76b.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%2F4s68aqeznvk4v0p7f76b.png" alt="Idsfasva" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Publishing to the Global Stage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Push your local commits to a remote repository hosted on GitHub.&lt;/p&gt;

&lt;p&gt;This operation transfers committed changes from your local Git history to the remote repository, synchronizing your local development state with the centralized codebase and making updates available to collaborators.&lt;/p&gt;

&lt;p&gt;This supports Reliability by ensuring code is safely backed up in the cloud and Operational Excellence by enabling seamless collaboration and consistent version synchronization across environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Push to Remote&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Transfers all commits from the local &lt;strong&gt;&lt;em&gt;master&lt;/em&gt;&lt;/strong&gt; branch to the remote repository labeled &lt;strong&gt;&lt;em&gt;origin&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This operation publishes your local changes to the remote version control system, making your updates accessible to collaborators and enabling integration with services such as GitHub Pages for deployment and hosting.&lt;/p&gt;

&lt;p&gt;This supports Operational Excellence by synchronizing the local development environment with the central source of truth, ensuring consistency, collaboration, and controlled distribution of code changes.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Uploads your local commits to the remote repository.
      git push origin main
&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%2Flie9n0vs93i0pgn5dnb5.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%2Flie9n0vs93i0pgn5dnb5.png" alt="Irsfe4" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Hosting: GitHub Pages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deploy your static content to a publicly accessible web server.&lt;/p&gt;

&lt;p&gt;This process publishes your HTML, CSS, and JavaScript files to a hosting environment, making them available over the internet for end users to access through a web browser.&lt;/p&gt;

&lt;p&gt;This supports Operational Excellence by ensuring consistent, reliable delivery of application assets from development to production environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Enable GitHub Pages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Configures GitHub to publish the repository as a static website and generate a publicly accessible URL.&lt;/p&gt;

&lt;p&gt;This enables GitHub Pages to serve your project directly from the repository, allowing you to showcase your application without provisioning or managing dedicated servers.&lt;/p&gt;

&lt;p&gt;This supports Performance Efficiency by leveraging GitHub’s globally distributed infrastructure (CDN), ensuring fast, low-latency content delivery to users across different regions.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # 1. In GitHub UI: Settings -&amp;gt; Pages
      # 2. Source: 'Deploy from a branch'
      # 3. Branch: 'master' (or 'main')
      # 4. Folder: '/ (root)'
      # 5. Save
&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%2Far2dmxqqd1tl8n95imsz.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%2Far2dmxqqd1tl8n95imsz.png" alt="sfegafeae" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automated Lifecycle: CI/CD&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Defines a GitHub Actions workflow to automate the software deployment process.&lt;/p&gt;

&lt;p&gt;This enables continuous integration and continuous deployment (CI/CD) by executing predefined steps such as building, testing, and publishing whenever changes are pushed to the repository, reducing manual intervention and improving consistency.&lt;/p&gt;

&lt;p&gt;This supports Operational Excellence by automating repetitive tasks, improving deployment reliability, and ensuring faster, more consistent delivery of updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Create Workflow Definition&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Creates the standard directory structure required for GitHub Actions workflows.&lt;/p&gt;

&lt;p&gt;GitHub automatically detects and executes automation scripts only when they are placed inside the .github/workflows directory, where workflow configuration files are defined.&lt;/p&gt;

&lt;p&gt;This supports Operational Excellence by enforcing a consistent and standardized location for automation pipelines, improving maintainability, discoverability, and reliability of CI/CD processes.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Creates a new directory (folder).
      mkdir -p .github/workflows

      # Creates an empty file or updates the timestamp of an existing one.
      touch .github/workflows/deploy.yml
&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%2Fk8vtq2aqltvdwy9mjj70.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%2Fk8vtq2aqltvdwy9mjj70.png" alt="Iygyuhy" width="799" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure the Pipeline&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Defines an automated workflow consisting of sequential jobs such as Checkout, Configuration, Build/Upload, and Deployment that are triggered on every push event to the master branch.&lt;/p&gt;

&lt;p&gt;This CI/CD pipeline automates the software delivery process, reducing reliance on manual deployment steps, minimizing human error, and ensuring that the production environment consistently reflects the latest committed code.&lt;/p&gt;

&lt;p&gt;This supports Reliability by enabling consistent, repeatable, and error-resistant deployments through automation.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      name: Deploy to Pages
      on:
        push:
          branches: [ master ]
      permissions:
        contents: read
        pages: write
        id-token: write
      jobs:
        deploy:
          environment:
            name: github-pages
          runs-on: ubuntu-latest
          steps:
            - uses: actions/checkout@v4
            - uses: actions/configure-pages@v4
            - uses: actions/upload-pages-artifact@v3
              with:
                path: '.'
            - uses: actions/deploy-pages@v4
&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%2F209a5036ts8ys8aj0o5a.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%2F209a5036ts8ys8aj0o5a.png" alt="yugyttr65t" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Git and GitHub are essential tools in modern software development and DevOps workflows. Understanding how to move code from a local machine to a GitHub repository establishes the foundation for more advanced practices such as Continuous Integration (CI), Continuous Delivery (CD), Infrastructure as Code (IaC), and collaborative software engineering.&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>ai</category>
      <category>html</category>
    </item>
    <item>
      <title>Introduction to DevOps for Beginners.</title>
      <dc:creator>lotanna obianefo</dc:creator>
      <pubDate>Wed, 10 Jun 2026 19:30:47 +0000</pubDate>
      <link>https://dev.to/lotanna_obianefo/introduction-to-devops-for-beginners-513l</link>
      <guid>https://dev.to/lotanna_obianefo/introduction-to-devops-for-beginners-513l</guid>
      <description>&lt;p&gt;DevOps is a modern software engineering approach that combines software development (Dev) and IT operations (Ops) into a unified practice aimed at improving the speed, reliability, and quality of software delivery. It is not a tool or a job title, but rather a culture, set of practices, and automation-driven methodology that enables organizations to build, test, and release software more efficiently.&lt;/p&gt;

&lt;p&gt;At its core, DevOps is about breaking down the traditional silos between development and operations teams. In older models, developers would write code and “throw it over the wall” to operations teams for deployment and maintenance. This separation often led to delays, miscommunication, and unstable releases.&lt;/p&gt;

&lt;p&gt;To gain a practical understanding of DevOps, we will examine a real-world project that involves deploying a simple web application using modern DevOps tools and methodologies. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arm Your Workstation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every DevOps engineer relies on a core set of tools to build, test, and deploy applications efficiently. In this setup, we will install three essential tools: Git for version control, curl for transferring data over networks, and Docker for containerizing applications. Together, these tools form a foundational toolkit for modern DevOps workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Update Your Local Development Environment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step updates your system's package repository information and upgrades installed software to the latest available versions. Keeping your system up to date ensures you have the latest security patches, bug fixes, and compatibility improvements, reducing the likelihood of installation failures or unexpected issues when setting up new tools.&lt;/p&gt;

&lt;p&gt;Maintaining an updated and healthy environment is a fundamental operational practice. It helps ensure system reliability, consistency, and readiness for development and deployment activities, forming a strong foundation for efficient DevOps workflows.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      winget upgrade --all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;These commands are for windows operating systems&lt;/em&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%2F1xvj3uf6t7qvtsz09k6x.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%2F1xvj3uf6t7qvtsz09k6x.png" alt="jgfrfdygyt" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;Install Git, Curl, and Docker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step installs three essential tools used throughout modern software development and DevOps practices. &lt;strong&gt;Git&lt;/strong&gt; for version control and collaboration, &lt;strong&gt;curl&lt;/strong&gt; for transferring data and interacting with web services from the command line, and &lt;strong&gt;Docker&lt;/strong&gt; for packaging and running applications in isolated, portable containers.&lt;/p&gt;

&lt;p&gt;These tools form the foundation of many development, automation, and deployment workflows, making them indispensable for engineers working with cloud and DevOps technologies.&lt;/p&gt;

&lt;p&gt;Equipping your environment with industry-standard tools enables efficient development, automation, troubleshooting, and deployment processes. Standardized tooling improves productivity, consistency, and reliability across the software delivery lifecycle, supporting operational excellence and best practices.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      winget install -e --id Git.Git

      winget install -e --id Docker.DockerDesktop

      winget install -e --id curl.curl

      docker --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;These commands are for windows operating systems&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3&lt;/strong&gt;. &lt;strong&gt;Configure Git with Your Identity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step configures your Git identity by setting your &lt;strong&gt;username&lt;/strong&gt; and &lt;strong&gt;email address&lt;/strong&gt;. Git uses this information to label every commit you make, ensuring that all changes in a codebase are properly attributed to the correct developer.&lt;/p&gt;

&lt;p&gt;Without this configuration, Git cannot associate commits with a user identity, which prevents proper tracking of changes and can block or invalidate contributions in collaborative repositories.&lt;/p&gt;

&lt;p&gt;Defining a clear user identity in Git supports traceability and accountability across the software development lifecycle. It ensures that every change can be audited, reviewed, and attributed, which is essential for secure, compliant, and well-governed development practices.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Sets Git configuration (username or aliases, etc.).
      git config --global user.name "Your Name"

      # Sets Git configuration (email).
      git config --global user.email "you@example.com"

      # Displays all Git configuration settings that are currently applied to your Git environment.
      git config --list
&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%2Fulif8yi6bv77gbgzv0t4.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%2Fulif8yi6bv77gbgzv0t4.png" alt="kjhyftg" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4&lt;/strong&gt;. &lt;strong&gt;Create a GitHub Repository&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step creates a remote repository on GitHub, providing a centralized location to store and manage your code in the cloud. A remote repository acts as a shared source of truth where your project is safely backed up, version-controlled, and accessible to collaborators.&lt;/p&gt;

&lt;p&gt;In real DevOps environments, code is never kept only on a local machine. It is stored in remote repositories to enable team collaboration, trigger automated CI/CD pipelines, and ensure code is not lost due to local system failure.&lt;/p&gt;

&lt;p&gt;Remote repositories are essential for enabling teamwork, transparency, and continuous integration in modern software delivery. They serve as the foundation for collaborative development workflows, automated deployments, and scalable DevOps practices.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # 1. Go to https://github.com and sign in (or create an account if you don't have one)

      # 2. Click the '+' icon in the top-right corner → 'New repository'

      # 3. Name it: devops-lab1

      # 4. Leave it PUBLIC, do NOT add a README (we'll push our own code)

      # 5. Click 'Create repository'

      # 6. Copy the HTTPS URL — it will look like: https://github.com/YOUR-USERNAME/devops-lab1.git
&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%2Ff73auo2lx80fwwng8nc5.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%2Ff73auo2lx80fwwng8nc5.png" alt="dtgwsegs" width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Containerise the App&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Develop a small application and package it inside a Docker container to ensure it runs consistently across any environment. Containerizing the application isolates it from system-level differences, making it portable, reproducible, and easy to deploy on any machine or cloud platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Create Your First App&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step initializes a local project directory, creates a simple Node.js application, tracks it using Git version control, and links the local repository to a remote GitHub repository. This ensures that all code changes are properly recorded, versioned, and synchronized with a central remote source.&lt;/p&gt;

&lt;p&gt;From the beginning of development, integrating with GitHub ensures that your work is securely backed up, easily shareable, and ready for integration into CI/CD pipelines for automated testing and deployment.&lt;/p&gt;

&lt;p&gt;Applying version control from the start establishes a reliable and traceable development workflow. It supports consistency, recoverability, and automation readiness, which are key principles of operational excellence in modern DevOps practices.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Creates a new directory (folder).
      mkdir devops-lab &amp;amp;&amp;amp; cd devops-lab


      # Let's create an app.js file. The '&amp;gt;' symbol redirects the 'echo' text into the file.
      # ALTERNATIVE: You can just open a text editor (like VS Code or Notepad), create a new file called 'app.js', type 'console.log("Hello, DevOps!");' and save it!

      # Prints text to the terminal — also used to write to files with &amp;gt; or &amp;gt;&amp;gt;.
      echo 'console.log("Hello, DevOps!");' &amp;gt; app.js

      # Initializes a new Git repository in the current directory.
      git init

      # Lists, creates, or manages branches.
      git branch -M main

      # Stages all changed files for the next commit.
      git add . &amp;amp;&amp;amp; git commit -m 'Initial commit'

      # Now connect your local repo to the GitHub repo you created in Mission 1
      # Replace YOUR-USERNAME with your actual GitHub username

      # Stages the specified file(s) for the next commit.
      git remote add origin https://github.com/YOUR-USERNAME/devops-lab1.git

      # Manages remote repository connections (origin, upstream, etc.).
      git remote -v
&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%2Fuq6niax2rfkhfp6b0cbz.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%2Fuq6niax2rfkhfp6b0cbz.png" alt="Isfsf" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;Build the Docker Container&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step involves creating a Dockerfile, which defines the instructions required to package an application into a Docker image, then building that image and running it as a container. This process standardizes how the application is built and executed across environments.&lt;/p&gt;

&lt;p&gt;By containerizing the application, you ensure consistency between development, testing, and production environments. This eliminates environment-specific issues such as dependency mismatches or configuration differences, commonly referred to as “it works on my machine” problems.&lt;/p&gt;

&lt;p&gt;Containerization improves system reliability by providing consistent, immutable runtime environments. This ensures applications behave predictably across all stages of deployment, reducing failures and improving confidence in releases.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Here, 'printf' prints formatted text and '&amp;gt;' saves it into a file called 'Dockerfile'.
      # ALTERNATIVE: Open your text editor, create 'Dockerfile', paste the 3 lines starting with FROM, COPY, and CMD, then save it.

      # Prints formatted text — more control than echo (like C's printf).
      printf 'FROM node:18-alpine\nCOPY app.js .\nCMD ["node","app.js"]\n' &amp;gt; Dockerfile

      # Builds a Docker image from the Dockerfile in the current directory. The -t flag tags it with a name.
      docker build -t devops-helloo .

      # Creates and starts a new container from the specified image.
      docker run --rm devops-helloo
&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%2Fae76qgk1bjn4u0vkmzdh.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%2Fae76qgk1bjn4u0vkmzdh.png" alt="Ierewre" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measure DORA Metrics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Learn the key performance indicators known as DORA metrics, which high-performing DevOps teams use to measure software delivery efficiency, stability, and overall engineering effectiveness. These metrics help evaluate and improve how quickly and reliably teams deliver changes to production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Simulate a Super-Fast Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step creates an additional Git commit to simulate the process of delivering a new feature to a codebase. Each commit represents a versioned change, similar to how features are incrementally shipped in real software development workflows.&lt;/p&gt;

&lt;p&gt;Frequent commits and deployments reflect a key DevOps performance indicator known as Deployment Frequency, which measures how often code changes are released into production. High-performing DevOps teams aim for frequent, small, and reliable deployments rather than large, infrequent releases.&lt;/p&gt;

&lt;p&gt;Increasing deployment frequency demonstrates improved delivery speed and responsiveness. It supports agile development practices by enabling rapid iteration, faster feedback loops, and continuous delivery of value to users.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Make a quick change and commit it


      # Prints text to the terminal — also used to write to files with &amp;gt; or &amp;gt;&amp;gt;.
      echo 'v2' &amp;gt;&amp;gt; app.js

      # Stages all changed files for the next commit.
      git add . &amp;amp;&amp;amp; git commit -m 'feat: bump to v2'

      # Shows the commit history. --oneline condenses each commit to one line, --graph shows branches visually.
      git log --oneline
&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%2Ft7gv3t3w6n0dgok0smvt.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%2Ft7gv3t3w6n0dgok0smvt.png" alt="gffdryftr" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automate with a Robot Butler (Make)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of repeatedly typing long and complex commands, you can create a Makefile to automate and simplify repetitive tasks. A Makefile defines a set of instructions that can be executed with a single command, improving efficiency, consistency, and reducing the chance of human error during development workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Write the Automation Script (Makefile)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step involves creating a Makefile that defines reusable shortcuts (such as &lt;strong&gt;build&lt;/strong&gt;, &lt;strong&gt;run&lt;/strong&gt;, and &lt;strong&gt;clean&lt;/strong&gt;) to automate long and repetitive Docker and development commands. Instead of manually typing complex instructions, a Makefile allows you to execute them using simple, consistent commands.&lt;/p&gt;

&lt;p&gt;This improves workflow efficiency by reducing manual effort, minimizing human errors, and ensuring that common tasks are executed in a standardized way across all environments.&lt;/p&gt;

&lt;p&gt;Automation of repetitive development tasks is a key principle of operational excellence. By using Makefiles, developers improve consistency, productivity, and reliability, while freeing up time to focus on higher-value engineering work.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       # 'printf' writes our commands with literal tab characters (\t) to create a syntactically correct Makefile.
       # ALTERNATIVE SIMPLER WAY: Open a text editor, create a file named 'Makefile', and manually type the build, run, and clean sections. (Make sure to use real tabs for indentation, not spaces!)

       # Prints formatted text — more control than echo (like C's printf).
        printf 'build:\n\tdocker build -t devops-helloo .\nrun:\n\tdocker run --rm devops-helloo\nclean:\n\tdocker rmi devops-helloo\n' &amp;gt; Makefile
&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%2F5e3275i6me5gwz63xoh8.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%2F5e3275i6me5gwz63xoh8.png" alt="gytfryn" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test Your New Butler&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step executes the automation defined in your Makefile by running predefined shortcuts to build a Docker image, start the application container, and clean up unused resources. It validates that your automated commands work correctly and produce the expected results in a local environment.&lt;/p&gt;

&lt;p&gt;Testing automation locally is a critical practice before applying it to production systems, as it helps identify errors early and ensures that build, run, and cleanup processes behave consistently.&lt;/p&gt;

&lt;p&gt;Verifying automation ensures that workflows are predictable, repeatable, and error-free. This strengthens system reliability by reducing deployment failures and ensuring that automated processes behave consistently across different environments.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      make build

      make run

      make clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Tag the Production Release&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Assign a version number (tag) to your codebase using Git to mark a stable release point. This creates a clear reference for future deployments, enabling easier tracking, rollback, and release management in a controlled software development lifecycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Create a Release Tag&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step finalizes your code changes by committing any remaining work and applying a version tag (e.g., v1.0.0) to mark a stable release point in the Git history. Tags act as immutable references that identify specific states of the codebase, making it easier to track releases and manage deployments.&lt;/p&gt;

&lt;p&gt;In a CI/CD pipeline, new version tags can automatically trigger build, test, and deployment processes, ensuring that only validated and stable versions are promoted to production environments.&lt;/p&gt;

&lt;p&gt;Version tagging improves system reliability by creating clear, identifiable release points. This enables safe rollbacks, consistent deployments, and better traceability across the software delivery lifecycle.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Stages all changed files for the next commit.
      git add . &amp;amp;&amp;amp; git commit -m 'feat: add Makefile automation'

      # Creates a tag (label) on a commit — typically used for release versions (v1.0, v2.0).
      git tag -a v1.0.0 -m 'First epic DevOps lab release!'

      # Shows the commit history. --oneline condenses each commit to one line, --graph shows branches visually.
      git log --oneline --decorate
&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%2Fcw042l7s4yvlkfgau8kd.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%2Fcw042l7s4yvlkfgau8kd.png" alt="Ijdjsjus" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;Push Everything to GitHub&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step pushes all local Git commits and the version tag (e.g., &lt;strong&gt;v1.0.0&lt;/strong&gt;) to a remote GitHub repository, synchronizing your local development history with a centralized version control system. This ensures that your code and release versions are securely stored and accessible in a shared environment.&lt;/p&gt;

&lt;p&gt;In real DevOps workflows, code must live in a remote repository rather than only on a local machine. Pushing changes to GitHub enables collaboration across teams, provides reliable backup, and acts as a trigger point for CI/CD pipelines that automate testing, building, and deployment processes.&lt;/p&gt;

&lt;p&gt;Publishing code to a remote repository is essential for enabling team-based development and automated delivery workflows. It ensures that changes are shared, traceable, and ready for continuous integration and deployment across environments.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Push all your commits to GitHub

      # Uploads your local commits to the remote repository.
      git push -u origin main


      # If you get an error about 'main', your default branch might be called 'master' — try:
      # git push -u origin master
      # Push your release tag too


      # Uploads your local commits to the remote repository.
      git push origin v1.0.0


      # Prints text to the terminal — also used to write to files with &amp;gt; or &amp;gt;&amp;gt;.
      echo ''


      # Prints text to the terminal — also used to write to files with &amp;gt; or &amp;gt;&amp;gt;.
      echo '  🎉 CONGRATULATIONS! 🎉'


      # Prints text to the terminal — also used to write to files with &amp;gt; or &amp;gt;&amp;gt;.
      echo '  ✅ v1.0.0 is tagged and pushed to GitHub!'


      # Prints text to the terminal — also used to write to files with &amp;gt; or &amp;gt;&amp;gt;.
      echo '  🌐 Check your repo at: https://github.com/YOUR-USERNAME/devops-lab'

      # Prints text to the terminal — also used to write to files with &amp;gt; or &amp;gt;&amp;gt;.
      echo ''

      # Prints text to the terminal — also used to write to files with &amp;gt; or &amp;gt;&amp;gt;.
      echo 'Next up: CI/CD Pipelines with GitHub Actions'


      # Prints text to the terminal — also used to write to files with &amp;gt; or &amp;gt;&amp;gt;.
      echo '================================================'
&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%2Fbzf6f7wlw4l2pkjd4q3b.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%2Fbzf6f7wlw4l2pkjd4q3b.png" alt="kfvd" width="800" height="628"&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%2Fz4gau02y7610v3y8tnfg.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%2Fz4gau02y7610v3y8tnfg.png" alt="uutyt6tyu" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DevOps is a transformative approach that enables organizations to deliver software faster, more reliably, and at scale. By combining automation, collaboration, and continuous improvement, DevOps bridges the gap between development and operations, making it a cornerstone of modern cloud-native engineering practices.&lt;/p&gt;

&lt;p&gt;Whether you are a developer, system administrator, or aspiring cloud engineer, understanding DevOps is essential for working in today’s technology landscape.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>github</category>
      <category>cloudnative</category>
      <category>azure</category>
    </item>
    <item>
      <title>Getting Started with Azure Kubernetes Service (AKS).</title>
      <dc:creator>lotanna obianefo</dc:creator>
      <pubDate>Fri, 01 May 2026 19:31:57 +0000</pubDate>
      <link>https://dev.to/lotanna_obianefo/getting-started-with-azure-kubernetes-service-aks-21fg</link>
      <guid>https://dev.to/lotanna_obianefo/getting-started-with-azure-kubernetes-service-aks-21fg</guid>
      <description>&lt;p&gt;As organizations increasingly adopt microservices and cloud-native architectures, container orchestration platforms have become essential. Azure Kubernetes Service (AKS) is a fully managed Kubernetes offering from Microsoft that simplifies deploying, managing, and scaling containerized applications in the cloud.&lt;/p&gt;

&lt;p&gt;AKS reduces the operational overhead of managing Kubernetes by handling critical control plane components while providing deep integration with Azure services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workspace Initialization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Set up a local repository using Git and link it to a remote repository on GitHub to systematically track, version, and manage changes to your project, enabling progress monitoring, collaboration, and recovery of previous states if needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Initialize Git Repository&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a new project directory, initialize it as a repository using Git, and perform an initial commit with a README.md file to establish a baseline. &lt;/p&gt;

&lt;p&gt;This is essential in cloud engineering because version control enables tracking of code and infrastructure changes, supports collaboration, and allows safe rollback to previous states. &lt;/p&gt;

&lt;p&gt;It aligns with the Operational Excellence pillar of the AKS Well-Architected Framework, ensuring effective change management, traceability, and reliable deployment practices.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Creates a new directory (folder).
      mkdir my-cloud-project 

      # Changes the current directory.
      cd my-cloud-project 

      # Initializes a new Git repository in the current directory.
      git init 

      # Prints text to the terminal — also used to write to files with &amp;gt; or &amp;gt;&amp;gt;.
      echo "# Cloud project Repository" &amp;gt; README.md 

      # Stages the specified file(s) for the next commit.
      git add README.md 

      # Creates a new commit with all staged changes and the message after -m.
      git commit -m "Initial commit" 
&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%2Fmh4409pqd3leuwiq7u2m.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%2Fmh4409pqd3leuwiq7u2m.png" alt="kdsjscc" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup &amp;amp; Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prepare your local development environment and install the Kubernetes command-line interface, kubectl, which is required to interact with and manage Kubernetes clusters by deploying applications, inspecting resources, and executing administrative commands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Login and Set Variables&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Authenticate with Microsoft Azure using the command-line interface and define reusable variables for key resources (such as cluster name, region, and resource group) to standardize configuration. &lt;/p&gt;

&lt;p&gt;This approach reduces manual input errors, ensures consistency during resource provisioning, and improves repeatability across deployments. &lt;/p&gt;

&lt;p&gt;It aligns with the Operational Excellence pillar of the AKS Well-Architected Framework, as using variables and CLI-based automation promotes efficient, reliable, and well-governed cloud operations.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Signs you in to your Azure account so you can run commands against your subscription.
      az login

      # Sets the shell variable RG so later commands can reference it with $RG.
      RG="aks-project-rg"

      # Sets the shell variable CLUSTER_NAME so later commands can reference it with $CLUSTER_NAME.
      CLUSTER_NAME="skill-aks-cluster"

      # Sets the shell variable LOCATION so later commands can reference it with $LOCATION.
      LOCATION="australiacentral"
&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%2Fl05ybxabdbp98u73ogbn.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%2Fl05ybxabdbp98u73ogbn.png" alt="ouhuhi" width="800" height="400"&gt;&lt;/a&gt;&lt;br&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%2Fufvva5yfls608qug0plk.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%2Fufvva5yfls608qug0plk.png" alt="Iuuuiij" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;Install Kubectl&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Install the Kubernetes command-line tool, kubectl, which serves as the primary interface for communicating with the Kubernetes API server to deploy applications, manage cluster resources, and perform administrative tasks. &lt;/p&gt;

&lt;p&gt;Properly initializing this essential tooling ensures consistent and reliable interaction with the cluster, aligning with the Operational Excellence pillar of the AKS Well-Architected Framework by promoting standardized, efficient, and error-resistant operations.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Runs the Azure CLI command "az aks install-cli" — see "az aks install-cli --help" for details.
      az aks install-cli


      # Runs a Kubernetes cluster management command.
      kubectl version --client
&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%2Fqqr10i42uwa1cgzq4v1t.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%2Fqqr10i42uwa1cgzq4v1t.png" alt="Ijhghygfyt" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3&lt;/strong&gt;. &lt;strong&gt;Create Resource Group&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a resource group in Microsoft Azure to act as a logical container for all cluster-related resources. This is required because Azure mandates that resources are organized within resource groups for consistent management, access control, and cost tracking. &lt;/p&gt;

&lt;p&gt;It supports the Reliability pillar of the Azure Well-Architected Framework by enabling structured lifecycle management, including deployment, updates, and deletion of resources as a single unit.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Creates a resource group called "$RG" — a logical container for all the Azure resources in this project.
      az group create --name $RG --location $LOCATION
&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%2F581jc0dvjrkpfhvr09zd.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%2F581jc0dvjrkpfhvr09zd.png" alt="hgffdtrg" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provision the AKS Cluster&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a managed Kubernetes cluster using Azure Kubernetes Service (AKS) and configure a single system node pool, which hosts core Kubernetes components and system workloads required for cluster operation. This setup provides a stable foundation for running containerized applications while benefiting from automated cluster management, scaling, and maintenance handled by Azure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Create the Cluster&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Provision a managed Kubernetes cluster using Azure Kubernetes Service (AKS), which automatically creates the Kubernetes control plane and a worker node for running workloads. &lt;/p&gt;

&lt;p&gt;This is important because AKS handles the complexity of managing control plane components such as the API server, scheduler, and etcd, allowing you to focus on deploying and scaling applications rather than maintaining infrastructure. &lt;/p&gt;

&lt;p&gt;It also aligns with the Performance Efficiency pillar of the Azure Well-Architected Framework by offloading operational overhead to the cloud provider, enabling more efficient use of resources and faster deployment cycles.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      az aks create \
        --resource-group $RG \
        --name $CLUSTER_NAME \
        --node-count 1 \
        --generate-ssh-keys \
        --node-vm-size Standard_D2_v3
&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%2Fqaolroix66nhnrfo3xkj.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%2Fqaolroix66nhnrfo3xkj.png" alt="grtwgew" width="800" height="470"&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%2Fhfucv0i4ya9ywfm8hrwh.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%2Fhfucv0i4ya9ywfm8hrwh.png" alt="gyugyuyt" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect to the Cluster&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Configure your local kubectl environment to securely communicate with the Kubernetes cluster by downloading and storing the cluster credentials, API endpoint information, and authentication certificates in the local kubeconfig file. This setup enables authenticated and encrypted interaction with the cluster for managing workloads and resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Download Kubeconfig&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Download the Kubernetes cluster credentials from Azure Kubernetes Service (AKS) and merge them into the local &lt;strong&gt;~/.kube/config&lt;/strong&gt; file, which stores cluster connection details and authentication settings for kubectl. &lt;/p&gt;

&lt;p&gt;This configuration is required because kubectl uses the cluster API endpoint, certificates, and access credentials to securely authenticate and communicate with the Kubernetes API server. &lt;/p&gt;

&lt;p&gt;This process also supports the Security pillar of the Azure Well-Architected Framework by enabling encrypted authentication and controlled access through certificates and Role-Based Access Control (RBAC).&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      az aks install-cli
      az aks get-credentials --resource-group $RG --name $CLUSTER_NAME
&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%2Fpklk7l55d7f4ptf8kwvm.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%2Fpklk7l55d7f4ptf8kwvm.png" alt="uygytyjj" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;Verify Connection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use kubectl to list the worker nodes in the Kubernetes cluster and verify the status of the cluster API endpoint. &lt;/p&gt;

&lt;p&gt;This validation step confirms successful end-to-end connectivity between your local environment and the cluster, ensuring that the control plane and worker nodes are operational and ready to receive workloads. &lt;/p&gt;

&lt;p&gt;This aligns with the Reliability pillar of the Azure Well-Architected Framework by verifying the operational readiness and availability of the Kubernetes environment before deploying applications.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      kubectl get nodes
      kubectl cluster-info
&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%2Fwxjuxfwsyjyn00sisf6h.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%2Fwxjuxfwsyjyn00sisf6h.png" alt="igyfttdty" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploy Your First App&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deploy a simple NGINX application to the Kubernetes cluster using a Kubernetes Deployment resource, which defines the desired application state and automatically manages pod creation, scaling, and recovery to ensure the application remains available and operational.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Create the Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a Kubernetes Deployment that defines the desired state of running two replicas of the NGINX container within the cluster. &lt;/p&gt;

&lt;p&gt;This is important because Kubernetes Deployments continuously monitor the application state and automatically replace failed pods to maintain the specified number of running replicas. &lt;/p&gt;

&lt;p&gt;This self-healing capability improves application availability and supports the Reliability pillar of the Azure Well-Architected Framework by ensuring automated recovery and consistent workload operation.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      kubectl create deployment nginx-app --image=nginx --replicas=2
&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%2Fpfx86i1u4d9w23q5qrj3.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%2Fpfx86i1u4d9w23q5qrj3.png" alt="ugytytugf" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;View Resources&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use kubectl to monitor the rollout status of your application deployment and track the progress of updates being applied to the cluster. &lt;/p&gt;

&lt;p&gt;This is important because it provides real-time visibility into whether new pods are being created successfully and whether the application has reached its desired operational state without errors. &lt;/p&gt;

&lt;p&gt;Monitoring deployment rollouts supports the Operational Excellence pillar of the Azure Well-Architected Framework by improving observability, enabling faster troubleshooting, and ensuring reliable workload management.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      kubectl get deployments
      kubectl get pods
&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%2Fice44syrykbggiwrsgfo.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%2Fice44syrykbggiwrsgfo.png" alt="yutddydtr" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expose to the Internet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a Kubernetes Service of type LoadBalancer to expose your application to external users by automatically assigning a public IP address and routing incoming internet traffic to the application pods running inside the cluster. This allows the application to be securely accessed from outside the Kubernetes environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Create LoadBalancer Service&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a Kubernetes Service of type LoadBalancer in Azure Kubernetes Service (AKS) to automatically provision an Azure Load Balancer and route external traffic to the application pods running in the cluster. &lt;/p&gt;

&lt;p&gt;This is necessary because Kubernetes pods are accessible only within the cluster by default, and a LoadBalancer service provides a stable public IP address and entry point for external client access. &lt;/p&gt;

&lt;p&gt;This approach supports the Performance Efficiency pillar of the Azure Well-Architected Framework by leveraging cloud-native networking and scalable traffic distribution to efficiently handle inbound application requests.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      kubectl expose deployment nginx-app --type=LoadBalancer --port=80
&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%2Flby1odzrq5ul1j9caf6a.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%2Flby1odzrq5ul1j9caf6a.png" alt="iuhfrdrr" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;Retrieve Public IP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use kubectl to continuously monitor the Kubernetes Service until the &lt;strong&gt;EXTERNAL-IP&lt;/strong&gt; field changes from  to an assigned public IP address. &lt;/p&gt;

&lt;p&gt;This process is necessary because the cloud provider requires time to provision and configure the external load balancer that exposes the application to the internet. Once assigned, the public IP address serves as the endpoint used to access the application from a web browser. &lt;/p&gt;

&lt;p&gt;This supports the Operational Excellence pillar of the Azure Well-Architected Framework by enabling real-time visibility and dynamic tracking of infrastructure resource provisioning.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      kubectl get service nginx-app --watch
&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%2F0z26infzfm6zdxvfk01s.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%2F0z26infzfm6zdxvfk01s.png" alt="ugyftrffyt" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3&lt;/strong&gt;. &lt;strong&gt;Test Access&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Verify that the web server hosted in Azure Kubernetes Service (AKS) is accessible from the internet by testing connectivity through the application’s public endpoint. &lt;/p&gt;

&lt;p&gt;This end-to-end validation confirms that the networking components including the Kubernetes Service, load balancer, and application pods are correctly configured and functioning as expected. &lt;/p&gt;

&lt;p&gt;Performing this final connectivity check supports the Reliability pillar of the Azure Well-Architected Framework by ensuring the application is available and reachable&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        curl http://&amp;lt;YOUR_EXTERNAL_IP&amp;gt;
&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%2Fkpksyhc3y2y46kc2qt00.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%2Fkpksyhc3y2y46kc2qt00.png" alt="iuhyugytyu" width="800" height="469"&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%2Fgr4x6rajz9l9bg64rtei.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%2Fgr4x6rajz9l9bg64rtei.png" alt="yugyuuyi" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cleanup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Avoid Azure costs by deleting the resource group&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      az group delete --name aks-project-rg --yes --no-wait
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Azure Kubernetes Service (AKS) simplifies the deployment, management, and scaling of containerized applications by combining the power of Kubernetes with the reliability and scalability of Microsoft Azure. Throughout this guide, you learned the core fundamentals of AKS, including cluster creation, application deployment, service exposure, and workload management using Kubernetes tools such as kubectl.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>azure</category>
      <category>ai</category>
    </item>
    <item>
      <title>Building a Complete CI/CD Pipeline with Node.js, Docker, and K8s.</title>
      <dc:creator>lotanna obianefo</dc:creator>
      <pubDate>Tue, 03 Mar 2026 16:53:45 +0000</pubDate>
      <link>https://dev.to/lotanna_obianefo/building-a-complete-cicd-pipeline-with-nodejs-docker-and-k8s-4o44</link>
      <guid>https://dev.to/lotanna_obianefo/building-a-complete-cicd-pipeline-with-nodejs-docker-and-k8s-4o44</guid>
      <description>&lt;p&gt;Modern software delivery demands speed, reliability, and scalability. Continuous Integration and Continuous Deployment (CI/CD) pipelines enable teams to ship code faster while maintaining high quality and operational stability. When combined with Node.js, Docker, and Kubernetes (K8s), CI/CD becomes a powerful system for building cloud-native, production-ready applications.&lt;/p&gt;

&lt;p&gt;This article provides a complete technical walkthrough of designing and implementing a CI/CD pipeline.&lt;/p&gt;

&lt;p&gt;Before starting, you need to install these tools on your machine.&lt;/p&gt;

&lt;p&gt;Required Downloads:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Node.js&lt;/strong&gt; (v18 or higher) - Current LTS: v20.x&lt;br&gt;
Download from: &lt;a href="https://nodejs.org/" rel="noopener noreferrer"&gt;https://nodejs.org/&lt;/a&gt;&lt;br&gt;
Choose the LTS version (20.x as of 2025)&lt;br&gt;
Verify installation: &lt;strong&gt;node --version&lt;/strong&gt; and &lt;strong&gt;npm --version&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt; - Latest stable version&lt;br&gt;
Download from: &lt;a href="https://git-scm.com/downloads" rel="noopener noreferrer"&gt;https://git-scm.com/downloads&lt;/a&gt;&lt;br&gt;
Choose your operating system version&lt;br&gt;
Verify installation: &lt;strong&gt;git --version&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Docker Desktop&lt;/strong&gt; - Latest version&lt;br&gt;
Download from: &lt;a href="https://www.docker.com/products/docker-desktop/" rel="noopener noreferrer"&gt;https://www.docker.com/products/docker-desktop/&lt;/a&gt;&lt;br&gt;
Install and start Docker Desktop&lt;br&gt;
Verify installation: &lt;strong&gt;docker --version&lt;/strong&gt; and &lt;strong&gt;docker-compose --version&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitHub Account&lt;/strong&gt;&lt;br&gt;
Sign up at: &lt;a href="https://github.com" rel="noopener noreferrer"&gt;https://github.com&lt;/a&gt;&lt;br&gt;
You'll need this for hosting your code and CI/CD pipeline&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;VS Code&lt;/strong&gt;&lt;br&gt;
Download: &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;https://code.visualstudio.com/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Verify Everything is Installed&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%2Fevt00cs722v94g0jejbk.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%2Fevt00cs722v94g0jejbk.png" alt="ygtrty" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: &lt;strong&gt;Set Up Git for Version Control&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Configures Git on your machine so it knows who you are when you make commits and sets up proper project tracking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One-time Git Configuration&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;     git config --global user.name "Your Name"
     git config --global user.email "you@example.com"
     git config --global init.defaultBranch main
&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%2F3wyx720h7b837asgreb0.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%2F3wyx720h7b837asgreb0.png" alt="trreyu" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To displays all Git configuration settings that are currently applied for your environment use the command &lt;strong&gt;git config --list&lt;/strong&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%2Fogt7pfhxk3u7gevcepps.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%2Fogt7pfhxk3u7gevcepps.png" alt="jdjsjcsds" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create and Initialize Project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To create and initialize the project, first create a new directory, navigate into it, and ensure the directory is initialized with a local Git repository using the below commands.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;     mkdir my-devops-project
     cd my-devops-project
     git init
&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%2Flxkk9863l2dgfbguvsj7.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%2Flxkk9863l2dgfbguvsj7.png" alt="kjgtft" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: &lt;strong&gt;Build a Node.js Web App&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Creates a web application using Node.js that can serve web pages and API endpoints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initialize Node.js Project&lt;/strong&gt;&lt;br&gt;
This command creates a package.json file that describes your project and manages dependencies.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      npm init -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;The -y flag automatically responds “yes” to all confirmation prompts during command execution&lt;/em&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%2Fz5ih33v2ibxc7urmlx4y.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%2Fz5ih33v2ibxc7urmlx4y.png" alt="gfytftut" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update package.json&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This customizes the package.json with proper scripts and metadata for your DevOps project.&lt;/p&gt;

&lt;p&gt;Create/edit &lt;strong&gt;package.json&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      {
        "name": "devops-project01",
        "version": "1.0.0",
       "description": "DevOps learning project with Node.js",
        "main": "app.js",
        "scripts": {
          "start": "node app.js",
          "test": "jest",
          "dev": "node app.js",
          "lint": "eslint ."
        },
        "keywords": ["devops", "nodejs", "docker"],
        "author": "lotanna",
        "license": "MIT",
        "engines": {
          "node": "&amp;gt;=18.0.0"
        },
        "devDependencies": {
          "jest": "^29.7.0",
          "eslint": "^8.57.0",
          "supertest": "^7.1.4"
        }
      }
&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%2Fmxn2wcffbtkv8s9iefbv.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%2Fmxn2wcffbtkv8s9iefbv.png" alt="uhgtfft" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create Application File&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To create the application file, use the &lt;strong&gt;touch&lt;/strong&gt; command to generate &lt;strong&gt;app.js&lt;/strong&gt;, then insert the required code, which defines the following functionalities and outlines.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;HTTP server that listens on port 3000&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Serves different endpoints (/, /health, /info, /metrics)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Includes security headers and proper error handling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provides graceful shutdown capability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exports the server for testing&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Create&lt;/strong&gt; &lt;strong&gt;app.js&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      // core modules
      const http = require("http");
      const url = require("url");

      // environment configuration
      const PORT = process.env.PORT || 3000;
      const ENVIRONMENT = process.env.NODE_ENV || "development";

      let requestCount = 0;

      // helper: send JSON responses
      function sendJSON(res, statusCode, data) {
        res.statusCode = statusCode;
        res.setHeader("Content-Type", "application/json");
        res.end(JSON.stringify(data, null, 2));
      }

      // helper: send HTML responses
      function sendHTML(res, statusCode, content) {
        res.statusCode = statusCode;
        res.setHeader("Content-Type", "text/html");
        res.end(content);
      }

      // helper: send Prometheus metrics
      function sendMetrics(res) {
        const mem = process.memoryUsage();
        const metrics = `
      # HELP http_requests_total Total HTTP requests
      # TYPE http_requests_total counter
      http_requests_total ${requestCount}

      # HELP app_uptime_seconds Application uptime in seconds
      # TYPE app_uptime_seconds gauge
      app_uptime_seconds ${process.uptime()}

      # HELP nodejs_memory_usage_bytes Node.js memory usage
      # TYPE nodejs_memory_usage_bytes gauge
      nodejs_memory_usage_bytes{type="rss"} ${mem.rss}
      nodejs_memory_usage_bytes{type="heapUsed"} ${mem.heapUsed}
      nodejs_memory_usage_bytes{type="heapTotal"} ${mem.heapTotal}
      nodejs_memory_usage_bytes{type="external"} ${mem.external}
      `;
        res.statusCode = 200;
        res.setHeader("Content-Type", "text/plain");
        res.end(metrics);
      }

      // main server
      const server = http.createServer((req, res) =&amp;gt; {
        requestCount++;
        const timestamp = new Date().toISOString();
        const { pathname } = url.parse(req.url, true);

        // logging
        console.log(
          `${timestamp} - ${req.method} ${pathname} - ${
            req.headers["user-agent"] || "Unknown"
          }`
        );

        // CORS headers
        res.setHeader("Access-Control-Allow-Origin", "*");
        res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        res.setHeader("Access-Control-Allow-Headers", "Content-Type");

        // security headers
        res.setHeader("X-Content-Type-Options", "nosniff");
        res.setHeader("X-Frame-Options", "DENY");
        res.setHeader("X-XSS-Protection", "1; mode=block");

        // route handling
        switch (pathname) {
          case "/":
           sendHTML(
              res,
              200,
              `
      &amp;lt;!DOCTYPE html&amp;gt;
      &amp;lt;html&amp;gt;
      &amp;lt;head&amp;gt;
        &amp;lt;title&amp;gt;DevOps Lab 2025&amp;lt;/title&amp;gt;
        &amp;lt;style&amp;gt;
          body { font-family: Arial, sans-serif; max-width: 800px; margin: 50px auto; padding: 20px; }
          .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 20px; border-radius: 8px; }
          .endpoint { background: #f8f9fa; padding: 15px; margin: 10px 0; border-radius: 5px; border-left: 4px solid #007bff; }
        &amp;lt;/style&amp;gt;
      &amp;lt;/head&amp;gt;
      &amp;lt;body&amp;gt;
        &amp;lt;div class="header"&amp;gt;
          &amp;lt;h1&amp;gt;DevOps Lab 2025&amp;lt;/h1&amp;gt;
          &amp;lt;p&amp;gt;Modern Node.js application with CI/CD pipeline&amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;h2&amp;gt;Available Endpoints:&amp;lt;/h2&amp;gt;
        &amp;lt;div class="endpoint"&amp;gt;&amp;lt;strong&amp;gt;GET /&amp;lt;/strong&amp;gt; - This welcome page&amp;lt;/div&amp;gt;
        &amp;lt;div class="endpoint"&amp;gt;&amp;lt;strong&amp;gt;GET /health&amp;lt;/strong&amp;gt; - Health check (JSON)&amp;lt;/div&amp;gt;
        &amp;lt;div class="endpoint"&amp;gt;&amp;lt;strong&amp;gt;GET /info&amp;lt;/strong&amp;gt; - System information&amp;lt;/div&amp;gt;
        &amp;lt;div class="endpoint"&amp;gt;&amp;lt;strong&amp;gt;GET /metrics&amp;lt;/strong&amp;gt; - Prometheus metrics&amp;lt;/div&amp;gt;
        &amp;lt;p&amp;gt;Environment: &amp;lt;strong&amp;gt;${ENVIRONMENT}&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;Server time: &amp;lt;strong&amp;gt;${timestamp}&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;Requests served: &amp;lt;strong&amp;gt;${requestCount}&amp;lt;/strong&amp;gt; &amp;lt;/p&amp;gt;
      &amp;lt;/body&amp;gt;
      &amp;lt;/html&amp;gt;`
            );
            break;

         case "/health":
             sendJSON(res, 200, {
              status: "healthy",
              timestamp,
              uptime: process.uptime(),
              environment: ENVIRONMENT,
              version: "1.0.0",
              node_version: process.version,
              requests_served: requestCount,
            });
            break;

          case "/info":
            sendJSON(res, 200, {
              platform: process.platform,
              architecture: process.arch,
              node_version: process.version,
              memory_usage: process.memoryUsage(),
              environment: ENVIRONMENT,
              pid: process.pid,
              uptime: process.uptime(),
            });
            break;

          case "/metrics":
            sendMetrics(res);
            break;

          default:
            sendJSON(res, 404, {
              error: "Not Found",
              message: `Route ${pathname} not found`,
              timestamp,
            });
        }
      });

      // graceful shutdown
      function shutdown(signal) {
        console.log(`\nReceived ${signal}, shutting down gracefully...`);
        server.close(() =&amp;gt; {
          console.log("Server closed");
          process.exit(0);
        });
      }
      process.on("SIGTERM", () =&amp;gt; shutdown("SIGTERM"));
      process.on("SIGINT", () =&amp;gt; shutdown("SIGINT"));

      // start server
      server.listen(PORT, () =&amp;gt; {
        console.log(`🚀 Server running at http://localhost:${PORT}/`);
        console.log(`Environment: ${ENVIRONMENT}`);
        console.log(`Node.js version: ${process.version}`);
      });

      // export for testing
      module.exports = server;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;touch &lt;strong&gt;app.js&lt;/strong&gt;&lt;br&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%2Fd08whnqwketisfeklhn6.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%2Fd08whnqwketisfeklhn6.png" alt="jdjdjdj" width="800" height="358"&gt;&lt;/a&gt;&lt;br&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%2Fy09zacedz2pv4zpu2vfz.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%2Fy09zacedz2pv4zpu2vfz.png" alt="idjdjdj" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install Dependencies&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Install testing and development tools
      npm install --save-dev jest eslint supertest

      # Install all dependencies (creates node_modules folder)
      npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;npm install --save-dev jest eslint supertest&lt;/strong&gt; installs development-only tools for testing (Jest), code quality enforcement (ESLint), and HTTP/API testing (Supertest), and records them under devDependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;npm install&lt;/strong&gt; installs all dependencies defined in package.json (both dependencies and devDependencies), creates the node_modules directory, and ensures version consistency using package-lock.json.&lt;/p&gt;

&lt;p&gt;After running the code, you'll see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A node_modules/ folder with all installed packages&lt;/li&gt;
&lt;li&gt;A package-lock.json file that locks dependency versions&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%2F2o683opyob0xir9w6s4k.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%2F2o683opyob0xir9w6s4k.png" alt="rgefsrge" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: &lt;strong&gt;Create Proper Tests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step sets up automated testing so you can verify your application works correctly every time you make changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create tests directory and test file&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Create a folder for your tests
      mkdir tests

      # Create the main test file
      touch tests/app.test.js
&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%2Ftogtozgu5mgetb8w8pyw.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%2Ftogtozgu5mgetb8w8pyw.png" alt="defeqfw" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create test file&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Copy this code into already created &lt;strong&gt;tests/app.test.js&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      const request = require('supertest');
      const server = require('../app');

      describe('App Endpoints', () =&amp;gt; {
        afterAll(() =&amp;gt; {
          server.close();
        });

        test('GET / should return welcome page', async () =&amp;gt; {
          const response = await request(server).get('/');
          expect(response.status).toBe(200);
          expect(response.text).toContain('DevOps Lab 2025');
        });

        test('GET /health should return health status', async () =&amp;gt; {
          const response = await request(server).get('/health');
          expect(response.status).toBe(200);
          expect(response.body.status).toBe('healthy');
          expect(response.body.timestamp).toBeDefined();
          expect(typeof response.body.uptime).toBe('number');
        });

        test('GET /info should return system info', async () =&amp;gt; {
          const response = await request(server).get('/info');
          expect(response.status).toBe(200);
          expect(response.body.platform).toBeDefined();
          expect(response.body.node_version).toBeDefined();
        });

        test('GET /metrics should return prometheus metrics', async () =&amp;gt; {
          const response = await request(server).get('/metrics');
          expect(response.status).toBe(200);
          expect(response.text).toContain('http_requests_total');
          expect(response.text).toContain('app_uptime_seconds');
        });

        test('GET /nonexistent should return 404', async () =&amp;gt; {
          const response = await request(server).get('/nonexistent');
          expect(response.status).toBe(404);
          expect(response.body.error).toBe('Not Found');
        });
      });
&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%2F6z9qe6ib8ke9o2ie5aqe.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%2F6z9qe6ib8ke9o2ie5aqe.png" alt="sgrwesrgew" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create Jest configuration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a &lt;strong&gt;jest.config.js&lt;/strong&gt; file, add the required configuration content, and save the file.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      module.exports = {
        testEnvironment: 'node',
        collectCoverage: true,
        coverageDirectory: 'coverage',
        testMatch: ['**/tests/**/*.test.js'],
        verbose: true
      };
&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%2Fmubpcvt57h0y1waumy2o.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%2Fmubpcvt57h0y1waumy2o.png" alt="ugyftftty" width="800" height="360"&gt;&lt;/a&gt;&lt;br&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%2Fu7866tmjakmysgiudy1p.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%2Fu7866tmjakmysgiudy1p.png" alt="sagrgewr" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;: &lt;strong&gt;GitHub Actions CI/CD Pipeline&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This Creates an automated pipeline that runs tests and builds Docker images every time you push code to GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create workflow directory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;.github/workflows&lt;/strong&gt; directory is the local repository path where GitHub Actions workflows are defined and executed to manage CI/CD processes.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Create the GitHub Actions directory structure
      mkdir -p .github/workflows
&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%2Frlf29akivccadwazdp1r.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%2Frlf29akivccadwazdp1r.png" alt="gyftyft" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create CI/CD pipeline file&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create &lt;strong&gt;.github/workflows/ci.yml&lt;/strong&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%2F2s1bjd2yxvdkn6sastwj.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%2F2s1bjd2yxvdkn6sastwj.png" alt="ugygty" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now add the required configuration content and save the file.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      name: CI/CD Pipeline

      on:
        push:
          branches: [ main, develop ]
          tags: [ 'v*' ]
        pull_request:
          branches: [ main ]

      env:
        REGISTRY: ghcr.io
        IMAGE_NAME: ${{ github.repository }}

      concurrency:
        group: ${{ github.workflow }}-${{ github.ref }}
        cancel-in-progress: true

      jobs:
        test:
          name: Test &amp;amp; Lint
          runs-on: ubuntu-latest

          strategy:
            matrix:
              node-version: [20, 22]

          steps:
            - name: Checkout code
              uses: actions/checkout@v4

            - name: Setup Node.js ${{ matrix.node-version }}
              uses: actions/setup-node@v4
              with:
                node-version: ${{ matrix.node-version }}
                cache: 'npm'

            - name: Install dependencies
              run: npm ci

            - name: Run linting
              run: npm run lint

            - name: Run tests
              run: npm test

            - name: Security audit
              run: npm audit --audit-level=critical || echo "Audit completed with warnings"

       build:
          name: Build &amp;amp; Push Image
          runs-on: ubuntu-latest
          needs: test
          if: github.event_name == 'push'

          permissions:
            contents: read
            packages: write
            security-events: write

          outputs:
            image-tag: ${{ steps.meta.outputs.tags }}
            image-digest: ${{ steps.build.outputs.digest }}

          steps:
            - name: Checkout code
              uses: actions/checkout@v4

            - name: Set up Docker Buildx
              uses: docker/setup-buildx-action@v3
              with:
                platforms: linux/amd64,linux/arm64

            - name: Log in to Container Registry
              uses: docker/login-action@v3
              with:
                registry: ${{ env.REGISTRY }}
                username: ${{ github.actor }}
                password: ${{ secrets.GITHUB_TOKEN }}

            - name: Extract metadata
              id: meta
              uses: docker/metadata-action@v5
              with:
                images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
                tags: |
                  type=ref,event=branch
                  type=ref,event=pr
                  type=semver,pattern={{version}}
                  type=semver,pattern={{major}}.{{minor}}
                  type=sha,prefix={{branch}}-
                  type=raw,value=${{ github.run_id }}
                  type=raw,value=latest,enable={{is_default_branch}}
                labels: |
                  org.opencontainers.image.title=DevOps Lab 2025
                  org.opencontainers.image.description=Modern Node.js DevOps application

            - name: Build and push Docker image
              id: build
              uses: docker/build-push-action@v5
              with:
                context: .
                platforms: linux/amd64,linux/arm64
                push: true
                tags: ${{ steps.meta.outputs.tags }}
                labels: ${{ steps.meta.outputs.labels }}
                cache-from: type=gha
                cache-to: type=gha,mode=max
                target: production

            - name: Run Trivy vulnerability scanner
              uses: aquasecurity/trivy-action@0.24.0
              with:
                image-ref: ${{ steps.meta.outputs.tags }}
                format: 'sarif'
                output: 'trivy-results.sarif'
                severity: 'CRITICAL,HIGH'
              continue-on-error: true

            - name: Upload Trivy scan results
              uses: github/codeql-action/upload-sarif@v3
              if: always() &amp;amp;&amp;amp; hashFiles('trivy-results.sarif') != ''
              with:
                sarif_file: 'trivy-results.sarif'

        deploy-staging:
          name: Deploy to Staging
          runs-on: ubuntu-latest
          needs: build
          if: github.ref == 'refs/heads/develop'
          environment: staging

          steps:
            - name: Deploy to Staging
              run: |
                echo "🚀 Deploying to staging environment..."
                echo "Image: ${{ needs.build.outputs.image-tag }}"
                echo "Digest: ${{ needs.build.outputs.image-digest }}"
                # Add your staging deployment commands here (kubectl, helm, etc.)

        deploy-production:
          name: Deploy to Production
          runs-on: ubuntu-latest
          needs: build
          if: github.ref == 'refs/heads/main'
          environment: production

          steps:
            - name: Deploy to Production
              run: |
                echo "🎯 Deploying to production environment..."
                echo "Image: ${{ needs.build.outputs.image-tag }}"
                echo "Digest: ${{ needs.build.outputs.image-digest }}"
                # Add your production deployment commands here
&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%2F19dimrsamyp2iet5tlrk.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%2F19dimrsamyp2iet5tlrk.png" alt="ytfrtryt" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5&lt;/strong&gt;: &lt;strong&gt;Dockerfile&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step defines the build instructions Docker uses to create a portable container image of the application, ensuring consistent execution across environments. &lt;/p&gt;

&lt;p&gt;The Dockerfile performs the following functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses multi-stage builds for smaller image size&lt;/li&gt;
&lt;li&gt;Installs curl for health checks&lt;/li&gt;
&lt;li&gt;Creates a non-root user for security&lt;/li&gt;
&lt;li&gt;Sets up proper file permissions&lt;/li&gt;
&lt;li&gt;Configures health checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create &lt;strong&gt;Dockerfile&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Input these commands into the &lt;strong&gt;Dockerfile&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Multi-stage build for optimized image
      FROM node:20-alpine AS dependencies

      # Update packages for security
      RUN apk update &amp;amp;&amp;amp; apk upgrade --no-cache

      WORKDIR /app

      # Copy package files first for better caching
      COPY package*.json ./

      # Install only production dependencies
      RUN npm ci --only=production &amp;amp;&amp;amp; npm cache clean --force

      # Production stage  
      FROM node:20-alpine AS production

      # Update packages and install necessary tools
      RUN apk update &amp;amp;&amp;amp; apk upgrade --no-cache &amp;amp;&amp;amp; \
          apk add --no-cache curl dumb-init &amp;amp;&amp;amp; \
          rm -rf /var/cache/apk/*

      # Create non-root user with proper permissions
      RUN addgroup -g 1001 -S nodejs &amp;amp;&amp;amp; \
          adduser -S nodeuser -u 1001 -G nodejs

      WORKDIR /app

      # Copy dependencies from previous stage with proper ownership
      COPY --from=dependencies --chown=nodeuser:nodejs /app/node_modules ./node_modules

      # Copy application code with proper ownership
      COPY --chown=nodeuser:nodejs package*.json ./
      COPY --chown=nodeuser:nodejs app.js ./

      # Switch to non-root user
      USER nodeuser

      # Expose port
      EXPOSE 3000

      # Health check with proper timing for Node.js startup
      HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3 \
        CMD curl -f http://localhost:3000/health || exit 1

      # Use dumb-init for proper signal handling in containers
      ENTRYPOINT ["dumb-init", "--"]

      # Start application
      CMD ["npm", "start"]
&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%2Fn3ai8gpju4indainshsw.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%2Fn3ai8gpju4indainshsw.png" alt="Ihjgffd" width="800" height="362"&gt;&lt;/a&gt;&lt;br&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%2F5sgvhbqpxz0oz91bqgf3.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%2F5sgvhbqpxz0oz91bqgf3.png" alt="kyfttfrfyh" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6&lt;/strong&gt;: &lt;strong&gt;Essential Configuration Files&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This creates configuration files that tell various tools what to ignore, how to behave, and what settings to use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create&lt;/strong&gt; &lt;strong&gt;.dockerignore&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create .dockerignore:&lt;/p&gt;

&lt;p&gt;Input these commands into &lt;strong&gt;.dockerignore&lt;/strong&gt; and &lt;strong&gt;save&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # =========================
      # Dependencies &amp;amp; Package Managers
      # =========================
      node_modules
      npm-debug.log*
      coverage
      .nyc_output

      # =========================
      # Environment Variables
      # =========================
      .env
      .env.local
      .env.*.local

      # =========================
      # Version Control
      # =========================
      .git
      .github

      # =========================
      # Logs
      # =========================
      logs
      *.log

      # =========================
      # Editor &amp;amp; IDE Files
      # =========================
      .vscode
      .idea
      *.swp
      *.swo

      # =========================
      # OS Files
      # =========================
      .DS_Store
      Thumbs.db

      # =========================
      # Testing &amp;amp; Tooling
      # =========================
      tests/
      jest.config.js
      .eslintrc*

      # =========================
      # Documentation
      # =========================
      README.md
&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%2F3eczbbwk4xg7xhu3hvez.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%2F3eczbbwk4xg7xhu3hvez.png" alt="Ikfdgdgd" width="800" height="386"&gt;&lt;/a&gt;&lt;br&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%2Fflta88x9k6uc0vbc85zh.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%2Fflta88x9k6uc0vbc85zh.png" alt="rgereyeryw" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create&lt;/strong&gt; &lt;strong&gt;.gitignore&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create .gitignore:&lt;/p&gt;

&lt;p&gt;Input these commands into already created &lt;strong&gt;.gitignore&lt;/strong&gt; and &lt;strong&gt;save&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;         # ===============================
         # Dependencies
         # ===============================
         node_modules/
         npm-debug.log*
         yarn-debug.log*
         yarn-error.log*

         # ===============================
         # Runtime Data
         # ===============================
         pids
         *.pid
         *.seed
         *.pid.lock

         # ===============================
         # Coverage &amp;amp; Test Reports
         # ===============================
         coverage/
         .nyc_output/

         # ===============================
         # Environment Variables
         # ===============================
         .env
         .env.local
         .env.*.local

         # ===============================
         # Logs
         # ===============================
         logs/
         *.log

         # ===============================
         # IDE / Editor
         # ===============================
         .vscode/
         .idea/
         *.swp
         *.swo

         # ===============================
         # OS Files
         # ===============================
         .DS_Store
         Thumbs.db
&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%2Fz0008ea0808ln5og7usr.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%2Fz0008ea0808ln5og7usr.png" alt="hggchg" width="800" height="385"&gt;&lt;/a&gt;&lt;br&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%2Frueolxjcdmaqwxjbho9b.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%2Frueolxjcdmaqwxjbho9b.png" alt="ffdfghf" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create&lt;/strong&gt; &lt;strong&gt;environment&lt;/strong&gt; &lt;strong&gt;template&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create .env.example:&lt;/p&gt;

&lt;p&gt;Input these commands into already created &lt;strong&gt;.env.example&lt;/strong&gt; and &lt;strong&gt;save&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       # ===============================
       # Server Configuration
       # ===============================
       PORT=3000
       NODE_ENV=production

       # ===============================
       # Logging Configuration
       # ===============================
       LOG_LEVEL=info
&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%2Fvy0wgwu0mp6zl238maro.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%2Fvy0wgwu0mp6zl238maro.png" alt="dfsdgre" width="800" height="376"&gt;&lt;/a&gt;&lt;br&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%2Fhoocl8ji6b80o6qfq473.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%2Fhoocl8ji6b80o6qfq473.png" alt="rhrhtregr" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create&lt;/strong&gt; &lt;strong&gt;ESLint&lt;/strong&gt; &lt;strong&gt;configuration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create .eslintrc.js:&lt;/p&gt;

&lt;p&gt;Input these commands into already created &lt;strong&gt;.eslintrc.js&lt;/strong&gt; and &lt;strong&gt;save&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      module.exports = {
        env: {
          node: true,
          es2021: true,
          jest: true
        },
        extends: ['eslint:recommended'],
        parserOptions: {
          ecmaVersion: 12,
          sourceType: 'module'
        },
        rules: {
          'no-console': 'off',
          'no-unused-vars': ['error', { 'argsIgnorePattern': '^_' }]
        }
      };
&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%2Fabnh2wjj0bqnirii01bd.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%2Fabnh2wjj0bqnirii01bd.png" alt="Ihgfytin" width="800" height="388"&gt;&lt;/a&gt;&lt;br&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%2F3qr1qpjvyrfag1tn9cjn.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%2F3qr1qpjvyrfag1tn9cjn.png" alt="hgyugyuhuiu" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7&lt;/strong&gt;: &lt;strong&gt;Docker Compose for Development&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This creates a Docker Compose file that makes it easy to run your application and any supporting services with a single command.&lt;/p&gt;

&lt;p&gt;Create docker-compose.yml:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      version: '3.8'

      services:
        app:
          build: .
          ports:
            - "3000:3000"
          environment:
            - NODE_ENV=development
            - PORT=3000
          restart: unless-stopped
          healthcheck:
            test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
            interval: 30s
            timeout: 10s
            retries: 3
            start_period: 10s
&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%2Fsw2vused0ddmkmwpkbjx.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%2Fsw2vused0ddmkmwpkbjx.png" alt="I76tr65ry6n" width="800" height="378"&gt;&lt;/a&gt;&lt;br&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%2F9t05b4bhso0rbk995nfw.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%2F9t05b4bhso0rbk995nfw.png" alt="yuttyun" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 8&lt;/strong&gt;: &lt;strong&gt;Test Everything Locally&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This shows you how to actually run and test your application locally before deploying it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install and Test Locally&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Install all dependencies from package.json
      npm install
      # Run your test suite to make sure everything works
      npm test
      # Start the application server
      npm start
&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%2Fdrpu08k7doqegzymzzug.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%2Fdrpu08k7doqegzymzzug.png" alt="ytfyfytfyt" width="800" height="357"&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%2F9tf8khj66fefkhp7o0kq.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%2F9tf8khj66fefkhp7o0kq.png" alt="ygyuyy" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Tests should pass with green checkmarks: ✓ GET / should return welcome page&lt;/em&gt;&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%2F238yw0r6f2ifss2831fz.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%2F238yw0r6f2ifss2831fz.png" alt="hfdtrtyhg" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Server starts and shows: 🚀 Server running at &lt;a href="http://localhost:3000/" rel="noopener noreferrer"&gt;http://localhost:3000/&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Test endpoints (in a new terminal window)&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      curl http://localhost:3000/         # Homepage
      curl http://localhost:3000/health   # Health check JSON
      curl http://localhost:3000/info     # System info JSON  
      curl http://localhost:3000/metrics  # Prometheus metrics
&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%2Fwkzwmw0ckfyxwb7erxrg.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%2Fwkzwmw0ckfyxwb7erxrg.png" alt="jdfcjsc" width="800" height="404"&gt;&lt;/a&gt;&lt;br&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%2Fqljsj1pooebwgll0t6gy.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%2Fqljsj1pooebwgll0t6gy.png" alt="idsfsfs" width="800" height="396"&gt;&lt;/a&gt;&lt;br&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%2Fts5cnfitdirop20ksrs1.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%2Fts5cnfitdirop20ksrs1.png" alt="fgdgeage" width="800" height="401"&gt;&lt;/a&gt;&lt;br&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%2Fn1ulk7b8ahhqcwq5irxb.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%2Fn1ulk7b8ahhqcwq5irxb.png" alt="drwbhywsr" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Commands&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Build image
      docker build -t my-devops-app:latest .

      # Run container
      docker run -d \
        --name my-devops-container \
        -p 3000:3000 \
        --restart unless-stopped \
        my-devops-app:latest

      # Check container status
      docker ps
      docker logs my-devops-container

      # Test health check
      curl http://localhost:3000/health

      # Stop container
      docker stop my-devops-container
      docker rm my-devops-container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Build image&lt;/strong&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%2Fnj9b09fcxxkabgz532wj.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%2Fnj9b09fcxxkabgz532wj.png" alt="htfytytdt" width="800" height="426"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Run container&lt;/strong&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%2Fq1uu950whvbjoypykagb.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%2Fq1uu950whvbjoypykagb.png" alt="Iygytfyy" width="800" height="372"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Check container status&lt;/strong&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%2F4cag8jzdco8xg1v8p1g5.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%2F4cag8jzdco8xg1v8p1g5.png" alt="Iyugyu" width="800" height="375"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Test health check&lt;/strong&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%2Fasnzzzpcmotveozer9hx.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%2Fasnzzzpcmotveozer9hx.png" alt="dsfcsd" width="800" height="404"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Stop container&lt;/strong&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%2F3o7kqw0p1hnkd7tiskv7.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%2F3o7kqw0p1hnkd7tiskv7.png" alt="Iytytytn" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Compose Commands&lt;/strong&gt;&lt;br&gt;
Docker compose is not used to test in production environment but locally.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Start all services defined in docker-compose.yml
      docker-compose up -d

      # View real-time logs from all services
      docker-compose logs -f

      # Stop all services and clean up
      docker-compose down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Start all services defined in docker-compose.yml&lt;/strong&gt;&lt;br&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%2Flkj8dkk0j9icxyu9c86i.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%2Flkj8dkk0j9icxyu9c86i.png" alt="frdtrgfy" width="800" height="503"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;View real-time logs from all services&lt;/strong&gt;&lt;br&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%2Fjo7nq44ta0vuk5jabptc.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%2Fjo7nq44ta0vuk5jabptc.png" alt="jgytfyt" width="800" height="364"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Stop all services and clean up&lt;/strong&gt;&lt;br&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%2Fudvlfbc13nl741k5kkwj.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%2Fudvlfbc13nl741k5kkwj.png" alt="yugytfyt" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 9&lt;/strong&gt;: &lt;strong&gt;Deploy to GitHub&lt;/strong&gt;&lt;br&gt;
This commits your code to Git and pushes it to GitHub so the automated CI/CD pipeline can start working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initial commit&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Add all files to Git staging area
      git add .

      # Create your first commit with a descriptive message
      git commit -m "Initial commit: Complete DevOps setup with working CI/CD"
&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%2Fkr6v09q9hs2hjaejq7oo.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%2Fkr6v09q9hs2hjaejq7oo.png" alt="Iygtftfyy" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect to GitHub&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before running these commands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;GitHub.com&lt;/strong&gt; and create a new repository called &lt;strong&gt;my-devops-project&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;DO NOT initialize it with &lt;strong&gt;README&lt;/strong&gt;, &lt;strong&gt;.gitignore&lt;/strong&gt;, or &lt;strong&gt;license&lt;/strong&gt; (we already have these)&lt;/li&gt;
&lt;li&gt;Copy the repository &lt;strong&gt;URL&lt;/strong&gt; from GitHub&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace &lt;strong&gt;YOUR_GITHUB_USERNAME&lt;/strong&gt; below with your actual GitHub username&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   # Set main as the default branch
   git branch -M main

   # Connect to your GitHub repository (UPDATE THIS URL!)
   git remote add origin https://github.com/YOUR_GITHUB_USERNAME/my-devops-project.git

   # Push your code to GitHub for the first time
   git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&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%2Fear17dvgmu4tg7lsr08z.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%2Fear17dvgmu4tg7lsr08z.png" alt="Ikjhyftrdy" width="800" height="368"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Your code appears on GitHub, and the CI/CD pipeline starts running automatically&lt;/em&gt;.&lt;br&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%2F9f3w9ryvb0ktnvlf26sc.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%2F9f3w9ryvb0ktnvlf26sc.png" alt="hygtyuj" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 10&lt;/strong&gt;: &lt;strong&gt;Kubernetes Deployment Configurations&lt;/strong&gt;&lt;br&gt;
This step creates Kubernetes configuration files that define how your application should run in staging and production environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create directories&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       # Create directories for Kubernetes configurations
       mkdir -p k8s/staging k8s/production
&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%2Fe0ayjn4iu04ap1e1d1ju.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%2Fe0ayjn4iu04ap1e1d1ju.png" alt="gftfyhgy" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create Staging Deployment&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Create&lt;/strong&gt; k8s/staging/deployment.yml&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: devops-app-staging
        namespace: staging
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: devops-app
            environment: staging
        template:
          metadata:
            labels:
              app: devops-app
              environment: staging
          spec:
            containers:
            - name: app
              image: ghcr.io/YOUR_GITHUB_USERNAME/my-devops-project:develop-latest
              ports:
              - containerPort: 3000
              env:
              - name: NODE_ENV
                value: "staging"
              - name: PORT
                value: "3000"
              livenessProbe:
                httpGet:
                  path: /health
                  port: 3000
                initialDelaySeconds: 30
                periodSeconds: 10
              readinessProbe:
                httpGet:
                  path: /health
                  port: 3000
                initialDelaySeconds: 5
                periodSeconds: 5
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: devops-app-service-staging
        namespace: staging
      spec:
        selector:
          app: devops-app
          environment: staging
        ports:
        - protocol: TCP
          port: 80
          targetPort: 3000
        type: LoadBalancer
&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%2Fsgzp2ncpl8rivcihwj6z.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%2Fsgzp2ncpl8rivcihwj6z.png" alt="isisfifisi" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create Production Deployment&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Create&lt;/strong&gt; k8s/production/deployment.yml&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: devops-app-production
        namespace: production
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: devops-app
            environment: production
        template:
          metadata:
            labels:
              app: devops-app
              environment: production
          spec:
            containers:
            - name: app
              image: ghcr.io/YOUR_GITHUB_USERNAME/my-devops-project:latest
              ports:
              - containerPort: 3000
              env:
              - name: NODE_ENV
                value: "production"
              - name: PORT
                value: "3000"
              resources:
                requests:
                  memory: "128Mi"
                  cpu: "100m"
                limits:
                  memory: "256Mi"
                  cpu: "200m"
              livenessProbe:
                httpGet:
                  path: /health
                  port: 3000
                initialDelaySeconds: 30
                periodSeconds: 10
              readinessProbe:
                httpGet:
                  path: /health
                  port: 3000
                initialDelaySeconds: 5
                periodSeconds: 5
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: devops-app-service-production
        namespace: production
      spec:
        selector:
          app: devops-app
          environment: production
        ports:
        - protocol: TCP
          port: 80
          targetPort: 3000
        type: LoadBalancer
&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%2Ffere3m06answ5mxp421k.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%2Ffere3m06answ5mxp421k.png" alt="Ikdsfwewf" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 11&lt;/strong&gt;: &lt;strong&gt;Complete Deployment Workflow&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step shows you how to use the complete CI/CD pipeline with proper branching strategy for staging and production deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Branch-based Deployment Strategy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;develop branch&lt;/strong&gt; → Automatically deploys to staging environment&lt;br&gt;
&lt;strong&gt;main branch&lt;/strong&gt; → Automatically deploys to production environment&lt;br&gt;
&lt;strong&gt;Pull requests&lt;/strong&gt; → Run tests only (no deployment)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploy Changes&lt;/strong&gt;&lt;br&gt;
Deploy to staging:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Create and switch to develop branch
      git checkout -b develop

      # Make your changes, then commit and push
      git add .
      git status
      git commit -m "Add new feature"
      git push origin develop
&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%2Feybd22jwesep4c382ndb.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%2Feybd22jwesep4c382ndb.png" alt="dfghsrthr" width="800" height="502"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;GitHub Actions automatically runs tests and deploys to staging&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Deploy to production:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Switch to main branch
      git checkout main

      # Merge changes from develop
      git merge develop

      # Push to trigger production deployment
      git push origin main
&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%2Fsqgcp7s2te84457jwtks.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%2Fsqgcp7s2te84457jwtks.png" alt="jdfvdijgids" width="800" height="501"&gt;&lt;/a&gt;&lt;br&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%2F7kl2tva9w4xf0xuihelt.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%2F7kl2tva9w4xf0xuihelt.png" alt="Ioikgkrjgwes" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitor Deployments&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can execute this command to monitor the GitHub Actions workflow execution and verify the health status of the deployed application.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Check GitHub Actions status
      # Visit: https://github.com/YOUR_GITHUB_USERNAME/my-devops-project/actions

      # Check your container registry
      # Visit: https://github.com/YOUR_GITHUB_USERNAME/my-devops-project/pkgs/container/my-devops-project

      # Test your deployed applications (once you have URLs)
      curl https://your-staging-url.com/health      # Staging health check
      curl https://your-production-url.com/health   # Production health check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This project implements a production grade CI/CD pipeline for a containerized Node.js application using GitHub Actions, Docker, and Kubernetes, demonstrating end-to-end DevOps engineering practices. The application exposes health, metrics, and system endpoints with graceful shutdown handling for Kubernetes environments.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>k8s</category>
      <category>cicd</category>
      <category>node</category>
    </item>
    <item>
      <title>Mastering Git for Production: Branching, Merging &amp; Squash Strategies Every Engineer Should Know</title>
      <dc:creator>lotanna obianefo</dc:creator>
      <pubDate>Thu, 19 Feb 2026 12:23:27 +0000</pubDate>
      <link>https://dev.to/lotanna_obianefo/mastering-git-for-production-branching-merging-squash-strategies-every-engineer-should-know-5flp</link>
      <guid>https://dev.to/lotanna_obianefo/mastering-git-for-production-branching-merging-squash-strategies-every-engineer-should-know-5flp</guid>
      <description>&lt;p&gt;Modern software development depends heavily on version control systems to manage code changes, support collaboration, and maintain stability. Git is the industry-standard distributed version control system that enables teams to work concurrently without overwriting each other’s progress.&lt;/p&gt;

&lt;p&gt;Core to Git’s power are its branching and history management capabilities specifically branching, merging, squashing, and rebasing. Understanding these concepts is essential for maintaining a clean, traceable, and production ready codebase.&lt;/p&gt;

&lt;p&gt;By the end of this article, engineers will understand how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create branches to work safely&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Merge branches using different strategies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix merge conflicts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Squash many commits into one&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Push a complete project to GitHub&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PROJECT SETUP&lt;/strong&gt; -&lt;strong&gt;Part 1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. &lt;strong&gt;Create Project Folder&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      mkdir git-merge-lab
&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%2Ffsnuoz1je41ufqs8k748.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%2Ffsnuoz1je41ufqs8k748.png" alt="kdsfAW" width="800" height="371"&gt;&lt;/a&gt;&lt;br&gt;
This creates a new, empty directory named &lt;strong&gt;git-merge-lab&lt;/strong&gt;, establishing an isolated workspace that prevents interference with existing files and ensures a controlled environment for Git merge practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. &lt;strong&gt;Enter the Folder&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;     cd git-merge-lab
&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%2Fywms2o0xrqrl29ctkx6k.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%2Fywms2o0xrqrl29ctkx6k.png" alt="utytr5fr" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This navigates the terminal session into the project directory, setting the folder as the current working environment.&lt;/p&gt;

&lt;p&gt;Purpose:&lt;br&gt;
Git operations are context-sensitive and can only be executed within an initialized repository or project directory.&lt;/p&gt;

&lt;p&gt;Outcome:&lt;br&gt;
All subsequent files, commits, and version control activities will be contained within this directory, ensuring organized project structure and traceability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3&lt;/strong&gt;. &lt;strong&gt;Initialize Git&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git init
&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%2Ft34accsd62kqfds0kkvt.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%2Ft34accsd62kqfds0kkvt.png" alt="ygfdredt" width="800" height="404"&gt;&lt;/a&gt;&lt;br&gt;
This Initializes the directory as a Git repository by generating a hidden .git subdirectory that stores metadata, configuration settings, and the complete version history.&lt;/p&gt;

&lt;p&gt;Purpose:&lt;br&gt;
Repository initialization is required for Git to begin tracking file changes and managing version control.&lt;/p&gt;

&lt;p&gt;Outcome:&lt;br&gt;
The directory is now under Git management, enabling change tracking, staging, committing, and collaboration workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4&lt;/strong&gt;. &lt;strong&gt;Create README File&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      echo "# Team Project" &amp;gt; README.md
&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%2Fpho8hh7muam7jwfhdq5m.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%2Fpho8hh7muam7jwfhdq5m.png" alt="fytftygyt" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This creates a README.md file and populates it with initial content.&lt;/p&gt;

&lt;p&gt;Purpose:&lt;br&gt;
Git requires at least one tracked file to generate a commit and establish version history within the repository.&lt;/p&gt;

&lt;p&gt;Outcome:&lt;br&gt;
The README.md file is present in the working directory but remains untracked until it is staged and committed to the repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5&lt;/strong&gt;. &lt;strong&gt;Stage the File&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git add README.md
&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%2Fe8zekbww35z1m1x19wf6.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%2Fe8zekbww35z1m1x19wf6.png" alt="hjgfdrrr" width="800" height="380"&gt;&lt;/a&gt;&lt;br&gt;
This stages the file for inclusion in the upcoming commit by adding it to the Git index.&lt;/p&gt;

&lt;p&gt;Purpose:&lt;br&gt;
Git only records changes that have been explicitly staged, allowing developers to control which modifications are captured in a commit.&lt;/p&gt;

&lt;p&gt;Outcome:&lt;br&gt;
README.md is now in the staging area and prepared to be committed to the repository history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6&lt;/strong&gt;. &lt;strong&gt;Commit the File&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git commit -m "Initial commit"
&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%2F5jj8apiisx9hxyehc3pi.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%2F5jj8apiisx9hxyehc3pi.png" alt="rdsthryuty" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This creates a commit that captures a snapshot of the project state within the repository history.&lt;/p&gt;

&lt;p&gt;Purpose:&lt;br&gt;
Committing establishes a restore point, enabling version rollback and facilitating traceability if future changes introduce issues.&lt;/p&gt;

&lt;p&gt;Outcome:&lt;br&gt;
The repository now contains its initial commit, marking the first recorded version of the project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7&lt;/strong&gt;. &lt;strong&gt;Rename Branch to main&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git branch -M main
&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%2F85o67x060ynxwdbtxf49.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%2F85o67x060ynxwdbtxf49.png" alt="ftrdryugftr" width="800" height="440"&gt;&lt;/a&gt;&lt;br&gt;
This renames the active branch to main, aligning it with modern repository naming conventions.&lt;/p&gt;

&lt;p&gt;Purpose:&lt;br&gt;
Most hosting platforms and enterprise workflows designate main as the default branch, promoting consistency across development environments.&lt;/p&gt;

&lt;p&gt;Outcome:&lt;br&gt;
The primary development branch is now labeled main, serving as the central integration point for future changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FAST-FORWARD MERGE&lt;/strong&gt; -&lt;strong&gt;Part 2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8&lt;/strong&gt;. &lt;strong&gt;Create Feature Branch&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;     git checkout -b feature-login
&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%2Ft03h0ekud8q39ew5khs6.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%2Ft03h0ekud8q39ew5khs6.png" alt="Ivggfn" width="800" height="397"&gt;&lt;/a&gt;&lt;br&gt;
This creates a new Git branch and checks it out as the active working branch.&lt;/p&gt;

&lt;p&gt;Purpose:&lt;br&gt;
Feature development is isolated in dedicated branches to prevent instability in the main (or production) branch and to support controlled integration workflows.&lt;/p&gt;

&lt;p&gt;Outcome:&lt;br&gt;
The working directory is now tracking the feature-login branch instead of main, ensuring all subsequent commits apply only to this feature stream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9&lt;/strong&gt;. &lt;strong&gt;Add Feature File&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      echo "Login page created" &amp;gt; login.txt
&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%2Fxmjaen7y7tr7d8dbzr21.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%2Fxmjaen7y7tr7d8dbzr21.png" alt="jgfytuy" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This creates a new source file associated with the login functionality.&lt;/p&gt;

&lt;p&gt;Purpose:&lt;br&gt;
This step represents the introduction of new application logic and simulates the implementation of a feature within the codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10&lt;/strong&gt;. &lt;strong&gt;Commit Feature&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git add login.txt
      git commit -m "Add login feature"
&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%2Fh8dliytyzh3imt8w8yqu.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%2Fh8dliytyzh3imt8w8yqu.png" alt="iuytden" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Purpose of both commands:&lt;br&gt;
&lt;strong&gt;git add&lt;/strong&gt; stages the modified file by placing it into the index, preparing it for version control tracking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git commit&lt;/strong&gt; records the staged changes into the repository history as a new snapshot.&lt;/p&gt;

&lt;p&gt;Outcome:&lt;br&gt;
The feature changes are now securely versioned and stored within the feature branch’s commit history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;11&lt;/strong&gt;. &lt;strong&gt;Switch Back to Main&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git checkout main
&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%2Fzoamgmddu1lfr57iltzd.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%2Fzoamgmddu1lfr57iltzd.png" alt="Ikhyt6tyt" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This switches the working context back to the main branch.&lt;/p&gt;

&lt;p&gt;Purpose:&lt;br&gt;
In Git, merge operations are executed into the currently checked-out branch, so you must be on the target branch before initiating a merge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12&lt;/strong&gt;. &lt;strong&gt;Merge Feature (Fast-Forward)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git merge feature-login
&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%2Fxpzs4oa4vbzpv17sqd9x.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%2Fxpzs4oa4vbzpv17sqd9x.png" alt="khftfyuy" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main branch advances its pointer to incorporate the commits from the feature branch.&lt;/p&gt;

&lt;p&gt;Purpose:&lt;br&gt;
Since main has not diverged and contains no new commits since the branch was created, Git performs a fast-forward merge rather than generating an additional merge commit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3-WAY MERGE (PARALLEL WORK)&lt;/strong&gt; -&lt;strong&gt;Part 3&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;13&lt;/strong&gt;. &lt;strong&gt;Create Profile Feature&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;     git checkout -b feature-profile
     echo "Profile page created" &amp;gt; profile.txt
     git add profile.txt
     git commit -m "Add profile feature"
&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%2Ff7nsf8n6jzshokjeddgk.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%2Ff7nsf8n6jzshokjeddgk.png" alt="iuytrtt" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This establishes an isolated development context that allows a new feature to be implemented independently, without impacting the stability or history of other branches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;git checkout main&lt;/strong&gt;&lt;/em&gt; switches the working directory to the main branch, ensuring the new work is based on the latest stable code.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;git checkout -b feature-settings&lt;/strong&gt;&lt;/em&gt; creates a new branch named feature-settings from main and immediately switches to it. These isolates feature development from the main codebase.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;echo "Settings page created" &amp;gt; settings.txt&lt;/strong&gt;&lt;/em&gt; creates a new file called settings.txt and writes initial content to it, representing the implementation of the settings feature.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;git add settings.txt&lt;/strong&gt;&lt;/em&gt; stages the newly created file by adding it to the Git index, marking it for inclusion in the next commit.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;git commit -m "Add settings feature"&lt;/strong&gt;&lt;/em&gt; creates a commit that records the staged changes in the repository history with a descriptive message, capturing the initial implementation of the settings feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;14&lt;/strong&gt;. &lt;strong&gt;Create Settings Feature&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git checkout main
      git checkout -b feature-settings
      echo "Settings page created" &amp;gt; settings.txt
      git add settings.txt
      git commit -m "Add settings feature"
&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%2F2mxsi5g9kz9dbpjzkk2r.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%2F2mxsi5g9kz9dbpjzkk2r.png" alt="Ihuygyu" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, the codebase has diverged, with independent changes introduced on two separate branches, resulting in distinct commit histories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;15&lt;/strong&gt;. &lt;strong&gt;Merge Profile&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git checkout main
      git merge feature-profile
&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%2Fqlome97me4xua8ap5h89.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%2Fqlome97me4xua8ap5h89.png" alt="Iugtt" width="800" height="378"&gt;&lt;/a&gt;&lt;br&gt;
This ensures the main branch is updated first with the profile feature, establishing it as the authoritative baseline before integrating additional feature work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;16&lt;/strong&gt;. &lt;strong&gt;Merge Settings (3-Way)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git merge feature-settings
&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%2F0jlvhqaook144a6i68et.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%2F0jlvhqaook144a6i68et.png" alt="Iifisfd" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;;&lt;br&gt;
&lt;em&gt;Demonstrates familiarity with the Vim editor by entering a commit message within the Vim interface and exiting correctly using the &lt;strong&gt;Esc&lt;/strong&gt; key followed by &lt;strong&gt;:wq&lt;/strong&gt; to write and quit&lt;/em&gt;.&lt;br&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%2Ff5i8jl7daaapvynss1rk.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%2Ff5i8jl7daaapvynss1rk.png" alt="dsfsdsdf" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Git generates a merge commit that reconciles and combines the divergent commit histories from both branches.&lt;/p&gt;

&lt;p&gt;Outcome:&lt;br&gt;
The main and feature branches have progressed independently, resulting in non-linear histories that require an explicit merge commit to integrate their changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MERGE CONFLICT&lt;/strong&gt; -&lt;strong&gt;PART 4&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;17&lt;/strong&gt;. &lt;strong&gt;Bugfix Changes README&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git checkout -b bugfix-title
      echo "# Team Project Version 2" &amp;gt; README.md
      git add README.md
      git commit -m "Update title in bugfix"
&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%2Ffrgxpp6ourr1937sonhp.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%2Ffrgxpp6ourr1937sonhp.png" alt="bgrgtrgrt" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;18&lt;/strong&gt;. &lt;strong&gt;Feature Also Changes README&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git checkout main
      git checkout -b feature-title-update
      echo "# Awesome Team Project" &amp;gt; README.md
      git add README.md
      git commit -m "Update title in feature"
&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%2Ffziutlekwkvhv2yep0rb.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%2Ffziutlekwkvhv2yep0rb.png" alt="Iigtfrruyg" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;19&lt;/strong&gt;. &lt;strong&gt;Trigger Conflict&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git checkout main
      git merge bugfix-title
      git merge feature-title-update
&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%2F02pfmrelqfnvyju497rt.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%2F02pfmrelqfnvyju497rt.png" alt="kjsdsdf" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Git is unable to automatically complete the merge process and halts the operation.&lt;/p&gt;

&lt;p&gt;Outcome:&lt;br&gt;
Conflicting changes exist, and Git cannot determine which version should be applied, requiring manual conflict resolution by the developer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;20&lt;/strong&gt;. &lt;strong&gt;Resolve Conflict&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open &lt;strong&gt;README.md&lt;/strong&gt; delete the conflict marker and write the following command.&lt;/p&gt;

&lt;p&gt;Note: &lt;em&gt;Merge conflicts must be resolved manually by the developer. To do this, open the affected file in the Vim editor using &lt;strong&gt;vim README.md&lt;/strong&gt;, review the conflict markers, and explicitly select or reconcile the appropriate changes&lt;/em&gt;.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      # Awesome Team Project Version 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git add README.md
      git commit -m "Resolve merge conflict"
&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%2F659zabm5tjnmorujzyvb.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%2F659zabm5tjnmorujzyvb.png" alt="jgytft" width="800" height="380"&gt;&lt;/a&gt;&lt;br&gt;
This notifies Git that the merge conflict has been resolved and the finalized version of the file has been saved by staging the corrected file for commit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQUASH MERGE&lt;/strong&gt; -&lt;strong&gt;PART 5&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;21&lt;/strong&gt;. &lt;strong&gt;Create Feature With Many Commits &amp;amp; Squash It&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git checkout -b feature-dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;-&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      echo "Dashboard layout" &amp;gt; dashboard.txt
      git add dashboard.txt
      git commit -m "Add dashboard layout"
&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%2Fkppofrra4a92o1ej2cz7.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%2Fkppofrra4a92o1ej2cz7.png" alt="hyugyty" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      echo "Add charts" &amp;gt;&amp;gt; dashboard.txt
      git add dashboard.txt
      git commit -m "Add charts"
&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%2F7dow8ksth39akaquh35g.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%2F7dow8ksth39akaquh35g.png" alt="ytfytrytyt" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      echo "Fix alignment" &amp;gt;&amp;gt; dashboard.txt
      git add dashboard.txt
      git commit -m "Fix alignment"
&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%2Fzh4au9z3o4k4x457sl3l.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%2Fzh4au9z3o4k4x457sl3l.png" alt="ygytfygyu" width="800" height="350"&gt;&lt;/a&gt;&lt;br&gt;
Now squash:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git checkout main
      git merge --squash feature-dashboard
      git commit -m "Add dashboard feature"
&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%2F0d6i1eif4kx2d20nqpik.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%2F0d6i1eif4kx2d20nqpik.png" alt="Ihftrhgyft" width="800" height="367"&gt;&lt;/a&gt;&lt;br&gt;
Squashing is used to consolidate multiple incremental development commits into a single, cohesive commit, ensuring that the main branch history remains clean, concise, and focused on meaningful changes rather than granular development steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;22&lt;/strong&gt;. &lt;strong&gt;View History&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;     git log --oneline --graph --all
&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%2F0ppt1x009rmdom5ytrkp.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%2F0ppt1x009rmdom5ytrkp.png" alt="Ifgdgresd" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is to visually inspect and validate the type of merge performed, ensuring the resulting commit history aligns with the intended integration strategy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PUSH TO GITHUB&lt;/strong&gt; -&lt;strong&gt;PART 6&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;23&lt;/strong&gt;. &lt;strong&gt;Create Repo on GitHub&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A remote repository must be created and accessible prior to performing a push operation, as Git requires a valid remote endpoint to receive and store the local commits.&lt;/p&gt;

&lt;p&gt;DO NOT check: Add &lt;strong&gt;README&lt;/strong&gt;, Add &lt;strong&gt;.gitignore&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;24&lt;/strong&gt;. &lt;strong&gt;Connect Local to GitHub&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      git remote add origin https://github.com/YOUR_USERNAME/git-merge-lab.git
&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%2F4tcdarc2oqlj2z3usnjf.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%2F4tcdarc2oqlj2z3usnjf.png" alt="jgtftrt" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This defines the remote endpoint, informing Git of the destination repository to which local commits and branches should be transmitted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;25&lt;/strong&gt;. &lt;strong&gt;Push All Branches&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;         git push -u origin --all
&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%2Fvg3dn79qj1bt8oikvijc.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%2Fvg3dn79qj1bt8oikvijc.png" alt="ifdvdfjsid" width="800" height="467"&gt;&lt;/a&gt;&lt;br&gt;
This Pushes all local branches (such as main, feature, and bugfix) to the remote GitHub repository and establishes upstream tracking relationships, enabling simplified and consistent push and pull operations in subsequent workflows.&lt;br&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%2F22vvtxna3aocl4pmlh4l.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%2F22vvtxna3aocl4pmlh4l.png" alt="kfdfsfs" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Branching, merging, and squashing form the backbone of efficient Git workflows. Branching enables safe experimentation, merging integrates work and squashing keeps history readable. Mastering when and how to use each technique allows engineering teams to scale collaboration while maintaining a stable and maintainable codebase.&lt;/p&gt;

&lt;p&gt;For modern DevOps environments where automation, rapid releases, and distributed teams are the norm these practices are not optional, they are foundational to high quality software delivery.&lt;/p&gt;

</description>
      <category>github</category>
      <category>devops</category>
      <category>cicd</category>
      <category>azure</category>
    </item>
    <item>
      <title>Get Started with Elastic Beanstalk</title>
      <dc:creator>lotanna obianefo</dc:creator>
      <pubDate>Sat, 27 Dec 2025 15:01:28 +0000</pubDate>
      <link>https://dev.to/lotanna_obianefo/get-started-with-elastic-beanstalk-3936</link>
      <guid>https://dev.to/lotanna_obianefo/get-started-with-elastic-beanstalk-3936</guid>
      <description>&lt;p&gt;Amazon Elastic Beanstalk (EB) is a Platform as a Service (PaaS) offering from AWS that simplifies the deployment, management, and scaling of web applications. It allows developers to focus on writing code while AWS handles infrastructure provisioning, load balancing, auto scaling, monitoring, and application health management.&lt;/p&gt;

&lt;p&gt;Elastic Beanstalk is ideal for teams that want speed, scalability, and operational simplicity without sacrificing control over the underlying AWS resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To create an application&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Search for &lt;strong&gt;Elastic Beanstalk&lt;/strong&gt; on the search console and click on &lt;strong&gt;create Application&lt;/strong&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%2Fkq2txtbvekfjpyr0f2yp.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%2Fkq2txtbvekfjpyr0f2yp.png" alt="hjhduhcs" width="800" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The console provides a six-step process for creating an application and configuring an environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step1&lt;/strong&gt;: &lt;strong&gt;Configure Environment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;Environment Tier&lt;/strong&gt; section, select &lt;strong&gt;Web Server Environment&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Provide an &lt;strong&gt;Application Name&lt;/strong&gt; (for example, Fintec_app25).&lt;br&gt;
The system will automatically generate the corresponding &lt;strong&gt;Environment Name&lt;/strong&gt; by appending _env to the application name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under the &lt;strong&gt;Platform configuration&lt;/strong&gt;, select &lt;strong&gt;Node.js&lt;/strong&gt;.&lt;br&gt;
The recommended Platform Branch and Version will be automatically populated based on the selection.&lt;/p&gt;&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%2Fmpd4a066aiidtmnjedo0.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%2Fmpd4a066aiidtmnjedo0.png" alt="ijuhygyy" width="800" height="423"&gt;&lt;/a&gt;&lt;br&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%2Fox4r9at1ej9kw2m6kkgj.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%2Fox4r9at1ej9kw2m6kkgj.png" alt="jhugtft" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leave all other settings at their default values, then proceed by clicking &lt;strong&gt;Next&lt;/strong&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%2Fwao0cac9rcinmyg6pmo6.png" alt="dffgdge" width="800" height="423"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: &lt;strong&gt;Configure Service Access&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the Service Role, select &lt;strong&gt;Create role&lt;/strong&gt; if no existing role is available.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;During the role creation process, leave all configuration parameters at their default values.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proceed by clicking &lt;strong&gt;Next&lt;/strong&gt; on both the &lt;strong&gt;Select trusted entity&lt;/strong&gt; and &lt;strong&gt;Add permissions steps&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the &lt;strong&gt;Role name&lt;/strong&gt; to a unique and descriptive identifier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Complete the process by clicking &lt;strong&gt;Create role&lt;/strong&gt;. &lt;/p&gt;&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%2F7gentx2gpd5ooisckwjv.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%2F7gentx2gpd5ooisckwjv.png" alt="zfdsssfs" width="800" height="423"&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%2Fzrvvhklpnhq642cst0dy.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%2Fzrvvhklpnhq642cst0dy.png" alt="fsfwefw" width="800" height="423"&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%2Fdfn11x1ntok3sfdt8udu.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%2Fdfn11x1ntok3sfdt8udu.png" alt="Isscs" width="800" height="423"&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%2Fw83ftgguq9kgclic7lz7.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%2Fw83ftgguq9kgclic7lz7.png" alt="dfgdge" width="800" height="423"&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%2F0cclsosv48igvindhi91.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%2F0cclsosv48igvindhi91.png" alt="sfsfw" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just as the previous, For &lt;strong&gt;EC2 instance profile&lt;/strong&gt; select &lt;strong&gt;Create role&lt;/strong&gt; if no existing role is available.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;During the role creation process, leave all configuration parameters at their default values.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proceed by clicking &lt;strong&gt;Next&lt;/strong&gt; on both the &lt;strong&gt;Select trusted entity&lt;/strong&gt; and &lt;strong&gt;Add permissions steps&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the &lt;strong&gt;Role name&lt;/strong&gt; to a unique and descriptive identifier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Complete the process by clicking &lt;strong&gt;Create role&lt;/strong&gt;. &lt;/p&gt;&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%2Fdpvms37six52sgcqp2qb.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%2Fdpvms37six52sgcqp2qb.png" alt="jhgttttrd" width="800" height="423"&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%2F1f2cv9gohmt7zpu5a9qp.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%2F1f2cv9gohmt7zpu5a9qp.png" alt="ytrruyyy" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the EC2 Key Pair, locate the service using the AWS Management Console search bar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create a new key pair by providing a unique and descriptive name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leave all other configuration options at their default settings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Complete the process by selecting &lt;strong&gt;Create key pair&lt;/strong&gt;. &lt;/p&gt;&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%2F2tzek9uuawxe15qipw0q.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%2F2tzek9uuawxe15qipw0q.png" alt="gygftfyu" width="800" height="423"&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%2Fmamiwww8f8qw838yheaf.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%2Fmamiwww8f8qw838yheaf.png" alt="hgtftrty" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Next&lt;/strong&gt; on Configure service page afterwards.&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%2Fzesa99q6mfd0uat5e2rg.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%2Fzesa99q6mfd0uat5e2rg.png" alt="**Image description**" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step3&lt;/strong&gt;: &lt;strong&gt;Set up networking, database, and tags&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select the default VPC from the available options in the dropdown menu.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable &lt;strong&gt;Public IP address&lt;/strong&gt; assignment for the instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From the Instance Subnet options, select any available subnet.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Leave all remaining parameters at their default values, then click &lt;strong&gt;Next&lt;/strong&gt; to proceed.&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%2Fmp8awveg9d8ccxvs01r0.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%2Fmp8awveg9d8ccxvs01r0.png" alt="IXSLS" width="800" height="423"&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%2F0mn9stmrawbeqilhi9rc.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%2F0mn9stmrawbeqilhi9rc.png" alt="dgdge" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step4&lt;/strong&gt;: &lt;strong&gt;Configure instance traffic and scaling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select an existing &lt;strong&gt;EC2 Security Group&lt;/strong&gt; from the dropdown list.&lt;/li&gt;
&lt;li&gt;Leave all other configuration parameters at their default values, then click &lt;strong&gt;Next&lt;/strong&gt; to continue.&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%2F9wj1luuhr69hxfjerscm.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%2F9wj1luuhr69hxfjerscm.png" alt="ygtdrdrt" width="800" height="423"&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%2Fcghnxykjrysh7b6b3z2j.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%2Fcghnxykjrysh7b6b3z2j.png" alt="uhytt" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step5&lt;/strong&gt;: &lt;strong&gt;Configure updates, monitoring, and logging&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the appropriate &lt;strong&gt;CloudWatch metrics instance&lt;/strong&gt; and the corresponding &lt;strong&gt;CloudWatch metrics environment&lt;/strong&gt; from their respective fields simultaneously&lt;/li&gt;
&lt;li&gt;Leave all other configuration parameters at their default values, then click &lt;strong&gt;Next&lt;/strong&gt; to continue.&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%2Fwmla12xb54k9yoo9cg8p.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%2Fwmla12xb54k9yoo9cg8p.png" alt="hgtftgyt" width="800" height="423"&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%2F4t5njonugshebdnoczec.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%2F4t5njonugshebdnoczec.png" alt="uhyttrrt" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now review the entire steps and click &lt;strong&gt;create&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once the Environment is successfully lunched and the health status shows green and &lt;strong&gt;OK&lt;/strong&gt;. Click the URL link listed for &lt;strong&gt;Domain&lt;/strong&gt; to browse your 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%2F06l1mmc3hqd39mtt1rng.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%2F06l1mmc3hqd39mtt1rng.png" alt="DFDGES" width="800" height="423"&gt;&lt;/a&gt;&lt;br&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%2Fczaptnfjm6mrqoawhfqp.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%2Fczaptnfjm6mrqoawhfqp.png" alt="sddrgevev" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;To access the &lt;strong&gt;Elastic Beanstalk–managed EC2 instance shell&lt;/strong&gt;, navigate to &lt;strong&gt;Amazon Elastic Compute Cloud (EC2)&lt;/strong&gt; and select the relevant &lt;strong&gt;Instance ID&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From the &lt;strong&gt;Instance&lt;/strong&gt; Overview page, click &lt;strong&gt;Connect&lt;/strong&gt;, then select &lt;strong&gt;Connect&lt;/strong&gt; again to initiate an in-browser SSH session.&lt;/p&gt;&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%2Fpsa7lowtgzx12y4yy811.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%2Fpsa7lowtgzx12y4yy811.png" alt="Idfefd" width="800" height="423"&gt;&lt;/a&gt;&lt;br&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%2F8v0wpxfg5zutdzx4v720.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%2F8v0wpxfg5zutdzx4v720.png" alt="4t4fref" width="800" height="423"&gt;&lt;/a&gt;&lt;br&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%2Fygd69ju8xh7pepfy3wcn.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%2Fygd69ju8xh7pepfy3wcn.png" alt="regdgrg" width="800" height="423"&gt;&lt;/a&gt;&lt;br&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%2F315t16n8nn67iuitj1uv.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%2F315t16n8nn67iuitj1uv.png" alt="rgewge" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Amazon Elastic Beanstalk strikes a balance between simplicity and control. It abstracts infrastructure management while still allowing developers to customize and scale their applications using familiar AWS services.&lt;/p&gt;

&lt;p&gt;For teams seeking fast deployments, built-in scaling, and reduced operational overhead, Elastic Beanstalk remains a powerful and reliable choice.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloudnative</category>
      <category>devops</category>
      <category>awschallenge</category>
    </item>
    <item>
      <title>Prepare your app deployment tools and resources</title>
      <dc:creator>lotanna obianefo</dc:creator>
      <pubDate>Tue, 02 Dec 2025 02:40:32 +0000</pubDate>
      <link>https://dev.to/lotanna_obianefo/prepare-your-app-deployment-tools-and-resources-4ia6</link>
      <guid>https://dev.to/lotanna_obianefo/prepare-your-app-deployment-tools-and-resources-4ia6</guid>
      <description>&lt;p&gt;Many companies are looking for ways to simplify and modernize their DevOps processes. In some cases, their teams already run containerized applications on Azure Kubernetes Service (AKS) but aren’t fully using its advanced features, such as custom service mesh and autoscaling. To reduce complexity and improve efficiency, Azure Container Apps offers a lighter, more scalable, and cost-effective alternative.&lt;/p&gt;

&lt;p&gt;By switching to Azure Container Apps, teams can streamline how they deploy and manage containerized applications, cut down on DevOps overhead, and benefit from built-in autoscaling and scale-to-zero features to make better use of resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup the environment&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Install Docker Desktop&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open your web browser and go to the Docker Desktop installation page &lt;a href="https://docs.docker.com/desktop/install/windows-install/" rel="noopener noreferrer"&gt;https://docs.docker.com/desktop/install/windows-install/&lt;/a&gt;. &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%2Fi4472sdy4uhr1wev2218.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%2Fi4472sdy4uhr1wev2218.png" alt="f7ttfyy" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make sure your computer meets the required system specifications and follow the instructions provided on the website to complete the Docker Desktop installation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Install the .NET Software Development Kit&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open a browser window and then navigate to the .NET download page. &lt;a href="https://dotnet.microsoft.com/download" rel="noopener noreferrer"&gt;https://dotnet.microsoft.com/download&lt;/a&gt;.&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%2Fpvn1m83yf58a1j5qduit.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%2Fpvn1m83yf58a1j5qduit.png" alt="Ibvgft6" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;select the latest Long-Term Support (LTS) version, Double-click the installation file to begin the installation process. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the .NET SDK Installer window, select &lt;strong&gt;Install&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Install Visual Studio Code with Docker and Azure App Service extensions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open a browser window and then navigate to: &lt;a href="https://code.visualstudio.com" rel="noopener noreferrer"&gt;https://code.visualstudio.com&lt;/a&gt;.
In the browser window, select Download for Windows or Mac.&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%2Fofu1rl03o1cb6xdtihsg.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%2Fofu1rl03o1cb6xdtihsg.png" alt="hygy88" width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Download page for Visual Studio Code automatically detects your operating system. It displays the version to download for your operating system, such as Linux, macOS, or Windows&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wait for the installer file to finish downloading, and then use a file explorer application to navigate to your computer’s downloads folder.&lt;/li&gt;
&lt;li&gt;In your file explorer application, select and run the Visual Studio Code installer file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;You can install Visual Studio Code using either the User Installer or System Installer. The User Installer installs Visual Studio Code just for the current user, while the System Installer installs Visual Studio Code for all users. The User Installer is the recommended option for most users&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;I accept the license agreement&lt;/strong&gt;, and then continue following the online instructions to complete the installation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Accept the default options during the remainder of the installation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure that you have Visual Studio Code open.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Activity bar, select &lt;strong&gt;Extensions&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Search Extensions in Marketplace textbox, enter &lt;strong&gt;C#&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Entering "C#" filters the list of extensions to show only the extensions that have something to do with C# coding.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In the filtered list of available extensions, select the extension labeled "&lt;strong&gt;C# Dev Kit&lt;/strong&gt; - Official C# extension from Microsoft" that's published by Microsoft.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To install the extension, select &lt;strong&gt;Install&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wait for the installation to complete.&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%2Ftzc3aqj8nuytt68zasgp.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%2Ftzc3aqj8nuytt68zasgp.png" alt="gf6t6y8y8u" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the &lt;strong&gt;EXTENSIONS&lt;/strong&gt; view, replace C# with &lt;strong&gt;docker&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the filtered list of available extensions, select the extension labeled Docker that's published by Microsoft.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To install the extension, select &lt;strong&gt;Install&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wait for the installation to complete.&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%2F4fk2brqqkxzeavyylaxy.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%2F4fk2brqqkxzeavyylaxy.png" alt="ci7t6t77" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the &lt;strong&gt;EXTENSIONS&lt;/strong&gt; view, replace docker with &lt;strong&gt;azure app service&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the filtered list of available extensions, select the extension labeled Azure App Service that's published by Microsoft.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To install the extension, select &lt;strong&gt;Install&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wait for the installation to complete.&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%2F5rcopul6mgf0go2rz0zs.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%2F5rcopul6mgf0go2rz0zs.png" alt="ytr6fytiiy" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Close Visual Studio Code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install Azure CLI and the containerapp extension&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Complete the following steps install Azure CLI and the containerapp extension.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open a browser window, and then navigate to: /cli/azure/install-azure-cli.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the browser window, follow the instructions for installing/updating Azure CLI for your computer's operating system.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;The current version of the Azure CLI is 2.65.0. For information about the latest release, see the release notes. To find your installed version and see if you need to update, run az version. You can run az upgrade to install the latest version&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open a command line or terminal application, such as Windows Command Prompt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sign in to Azure using the az login command.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Follow the prompts to complete the authentication process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install the Azure Container Apps extension using the &lt;strong&gt;az extension add --name containerapp --upgrade command&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Install Microsoft PowerShell&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Complete the following steps to install Microsoft PowerShell.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open a browser window, and then navigate to: /powershell/scripting/install/installing-powershell.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the browser window, follow the instructions for installing/updating PowerShell for your computer's operating system.&lt;/p&gt;&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%2F3c7w2mvn34ze5ppqfsj9.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%2F3c7w2mvn34ze5ppqfsj9.png" alt="uyg6tfr" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure a Resource Group for your Azure resources&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Complete the following steps to configure a resource group for your Azure resources.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open a browser window, and then navigate to the Azure portal: &lt;a href="https://portal.azure.com/" rel="noopener noreferrer"&gt;https://portal.azure.com/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure that your Azure account has permission to create resources and assign RBAC permissions. Check the RBAC role(s) assigned to your account before you continue.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Contributor role isn't able to assign Azure RBAC permissions. We recommend using an account that has been assigned the Owner, Azure account administrator, or Azure co-administrator role for your Azure subscription.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the top search bar of the Azure portal, in the Search textbox, enter &lt;strong&gt;resource group&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the search results, select Resource groups, and then select &lt;strong&gt;+ Create&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Basics tab, configure the resource group as follows:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subscription: Specify the Azure subscription that you're using&lt;/p&gt;

&lt;p&gt;Resource group: Enter &lt;strong&gt;RG1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Region: Select &lt;strong&gt;Central US&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Select &lt;strong&gt;Review + create&lt;/strong&gt;.&lt;br&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%2F286e8pomtmgilp9zwxcs.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%2F286e8pomtmgilp9zwxcs.png" alt="J98UH" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
Once validation has passed, select &lt;strong&gt;Create&lt;/strong&gt;.&lt;br&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%2Fke3kgn0upne811bhi7qy.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%2Fke3kgn0upne811bhi7qy.png" alt="n8u877" width="800" height="403"&gt;&lt;/a&gt;&lt;br&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%2Fuv3nfti7kyd9y8m7d4cm.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%2Fuv3nfti7kyd9y8m7d4cm.png" alt="pliu8hh" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure a Virtual Network and subnets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Complete the following steps to configure a Virtual Network and subnets.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ensure that you have your Azure portal open in a browser window.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the top search bar of the Azure portal, in the Search textbox, enter &lt;strong&gt;virtual network&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the search results, select &lt;strong&gt;Virtual networks&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Create virtual network&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the Basics tab, configure your virtual network as follows:&lt;/p&gt;

&lt;p&gt;Subscription: Specify the Azure subscription that you're using&lt;br&gt;
Resource group name: Select &lt;strong&gt;RG1&lt;/strong&gt;&lt;br&gt;
Virtual network name: Enter &lt;strong&gt;VNET1&lt;/strong&gt;&lt;br&gt;
Region: Ensure that &lt;strong&gt;Central US&lt;/strong&gt; is selected.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the IP addresses tab.
&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%2Fgvl8nt198gj3eccgrnf5.png" alt="JT6ftttgg" width="800" height="442"&gt;
&lt;/li&gt;
&lt;li&gt;On the IP addresses tab, under Subnets, select &lt;strong&gt;default&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the Edit subnet page, configure the subnet as follows:&lt;/p&gt;

&lt;p&gt;Name: Enter &lt;strong&gt;PESubnet&lt;/strong&gt;&lt;br&gt;
Starting address: Ensure that &lt;strong&gt;10.0.0.0&lt;/strong&gt; is specified.&lt;br&gt;
Subnet size: Ensure that &lt;strong&gt;/24 (256 addresses)&lt;/strong&gt; is specified.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Save&lt;/strong&gt;.&lt;br&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%2Fttrs7q1zoxxemzntz1yp.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%2Fttrs7q1zoxxemzntz1yp.png" alt="uy7ff5f" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the IP addresses tab, select &lt;strong&gt;+ Add&lt;/strong&gt; a subnet.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the Add a subnet page, configure the subnet as follows:&lt;/p&gt;

&lt;p&gt;Name: Enter &lt;strong&gt;ACASubnet&lt;/strong&gt;&lt;br&gt;
Starting address: Ensure that &lt;strong&gt;10.0.4.0&lt;/strong&gt; is specified.&lt;br&gt;
Subnet size: Ensure that &lt;strong&gt;/23 (512 addresses)&lt;/strong&gt; is specified.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;Add&lt;/strong&gt;.&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%2Fai1t685taommecrk3o22.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%2Fai1t685taommecrk3o22.png" alt="6fr65ftrf" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;Review + create&lt;/strong&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%2Fqehft54nexi1inl160u5.png" alt="ygygtcc" width="800" height="400"&gt;
&lt;/li&gt;
&lt;li&gt;Once validation has passed, select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wait for the deployment to complete.&lt;br&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%2Ftgps273hzncbwhdg4ro9.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%2Ftgps273hzncbwhdg4ro9.png" alt="fgugyugig" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure Service Bus&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Complete the following steps to configure a Service Bus instance.&lt;/p&gt;

&lt;p&gt;Ensure that you have your Azure portal open in a browser window.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the top search bar of the Azure portal, in the Search textbox, enter service bus&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the search results, select &lt;strong&gt;Service Bus&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Create service bus namespace.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Basics tab, configure your Service bus namespace as follows:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subscription: Ensure that the Azure subscription is selected.&lt;br&gt;
Resource group name: Select &lt;strong&gt;RG1&lt;/strong&gt;&lt;br&gt;
Namespace name: Enter &lt;strong&gt;sb-az2003-LT&lt;/strong&gt;.&lt;br&gt;
Location: Ensure that &lt;strong&gt;Central US&lt;/strong&gt; is selected.&lt;br&gt;
Pricing tier: Select &lt;strong&gt;Basic&lt;/strong&gt;.&lt;br&gt;
Select &lt;strong&gt;Review + create&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once the Validation succeeded message appears, select &lt;strong&gt;Create&lt;/strong&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%2Fb6d6k6g157kfzrnc0cle.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%2Fb6d6k6g157kfzrnc0cle.png" alt="IDFRE" width="800" height="358"&gt;&lt;/a&gt;&lt;br&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%2Frxpcguub7sbcmrk6bvmv.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%2Frxpcguub7sbcmrk6bvmv.png" alt="eftc5c" width="800" height="398"&gt;&lt;/a&gt;&lt;br&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%2Ftukrrquq53maariioijs.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%2Ftukrrquq53maariioijs.png" alt="dht7u7" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait for the deployment to complete.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure Azure Container Registry&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Complete the following steps to configure a Container Registry instance.&lt;/p&gt;

&lt;p&gt;Ensure that you have your Azure portal open in a browser window.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the top search bar of the Azure portal, in the Search textbox, enter container registry&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the search results, select &lt;strong&gt;Container registries&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Container registries page, select &lt;strong&gt;Create container registry or + Create&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Basics tab of the Create container registry page, specify the following information:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subscription: Ensure that the Azure subscription is selected.&lt;br&gt;
Resource group: Select &lt;strong&gt;RG1&lt;/strong&gt;.&lt;br&gt;
Registry name: Enter &lt;strong&gt;acraz2003LT2025&lt;/strong&gt; &lt;br&gt;
Location: Ensure that &lt;strong&gt;Central US&lt;/strong&gt; is selected.&lt;br&gt;
SKU: Select &lt;strong&gt;Premium&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The name of your Registry must be unique. Also, the Premium tier is required for private link with private endpoints&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select Review + create.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Create.&lt;/p&gt;&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%2Fjqrvkzvddwher8k5t53d.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%2Fjqrvkzvddwher8k5t53d.png" alt="YTYUTT" width="800" height="398"&gt;&lt;/a&gt;&lt;br&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%2Fgpc9yyv0ohht5cf3ynxu.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%2Fgpc9yyv0ohht5cf3ynxu.png" alt="5656ytf7" width="800" height="397"&gt;&lt;/a&gt;&lt;br&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%2F1nalbemu3n2a8kvs0dga.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%2F1nalbemu3n2a8kvs0dga.png" alt="tyrr6766gff" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;After the deployment has completed, open the deployed resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the left-side menu, under Settings, select &lt;strong&gt;Networking&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Networking page, on the &lt;strong&gt;Public access&lt;/strong&gt; tab, ensure that &lt;strong&gt;All networks&lt;/strong&gt; is selected.&lt;/p&gt;&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%2Fiv3j2gwp1wddiek47pa6.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%2Fiv3j2gwp1wddiek47pa6.png" alt="yt66ff" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the left-side menu, under Settings, select &lt;strong&gt;Properties&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Properties page, select &lt;strong&gt;Admin user&lt;/strong&gt;, and then select &lt;strong&gt;Save&lt;/strong&gt;&lt;/p&gt;&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%2Fduxcd2vld6jq649ra7ot.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%2Fduxcd2vld6jq649ra7ot.png" alt="f5rrrf" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a WebAPI app and publish to a GitHub repository&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Complete the following steps to create a WebAPI app and publish to a GitHub repository.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open Visual Studio Code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the File menu, select &lt;strong&gt;Open Folder&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new folder named &lt;strong&gt;AZ2003&lt;/strong&gt; in a location that is easy to find.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, create a folder named AZ2003 on the Windows Desktop.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the Terminal menu, select &lt;strong&gt;New Terminal&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the terminal command prompt, to create a new ASP.NET Web API project, enter the following command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       dotnet new webapi --no-https
&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%2Fiwe0jpo8hwirxo6g9pfj.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%2Fiwe0jpo8hwirxo6g9pfj.png" alt="hgygyuhjg" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the terminal command prompt, run the following dotnet CLI command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      dotnet build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;On the View menu, select Command Palette, and then run the following command: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;     .NET: Generate Assets for Build and Debug.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;If the command generates an error message, select &lt;strong&gt;OK&lt;/strong&gt;, and then run the command again&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In the root project folder, create a &lt;strong&gt;.gitignore&lt;/strong&gt; file that contains the following information:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  [Bb]in/
  [Oo]bj/
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the File menu, select &lt;strong&gt;Save All&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open the Source Control view.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Publish to GitHub&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If prompted, to enable the GitHub extension to sign in using GitHub, select Allow, and then provide authorization in GitHub.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Visual Studio Code, select &lt;strong&gt;Publish to GitHub public repository&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure that the bin and obj folders are not included in the repository.&lt;/p&gt;&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%2Fr7rusa8bh3hc916tsm1r.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%2Fr7rusa8bh3hc916tsm1r.png" alt="66t6ggg" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create Docker image and push to Azure Container Registry&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Complete the following steps to create a Docker image and push the image to your Azure Container Registry.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ensure that you have your AZ2003 code project open in Visual Studio Code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To create a Dockerfile, run the following command in the Command Palette: &lt;strong&gt;Docker: Add Docker Files to Workspace&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When prompted, specify the following information:&lt;/p&gt;

&lt;p&gt;Application Platform: &lt;strong&gt;.NET ASP.NET Core&lt;/strong&gt;.&lt;br&gt;
Operating System: &lt;strong&gt;Linux&lt;/strong&gt;.&lt;br&gt;
Ports: &lt;strong&gt;5000&lt;/strong&gt;.&lt;br&gt;
Docker Compose files: &lt;strong&gt;No&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At a terminal command prompt, run the following docker CLI command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      docker build --tag aspnetcorecontainer:latest .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;The syntax for the build command is: &lt;strong&gt;docker build --tag image name:image tag .&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This command builds a container image that is hosted by Docker and accessible using the Docker extension for VS Code&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Wait for the Docker Build command to complete.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the Visual Studio Code Command Palette, and then run the following command: &lt;strong&gt;Docker Images: Push&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the command runs, enter the following information:&lt;/p&gt;

&lt;p&gt;Select the docker image name that you created: &lt;strong&gt;aspnetcorecontainer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Select the image tag that you created: &lt;strong&gt;latest&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you see a message stating that no registry is connected, select &lt;strong&gt;Connect Registry&lt;/strong&gt;, and then enter the following information:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Registry provider: Select &lt;strong&gt;Azure&lt;/strong&gt;. Follow the online instructions to verify your Azure account if needed.&lt;/p&gt;

&lt;p&gt;Azure subscription: Select the Azure Subscription for this project.&lt;/p&gt;

&lt;p&gt;Select your Azure Container Registry resource: &lt;strong&gt;acraz2003LT25oct&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An image tag is generated: &lt;strong&gt;acraz2003LT12oct.azurecr.io/aspnetcorecontainer:latest&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To push the image to your Container Registry, press &lt;strong&gt;Enter&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The following Docker command is executed:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      docker image push acraz2003cah12oct.azurecr.io/aspnetcorecontainer:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wait for the image to be pushed to your Azure Container Registry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open the Source Control view and then &lt;strong&gt;Commit&lt;/strong&gt; and Sync your file updates.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Configure Azure DevOps and a starter Pipeline&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Complete the following steps to configure Azure DevOps and a starter Pipeline:&lt;/p&gt;

&lt;p&gt;Open the Azure portal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the top search bar, in the Search textbox, enter &lt;strong&gt;devops&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the search results, select &lt;strong&gt;Azure DevOps organizations&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;My Azure DevOps Organizations&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the home page of your organization, in the lower-left corner of the page, select &lt;strong&gt;Organization settings&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the left side menu under Security, select &lt;strong&gt;Policies&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure that the &lt;strong&gt;Allow public projects policy&lt;/strong&gt; is set to &lt;strong&gt;On&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Return to the home page of your organization.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To create a new project, select &lt;strong&gt;New project&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you created a new organization, you may see the Create a project to get started page.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the Create new project page, specify the following information:&lt;/p&gt;

&lt;p&gt;Project name: &lt;strong&gt;Project1&lt;/strong&gt;&lt;br&gt;
Description: &lt;strong&gt;AZ-2003 project&lt;/strong&gt;&lt;br&gt;
Visibility: &lt;strong&gt;Public&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the Create new project page, select &lt;strong&gt;Create project&lt;/strong&gt;.&lt;br&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%2Ffqicnkdc49hv621t9hns.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%2Ffqicnkdc49hv621t9hns.png" alt="yt76rttt" width="800" height="400"&gt;&lt;/a&gt;&lt;br&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%2F1euolz0jwhv1051k3sus.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%2F1euolz0jwhv1051k3sus.png" alt="iuyur5gygt" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the left-side menu, select &lt;strong&gt;Repos&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under Import a repository, select &lt;strong&gt;Import&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Import a Git repository page, enter the &lt;strong&gt;URL&lt;/strong&gt; for the GitHub repository you created for your code project, and then select &lt;strong&gt;Import&lt;/strong&gt;.&lt;/p&gt;&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%2Fpv4z8duj5pzb5gw75091.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%2Fpv4z8duj5pzb5gw75091.png" alt="hgftyr655" width="800" height="425"&gt;&lt;/a&gt;&lt;br&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%2Fuaq6o4hzza7pabtrui8y.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%2Fuaq6o4hzza7pabtrui8y.png" alt="hgft665" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your repository URL should be similar to the following example:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/your-account/AZ2003" rel="noopener noreferrer"&gt;https://github.com/your-account/AZ2003&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the left-side menu, select &lt;strong&gt;Pipelines&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Create Pipeline&lt;/strong&gt;.&lt;br&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%2F33cgukr3fk4y6h7rke48.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%2F33cgukr3fk4y6h7rke48.png" alt="hgy77tyy" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Azure Repos Git&lt;/strong&gt;.&lt;br&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%2Fkdcdynoy8subyua6qceb.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%2Fkdcdynoy8subyua6qceb.png" alt="nyuijkj" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Select a repository page, select &lt;strong&gt;Project1&lt;/strong&gt;.&lt;br&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%2Fkfchebmsii7urhvrhiu0.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%2Fkfchebmsii7urhvrhiu0.png" alt="brhrhrt" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Starter pipeline&lt;/strong&gt;.&lt;br&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%2Fvwyp42yxmo0yrvswcycu.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%2Fvwyp42yxmo0yrvswcycu.png" alt="fnhurhb" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under Save and Run, select &lt;strong&gt;Save&lt;/strong&gt;, and then select &lt;strong&gt;Save&lt;/strong&gt;.&lt;br&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%2F44cv9dl4qhm8serr6ali.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%2F44cv9dl4qhm8serr6ali.png" alt="Idferg" width="800" height="422"&gt;&lt;/a&gt;&lt;br&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%2Fmvflnsfis7ehlnqbl50v.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%2Fmvflnsfis7ehlnqbl50v.png" alt="fgrye" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To rename the pipeline to Pipeline1, complete the following steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the left-side menu, select &lt;strong&gt;Pipelines&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To the right of the Project1 pipeline, select &lt;strong&gt;More options&lt;/strong&gt;, and then select &lt;strong&gt;Rename/move&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Rename/move pipeline dialog, under Name, enter &lt;strong&gt;Pipeline1&lt;/strong&gt; and then select &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;&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%2Fsmvnbsqzb3phfgqp64gf.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%2Fsmvnbsqzb3phfgqp64gf.png" alt="fg56yry" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Don't run the pipeline now. You will configure this pipeline during the project exercise&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploy a self-hosted Windows agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For an Azure Pipeline to build and deploy Windows, Azure, and other Visual Studio solutions you need at least one Windows agent in the host environment.&lt;/p&gt;

&lt;p&gt;Complete the following steps to deploy a self-hosted Windows agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ensure that you're signed-in to Azure DevOps with the user account you're using for your Azure DevOps organization.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From the home page of your organization, open your user settings, and then select &lt;strong&gt;Personal access tokens&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To create a personal access token, select &lt;strong&gt;+ New Token&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under Name, enter &lt;strong&gt;AZ2003&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At the bottom of the Create a new personal access token window, to see the complete list of scopes, select &lt;strong&gt;Show all scopes&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For the custom designed scope, select &lt;strong&gt;Agent Pools (Read &amp;amp; manage)&lt;/strong&gt; and &lt;strong&gt;Deployment Groups (Read &amp;amp; manage)&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure that all the other boxes are cleared.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;&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%2Fyr5iyenv8nl6mdozsg9n.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%2Fyr5iyenv8nl6mdozsg9n.png" alt="4rfefd" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the Success page, to copy the token, select Copy to clipboard.&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%2Fv1z5b3eo12hm866prfh2.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%2Fv1z5b3eo12hm866prfh2.png" alt="Ibnytjrnt" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You will use this token when you configure the agent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure that you're signed into Azure DevOps as the Azure DevOps organization owner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select your DevOps organization, and then select &lt;strong&gt;Organization settings&lt;/strong&gt;.&lt;br&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%2Fhw6bj04qscbdl3a3dw22.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%2Fhw6bj04qscbdl3a3dw22.png" alt="rrer4" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the left side menu under Pipelines, select &lt;strong&gt;Agent pools&lt;/strong&gt;.&lt;br&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%2Fin5suwroecobwwqjvdsq.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%2Fin5suwroecobwwqjvdsq.png" alt="r6eytrtr" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the &lt;strong&gt;Get the agent&lt;/strong&gt; dialog box opens, skip to the next step.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a list of Agent pools is displayed, complete the following steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To select the default pool, select &lt;strong&gt;Default&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;If the Default pool doesn't exist, select Add pool, and then enter the following information&lt;/em&gt;:&lt;br&gt;
&lt;em&gt;Under Pool type, select &lt;strong&gt;Self-hosted&lt;/strong&gt;&lt;/em&gt;.&lt;br&gt;
&lt;em&gt;Under Name, enter &lt;strong&gt;default&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Select &lt;strong&gt;Create&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To open the pool that you just created, select &lt;strong&gt;default&lt;/strong&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%2Fqlnyow83y3q3ciljl9we.png" alt="fdgtrthrt" width="800" height="424"&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Agents&lt;/strong&gt;, and then select &lt;strong&gt;New agent&lt;/strong&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%2F2yr1jijtrba47wyr8oke.png" alt="tryhdh" width="800" height="426"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the Get the agent dialog box, complete the following steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select the &lt;strong&gt;Windows&lt;/strong&gt; tab.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the left pane, select the processor architecture of the installed Windows OS version on your machine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The x64 agent version is intended for 64-bit Windows, whereas the x86 version is intended for 32-bit Windows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the right pane, select &lt;strong&gt;Download&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Follow the instructions to download the agent.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use File Explorer to create the following folder location for the agent:&lt;br&gt;
               C:\agents&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Unpack the agent zip file into the directory you created.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open PowerShell as an Administrator.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navigate to the "C:\agents" directory, and then enter the following PowerShell command:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       .\config
&lt;/code&gt;&lt;/pre&gt;
&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%2F0hmcn67py409x3q3yex3.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%2F0hmcn67py409x3q3yex3.png" alt="dtgtg" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Respond to the configuration prompts as follows:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enter server URL: enter the URL for your &lt;strong&gt;DevOps organization&lt;/strong&gt;. Enter authentication type (press enter for PAT) &amp;gt;: press &lt;strong&gt;Enter&lt;/strong&gt;.&lt;br&gt;
Enter personal access token &amp;gt;: Paste-in the &lt;strong&gt;personal access token&lt;/strong&gt; that you copied to the clipboard earlier.&lt;br&gt;
Enter agent pool (press enter for default): press &lt;strong&gt;Enter&lt;/strong&gt;.&lt;br&gt;
Enter agent name (press enter for YOUR-PC-NAME), enter az2003-agent&lt;br&gt;
Enter work folder (press enter for _work) &amp;gt;: press &lt;strong&gt;Enter&lt;/strong&gt;.&lt;br&gt;
Enter run agent as service? (Y/N) (press enter for N) &amp;gt;: enter &lt;strong&gt;Y&lt;/strong&gt;&lt;br&gt;
Enter enable SERVICE_SID_TYPE_UNRESTRICTED for agent service (Y/N) (press enter for N) &amp;gt;: enter &lt;strong&gt;Y&lt;/strong&gt;&lt;br&gt;
Enter User account to use for the service (press enter for NT AUTHORITY\NETWORK SERVICE) &amp;gt;: press &lt;strong&gt;Enter&lt;/strong&gt;.&lt;br&gt;
Enter whether to prevent service starting immediately after configuration is finished? (Y/N) (press enter for N) &amp;gt;: press &lt;strong&gt;Enter&lt;/strong&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%2Fibhlsl8c4bqqrmfgjzei.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%2Fibhlsl8c4bqqrmfgjzei.png" alt="ghtdfbfd" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A message informing you that the agent started successfully is displayed.&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%2Fnpxx1v287kiqpxkb172c.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%2Fnpxx1v287kiqpxkb172c.png" alt="jjnknkuu" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you're now ready to begin your project.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>azure</category>
      <category>cloudnative</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Manage revisions in Azure Container Apps</title>
      <dc:creator>lotanna obianefo</dc:creator>
      <pubDate>Mon, 01 Dec 2025 02:04:26 +0000</pubDate>
      <link>https://dev.to/lotanna_obianefo/manage-revisions-in-azure-container-apps-5938</link>
      <guid>https://dev.to/lotanna_obianefo/manage-revisions-in-azure-container-apps-5938</guid>
      <description>&lt;p&gt;Azure Container Apps includes a built-in revision management system that allows you to track, control, and roll back application updates with ease. Each time you deploy new code or update configuration settings, Azure Container Apps automatically generates a new immutable revision. These revisions enable precise traffic management, safe deployments, blue-green or canary release strategies, and quick rollback in case of failures. By leveraging revision modes, traffic-splitting, and version history, teams can maintain application stability while continuously delivering updates in a controlled and observable manner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set revision management to multiple&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the Azure portal, open your container app resource.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the left side menu, under Application, select &lt;strong&gt;Revisions and replicas&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At the top of the Revisions and replicas page, select &lt;strong&gt;Choose revision mode&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To switch from single to &lt;strong&gt;multi-revision&lt;/strong&gt; mode, select &lt;strong&gt;Confirm&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Revisions and replicas page, wait for the Revision Mode setting to update.&lt;/p&gt;&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%2Fc89dy814fn2e22o1m4r3.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%2Fc89dy814fn2e22o1m4r3.png" alt="gftdrttd" width="800" height="390"&gt;&lt;/a&gt;&lt;br&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%2Fbg29tcmhygm6duws21y7.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%2Fbg29tcmhygm6duws21y7.png" alt="tf5rydrdc" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Revision Mode will be set to Multiple after the update. Also, on the left-side menu, the section title changes from Application to Revisions&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a new revision with a v2 suffix&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the Azure portal, ensure that you have the Revisions and replicas page of your container app resource open.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At the top of the page, select &lt;strong&gt;+ Create new revision&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the Create and deploy new revision page, complete the following steps:&lt;/p&gt;

&lt;p&gt;Name / suffix: Enter &lt;strong&gt;v2&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Under Container image, select your container image. &lt;strong&gt;aca-az2003&lt;/strong&gt;.
Select &lt;strong&gt;Create&lt;/strong&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%2Fhwveaiyt1p53rbmrj4dh.png" alt="x5etfytt" width="800" height="397"&gt;
Wait for the deployment to be completed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Configure labels on the revisions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the left-side menu, under Settings, select &lt;strong&gt;Ingress&lt;/strong&gt;.&lt;br&gt;
If Ingress isn't enabled, select &lt;strong&gt;Enabled&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Ingress page, specify the following information:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ingress traffic: &lt;strong&gt;select Accepting traffic from anywhere&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ingress type: select &lt;strong&gt;HTTP&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Client certificate mode: ensure that &lt;strong&gt;Ignore&lt;/strong&gt; is selected.&lt;/p&gt;

&lt;p&gt;Transport: ensure that &lt;strong&gt;Auto&lt;/strong&gt; is selected.&lt;/p&gt;

&lt;p&gt;Insecure connections: ensure that &lt;strong&gt;Allowed&lt;/strong&gt; is NOT checked.&lt;/p&gt;

&lt;p&gt;Target port: enter &lt;strong&gt;5000&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IP Security Restrictions Mode: ensure that &lt;strong&gt;Allow all traffic&lt;/strong&gt; is selected.&lt;/p&gt;

&lt;p&gt;At the bottom of the Ingress page, select &lt;strong&gt;Save&lt;/strong&gt;, and then wait for the update to complete.&lt;br&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%2Fkbzfpnrs8wg2gcsc1cg5.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%2Fkbzfpnrs8wg2gcsc1cg5.png" alt="7y76t6trr" width="800" height="360"&gt;&lt;/a&gt;&lt;br&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%2Foshuw8dqmttfk5itq166.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%2Foshuw8dqmttfk5itq166.png" alt="ygress" width="800" height="241"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the left-side menu, under Revisions, select &lt;strong&gt;Revisions and replicas&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For the v2 revision, under Label, enter &lt;strong&gt;updated&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For the other revision, enter &lt;strong&gt;current&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the top of the page, select &lt;strong&gt;Save&lt;/strong&gt;.&lt;br&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%2Fvsd2lwp7elh4kri5qwam.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%2Fvsd2lwp7elh4kri5qwam.png" alt="guyftfyuyg" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure a traffic percentage on the revisions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ensure that you have the Revisions and replicas page open.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;For the v2 revision, under Traffic, enter &lt;strong&gt;25&lt;/strong&gt; as the percentage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For the other revision, under Traffic, enter &lt;strong&gt;75&lt;/strong&gt; as the percentage.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the top of the page, select &lt;strong&gt;Save&lt;/strong&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%2Fsry5e0ibb2464uyj4gh5.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%2Fsry5e0ibb2464uyj4gh5.png" alt="Iijugt6t" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify your work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ensure that you have your Container App open in the Azure portal.&lt;/p&gt;

&lt;p&gt;On the left-side menu, under Application, select &lt;strong&gt;Revisions and replicas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Verify that your revisions are configured as follows:&lt;br&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%2F69lyym9i6hsk23oyw7zm.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%2F69lyym9i6hsk23oyw7zm.png" alt="jhhjgytfryuyt" width="800" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Azure Container Apps uses a revision-based deployment model that creates a new immutable revision each time you update a container app’s configuration or container image. This enables safe, controlled rollouts without disrupting existing traffic. Revisions can be activated, deactivated, or rolled back as needed, allowing teams to test new versions, split traffic for gradual releases, and maintain high availability.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>azure</category>
      <category>cloud</category>
      <category>cloudnative</category>
    </item>
    <item>
      <title>Configure continuous integration by using Azure Pipelines</title>
      <dc:creator>lotanna obianefo</dc:creator>
      <pubDate>Thu, 27 Nov 2025 22:38:51 +0000</pubDate>
      <link>https://dev.to/lotanna_obianefo/configure-continuous-integration-by-using-azure-pipelines-16i2</link>
      <guid>https://dev.to/lotanna_obianefo/configure-continuous-integration-by-using-azure-pipelines-16i2</guid>
      <description>&lt;p&gt;Continuous Integration (CI) enables development teams to automatically build, test, and validate application changes whenever code is committed to a repository. In Azure environments, Azure Pipelines provides a robust CI service that integrates seamlessly with platforms like GitHub and Azure Repos. By configuring CI with Azure Pipelines, teams can automate the process of building container images, run tests, and securely pushing updated images to Azure Container Registry (ACR). This automated workflow ensures consistent deployments, reduces manual errors, and supports a scalable DevOps lifecycle for applications running on Azure Container Apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure Pipeline1 to use the self-hosted agent pool&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open a browser window, navigate to &lt;a href="https://dev.azure.com" rel="noopener noreferrer"&gt;https://dev.azure.com&lt;/a&gt;, and then open your Azure DevOps organization.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On your Azure DevOps page, to open your DevOps project, select Project1.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the left-side menu, select Pipelines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Pipeline1&lt;/strong&gt;, and then select &lt;strong&gt;Edit&lt;/strong&gt;.&lt;br&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%2Fdfntz6rpryd4s2e1pth5.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%2Fdfntz6rpryd4s2e1pth5.png" alt="6ftrd6uyu" width="800" height="426"&gt;&lt;/a&gt;&lt;br&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%2Fhpltu5xzpr7o2qvlgvo9.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%2Fhpltu5xzpr7o2qvlgvo9.png" alt="7ttfrd" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To use the self-hosted agent pool, update the azure-pipelines.yml file as shown in the following example:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;           trigger:
            - main

           pool:
           name: default

           steps:
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Recall that the &lt;strong&gt;pool&lt;/strong&gt; section specifies the agent pool to use for the pipeline. The &lt;strong&gt;name&lt;/strong&gt; property specifies the name of the agent pool. In this case, the name is &lt;strong&gt;default&lt;/strong&gt;, which is the pool you configured as a self-hosted agent pool&lt;/em&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%2Fmry286vvryncnufo4189.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%2Fmry286vvryncnufo4189.png" alt="fytkfyt66" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Under Validate and save, select Save without validating.&lt;/li&gt;
&lt;li&gt;Enter a commit message, and then select Save.
&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%2Fw2m51fg1e8yolepbcqd8.png" alt="I87uhgyt" width="800" height="421"&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%2Fp5bjq8yg5cblscx38q21.png" alt="ht6dxzd" width="800" height="424"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Configure Pipeline1 with an Azure Container Apps deployment task&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ensure that you have Pipeline1 open for editing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the right side under Tasks, in the Search tasks field, enter &lt;strong&gt;azure container&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In the filtered list of tasks, select &lt;strong&gt;Azure Container Apps Deploy&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Under Azure Resource Manager connection, select the Subscription you're using, and then select &lt;strong&gt;Authorize&lt;/strong&gt;.&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%2Fwk9lkcfsta6b90uunrl6.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%2Fwk9lkcfsta6b90uunrl6.png" alt="87tfdrt" width="800" height="422"&gt;&lt;/a&gt;&lt;br&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%2Foqiebrsmon7qaw95yl3g.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%2Foqiebrsmon7qaw95yl3g.png" alt="87trdtryy" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the Azure portal tab, open your Container App resource, and then open the Containers page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use the information on the Containers page to configure the following Pipeline1 Task information:&lt;/p&gt;

&lt;p&gt;Docker Image to Deploy: &lt;strong&gt;Registry/Image:Image tag&lt;/strong&gt;&lt;br&gt;
Azure Container App name: &lt;strong&gt;Name&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure the following &lt;strong&gt;Pipeline1&lt;/strong&gt; Task information:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Azure Resource group name: &lt;strong&gt;RG1&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the Azure Container Apps Deploy page, select &lt;strong&gt;Add&lt;/strong&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%2Ftgj20p1f9j6n3qvim2yp.png" alt="76ttr" width="800" height="424"&gt;
&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%2Fnk65senxrbgjnk6f8wje.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%2Fnk65senxrbgjnk6f8wje.png" alt="uyt76rrrrr" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Yaml file for your pipeline should now include the AzureContainerApps tasks as follows:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 trigger:
                   - main
                 pool:
                   name: default
                 steps:
                   - task: AzureContainerApps@1
                     inputs:
                       azureSubscription: '&amp;lt;Subscription&amp;gt;(&amp;lt;Subscription ID&amp;gt;)'
                       imageToDeploy: '&amp;lt;Registry&amp;gt;/&amp;lt;Image&amp;gt;:&amp;lt;Image tag&amp;gt;' from Container App resource
                       containerAppName: '&amp;lt;Name&amp;gt;' from Container App resource 
                       resourceGroup: '&amp;lt;resource group name&amp;gt;'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Select &lt;strong&gt;Validate and save&lt;/strong&gt;, and then select &lt;strong&gt;Save&lt;/strong&gt; again to commit directly to the main branch.&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%2Fowweq62jvi24tp4zbz4j.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%2Fowweq62jvi24tp4zbz4j.png" alt="rtcewwd" width="800" height="422"&gt;&lt;/a&gt;&lt;br&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%2Fyldg0k6nqp8723hjs0du.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%2Fyldg0k6nqp8723hjs0du.png" alt="4ctbeub" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You most likely have an indentation error. Review and correct the indentation to resolve the issue&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The contents of the YAML file must be formatted correctly, including indentation. If you encounter an error, review the YAML file and correct any indentation issues&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Navigate back to the main page of your pipeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run the Pipeline1 deployment task&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ensure that you have Pipeline1 open in Azure DevOps.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the Runs tab of the Pipeline1 page, select Run pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A Run pipeline page opens to display the associated job.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Run&lt;/strong&gt;.&lt;br&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%2Fhdzu086le7e6gb9s34v5.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%2Fhdzu086le7e6gb9s34v5.png" alt="6tderdtrr" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;The Jobs section displays job status, which progresses from Queued to Waiting&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;It can take a couple minutes for the status to transition from Queued to Waiting&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If a 'Permission needed' message is displayed ("This pipeline needs permission to access 2 resources before this run can continue"), select &lt;strong&gt;View&lt;/strong&gt; and then provide the required permissions.&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%2F3673mmcjkwbugvuelpij.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%2F3673mmcjkwbugvuelpij.png" alt="6frdrtfft" width="800" height="426"&gt;&lt;/a&gt;&lt;br&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%2Fq3n3cw8ez1i7g6iptose.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%2Fq3n3cw8ez1i7g6iptose.png" alt="ftrrd55" width="800" height="424"&gt;&lt;/a&gt;&lt;br&gt;
Monitor the status of the run operation and verify that the run is successful.&lt;br&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%2Fdrbmjkl5qcxc6kvth5d7.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%2Fdrbmjkl5qcxc6kvth5d7.png" alt="r6rdduy" width="800" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify your work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this task, you examine your pipeline and container app to verify successful pipeline runs.&lt;/p&gt;

&lt;p&gt;Ensure that you have &lt;strong&gt;Project1&lt;/strong&gt; open in Azure DevOps.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the left side menu, select &lt;strong&gt;Pipelines&lt;/strong&gt;, and then select &lt;strong&gt;Pipeline1&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Runs tab displays individual runs that can be selected to review details.&lt;br&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%2F1v95nlft16gn7a8ng339.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%2F1v95nlft16gn7a8ng339.png" alt="f65detr" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open your Azure portal, and then open your Container App.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the left side menu, select Activity Log.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify that a Create or Update Container App operation succeeded as a result of running your pipeline.&lt;br&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%2Ferwb9z5k4gg9csx4ls08.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%2Ferwb9z5k4gg9csx4ls08.png" alt="I87yrr" width="800" height="385"&gt;&lt;/a&gt;&lt;br&gt;
Notice that the Event initiated by column on the right shows your Project1 as the source.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In summary, configuring continuous integration (CI) with Azure Pipelines enables automated building, testing, and deployment of containerized applications to Azure Container Apps. By integrating your source code repository with Azure Pipelines, each commit or pull request can automatically trigger a pipeline that builds the container image, pushes it to Azure Container Registry (ACR), and deploys the updated image to Azure Container Apps. This setup ensures consistent application delivery, reduces manual overhead, and improves deployment reliability. Using YAML-based pipelines also provides version-controlled build definitions, promoting repeatability and alignment with DevOps best practices.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cicd</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Create and configure a container app in Azure Container Apps</title>
      <dc:creator>lotanna obianefo</dc:creator>
      <pubDate>Thu, 27 Nov 2025 03:44:52 +0000</pubDate>
      <link>https://dev.to/lotanna_obianefo/create-and-configure-a-container-app-in-azure-container-apps-14hj</link>
      <guid>https://dev.to/lotanna_obianefo/create-and-configure-a-container-app-in-azure-container-apps-14hj</guid>
      <description>&lt;p&gt;Creating and configuring a container app in Azure Container Apps involves deploying a containerized application into a fully managed, serverless environment designed for cloud-native workloads. Azure Container Apps abstracts away the need to manage Kubernetes clusters while still providing key capabilities such as autoscaling, revisions, traffic splitting, and secure integration with supporting services like Azure Container Registry.&lt;/p&gt;

&lt;p&gt;In this process, you define the container image to run, configure environment settings such as ingress and scaling rules, and connect the app to the required resources and identities. This setup enables reliable, scalable, and efficient execution of microservices and event-driven applications without managing underlying infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a container app that uses an ACR image&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open your Azure portal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the portal menu, select &lt;strong&gt;+ Create&lt;/strong&gt; a resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the top search bar, in the Search textbox, enter &lt;strong&gt;container app&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the search results under Services, select &lt;strong&gt;Container Apps&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the &lt;strong&gt;Basics&lt;/strong&gt; tab, specify the following:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subscription: Specify the Azure subscription that you're using.&lt;br&gt;
Resource group: &lt;strong&gt;RG1&lt;/strong&gt;&lt;br&gt;
Container app name: &lt;strong&gt;aca-az2003&lt;/strong&gt;&lt;br&gt;
Region: Select the Region specified for VNET1 &lt;strong&gt;(Central US)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The container app needs to be in the same region/location as the virtual network so you can choose VNET1 for the managed environment. For this guided project, keep all of your resources in the region/location specified for your resource group&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Container Apps Environment: Select &lt;strong&gt;Create new&lt;/strong&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%2Fhetzi34xdjb7xaq7ioa3.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%2Fhetzi34xdjb7xaq7ioa3.png" alt="rtge54" width="800" height="397"&gt;&lt;/a&gt;&lt;br&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%2Fnxp97ktaecvbxvr03csg.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%2Fnxp97ktaecvbxvr03csg.png" alt="YUDSSS" width="800" height="352"&gt;&lt;/a&gt;&lt;br&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%2Fk1xnowrjc219mq10ecm3.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%2Fk1xnowrjc219mq10ecm3.png" alt="II8Y6TR6" width="800" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the Create Container Apps Environment page, select the &lt;strong&gt;Networking&lt;/strong&gt; tab, and then specify the following:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use your own virtual network: Select &lt;strong&gt;Yes&lt;/strong&gt;.&lt;br&gt;
Virtual network: Select &lt;strong&gt;VNET1&lt;/strong&gt;.&lt;br&gt;
Infrastructure subnet: &lt;strong&gt;ACASubnet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If the ACASubnet subnet is not listed, open your virtual network resource, adjust the subnet address range to 10.0.2.0/23 and retry the steps to create the Container App&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the Create Container Apps Environment page, select &lt;strong&gt;Create&lt;/strong&gt;.&lt;br&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%2Fqnig8uisew0bpwzlte95.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%2Fqnig8uisew0bpwzlte95.png" alt="UYEW3A3" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Create Container App page, select the &lt;strong&gt;Container&lt;/strong&gt; tab, and then specify the following:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use quickstart image: Ensure that this setting is not selected. If it is selected, &lt;strong&gt;uncheck&lt;/strong&gt; this setting.&lt;br&gt;
Name: Enter &lt;strong&gt;aca-az2003&lt;/strong&gt;&lt;br&gt;
Image source: Ensure that &lt;strong&gt;Azure Container Registry&lt;/strong&gt; is selected.&lt;br&gt;
Registry: Select your container registry.: &lt;strong&gt;acraz2003cah.azurecr.io&lt;/strong&gt;&lt;br&gt;
Image: Select &lt;strong&gt;aspnetcorecontainer&lt;/strong&gt;&lt;br&gt;
Image tag: Select &lt;strong&gt;latest&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;Review + create&lt;/strong&gt;.&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%2F901y8ugutbridz2ise2w.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%2F901y8ugutbridz2ise2w.png" alt="yut65rtfe" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Once verification has Passed, select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wait for the deployment to complete.&lt;br&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%2Fb9g2iqo05ogaatov8zxl.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%2Fb9g2iqo05ogaatov8zxl.png" alt="ytr655" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure the container app to authenticate using the user assigned identity&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the Azure portal, open the Container App that you created.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under Security, select &lt;strong&gt;Identity&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the tab for &lt;strong&gt;User assigned&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Add user assigned managed identity&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Add user assigned managed identity page, select &lt;strong&gt;uai-az2003&lt;/strong&gt;, and then select &lt;strong&gt;Add&lt;/strong&gt;.&lt;/p&gt;&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%2F9wqbap8xaw2atnqh4egh.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%2F9wqbap8xaw2atnqh4egh.png" alt="tr5rtt" width="800" height="401"&gt;&lt;/a&gt;&lt;br&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%2Fjauv8bt4tomy7v1wbxqq.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%2Fjauv8bt4tomy7v1wbxqq.png" alt="husdfdg" width="800" height="400"&gt;&lt;/a&gt;&lt;br&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%2Fkzow1fxbr0czywxqn32z.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%2Fkzow1fxbr0czywxqn32z.png" alt="sgdevge" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure a connection between the container app and Service Bus&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the Azure portal, ensure that you have your Container App open.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under Settings, select &lt;strong&gt;Service Connector&lt;/strong&gt; (Preview).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Connect to your Services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Create connection page, specify the following:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Service type: Select &lt;strong&gt;Services Bus&lt;/strong&gt;.&lt;br&gt;
Client type: Select &lt;strong&gt;.NET&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;Next&lt;/strong&gt;: Authentication.&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%2Fpcrd2aiq75wid3ufe5y7.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%2Fpcrd2aiq75wid3ufe5y7.png" alt="dr34fff" width="800" height="403"&gt;&lt;/a&gt;&lt;br&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%2F3sewi4a7nzjczt4o35k4.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%2F3sewi4a7nzjczt4o35k4.png" alt="ert45egfe" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the Authentication tab, select &lt;strong&gt;User assigned managed identity&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure that the correct subscription and user assigned managed identity are selected.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subscription: The Azure subscription that you're using. &lt;br&gt;
User assigned managed identity: &lt;strong&gt;uai-az2003&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To change tabs, select &lt;strong&gt;Review + Create&lt;/strong&gt;.&lt;br&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%2Fv9nsk3agltbdjom93u4d.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%2Fv9nsk3agltbdjom93u4d.png" alt="kjfdgqw" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Once the Validation passed message appears, select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wait for the connection to be created.&lt;/p&gt;

&lt;p&gt;It can take a minute before the Service Connector page updates with the new connection.&lt;br&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%2Fx66gs28zx9sm01qawqdo.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%2Fx66gs28zx9sm01qawqdo.png" alt="trd45drd" width="800" height="405"&gt;&lt;/a&gt;&lt;br&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%2Fx0v5i2i7a63810t7dek8.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%2Fx0v5i2i7a63810t7dek8.png" alt="yu5rrr" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure HTTP scale rules&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ensure that your Container App is open in the portal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the left-side menu under &lt;strong&gt;Application&lt;/strong&gt;, select &lt;strong&gt;Revisions and replicas&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice the Name assigned to your active revision.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the left-side menu under Application, select &lt;strong&gt;Containers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To the right of Based on revision, ensure that your active revision is selected.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At the top of the page, select &lt;strong&gt;Edit and deploy&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the bottom of the page, select &lt;strong&gt;Next&lt;/strong&gt;: Scale.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure the Min / max replicas as follows:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Set Min replicas: &lt;strong&gt;0&lt;/strong&gt;&lt;br&gt;
Set Max replicas: &lt;strong&gt;2&lt;/strong&gt;&lt;br&gt;
Under Scale rule, select &lt;strong&gt;+ Add&lt;/strong&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%2Fnjb35fpzhgq3p8m98gjx.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%2Fnjb35fpzhgq3p8m98gjx.png" alt="iu8tfd4dc" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the Add scale rule page, specify the following:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rule name: Enter &lt;strong&gt;scalerule-http&lt;/strong&gt;&lt;br&gt;
Type: Select &lt;strong&gt;HTTP scaling&lt;/strong&gt;.&lt;br&gt;
Concurrent requests: Set the value to &lt;strong&gt;10,000&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the Add scale rule page, select &lt;strong&gt;Add&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the Create and deploy new revision page, select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ensure that your new scale rule is displayed.&lt;br&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%2Fcn1xj3gmrfmvu5d0l8zn.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%2Fcn1xj3gmrfmvu5d0l8zn.png" alt="je43cffw" width="800" height="402"&gt;&lt;/a&gt;&lt;br&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%2Fmj8w9tsc705y6r8f371b.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%2Fmj8w9tsc705y6r8f371b.png" alt="hg6t5dr66" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify your work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now you have to verify that your configuration meets the specified requirements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In the Azure portal, ensure that your Container App resource is open.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the left-side menu, under Settings, select &lt;strong&gt;Deployment&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At the top of the page, ensure that the &lt;strong&gt;Continuous deployment&lt;/strong&gt; tab is selected.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verify that the expected Registry settings are reported:&lt;/p&gt;

&lt;p&gt;Repository source: &lt;strong&gt;Azure Container Registry&lt;/strong&gt;&lt;br&gt;
Registry: the name of your Container Registry; &lt;strong&gt;acraz2003LT2025&lt;/strong&gt;&lt;br&gt;
Image: &lt;strong&gt;aca-az2003&lt;/strong&gt;&lt;br&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%2F2bv97szbw1hdja4yeci1.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%2F2bv97szbw1hdja4yeci1.png" alt="65rrdffy" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open your Container Apps Environment resource.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verify that your Container App uses the proper subnet as follows:&lt;/p&gt;

&lt;p&gt;On the Overview page, verify that Virtual Network is set to &lt;strong&gt;VNET1&lt;/strong&gt;.&lt;br&gt;
On the &lt;strong&gt;Overview&lt;/strong&gt; page, verify that Infrastructure subnet is set to &lt;strong&gt;ACASubnet&lt;/strong&gt;.&lt;br&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%2Fsknztih2ny82w7w0ykyz.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%2Fsknztih2ny82w7w0ykyz.png" alt="c65rfcr" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verify that the targetService properties match the specified configuration.&lt;/p&gt;

&lt;p&gt;To verify your HTTP scale rule, you would need to run testing software that's able to simulate 10,000 concurrent HTTP requests and ensure that container replicas are created.&lt;/p&gt;

</description>
      <category>containers</category>
      <category>azure</category>
      <category>devops</category>
      <category>cloudnative</category>
    </item>
    <item>
      <title>Configure Azure Container Registry for a secure connection with Azure Container Apps</title>
      <dc:creator>lotanna obianefo</dc:creator>
      <pubDate>Thu, 27 Nov 2025 00:57:38 +0000</pubDate>
      <link>https://dev.to/lotanna_obianefo/configure-azure-container-registry-for-a-secure-connection-with-azure-container-apps-4peo</link>
      <guid>https://dev.to/lotanna_obianefo/configure-azure-container-registry-for-a-secure-connection-with-azure-container-apps-4peo</guid>
      <description>&lt;p&gt;Configuring Azure Container Registry (ACR) for a secure connection with Azure Container Apps is a crucial step in ensuring that your containerized applications are deployed safely and efficiently. This process involves setting up permissions and authentication so Azure Container Apps can securely pull container images from ACR without exposing credentials. By integrating ACR with managed identities or workload identities, teams can streamline deployments, improve security, and maintain a clean, automated DevOps workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure a user-assigned managed identity&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open your Azure portal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the portal menu, select &lt;strong&gt;+ Create&lt;/strong&gt; a resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Create a resource page, in the Search services and marketplace text box, enter &lt;strong&gt;managed identity&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the filtered list of resources, select User &lt;strong&gt;Assigned Managed Identity&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the User Assigned Managed Identity page, select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Create User Assigned Managed Identity page, specify the following information:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subscription: Specify the Azure subscription that you're using for this guided project.&lt;br&gt;
Resource group: &lt;strong&gt;RG1&lt;/strong&gt;&lt;br&gt;
Region: &lt;strong&gt;Central US&lt;/strong&gt;&lt;br&gt;
Name: &lt;strong&gt;uai-az2003&lt;/strong&gt;&lt;br&gt;
Select &lt;strong&gt;Review + create&lt;/strong&gt;.&lt;br&gt;
Select &lt;strong&gt;Create&lt;/strong&gt;.&lt;br&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%2Fnopgk8jaq0h1bsyozer1.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%2Fnopgk8jaq0h1bsyozer1.png" alt="22" width="800" height="396"&gt;&lt;/a&gt;&lt;br&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%2Fkc16f6hi1uug15wh214r.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%2Fkc16f6hi1uug15wh214r.png" alt="yutrr" width="800" height="397"&gt;&lt;/a&gt;&lt;br&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%2F9u6vysh14lph2y1munnl.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%2F9u6vysh14lph2y1munnl.png" alt="ew4rw" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure Container Registry with AcrPull permissions for the managed identity&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
In the Azure portal, open your Container Registry resource that was already create.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the left-side menu, select &lt;strong&gt;Access Control (IAM)&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Access Control (IAM) page, select &lt;strong&gt;Add role assignment&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Search for the AcrPull role, and then select &lt;strong&gt;AcrPull&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note: This configuration can also be applied when assigning the AcrPush role.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Next&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Members tab, to the right of Assign access to, select &lt;strong&gt;Managed identity&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;+ Select members&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Select managed identities page, under Managed identity, select &lt;strong&gt;User-assigned managed identity&lt;/strong&gt;, and then select the user-assigned managed identity created for this project.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;For example: uai-az2003.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the Select managed identities page, select &lt;strong&gt;Select&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Members tab of the Add role assignment page, select &lt;strong&gt;Review + assign&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Review + assign tab, select &lt;strong&gt;Review + assign&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wait for the role assignment to be added.&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%2F9m7c4mopcagtwomggte6.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%2F9m7c4mopcagtwomggte6.png" alt="ftr5d4" width="800" height="399"&gt;&lt;/a&gt;&lt;br&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%2F66hukchl3uu08zsz6hon.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%2F66hukchl3uu08zsz6hon.png" alt="frd5eses" width="800" height="399"&gt;&lt;/a&gt;&lt;br&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%2Fjtxutanmjjhocxzhhwr8.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%2Fjtxutanmjjhocxzhhwr8.png" alt="gftfffc" width="800" height="400"&gt;&lt;/a&gt;&lt;br&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%2Fp83nrqbwmrhiu2de6hc1.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%2Fp83nrqbwmrhiu2de6hc1.png" alt="Ihfdrdd" width="800" height="401"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Configure Container Registry with a private endpoint connection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ensure that your Container Registry resource is open in the portal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Under Settings, select &lt;strong&gt;Networking&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Private access tab, select &lt;strong&gt;+ Create a private endpoint connection&lt;/strong&gt;.&lt;br&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%2Fmqex7zatkxbj1av77s5t.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%2Fmqex7zatkxbj1av77s5t.png" alt="Ihyfrsest" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Basics tab, under Project details, specify the following information:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subscription: Specify the Azure subscription that you're using for this project.&lt;br&gt;
Resource group: &lt;strong&gt;RG1&lt;/strong&gt;&lt;br&gt;
Name: &lt;strong&gt;pe-acr-az2003&lt;/strong&gt;&lt;br&gt;
Region: Ensure that &lt;strong&gt;Central US&lt;/strong&gt; is selected.&lt;br&gt;
Select &lt;strong&gt;Next&lt;/strong&gt;: Resource.&lt;br&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%2F9y9nqkbrbz9v14phj0wz.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%2F9y9nqkbrbz9v14phj0wz.png" alt="trdsffgdt" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
On the Resource tab, ensure the following information is displayed:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subscription: Ensure that the Azure subscription that you're using for this project is selected.&lt;br&gt;
Resource type: Ensure that &lt;strong&gt;Microsoft.ContainerRegistry/registries&lt;/strong&gt; is selected.&lt;br&gt;
Resource: Ensure that the name of your &lt;strong&gt;registry&lt;/strong&gt; is selected.&lt;br&gt;
Target sub-resource: Ensure that &lt;strong&gt;registry&lt;/strong&gt; is selected.&lt;br&gt;
Select &lt;strong&gt;Next&lt;/strong&gt;: Virtual Network.&lt;br&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%2Fscf5zso8w5997kjyzk2j.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%2Fscf5zso8w5997kjyzk2j.png" alt="Iyugtdrft" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
On the Virtual Network tab, under Networking, ensure the following information is displayed:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Virtual network: Ensure that &lt;strong&gt;VNET1&lt;/strong&gt; is selected&lt;br&gt;
Subnet: Ensure that &lt;strong&gt;PESubnet&lt;/strong&gt; is selected.&lt;br&gt;
Select &lt;strong&gt;Next&lt;/strong&gt;: DNS.&lt;br&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%2Fggd3ktnilcqlg86u91y5.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%2Fggd3ktnilcqlg86u91y5.png" alt="jrtqwte" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
On the DNS tab, under Private DNS Integration, ensure the following information is displayed:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Integrate with private DNS zone: Ensure that &lt;strong&gt;Yes&lt;/strong&gt; is selected.&lt;br&gt;
Private DNS Zone: Notice that (new) &lt;strong&gt;privatelink.azurecr.io&lt;/strong&gt; is specified.&lt;br&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%2Ftfneinhetmxk250oyrjm.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%2Ftfneinhetmxk250oyrjm.png" alt="t7tytfer" width="800" height="398"&gt;&lt;/a&gt;&lt;br&gt;
Select &lt;strong&gt;Next&lt;/strong&gt;: Tags and then Select Next: &lt;strong&gt;Review + create&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On the Review + create tab, when you see the Validation passed message, select &lt;strong&gt;Create&lt;/strong&gt;.&lt;br&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%2Fnri2pfrisui72fdmptrv.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%2Fnri2pfrisui72fdmptrv.png" alt="yu76ftfd" width="800" height="397"&gt;&lt;/a&gt;&lt;br&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%2Fp6uoqzgswucze7bwy5pc.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%2Fp6uoqzgswucze7bwy5pc.png" alt="yut65dd" width="800" height="397"&gt;&lt;/a&gt;&lt;br&gt;
Wait for the deployment to complete.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify your work&lt;/strong&gt;&lt;br&gt;
In this task, you verify that your configuration meets the specified requirements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the Azure portal, open your Container Registry resource.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Access Control (IAM) page, select &lt;strong&gt;Role assignments&lt;/strong&gt;.&lt;br&gt;
Verify that the role assignments list shows the &lt;strong&gt;AcrPull role&lt;/strong&gt; assigned to the User-assigned Managed Identity resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the left-side menu, under Settings, select &lt;strong&gt;Networking&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Networking page, select the &lt;strong&gt;Private access tab&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under Private endpoint, select the private endpoint that you created.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;For example, select &lt;strong&gt;per-acr-az2003&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the Private endpoint page, under Settings, select &lt;strong&gt;DNS configuration&lt;/strong&gt;.&lt;br&gt;
Verify the following DNS setting:&lt;br&gt;
Private DNS zone: set to &lt;strong&gt;privatelink.azurecr.io&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the left-side menu, select &lt;strong&gt;Overview&lt;/strong&gt;.&lt;br&gt;
Verify the following setting:&lt;br&gt;
Virtual network/subnet: set to &lt;strong&gt;VNET1/PESubnet&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To securely deploy containerized workloads in Azure Container Apps, you must establish a protected connection to Azure Container Registry (ACR), where container images are stored. &lt;/p&gt;

&lt;p&gt;This configuration ensures that only authorized resources can pull images from the registry. &lt;/p&gt;

</description>
      <category>containers</category>
      <category>resources</category>
      <category>azure</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
