<?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: Thu Kha Kyawe</title>
    <description>The latest articles on DEV Community by Thu Kha Kyawe (@thukhakyawe_cloud).</description>
    <link>https://dev.to/thukhakyawe_cloud</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3601335%2Fd44a63a0-36bb-4c80-a1f0-1d55fd8ccc1c.png</url>
      <title>DEV Community: Thu Kha Kyawe</title>
      <link>https://dev.to/thukhakyawe_cloud</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thukhakyawe_cloud"/>
    <language>en</language>
    <item>
      <title>Day 4: Create a Standard ML Project Structure</title>
      <dc:creator>Thu Kha Kyawe</dc:creator>
      <pubDate>Wed, 03 Jun 2026 12:35:33 +0000</pubDate>
      <link>https://dev.to/thukhakyawe_cloud/day-4-create-a-standard-ml-project-structure-3hi7</link>
      <guid>https://dev.to/thukhakyawe_cloud/day-4-create-a-standard-ml-project-structure-3hi7</guid>
      <description>&lt;h1&gt;
  
  
  Lab Information
&lt;/h1&gt;

&lt;p&gt;A colleague has started a new ML project at /root/code/fraud-detection/, but the layout does not match the xFusionCorp Industries standard. Bring the project in line with the team's conventions.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inspect the existing project at /root/code/fraud-detection/.

The final layout must match the tree below exactly:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;fraud-detection/&lt;br&gt;
├── data/&lt;br&gt;
│   ├── raw/&lt;br&gt;
│   └── processed/&lt;br&gt;
├── models/&lt;br&gt;
├── notebooks/&lt;br&gt;
├── src/&lt;br&gt;
│   ├── data/&lt;br&gt;
│   ├── features/&lt;br&gt;
│   ├── models/&lt;br&gt;
│   └── utils/&lt;br&gt;
├── tests/&lt;br&gt;
├── configs/&lt;br&gt;
├── requirements.txt&lt;br&gt;
└── README.md&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Every subdirectory under src/ must contain an __init__.py file so that Python recognises it as a package.

requirements.txt must list the following dependencies, one per line: scikit-learn, pandas, numpy, and mlflow. The canonical PyPI name for the scikit-learn package is scikit-learn.

README.md must begin with the heading # fraud-detection.

Review the existing project and correct everything that does not match the requirements above.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Lab Solutions
&lt;/h1&gt;

&lt;p&gt;🧭 Part 1: Lab Step-by-Step Guidelines&lt;/p&gt;

&lt;p&gt;Run the following commands on the controlplane host.&lt;/p&gt;

&lt;p&gt;Step 1 — Move into the project directory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root/code/fraud-detection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2 — Inspect the current structure&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tree
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If tree is unavailable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;tree
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3 — Check  the required directory structure&lt;/p&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tree
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Rename incorrect directories
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;src/feature src/features
&lt;span class="nb"&gt;mv &lt;/span&gt;src/util src/utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Create missing directories
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; data/raw
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; data/processed
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; tests
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; configs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Verify &lt;strong&gt;init&lt;/strong&gt;.py still exists&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls &lt;/span&gt;src/features
&lt;span class="nb"&gt;ls &lt;/span&gt;src/utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;init&lt;/strong&gt;.py&lt;/p&gt;

&lt;p&gt;Step 4 — Verify and fix requirements.txt&lt;/p&gt;

&lt;p&gt;Create/update the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; requirements.txt 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sklearn
pandas
numpy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the correct requirements.txt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; requirements.txt &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
scikit-learn
pandas
numpy
mlflow
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create/update the README:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;README.md 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Fraud&lt;/span&gt;

ML project for fraud detection at xFusionCorp Industries.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the README&lt;/p&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; README.md &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
# fraud-detection

ML project for fraud detection at xFusionCorp Industries.
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 7 — Verify the final structure and README.md content&lt;/p&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tree
&lt;span class="nb"&gt;cat &lt;/span&gt;README.md 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected structure:&lt;/p&gt;

&lt;p&gt;fraud-detection/&lt;br&gt;
├── data/&lt;br&gt;
│   ├── raw/&lt;br&gt;
│   └── processed/&lt;br&gt;
├── models/&lt;br&gt;
├── notebooks/&lt;br&gt;
├── src/&lt;br&gt;
│   ├── data/&lt;br&gt;
│   │   └── &lt;strong&gt;init&lt;/strong&gt;.py&lt;br&gt;
│   ├── features/&lt;br&gt;
│   │   └── &lt;strong&gt;init&lt;/strong&gt;.py&lt;br&gt;
│   ├── models/&lt;br&gt;
│   │   └── &lt;strong&gt;init&lt;/strong&gt;.py&lt;br&gt;
│   └── utils/&lt;br&gt;
│       └── &lt;strong&gt;init&lt;/strong&gt;.py&lt;br&gt;
├── tests/&lt;br&gt;
├── configs/&lt;br&gt;
├── requirements.txt&lt;br&gt;
└── README.md&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;root@controlplane ~/code/fraud-detection via 🐍 v3.12.3 ➜  cat README.md 
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fraud-detection
&lt;span class="go"&gt;
ML project for fraud detection at xFusionCorp Industries.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🧠 Part 2: Simple Beginner-Friendly Explanation&lt;/p&gt;

&lt;p&gt;This lab focuses on organising a machine learning project according to the xFusionCorp Industries standard structure.&lt;/p&gt;

&lt;p&gt;The goal is to:&lt;/p&gt;

&lt;p&gt;standardise project layout&lt;br&gt;
improve maintainability&lt;br&gt;
make collaboration easier for developers and data scientists&lt;/p&gt;

&lt;p&gt;You must inspect the existing project and correct anything that does not match the required structure.&lt;/p&gt;

&lt;p&gt;Understanding the Required Project Structure&lt;/p&gt;

&lt;p&gt;The final project must look exactly like this:&lt;/p&gt;

&lt;p&gt;fraud-detection/&lt;br&gt;
├── data/&lt;br&gt;
│   ├── raw/&lt;br&gt;
│   └── processed/&lt;br&gt;
├── models/&lt;br&gt;
├── notebooks/&lt;br&gt;
├── src/&lt;br&gt;
│   ├── data/&lt;br&gt;
│   ├── features/&lt;br&gt;
│   ├── models/&lt;br&gt;
│   └── utils/&lt;br&gt;
├── tests/&lt;br&gt;
├── configs/&lt;br&gt;
├── requirements.txt&lt;br&gt;
└── README.md&lt;/p&gt;

&lt;p&gt;Each folder has a specific purpose in an ML workflow.&lt;/p&gt;

&lt;p&gt;Purpose of Each Directory&lt;/p&gt;

&lt;p&gt;data/&lt;br&gt;
Stores datasets used in the project.&lt;/p&gt;

&lt;p&gt;data/raw/&lt;br&gt;
Contains original unmodified data.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
transactions.csv&lt;/p&gt;

&lt;p&gt;data/processed/&lt;br&gt;
Contains cleaned or transformed datasets used for training.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
clean_transactions.csv&lt;/p&gt;

&lt;p&gt;models/&lt;br&gt;
Stores trained machine learning models.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
fraud_model.pkl&lt;/p&gt;

&lt;p&gt;notebooks/&lt;br&gt;
Contains Jupyter notebooks for experimentation and analysis.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
eda.ipynb&lt;/p&gt;

&lt;p&gt;src/&lt;br&gt;
Contains the main Python source code for the application.&lt;br&gt;
This keeps project logic organised and modular.&lt;/p&gt;

&lt;p&gt;Why &lt;strong&gt;init&lt;/strong&gt;.py Files Are Required&lt;br&gt;
Every subdirectory under src/ must contain:&lt;br&gt;
&lt;strong&gt;init&lt;/strong&gt;.py&lt;/p&gt;

&lt;p&gt;This tells Python:&lt;br&gt;
“Treat this directory as a Python package.”&lt;/p&gt;

&lt;p&gt;Without these files:&lt;br&gt;
imports may fail&lt;br&gt;
modules may not be recognised correctly&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
from src.models.train import train_model&lt;/p&gt;

&lt;p&gt;Purpose of src/ Subdirectories&lt;/p&gt;

&lt;p&gt;Directory       Purpose&lt;br&gt;
src/data        Data loading and preprocessing&lt;br&gt;
src/features    Feature engineering logic&lt;br&gt;
src/models      Training and prediction code&lt;br&gt;
src/utils       Helper functions and utilities&lt;/p&gt;

&lt;p&gt;Why requirements.txt Matters&lt;br&gt;
The lab requires the following dependencies:&lt;/p&gt;

&lt;p&gt;scikit-learn&lt;br&gt;
pandas&lt;br&gt;
numpy&lt;br&gt;
mlflow&lt;/p&gt;

&lt;p&gt;This file helps developers install all required Python packages consistently.&lt;/p&gt;

&lt;p&gt;Important note:&lt;/p&gt;

&lt;p&gt;the correct PyPI package name is scikit-learn&lt;br&gt;
not sklearn&lt;/p&gt;

&lt;p&gt;Why README.md Matters&lt;br&gt;
The README file provides project documentation.&lt;/p&gt;

&lt;p&gt;The lab specifically requires it to begin with:&lt;/p&gt;

&lt;h1&gt;
  
  
  fraud-detection
&lt;/h1&gt;

&lt;p&gt;This acts as the project title and ensures naming consistency.&lt;/p&gt;

&lt;p&gt;Why Exact Naming Is Important&lt;br&gt;
Lab validators check:&lt;br&gt;
exact folder names&lt;br&gt;
exact file names&lt;br&gt;
exact dependency names&lt;/p&gt;

&lt;p&gt;Even small differences such as:&lt;br&gt;
feature instead of features&lt;br&gt;
util instead of utils&lt;/p&gt;

&lt;h1&gt;
  
  
  Fraud instead of # fraud-detection
&lt;/h1&gt;

&lt;p&gt;can cause the lab to fail.&lt;/p&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Resources &amp;amp; Next Steps&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📦 Full Code Repository: &lt;a href="https://github.com/thukhakyawe/100-Days-Of-MLOps-KodeKloud-Challenges-Solutions" rel="noopener noreferrer"&gt;KodeKloud Learning Labs&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💬 Join Discussion: &lt;a href="https://dev.to/thukhakyawe_cloud"&gt;DEV Community&lt;/a&gt; - Share your thoughts and questions
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💼 Let's Connect: &lt;a href="https://www.linkedin.com/in/thukhakyawe/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; - I'd love to connect with you
&lt;/h5&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Credits&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • All labs are from: &lt;a href="https://kodekloud.com/" rel="noopener noreferrer"&gt;KodeKloud&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • I sincerely appreciate your provision of these valuable resources.
&lt;/h5&gt;




</description>
      <category>kodekloud</category>
      <category>100daysofmlops</category>
    </item>
    <item>
      <title>Day 3: Fix a Broken uv Lockfile Specification</title>
      <dc:creator>Thu Kha Kyawe</dc:creator>
      <pubDate>Tue, 02 Jun 2026 13:14:56 +0000</pubDate>
      <link>https://dev.to/thukhakyawe_cloud/day-3-fix-a-broken-uv-lockfile-specification-31fl</link>
      <guid>https://dev.to/thukhakyawe_cloud/day-3-fix-a-broken-uv-lockfile-specification-31fl</guid>
      <description>&lt;h1&gt;
  
  
  Lab Information
&lt;/h1&gt;

&lt;p&gt;The xFusionCorp Industries ML team uses uv and lockfiles to keep Python dependencies reproducible across machines. A teammate has left behind a requirements.in specification that does not match the team's standard. Correct it and compile it into a pinned lockfile.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A high-level dependency specification exists at /root/code/fraud-detection/requirements.in. uv is already installed.

The corrected specification must meet the following requirements:
    it lists exactly these four top-level packages: scikit-learn, mlflow, pandas, and numpy;
    every package carries a version constraint that uv can actually satisfy against PyPI.

Review the existing requirements.in, and correct everything that does not match the requirements above.

From the project directory, compile the corrected specification into a pinned lockfile:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;uv pip compile requirements.in -o requirements.txt&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The resulting requirements.txt must pin each of the four top-level packages to an exact version using ==, and must also include the transitive dependencies that uv resolved.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  Lab Solutions
&lt;/h1&gt;

&lt;p&gt;🧭 Part 1: Lab Step-by-Step Guidelines&lt;/p&gt;

&lt;p&gt;Run the following commands on the controlplane host.&lt;/p&gt;

&lt;p&gt;Step 1 — Move to the project directory&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root/code/fraud-detection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2 — Inspect the existing requirements.in&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat requirements.in
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for:&lt;/p&gt;

&lt;p&gt;wrong package names&lt;br&gt;
missing packages&lt;br&gt;
extra packages&lt;br&gt;
invalid version constraints&lt;/p&gt;

&lt;p&gt;Step 3 — Edit requirements.in&lt;/p&gt;

&lt;p&gt;Open the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vi requirements.in
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the contents with valid package constraints such as:&lt;/p&gt;

&lt;p&gt;scikit-learn&amp;gt;=1.4&lt;br&gt;
mlflow&amp;gt;=2.12&lt;br&gt;
pandas&amp;gt;=2.2&lt;br&gt;
numpy&amp;gt;=1.26&lt;/p&gt;

&lt;p&gt;The file must contain:&lt;/p&gt;

&lt;p&gt;exactly 4 top-level packages&lt;/p&gt;

&lt;p&gt;all valid PyPI-installable constraints&lt;/p&gt;

&lt;p&gt;Step 4 — Compile the lockfile using uv&lt;/p&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv pip compile requirements.in &lt;span class="nt"&gt;-o&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This generates:&lt;/p&gt;

&lt;p&gt;requirements.txt&lt;/p&gt;

&lt;p&gt;with:&lt;/p&gt;

&lt;p&gt;exact pinned versions (==)&lt;/p&gt;

&lt;p&gt;all transitive dependencies&lt;/p&gt;

&lt;p&gt;Step 5 — Verify the generated lockfile&lt;/p&gt;

&lt;p&gt;Check the file:&lt;/p&gt;

&lt;p&gt;cat requirements.txt&lt;/p&gt;

&lt;p&gt;You should see entries like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="err"&gt;Resolved&lt;/span&gt; &lt;span class="err"&gt;90&lt;/span&gt; &lt;span class="err"&gt;packages&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;626ms&lt;/span&gt;
&lt;span class="c"&gt;# This file was autogenerated by uv via the following command:
#    uv pip compile requirements.in -o requirements.txt
&lt;/span&gt;&lt;span class="py"&gt;aiohappyeyeballs&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2.6.2&lt;/span&gt;
    &lt;span class="c"&gt;# via aiohttp
&lt;/span&gt;&lt;span class="py"&gt;aiohttp&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.14.0&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow
&lt;/span&gt;&lt;span class="py"&gt;aiosignal&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.4.0&lt;/span&gt;
    &lt;span class="c"&gt;# via aiohttp
&lt;/span&gt;&lt;span class="py"&gt;alembic&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.18.4&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow
&lt;/span&gt;&lt;span class="py"&gt;annotated-doc&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.0.4&lt;/span&gt;
    &lt;span class="c"&gt;# via fastapi
&lt;/span&gt;&lt;span class="py"&gt;annotated-types&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.7.0&lt;/span&gt;
    &lt;span class="c"&gt;# via pydantic
&lt;/span&gt;&lt;span class="py"&gt;anyio&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=4.13.0&lt;/span&gt;
    &lt;span class="c"&gt;# via starlette
&lt;/span&gt;&lt;span class="py"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=26.1.0&lt;/span&gt;
    &lt;span class="c"&gt;# via aiohttp
&lt;/span&gt;&lt;span class="py"&gt;blinker&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.9.0&lt;/span&gt;
    &lt;span class="c"&gt;# via flask
&lt;/span&gt;&lt;span class="py"&gt;cachetools&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=7.1.4&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-skinny
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-tracing
&lt;/span&gt;&lt;span class="py"&gt;certifi&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2026.5.20&lt;/span&gt;
    &lt;span class="c"&gt;# via requests
&lt;/span&gt;&lt;span class="py"&gt;cffi&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2.0.0&lt;/span&gt;
    &lt;span class="c"&gt;# via cryptography
&lt;/span&gt;&lt;span class="py"&gt;charset-normalizer&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.4.7&lt;/span&gt;
    &lt;span class="c"&gt;# via requests
&lt;/span&gt;&lt;span class="py"&gt;click&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=8.4.1&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   flask
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-skinny
&lt;/span&gt;    &lt;span class="c"&gt;#   uvicorn
&lt;/span&gt;&lt;span class="py"&gt;cloudpickle&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.1.2&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow-skinny
&lt;/span&gt;&lt;span class="py"&gt;contourpy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.3.3&lt;/span&gt;
    &lt;span class="c"&gt;# via matplotlib
&lt;/span&gt;&lt;span class="py"&gt;cryptography&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=48.0.0&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   google-auth
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow
&lt;/span&gt;&lt;span class="py"&gt;cycler&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.12.1&lt;/span&gt;
    &lt;span class="c"&gt;# via matplotlib
&lt;/span&gt;&lt;span class="py"&gt;databricks-sdk&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.114.0&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-skinny
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-tracing
&lt;/span&gt;&lt;span class="py"&gt;docker&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=7.1.0&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow
&lt;/span&gt;&lt;span class="py"&gt;fastapi&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.136.3&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow-skinny
&lt;/span&gt;&lt;span class="py"&gt;flask&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.1.3&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   flask-cors
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow
&lt;/span&gt;&lt;span class="py"&gt;flask-cors&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=6.0.2&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow
&lt;/span&gt;&lt;span class="py"&gt;fonttools&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=4.63.0&lt;/span&gt;
    &lt;span class="c"&gt;# via matplotlib
&lt;/span&gt;&lt;span class="py"&gt;frozenlist&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.8.0&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   aiohttp
&lt;/span&gt;    &lt;span class="c"&gt;#   aiosignal
&lt;/span&gt;&lt;span class="py"&gt;gitdb&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=4.0.12&lt;/span&gt;
    &lt;span class="c"&gt;# via gitpython
&lt;/span&gt;&lt;span class="py"&gt;gitpython&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.1.50&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow-skinny
&lt;/span&gt;&lt;span class="py"&gt;google-auth&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2.53.0&lt;/span&gt;
    &lt;span class="c"&gt;# via databricks-sdk
&lt;/span&gt;&lt;span class="py"&gt;graphene&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.4.3&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow
&lt;/span&gt;&lt;span class="py"&gt;graphql-core&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.2.8&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   graphene
&lt;/span&gt;    &lt;span class="c"&gt;#   graphql-relay
&lt;/span&gt;&lt;span class="py"&gt;graphql-relay&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.2.0&lt;/span&gt;
    &lt;span class="c"&gt;# via graphene
&lt;/span&gt;&lt;span class="py"&gt;greenlet&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.5.1&lt;/span&gt;
    &lt;span class="c"&gt;# via sqlalchemy
&lt;/span&gt;&lt;span class="py"&gt;gunicorn&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=26.0.0&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow
&lt;/span&gt;&lt;span class="py"&gt;h11&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.16.0&lt;/span&gt;
    &lt;span class="c"&gt;# via uvicorn
&lt;/span&gt;&lt;span class="py"&gt;huey&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.0.1&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow
&lt;/span&gt;&lt;span class="py"&gt;idna&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.17&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   anyio
&lt;/span&gt;    &lt;span class="c"&gt;#   requests
&lt;/span&gt;    &lt;span class="c"&gt;#   yarl
&lt;/span&gt;&lt;span class="py"&gt;importlib-metadata&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=9.0.0&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow-skinny
&lt;/span&gt;&lt;span class="py"&gt;itsdangerous&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2.2.0&lt;/span&gt;
    &lt;span class="c"&gt;# via flask
&lt;/span&gt;&lt;span class="py"&gt;jinja2&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.1.6&lt;/span&gt;
    &lt;span class="c"&gt;# via flask
&lt;/span&gt;&lt;span class="py"&gt;joblib&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.5.3&lt;/span&gt;
    &lt;span class="c"&gt;# via scikit-learn
&lt;/span&gt;&lt;span class="py"&gt;kiwisolver&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.5.0&lt;/span&gt;
    &lt;span class="c"&gt;# via matplotlib
&lt;/span&gt;&lt;span class="py"&gt;mako&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.3.12&lt;/span&gt;
    &lt;span class="c"&gt;# via alembic
&lt;/span&gt;&lt;span class="py"&gt;markupsafe&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.0.3&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   flask
&lt;/span&gt;    &lt;span class="c"&gt;#   jinja2
&lt;/span&gt;    &lt;span class="c"&gt;#   mako
&lt;/span&gt;    &lt;span class="c"&gt;#   werkzeug
&lt;/span&gt;&lt;span class="py"&gt;matplotlib&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.10.9&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow
&lt;/span&gt;&lt;span class="py"&gt;mlflow&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.13.0&lt;/span&gt;
    &lt;span class="c"&gt;# via -r requirements.in
&lt;/span&gt;&lt;span class="py"&gt;mlflow-skinny&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.13.0&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow
&lt;/span&gt;&lt;span class="py"&gt;mlflow-tracing&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.13.0&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow
&lt;/span&gt;&lt;span class="py"&gt;multidict&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=6.7.1&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   aiohttp
&lt;/span&gt;    &lt;span class="c"&gt;#   yarl
&lt;/span&gt;&lt;span class="py"&gt;narwhals&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2.22.0&lt;/span&gt;
    &lt;span class="c"&gt;# via scikit-learn
&lt;/span&gt;&lt;span class="py"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2.4.6&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   -r requirements.in
&lt;/span&gt;    &lt;span class="c"&gt;#   contourpy
&lt;/span&gt;    &lt;span class="c"&gt;#   matplotlib
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow
&lt;/span&gt;    &lt;span class="c"&gt;#   pandas
&lt;/span&gt;    &lt;span class="c"&gt;#   scikit-learn
&lt;/span&gt;    &lt;span class="c"&gt;#   scipy
&lt;/span&gt;    &lt;span class="c"&gt;#   skops
&lt;/span&gt;&lt;span class="py"&gt;opentelemetry-api&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.42.1&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-skinny
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-tracing
&lt;/span&gt;    &lt;span class="c"&gt;#   opentelemetry-sdk
&lt;/span&gt;    &lt;span class="c"&gt;#   opentelemetry-semantic-conventions
&lt;/span&gt;&lt;span class="py"&gt;opentelemetry-proto&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.42.1&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-skinny
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-tracing
&lt;/span&gt;&lt;span class="py"&gt;opentelemetry-sdk&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.42.1&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-skinny
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-tracing
&lt;/span&gt;&lt;span class="py"&gt;opentelemetry-semantic-conventions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.63b1&lt;/span&gt;
    &lt;span class="c"&gt;# via opentelemetry-sdk
&lt;/span&gt;&lt;span class="py"&gt;packaging&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=26.2&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   gunicorn
&lt;/span&gt;    &lt;span class="c"&gt;#   matplotlib
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-skinny
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-tracing
&lt;/span&gt;    &lt;span class="c"&gt;#   skops
&lt;/span&gt;&lt;span class="py"&gt;pandas&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2.3.3&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   -r requirements.in
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow
&lt;/span&gt;&lt;span class="py"&gt;pillow&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=12.2.0&lt;/span&gt;
    &lt;span class="c"&gt;# via matplotlib
&lt;/span&gt;&lt;span class="py"&gt;prettytable&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.17.0&lt;/span&gt;
    &lt;span class="c"&gt;# via skops
&lt;/span&gt;&lt;span class="py"&gt;propcache&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.5.2&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   aiohttp
&lt;/span&gt;    &lt;span class="c"&gt;#   yarl
&lt;/span&gt;&lt;span class="py"&gt;protobuf&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=6.33.6&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   databricks-sdk
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-skinny
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-tracing
&lt;/span&gt;    &lt;span class="c"&gt;#   opentelemetry-proto
&lt;/span&gt;&lt;span class="py"&gt;pyarrow&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=24.0.0&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow
&lt;/span&gt;&lt;span class="py"&gt;pyasn1&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.6.3&lt;/span&gt;
    &lt;span class="c"&gt;# via pyasn1-modules
&lt;/span&gt;&lt;span class="py"&gt;pyasn1-modules&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.4.2&lt;/span&gt;
    &lt;span class="c"&gt;# via google-auth
&lt;/span&gt;&lt;span class="py"&gt;pycparser&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.0&lt;/span&gt;
    &lt;span class="c"&gt;# via cffi
&lt;/span&gt;&lt;span class="py"&gt;pydantic&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2.13.4&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   fastapi
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-skinny
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-tracing
&lt;/span&gt;&lt;span class="py"&gt;pydantic-core&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2.46.4&lt;/span&gt;
    &lt;span class="c"&gt;# via pydantic
&lt;/span&gt;&lt;span class="py"&gt;pyparsing&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.3.2&lt;/span&gt;
    &lt;span class="c"&gt;# via matplotlib
&lt;/span&gt;&lt;span class="py"&gt;python-dateutil&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2.9.0.post0&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   graphene
&lt;/span&gt;    &lt;span class="c"&gt;#   matplotlib
&lt;/span&gt;    &lt;span class="c"&gt;#   pandas
&lt;/span&gt;&lt;span class="py"&gt;python-dotenv&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.2.2&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow-skinny
&lt;/span&gt;&lt;span class="py"&gt;pytz&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2026.2&lt;/span&gt;
    &lt;span class="c"&gt;# via pandas
&lt;/span&gt;&lt;span class="py"&gt;pyyaml&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=6.0.3&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow-skinny
&lt;/span&gt;&lt;span class="py"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2.34.2&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   databricks-sdk
&lt;/span&gt;    &lt;span class="c"&gt;#   docker
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-skinny
&lt;/span&gt;&lt;span class="py"&gt;scikit-learn&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.9.0&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   -r requirements.in
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow
&lt;/span&gt;    &lt;span class="c"&gt;#   skops
&lt;/span&gt;&lt;span class="py"&gt;scipy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.17.1&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow
&lt;/span&gt;    &lt;span class="c"&gt;#   scikit-learn
&lt;/span&gt;    &lt;span class="c"&gt;#   skops
&lt;/span&gt;&lt;span class="py"&gt;six&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.17.0&lt;/span&gt;
    &lt;span class="c"&gt;# via python-dateutil
&lt;/span&gt;&lt;span class="py"&gt;skops&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.14.0&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow
&lt;/span&gt;&lt;span class="py"&gt;smmap&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=5.0.3&lt;/span&gt;
    &lt;span class="c"&gt;# via gitdb
&lt;/span&gt;&lt;span class="py"&gt;sqlalchemy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2.0.50&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   alembic
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow
&lt;/span&gt;&lt;span class="py"&gt;sqlparse&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.5.5&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow-skinny
&lt;/span&gt;&lt;span class="py"&gt;starlette&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.2.1&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   fastapi
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-skinny
&lt;/span&gt;&lt;span class="py"&gt;threadpoolctl&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.6.0&lt;/span&gt;
    &lt;span class="c"&gt;# via scikit-learn
&lt;/span&gt;&lt;span class="py"&gt;typing-extensions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=4.15.0&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   aiohttp
&lt;/span&gt;    &lt;span class="c"&gt;#   aiosignal
&lt;/span&gt;    &lt;span class="c"&gt;#   alembic
&lt;/span&gt;    &lt;span class="c"&gt;#   anyio
&lt;/span&gt;    &lt;span class="c"&gt;#   fastapi
&lt;/span&gt;    &lt;span class="c"&gt;#   graphene
&lt;/span&gt;    &lt;span class="c"&gt;#   mlflow-skinny
&lt;/span&gt;    &lt;span class="c"&gt;#   opentelemetry-api
&lt;/span&gt;    &lt;span class="c"&gt;#   opentelemetry-sdk
&lt;/span&gt;    &lt;span class="c"&gt;#   opentelemetry-semantic-conventions
&lt;/span&gt;    &lt;span class="c"&gt;#   pydantic
&lt;/span&gt;    &lt;span class="c"&gt;#   pydantic-core
&lt;/span&gt;    &lt;span class="c"&gt;#   sqlalchemy
&lt;/span&gt;    &lt;span class="c"&gt;#   starlette
&lt;/span&gt;    &lt;span class="c"&gt;#   typing-inspection
&lt;/span&gt;&lt;span class="py"&gt;typing-inspection&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.4.2&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   fastapi
&lt;/span&gt;    &lt;span class="c"&gt;#   pydantic
&lt;/span&gt;&lt;span class="py"&gt;tzdata&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2026.2&lt;/span&gt;
    &lt;span class="c"&gt;# via pandas
&lt;/span&gt;&lt;span class="py"&gt;urllib3&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=2.7.0&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   docker
&lt;/span&gt;    &lt;span class="c"&gt;#   requests
&lt;/span&gt;&lt;span class="py"&gt;uvicorn&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.48.0&lt;/span&gt;
    &lt;span class="c"&gt;# via mlflow-skinny
&lt;/span&gt;&lt;span class="py"&gt;wcwidth&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=0.7.0&lt;/span&gt;
    &lt;span class="c"&gt;# via prettytable
&lt;/span&gt;&lt;span class="py"&gt;werkzeug&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=3.1.8&lt;/span&gt;
    &lt;span class="c"&gt;# via
&lt;/span&gt;    &lt;span class="c"&gt;#   flask
&lt;/span&gt;    &lt;span class="c"&gt;#   flask-cors
&lt;/span&gt;&lt;span class="py"&gt;yarl&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=1.24.2&lt;/span&gt;
    &lt;span class="c"&gt;# via aiohttp
&lt;/span&gt;&lt;span class="py"&gt;zipp&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=4.1.0&lt;/span&gt;
    &lt;span class="c"&gt;# via importlib-metadata
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🧠 Part 2: Simple Beginner-Friendly Explanation&lt;/p&gt;

&lt;p&gt;What is requirements.in?&lt;/p&gt;

&lt;p&gt;requirements.in is a high-level dependency file.&lt;/p&gt;

&lt;p&gt;It describes:&lt;/p&gt;

&lt;p&gt;“These are the packages my project needs.”&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;numpy&amp;gt;=1.26&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;p&gt;install numpy&lt;br&gt;
any compatible version newer than 1.26&lt;/p&gt;

&lt;p&gt;What is a Lockfile?&lt;/p&gt;

&lt;p&gt;The generated:&lt;/p&gt;

&lt;p&gt;requirements.txt&lt;/p&gt;

&lt;p&gt;is a fully pinned dependency lockfile.&lt;/p&gt;

&lt;p&gt;It contains:&lt;/p&gt;

&lt;p&gt;exact package versions&lt;br&gt;
every dependency required underneath&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;numpy==1.26.4&lt;/p&gt;

&lt;p&gt;This guarantees:&lt;/p&gt;

&lt;p&gt;reproducible installs&lt;br&gt;
same environment on every machine&lt;/p&gt;

&lt;p&gt;Why Use uv pip compile?&lt;/p&gt;

&lt;p&gt;Command:&lt;/p&gt;

&lt;p&gt;uv pip compile requirements.in -o requirements.txt&lt;/p&gt;

&lt;p&gt;does the following:&lt;/p&gt;

&lt;p&gt;reads requirements.in&lt;br&gt;
resolves compatible versions&lt;br&gt;
locks exact versions&lt;br&gt;
includes transitive dependencies&lt;/p&gt;

&lt;p&gt;Difference Between Top-Level and Transitive Dependencies&lt;/p&gt;

&lt;p&gt;Top-Level Dependencies&lt;/p&gt;

&lt;p&gt;Packages you explicitly request:&lt;/p&gt;

&lt;p&gt;numpy&lt;br&gt;
pandas&lt;br&gt;
mlflow&lt;br&gt;
scikit-learn&lt;/p&gt;

&lt;p&gt;Transitive Dependencies&lt;/p&gt;

&lt;p&gt;Packages automatically required by those libraries.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;pandas may require:&lt;br&gt;
python-dateutil&lt;br&gt;
pytz&lt;br&gt;
mlflow may require many extra libraries&lt;/p&gt;

&lt;p&gt;These appear automatically in:&lt;/p&gt;

&lt;p&gt;requirements.txt&lt;/p&gt;

&lt;p&gt;Why Exact == Versions Matter&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;numpy==1.26.4&lt;/p&gt;

&lt;p&gt;This prevents:&lt;/p&gt;

&lt;p&gt;unexpected upgrades&lt;br&gt;
dependency conflicts&lt;br&gt;
“works on my machine” problems&lt;/p&gt;

&lt;p&gt;It ensures all developers use identical versions.&lt;/p&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Resources &amp;amp; Next Steps&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📦 Full Code Repository: &lt;a href="https://github.com/thukhakyawe/100-Days-Of-MLOps-KodeKloud-Challenges-Solutions" rel="noopener noreferrer"&gt;KodeKloud Learning Labs&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💬 Join Discussion: &lt;a href="https://dev.to/thukhakyawe_cloud"&gt;DEV Community&lt;/a&gt; - Share your thoughts and questions
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💼 Let's Connect: &lt;a href="https://www.linkedin.com/in/thukhakyawe/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; - I'd love to connect with you
&lt;/h5&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Credits&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • All labs are from: &lt;a href="https://kodekloud.com/" rel="noopener noreferrer"&gt;KodeKloud&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • I sincerely appreciate your provision of these valuable resources.
&lt;/h5&gt;




</description>
      <category>kodekloud</category>
      <category>100daysofmlops</category>
    </item>
    <item>
      <title>Day 2: Set Up and Configure Jupyter Notebook Server</title>
      <dc:creator>Thu Kha Kyawe</dc:creator>
      <pubDate>Sun, 31 May 2026 04:59:09 +0000</pubDate>
      <link>https://dev.to/thukhakyawe_cloud/day-2-set-up-and-configure-jupyter-notebook-server-1ldm</link>
      <guid>https://dev.to/thukhakyawe_cloud/day-2-set-up-and-configure-jupyter-notebook-server-1ldm</guid>
      <description>&lt;h1&gt;
  
  
  Lab Information
&lt;/h1&gt;

&lt;p&gt;A teammate has configured a JupyterLab server for the xFusionCorp Industries data science team, but the server does not behave correctly. Inspect the configuration, diagnose the issues, and start the server.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JupyterLab is already installed in the virtual environment at /root/code/ml-env/. The team's configuration file is at /root/code/jupyter_lab_config.py and is visible in the file explorer.

When JupyterLab is started, the Jupyter UI button at the top of the lab must open the notebook interface.

For this to work, the running server must meet the following requirements:
    it listens on port 8888;
    it binds on 0.0.0.0 (the lab proxy cannot reach a server that is only bound on 127.0.0.1);
    the notebook root directory is /root/notebooks/, and that directory exists on disk.

Open the configuration file, identify every setting that prevents the requirements above from being met, and correct it. Create any missing directories.

Start JupyterLab from the virtual environment using the corrected configuration:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;source /root/code/ml-env/bin/activate&lt;br&gt;
   jupyter lab --config=/root/code/jupyter_lab_config.py --allow-root --no-browser &amp;amp;&lt;/p&gt;

&lt;p&gt;Make sure JupyterLab is running before using the button at the top of the lab.&lt;/p&gt;


&lt;h1&gt;
  
  
  Lab Solutions
&lt;/h1&gt;

&lt;p&gt;🧭 Part 1: Lab Step-by-Step Guidelines&lt;/p&gt;

&lt;p&gt;Run the following steps on the controlplane host.&lt;/p&gt;

&lt;p&gt;Step 1 — Activate the virtual environment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; /root/code/ml-env/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2 — Open the JupyterLab configuration file&lt;/p&gt;

&lt;p&gt;You can inspect it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /root/code/jupyter_lab_config.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or edit it directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vi /root/code/jupyter_lab_config.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3 — Fix the required settings&lt;/p&gt;

&lt;p&gt;Ensure the configuration contains the following correct values:&lt;/p&gt;

&lt;p&gt;c.ServerApp.port = 8888&lt;br&gt;
c.ServerApp.ip = '0.0.0.0'&lt;br&gt;
c.ServerApp.notebook_dir = '/root/notebooks'&lt;/p&gt;

&lt;p&gt;Remove or correct any conflicting settings such as:&lt;/p&gt;

&lt;p&gt;wrong port&lt;br&gt;
127.0.0.1&lt;br&gt;
incorrect notebook directory&lt;/p&gt;

&lt;p&gt;Step 4 — Create the notebook directory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /root/notebooks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 5 — Start JupyterLab&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jupyter lab &lt;span class="nt"&gt;--config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/root/code/jupyter_lab_config.py &lt;span class="nt"&gt;--allow-root&lt;/span&gt; &lt;span class="nt"&gt;--no-browser&lt;/span&gt; &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 6 — Verify JupyterLab is running&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps &lt;span class="nt"&gt;-ef&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;jupyter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected resuld should show:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;root        3460    1880  0 00:49 pts/2    00:00:01 /root/code/ml-env/bin/python3 /root/code/ml-env/bin/jupyter-lab --config=/root/code/jupyter_lab_config.py --allow-root --no-browser
root        3751    3649  0 00:49 pts/6    00:00:00 grep --color=auto jupyter
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also verify the listening port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ss &lt;span class="nt"&gt;-tulnp&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;8888
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected result should show:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;tcp   LISTEN 0      128          0.0.0.0:8888      0.0.0.0:*    users:(("jupyter-lab",pid=3460,fd=6)) 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🧠 Part 2: Simple Beginner-Friendly Explanation&lt;/p&gt;

&lt;p&gt;What is happening in this lab?&lt;/p&gt;

&lt;p&gt;JupyterLab is already installed, but its configuration is incorrect.&lt;/p&gt;

&lt;p&gt;Your job is to:&lt;/p&gt;

&lt;p&gt;inspect the config&lt;br&gt;
fix bad settings&lt;br&gt;
create the required notebook directory&lt;br&gt;
start the server correctly&lt;br&gt;
Understanding the Required Settings&lt;/p&gt;

&lt;p&gt;The lab requires:&lt;/p&gt;

&lt;p&gt;Requirement Meaning&lt;br&gt;
Port 8888   Jupyter must listen on this port&lt;br&gt;
Bind to 0.0.0.0 Allow external access from the lab proxy&lt;br&gt;
Root directory /root/notebooks  This is where notebooks are stored&lt;br&gt;
Why 127.0.0.1 Causes Problems&lt;/p&gt;

&lt;p&gt;If Jupyter binds to:&lt;/p&gt;

&lt;p&gt;127.0.0.1&lt;/p&gt;

&lt;p&gt;It only accepts local connections from inside the server itself.&lt;/p&gt;

&lt;p&gt;The lab UI button cannot reach it.&lt;/p&gt;

&lt;p&gt;Using:&lt;/p&gt;

&lt;p&gt;0.0.0.0&lt;/p&gt;

&lt;p&gt;means:&lt;/p&gt;

&lt;p&gt;“Accept connections from all network interfaces.”&lt;/p&gt;

&lt;p&gt;This allows the lab proxy to connect.&lt;/p&gt;

&lt;p&gt;Understanding the Config File&lt;/p&gt;

&lt;p&gt;Typical Jupyter config lines look like:&lt;/p&gt;

&lt;p&gt;c.ServerApp.port = 8888&lt;/p&gt;

&lt;p&gt;Meaning:&lt;/p&gt;

&lt;p&gt;c = configuration object&lt;br&gt;
ServerApp = Jupyter server settings&lt;br&gt;
port = listening port&lt;br&gt;
Why Create /root/notebooks&lt;/p&gt;

&lt;p&gt;Jupyter needs a valid working directory.&lt;/p&gt;

&lt;p&gt;If the folder does not exist:&lt;/p&gt;

&lt;p&gt;startup may fail&lt;br&gt;
notebook browser may break&lt;/p&gt;

&lt;p&gt;Creating it with:&lt;/p&gt;

&lt;p&gt;mkdir -p /root/notebooks&lt;/p&gt;

&lt;p&gt;ensures the directory exists.&lt;/p&gt;

&lt;p&gt;Starting JupyterLab&lt;/p&gt;

&lt;p&gt;Command:&lt;/p&gt;

&lt;p&gt;jupyter lab --config=/root/code/jupyter_lab_config.py --allow-root --no-browser &amp;amp;&lt;/p&gt;

&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;Option          Purpose&lt;br&gt;
--config=       Use the specified config file&lt;br&gt;
--allow-root    Permit running as root&lt;br&gt;
--no-browser    Do not open a GUI browser&lt;br&gt;
&amp;amp;               Run in background&lt;/p&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Resources &amp;amp; Next Steps&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📦 Full Code Repository: &lt;a href="https://github.com/thukhakyawe/100-Days-Of-MLOps-KodeKloud-Challenges-Solutions" rel="noopener noreferrer"&gt;KodeKloud Learning Labs&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💬 Join Discussion: &lt;a href="https://dev.to/thukhakyawe_cloud"&gt;DEV Community&lt;/a&gt; - Share your thoughts and questions
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💼 Let's Connect: &lt;a href="https://www.linkedin.com/in/thukhakyawe/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; - I'd love to connect with you
&lt;/h5&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Credits&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • All labs are from: &lt;a href="https://kodekloud.com/" rel="noopener noreferrer"&gt;KodeKloud&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • I sincerely appreciate your provision of these valuable resources.
&lt;/h5&gt;




</description>
      <category>kodekloud</category>
      <category>100daysofmlops</category>
    </item>
    <item>
      <title>Day 1: Create a Python Virtual Environment for ML</title>
      <dc:creator>Thu Kha Kyawe</dc:creator>
      <pubDate>Sat, 30 May 2026 06:47:15 +0000</pubDate>
      <link>https://dev.to/thukhakyawe_cloud/day-1-create-a-python-virtual-environment-for-ml-4fob</link>
      <guid>https://dev.to/thukhakyawe_cloud/day-1-create-a-python-virtual-environment-for-ml-4fob</guid>
      <description>&lt;h1&gt;
  
  
  Lab Information
&lt;/h1&gt;

&lt;p&gt;The xFusionCorp Industries data science team needs a standardised Python environment for their new ML project. Set up a virtual environment with the required ML libraries on the controlplane host.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a Python virtual environment named ml-env under /root/code/ using python3 -m venv.

Activate the environment and install the following packages: numpy, pandas, scikit-learn, and matplotlib.

Generate a requirements.txt file using pip freeze and save it at /root/code/requirements.txt.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h1&gt;
  
  
  Lab Solutions
&lt;/h1&gt;

&lt;p&gt;🧭 Part 1: Lab Step-by-Step Guidelines&lt;/p&gt;

&lt;p&gt;Run the following commands on the controlplane host:&lt;/p&gt;

&lt;p&gt;1.Create the Python virtual environment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv /root/code/ml-env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.Activate the virtual environment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; /root/code/ml-env/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After activation, your terminal should show something like:&lt;/p&gt;

&lt;p&gt;(ml-env)&lt;/p&gt;

&lt;p&gt;3.Install the required ML libraries&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;numpy pandas scikit-learn matplotlib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4.Generate the requirements.txt file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip freeze &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /root/code/requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5.Verify the file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /root/code/requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🧠 Part 2: Simple Beginner-Friendly Explanation&lt;/p&gt;

&lt;p&gt;What is a virtual environment?&lt;/p&gt;

&lt;p&gt;A virtual environment is an isolated Python workspace.&lt;br&gt;
It keeps project packages separate from the system Python packages.&lt;/p&gt;

&lt;p&gt;This helps:&lt;/p&gt;

&lt;p&gt;avoid package conflicts&lt;br&gt;
keep projects clean&lt;br&gt;
make setups reproducible&lt;br&gt;
Step Breakdown&lt;/p&gt;

&lt;p&gt;Step 1 — Create /root/code&lt;/p&gt;

&lt;p&gt;mkdir -p /root/code&lt;br&gt;
mkdir = make directory&lt;br&gt;
-p = create parent directories if needed&lt;/p&gt;

&lt;p&gt;This creates the folder where the project will live.&lt;/p&gt;

&lt;p&gt;Step 2 — Create the virtual environment&lt;/p&gt;

&lt;p&gt;python3 -m venv /root/code/ml-env&lt;/p&gt;

&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;python3 → use Python 3&lt;br&gt;
-m venv → run Python’s built-in virtual environment module&lt;br&gt;
/root/code/ml-env → name and location of the environment&lt;/p&gt;

&lt;p&gt;This creates:&lt;/p&gt;

&lt;p&gt;isolated Python binaries&lt;br&gt;
isolated package storage&lt;/p&gt;

&lt;p&gt;Step 3 — Activate the environment&lt;/p&gt;

&lt;p&gt;source /root/code/ml-env/bin/activate&lt;/p&gt;

&lt;p&gt;This tells the shell:&lt;/p&gt;

&lt;p&gt;“Use the Python and pip inside ml-env.”&lt;/p&gt;

&lt;p&gt;Without activation, packages may install globally instead.&lt;/p&gt;

&lt;p&gt;Step 4 — Install ML libraries&lt;/p&gt;

&lt;p&gt;pip install numpy pandas scikit-learn matplotlib&lt;/p&gt;

&lt;p&gt;What each library does:&lt;/p&gt;

&lt;p&gt;Package Purpose&lt;br&gt;
numpy   Numerical computing&lt;br&gt;
pandas  Data analysis &amp;amp; tables&lt;br&gt;
scikit-learn    Machine learning&lt;br&gt;
matplotlib  Data visualization &amp;amp; plotting&lt;/p&gt;

&lt;p&gt;Step 5 — Save installed packages&lt;/p&gt;

&lt;p&gt;pip freeze &amp;gt; /root/code/requirements.txt&lt;br&gt;
pip freeze lists installed packages&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;writes output into a file&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This creates a reusable dependency file.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;numpy==2.x.x&lt;br&gt;
pandas==2.x.x&lt;br&gt;
scikit-learn==1.x.x&lt;br&gt;
matplotlib==3.x.x&lt;/p&gt;

&lt;p&gt;Step 6 — Verify&lt;/p&gt;

&lt;p&gt;cat /root/code/requirements.txt&lt;/p&gt;

&lt;p&gt;This displays the contents of the file to confirm everything was saved correctly.&lt;/p&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Resources &amp;amp; Next Steps&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📦 Full Code Repository: &lt;a href="https://github.com/thukhakyawe/100-Days-Of-MLOps-KodeKloud-Challenges-Solutions" rel="noopener noreferrer"&gt;KodeKloud Learning Labs&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💬 Join Discussion: &lt;a href="https://dev.to/thukhakyawe_cloud"&gt;DEV Community&lt;/a&gt; - Share your thoughts and questions
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💼 Let's Connect: &lt;a href="https://www.linkedin.com/in/thukhakyawe/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; - I'd love to connect with you
&lt;/h5&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Credits&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • All labs are from: &lt;a href="https://kodekloud.com/" rel="noopener noreferrer"&gt;KodeKloud&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • I sincerely appreciate your provision of these valuable resources.
&lt;/h5&gt;




</description>
      <category>kodekloud</category>
      <category>100daysofmlops</category>
    </item>
    <item>
      <title>5.Configure Jenkins Job for Package Installation</title>
      <dc:creator>Thu Kha Kyawe</dc:creator>
      <pubDate>Sat, 30 May 2026 06:15:03 +0000</pubDate>
      <link>https://dev.to/thukhakyawe_cloud/5configure-jenkins-job-for-package-installation-350a</link>
      <guid>https://dev.to/thukhakyawe_cloud/5configure-jenkins-job-for-package-installation-350a</guid>
      <description>&lt;h1&gt;
  
  
  Lab Information
&lt;/h1&gt;

&lt;p&gt;Some new requirements have come up to install and configure some packages on the Nautilus infrastructure under Stratos Datacenter. The Nautilus DevOps team installed and configured a new Jenkins server so they wanted to create a Jenkins job to automate this task. Find below more details and complete the task accordingly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Access the Jenkins UI by clicking on the Jenkins button in the top bar. Log in using the credentials: username admin and password Adm!n321.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new Jenkins job named install-packages and configure it with the following specifications:&lt;/p&gt;

&lt;p&gt;Add a string parameter named PACKAGE.&lt;/p&gt;

&lt;p&gt;Configure the job to install a package specified in the $PACKAGE parameter on the storage server (Stratos Datacenter).&lt;/p&gt;

&lt;p&gt;Build the job at least once (e.g. with parameter PACKAGE=vim-enhanced) so the package is installed on the Storage server and can be verified.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Ensure to install any required plugins and restart the Jenkins service if necessary. Opt for Restart Jenkins when installation is complete and no jobs are running on the plugin installation/update page. Refresh the UI page if needed after restarting the service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify that the Jenkins job runs successfully on repeated executions to ensure reliability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Capture screenshots of your configuration for documentation and review purposes. Alternatively, use screen recording software like loom.com for comprehensive documentation and sharing.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Lab Solutions
&lt;/h1&gt;

&lt;p&gt;🧭 Part 1: Lab Step-by-Step Guidelines&lt;/p&gt;

&lt;p&gt;Step 1: Open Jenkins UI&lt;/p&gt;

&lt;p&gt;Click the Jenkins button from the top bar.&lt;/p&gt;

&lt;p&gt;Login with:&lt;/p&gt;

&lt;p&gt;Field       Value&lt;br&gt;
Username    admin&lt;br&gt;
Password    Adm!n321&lt;/p&gt;

&lt;p&gt;Step 2: Create New Jenkins Job&lt;/p&gt;

&lt;p&gt;From dashboard click:&lt;/p&gt;

&lt;p&gt;New Item&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/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/image.png" alt="alt text" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Configure Job Name&lt;/p&gt;

&lt;p&gt;Enter:&lt;/p&gt;

&lt;p&gt;install-packages&lt;/p&gt;

&lt;p&gt;Select:&lt;/p&gt;

&lt;p&gt;Freestyle project&lt;/p&gt;

&lt;p&gt;Click:&lt;/p&gt;

&lt;p&gt;OK&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/image-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/image-1.png" alt="alt text" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Add String Parameter&lt;/p&gt;

&lt;p&gt;Under:&lt;/p&gt;

&lt;p&gt;General&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;p&gt;This project is parameterized&lt;/p&gt;

&lt;p&gt;Click:&lt;/p&gt;

&lt;p&gt;Add Parameter&lt;/p&gt;

&lt;p&gt;Select:&lt;/p&gt;

&lt;p&gt;String Parameter&lt;/p&gt;

&lt;p&gt;Configure:&lt;/p&gt;

&lt;p&gt;Field           Value&lt;br&gt;
Name            PACKAGE&lt;br&gt;
Default Value   vim-enhanced&lt;br&gt;
Description     Package to install&lt;/p&gt;

&lt;p&gt;Step 5: Configure Build Step&lt;/p&gt;

&lt;p&gt;Scroll to:&lt;/p&gt;

&lt;p&gt;Build Steps&lt;/p&gt;

&lt;p&gt;Click:&lt;/p&gt;

&lt;p&gt;Add build step&lt;/p&gt;

&lt;p&gt;Select:&lt;/p&gt;

&lt;p&gt;Execute shell&lt;/p&gt;

&lt;p&gt;Add this script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sshpass -p 'Bl@kW' ssh -o StrictHostKeyChecking=no natasha@ststor01 "
sudo yum install -y $PACKAGE
"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 6: Save Job&lt;/p&gt;

&lt;p&gt;Click:&lt;/p&gt;

&lt;p&gt;Save&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/image-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/image-2.png" alt="alt text" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 7: Build the Job&lt;/p&gt;

&lt;p&gt;Click:&lt;/p&gt;

&lt;p&gt;Build with Parameters&lt;/p&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;p&gt;Parameter   Value&lt;br&gt;
PACKAGE vim-enhanced&lt;/p&gt;

&lt;p&gt;Click:&lt;/p&gt;

&lt;p&gt;Build&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/image-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/image-3.png" alt="alt text" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 8: Verify Build Success&lt;/p&gt;

&lt;p&gt;Open:&lt;/p&gt;

&lt;p&gt;Build History&lt;/p&gt;

&lt;p&gt;Click latest build.&lt;/p&gt;

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

&lt;p&gt;Console Output&lt;/p&gt;

&lt;p&gt;Expected output should show:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Started by user admin

Running as SYSTEM
Building in workspace /var/lib/jenkins/workspace/install-packages
[install-packages] $ /bin/sh -xe /tmp/jenkins11924998561678003613.sh
+ sshpass -p Bl@kW ssh -o StrictHostKeyChecking=no natasha@ststor01 
sudo yum install -y vim-enhanced

Last metadata expiration check: 1:06:35 ago on Sat May 30 04:53:03 2026.
Dependencies resolved.
================================================================================
 Package             Arch        Version                   Repository      Size
================================================================================
Installing:
 vim-enhanced        x86_64      2:8.2.2637-29.el9         appstream      1.7 M
Installing dependencies:
 gpm-libs            x86_64      1.20.7-29.el9             appstream       21 k
 vim-common          x86_64      2:8.2.2637-29.el9         appstream      7.0 M
 vim-filesystem      noarch      2:8.2.2637-29.el9         baseos          14 k

Transaction Summary
================================================================================
Install  4 Packages

Total download size: 8.8 M
Installed size: 34 M
Downloading Packages:
(1/4): gpm-libs-1.20.7-29.el9.x86_64.rpm        146 kB/s |  21 kB     00:00    
(2/4): vim-filesystem-8.2.2637-29.el9.noarch.rp  42 kB/s |  14 kB     00:00    
(3/4): vim-enhanced-8.2.2637-29.el9.x86_64.rpm  6.1 MB/s | 1.7 MB     00:00    
(4/4): vim-common-8.2.2637-29.el9.x86_64.rpm     12 MB/s | 7.0 MB     00:00    
--------------------------------------------------------------------------------
Total                                           7.5 MB/s | 8.8 MB     00:01     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : gpm-libs-1.20.7-29.el9.x86_64                          1/4 
  Installing       : vim-filesystem-2:8.2.2637-29.el9.noarch                2/4 
  Installing       : vim-common-2:8.2.2637-29.el9.x86_64                    3/4 
  Installing       : vim-enhanced-2:8.2.2637-29.el9.x86_64                  4/4 
  Running scriptlet: vim-enhanced-2:8.2.2637-29.el9.x86_64                  4/4 
  Verifying        : vim-filesystem-2:8.2.2637-29.el9.noarch                1/4 
  Verifying        : gpm-libs-1.20.7-29.el9.x86_64                          2/4 
  Verifying        : vim-common-2:8.2.2637-29.el9.x86_64                    3/4 
  Verifying        : vim-enhanced-2:8.2.2637-29.el9.x86_64                  4/4 

Installed:
  gpm-libs-1.20.7-29.el9.x86_64         vim-common-2:8.2.2637-29.el9.x86_64    
  vim-enhanced-2:8.2.2637-29.el9.x86_64 vim-filesystem-2:8.2.2637-29.el9.noarch

Complete!
Finished: SUCCESS
&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/image-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/image-4.png" alt="alt text" width="800" height="400"&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/image-5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/image-5.png" alt="alt text" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🧠 Part 2: Simple Step-by-Step Explanation (Beginner Friendly)&lt;/p&gt;

&lt;p&gt;What This Jenkins Job Does&lt;/p&gt;

&lt;p&gt;This Jenkins job automatically installs software packages on the Storage Server.&lt;/p&gt;

&lt;p&gt;Instead of manually logging into the server every time, Jenkins performs the installation for you.&lt;/p&gt;

&lt;p&gt;Why We Use a Parameter&lt;/p&gt;

&lt;p&gt;The parameter:&lt;/p&gt;

&lt;p&gt;PACKAGE&lt;/p&gt;

&lt;p&gt;makes the Jenkins job reusable.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;PACKAGE Value   What Happens&lt;br&gt;
vim-enhanced    Installs Vim editor&lt;br&gt;
git             Installs Git&lt;br&gt;
wget            Installs wget&lt;/p&gt;

&lt;p&gt;So you can install different packages without changing the job configuration.&lt;/p&gt;

&lt;p&gt;Why Jenkins Uses SSH&lt;/p&gt;

&lt;p&gt;Jenkins runs on its own server.&lt;/p&gt;

&lt;p&gt;To install software on another machine (ststor01), Jenkins must connect remotely using SSH.&lt;/p&gt;

&lt;p&gt;This command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh natasha@ststor01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;means:&lt;/p&gt;

&lt;p&gt;Connect to server ststor01&lt;br&gt;
Login as user natasha&lt;/p&gt;

&lt;p&gt;Why We Use sshpass&lt;/p&gt;

&lt;p&gt;Normally SSH asks for a password manually.&lt;/p&gt;

&lt;p&gt;But Jenkins jobs are automated and cannot type passwords interactively.&lt;/p&gt;

&lt;p&gt;sshpass sends the password automatically so the job can run without human input.&lt;/p&gt;

&lt;p&gt;Why We Use sudo&lt;/p&gt;

&lt;p&gt;The user natasha is not a root user.&lt;/p&gt;

&lt;p&gt;Installing packages requires administrator privileges.&lt;/p&gt;

&lt;p&gt;So we use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo yum install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which temporarily gives admin permissions.&lt;/p&gt;

&lt;p&gt;What This Command Does&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yum install -y $PACKAGE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Breakdown:&lt;/p&gt;

&lt;p&gt;Part        Meaning&lt;br&gt;
yum         Linux package manager&lt;br&gt;
install     Install software&lt;br&gt;
-y          Automatically answer yes&lt;br&gt;
$PACKAGE    Uses Jenkins parameter value&lt;/p&gt;

&lt;p&gt;Why We Run the Job Once&lt;/p&gt;

&lt;p&gt;The lab requires:&lt;/p&gt;

&lt;p&gt;✅ Jenkins job created&lt;br&gt;
✅ Job executed successfully&lt;br&gt;
✅ Package actually installed on Storage Server&lt;/p&gt;

&lt;p&gt;Running the build proves the automation works correctly.&lt;/p&gt;

&lt;p&gt;How To Verify Success&lt;/p&gt;

&lt;p&gt;If the build succeeds, the Console Output usually shows:&lt;/p&gt;

&lt;p&gt;Complete!&lt;/p&gt;

&lt;p&gt;or package installation messages.&lt;/p&gt;

&lt;p&gt;This confirms Jenkins successfully connected to the Storage Server and installed the package.&lt;/p&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Resources &amp;amp; Next Steps&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📦 Full Code Repository: &lt;a href="https://github.com/thukhakyawe/100-Days-Of-DevOps-KodeKloud-Challenges-Solutions" rel="noopener noreferrer"&gt;KodeKloud Learning Labs&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📖 More Deep Dives: &lt;a href="https://thukhakyawe.hashnode.dev/" rel="noopener noreferrer"&gt;Whispering Cloud Insights&lt;/a&gt; - Read other technical articles
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💬 Join Discussion: &lt;a href="https://dev.to/thukhakyawe_cloud"&gt;DEV Community&lt;/a&gt; - Share your thoughts and questions
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💼 Let's Connect: &lt;a href="https://www.linkedin.com/in/thukhakyawe/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; - I'd love to connect with you
&lt;/h5&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Credits&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • All labs are from: &lt;a href="https://kodekloud.com/" rel="noopener noreferrer"&gt;KodeKloud&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • I sincerely appreciate your provision of these valuable resources.
&lt;/h5&gt;




</description>
      <category>jenkins</category>
      <category>kodekloud</category>
    </item>
    <item>
      <title>4.Organize Jenkins Jobs with Folders</title>
      <dc:creator>Thu Kha Kyawe</dc:creator>
      <pubDate>Thu, 28 May 2026 04:57:57 +0000</pubDate>
      <link>https://dev.to/thukhakyawe_cloud/4organize-jenkins-jobs-with-folders-4hhf</link>
      <guid>https://dev.to/thukhakyawe_cloud/4organize-jenkins-jobs-with-folders-4hhf</guid>
      <description>&lt;h1&gt;
  
  
  Lab Information
&lt;/h1&gt;

&lt;p&gt;xFusionCorp Industries' DevOps team aims to streamline the management of Jenkins jobs by organizing them into distinct folders based on their purpose. Complete the task following the provided requirements:&lt;/p&gt;

&lt;p&gt;1.Access the Jenkins UI by clicking on the Jenkins button in the top bar. Log in using the credentials: username admin and password Adm!n321.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a new folder named Apache within the Jenkins UI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move the existing jobs httpd-php and services under the newly created Apache folder.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Ensure to install any required plugins and restart the Jenkins service if necessary. Opt for Restart Jenkins when installation is complete and no jobs are running on the plugin installation/update page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be aware that Jenkins UI may experience temporary unresponsiveness during the service restart. Refresh the UI page if needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Capture screenshots of your work for documentation and review purposes. Alternatively, utilize screen recording software like loom.com for detailed documentation and sharing.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Lab Solutions
&lt;/h1&gt;

&lt;p&gt;🧭 Part 1: Lab Step-by-Step Guidelines&lt;/p&gt;

&lt;p&gt;Step 1: Open Jenkins UI&lt;/p&gt;

&lt;p&gt;Click the Jenkins button from the top bar.&lt;/p&gt;

&lt;p&gt;Login with:&lt;/p&gt;

&lt;p&gt;Field       Value&lt;br&gt;
Username    admin&lt;br&gt;
Password    Adm!n321&lt;/p&gt;

&lt;p&gt;Step 2: Open Plugin Manager&lt;/p&gt;

&lt;p&gt;Go to:&lt;/p&gt;

&lt;p&gt;Manage Jenkins → Plugins&lt;/p&gt;

&lt;p&gt;Step 3: Install CloudBees Folders Plugin&lt;/p&gt;

&lt;p&gt;Open:&lt;/p&gt;

&lt;p&gt;Available plugins&lt;/p&gt;

&lt;p&gt;Search for:&lt;/p&gt;

&lt;p&gt;Folders&lt;/p&gt;

&lt;p&gt;Install:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Folders&lt;/code&gt; which is Maintained by CloudBees&lt;/p&gt;

&lt;p&gt;Step 4: Restart Jenkins (If Prompted)&lt;/p&gt;

&lt;p&gt;If Jenkins shows:&lt;/p&gt;

&lt;p&gt;Restart Jenkins when installation is complete and no jobs are running&lt;/p&gt;

&lt;p&gt;Select it.&lt;/p&gt;

&lt;p&gt;Wait for Jenkins login page to reappear.&lt;/p&gt;

&lt;p&gt;Refresh browser if UI becomes unresponsive.&lt;/p&gt;

&lt;p&gt;Step 5: Login Again&lt;/p&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;p&gt;Username    Password&lt;br&gt;
admin       Adm!n321&lt;/p&gt;

&lt;p&gt;Step 6: Create New Item&lt;/p&gt;

&lt;p&gt;From Jenkins dashboard click:&lt;/p&gt;

&lt;p&gt;New Item&lt;/p&gt;

&lt;p&gt;Step 7: Create Folder&lt;/p&gt;

&lt;p&gt;Enter name:&lt;/p&gt;

&lt;p&gt;Apache&lt;/p&gt;

&lt;p&gt;Select:&lt;/p&gt;

&lt;p&gt;Folder&lt;/p&gt;

&lt;p&gt;Click:&lt;/p&gt;

&lt;p&gt;OK&lt;/p&gt;

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

&lt;p&gt;Save&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%2Fdcxwbocibenvxzvbaw62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdcxwbocibenvxzvbaw62.png" alt=" " width="799" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 8: Open httpd-php Job&lt;/p&gt;

&lt;p&gt;From dashboard click:&lt;/p&gt;

&lt;p&gt;httpd-php&lt;/p&gt;

&lt;p&gt;Step 9: Move httpd-php Job&lt;/p&gt;

&lt;p&gt;On the left sidebar click:&lt;/p&gt;

&lt;p&gt;Move&lt;/p&gt;

&lt;p&gt;Destination:&lt;/p&gt;

&lt;p&gt;Apache&lt;/p&gt;

&lt;p&gt;Confirm move.&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%2Fzlhmmz0dwpa6i69yvorg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzlhmmz0dwpa6i69yvorg.png" alt=" " width="799" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 10: Move services Job&lt;/p&gt;

&lt;p&gt;Repeat same process:&lt;/p&gt;

&lt;p&gt;Open services&lt;br&gt;
Click Move&lt;br&gt;
Select destination:&lt;br&gt;
Apache&lt;br&gt;
Confirm&lt;br&gt;
Verify Structure&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%2Fhsrhrib28h04ej5am56j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhsrhrib28h04ej5am56j.png" alt=" " width="799" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 11: Verify Jobs Inside Apache Folder&lt;/p&gt;

&lt;p&gt;Open:&lt;/p&gt;

&lt;p&gt;Apache&lt;/p&gt;

&lt;p&gt;You should see:&lt;/p&gt;

&lt;p&gt;httpd-php&lt;br&gt;
services&lt;/p&gt;

&lt;p&gt;inside the folder.&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%2F20b0af21g9t4ry80ss3d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F20b0af21g9t4ry80ss3d.png" alt=" " width="799" height="382"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🧠 Part 2: Simple Step-by-Step Explanation (Beginner Friendly)&lt;/p&gt;

&lt;p&gt;What Is a Jenkins Folder?&lt;/p&gt;

&lt;p&gt;Folders help organize Jenkins jobs.&lt;/p&gt;

&lt;p&gt;Instead of keeping all jobs on one dashboard, you can group related jobs together.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;Apache/&lt;br&gt;
 ├── httpd-php&lt;br&gt;
 └── services&lt;br&gt;
Why Install the Folders Plugin?&lt;/p&gt;

&lt;p&gt;Jenkins does not support folders by default.&lt;/p&gt;

&lt;p&gt;The CloudBees Folders Plugin adds:&lt;/p&gt;

&lt;p&gt;Folder creation&lt;br&gt;
Nested job organization&lt;br&gt;
Better CI/CD management&lt;br&gt;
What Does “Move Job” Mean?&lt;/p&gt;

&lt;p&gt;Moving a job changes its location in Jenkins.&lt;/p&gt;

&lt;p&gt;The job itself is not deleted.&lt;/p&gt;

&lt;p&gt;Its:&lt;/p&gt;

&lt;p&gt;Build history&lt;br&gt;
Configuration&lt;br&gt;
Workspace&lt;br&gt;
Settings&lt;/p&gt;

&lt;p&gt;remain intact.&lt;/p&gt;

&lt;p&gt;Why Organize Jobs Into Folders?&lt;/p&gt;

&lt;p&gt;Large Jenkins servers may contain hundreds of jobs.&lt;/p&gt;

&lt;p&gt;Folders help teams:&lt;/p&gt;

&lt;p&gt;Stay organized&lt;br&gt;
Separate environments/projects&lt;br&gt;
Manage permissions more easily&lt;br&gt;
Reduce dashboard clutter&lt;br&gt;
Important Lab Tip&lt;/p&gt;

&lt;p&gt;If you do not see:&lt;/p&gt;

&lt;p&gt;Folder&lt;/p&gt;

&lt;p&gt;during “New Item” creation, the plugin installation likely did not complete yet.&lt;/p&gt;

&lt;p&gt;Wait for Jenkins restart and login again.&lt;/p&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Resources &amp;amp; Next Steps&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📦 Full Code Repository: &lt;a href="https://github.com/thukhakyawe/100-Days-Of-DevOps-KodeKloud-Challenges-Solutions" rel="noopener noreferrer"&gt;KodeKloud Learning Labs&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📖 More Deep Dives: &lt;a href="https://thukhakyawe.hashnode.dev/" rel="noopener noreferrer"&gt;Whispering Cloud Insights&lt;/a&gt; - Read other technical articles
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💬 Join Discussion: &lt;a href="https://dev.to/thukhakyawe_cloud"&gt;DEV Community&lt;/a&gt; - Share your thoughts and questions
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💼 Let's Connect: &lt;a href="https://www.linkedin.com/in/thukhakyawe/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; - I'd love to connect with you
&lt;/h5&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Credits&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • All labs are from: &lt;a href="https://kodekloud.com/" rel="noopener noreferrer"&gt;KodeKloud&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • I sincerely appreciate your provision of these valuable resources.
&lt;/h5&gt;




</description>
      <category>kodekloud</category>
      <category>jenkins</category>
    </item>
    <item>
      <title>3.Configure Jenkins User Access</title>
      <dc:creator>Thu Kha Kyawe</dc:creator>
      <pubDate>Thu, 28 May 2026 04:17:25 +0000</pubDate>
      <link>https://dev.to/thukhakyawe_cloud/3configure-jenkins-user-access-1d93</link>
      <guid>https://dev.to/thukhakyawe_cloud/3configure-jenkins-user-access-1d93</guid>
      <description>&lt;h1&gt;
  
  
  Lab Information
&lt;/h1&gt;

&lt;p&gt;The Nautilus team is integrating Jenkins into their CI/CD pipelines. After setting up a new Jenkins server, they're now configuring user access for the development team, Follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click on the Jenkins button on the top bar to access the Jenkins UI. Login with username admin and password Adm!n321.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a jenkins user named siva with the password B4zNgHA7Ya. Their full name should match Siva.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Utilize the Project-based Matrix Authorization Strategy to assign overall read permission to the siva user.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove all permissions for Anonymous users (if any) ensuring that the admin user retains overall Administer permissions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For the existing job, grant siva user only read permissions, disregarding other permissions such as Agent, SCM etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;You may need to install plugins and restart Jenkins service. After plugins installation, select Restart Jenkins when installation is complete and no jobs are running on plugin installation/update page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After restarting the Jenkins service, wait for the Jenkins login page to reappear before proceeding. Avoid clicking Finish immediately after restarting the service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Capture screenshots of your configuration for review purposes. Consider using screen recording software like loom.com for documentation and sharing.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Lab Solutions
&lt;/h1&gt;

&lt;p&gt;🧭 Part 1: Lab Step-by-Step Guidelines&lt;/p&gt;

&lt;p&gt;Step 1: Open Jenkins UI&lt;/p&gt;

&lt;p&gt;Click the Jenkins button from the lab top bar.&lt;/p&gt;

&lt;p&gt;Login using:&lt;/p&gt;

&lt;p&gt;Field       Value&lt;br&gt;
Username    admin&lt;br&gt;
Password    Adm!n321&lt;/p&gt;

&lt;p&gt;Step 2: Open Plugin Manager&lt;/p&gt;

&lt;p&gt;Go to:&lt;/p&gt;

&lt;p&gt;Manage Jenkins&lt;/p&gt;

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

&lt;p&gt;Plugins&lt;/p&gt;

&lt;p&gt;Step 3: Install Matrix Authorization Plugin&lt;/p&gt;

&lt;p&gt;Open:&lt;/p&gt;

&lt;p&gt;Available plugins&lt;/p&gt;

&lt;p&gt;Search for:&lt;/p&gt;

&lt;p&gt;Matrix Authorization Strategy&lt;/p&gt;

&lt;p&gt;Install the plugin.&lt;/p&gt;

&lt;p&gt;If prompted:&lt;/p&gt;

&lt;p&gt;Restart Jenkins when installation is complete and no jobs are running&lt;/p&gt;

&lt;p&gt;Select it.&lt;/p&gt;

&lt;p&gt;Wait until Jenkins restarts fully.&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%2Fgamd1ct7vnqvfg4rl30t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgamd1ct7vnqvfg4rl30t.png" alt=" " width="800" height="382"&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%2Fps2hyk4opgcg5y1dfkq7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fps2hyk4opgcg5y1dfkq7.png" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Login Again&lt;/p&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;p&gt;Field       Value&lt;br&gt;
Username    admin&lt;br&gt;
Password    Adm!n321&lt;/p&gt;

&lt;p&gt;Step 5: Open Security Realm User Management&lt;/p&gt;

&lt;p&gt;Go to:&lt;/p&gt;

&lt;p&gt;Manage Jenkins → Users&lt;/p&gt;

&lt;p&gt;Click:&lt;/p&gt;

&lt;p&gt;Create User&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%2Fncqozhx90f97jjft6lpo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fncqozhx90f97jjft6lpo.png" alt=" " width="800" height="382"&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%2Fbrokz99hwt9y0mjo11dm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbrokz99hwt9y0mjo11dm.png" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 6: Create User siva&lt;/p&gt;

&lt;p&gt;Use exactly:&lt;/p&gt;

&lt;p&gt;Field               Value&lt;br&gt;
Username            siva&lt;br&gt;
Password            B4zNgHA7Ya&lt;br&gt;
Confirm Password    B4zNgHA7Ya&lt;br&gt;
Full Name           Siva&lt;br&gt;
Email               leave blank or optional&lt;/p&gt;

&lt;p&gt;Click:&lt;/p&gt;

&lt;p&gt;Create User&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%2F68gwut8v2z1ykhfkme8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F68gwut8v2z1ykhfkme8c.png" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 7: Open Security Settings&lt;/p&gt;

&lt;p&gt;Go to:&lt;/p&gt;

&lt;p&gt;Manage Jenkins → Security&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%2Fkm12xubja4ufwy7pbnbx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkm12xubja4ufwy7pbnbx.png" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 8: Configure Authorization Strategy&lt;/p&gt;

&lt;p&gt;Under:&lt;/p&gt;

&lt;p&gt;Authorization&lt;/p&gt;

&lt;p&gt;Select:&lt;/p&gt;

&lt;p&gt;Project-based Matrix Authorization Strategy&lt;/p&gt;

&lt;p&gt;Step 9: Add User siva&lt;/p&gt;

&lt;p&gt;In the user/group field type:&lt;/p&gt;

&lt;p&gt;siva&lt;/p&gt;

&lt;p&gt;Click:&lt;/p&gt;

&lt;p&gt;Add&lt;/p&gt;

&lt;p&gt;Configure Global Permissions&lt;/p&gt;

&lt;p&gt;Step 10: Grant Overall Read Permission to siva&lt;/p&gt;

&lt;p&gt;Under the matrix:&lt;/p&gt;

&lt;p&gt;For user siva check ONLY:&lt;/p&gt;

&lt;p&gt;Overall → Read&lt;/p&gt;

&lt;p&gt;Do NOT select other permissions.&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%2F4nq406pt0oljxudmuknf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4nq406pt0oljxudmuknf.png" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 11: Remove Anonymous Permissions&lt;/p&gt;

&lt;p&gt;Find:&lt;/p&gt;

&lt;p&gt;Anonymous&lt;/p&gt;

&lt;p&gt;Uncheck ALL permissions for Anonymous.&lt;/p&gt;

&lt;p&gt;Important: Add administer permission for admin user if not already present.&lt;/p&gt;

&lt;p&gt;Ensure admin still has:&lt;/p&gt;

&lt;p&gt;Overall → Administer&lt;/p&gt;

&lt;p&gt;Otherwise you may lock yourself out. Then click Save&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%2Fdcy0rsmdomm9wnowrydj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdcy0rsmdomm9wnowrydj.png" alt=" " width="799" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 12: Open Existing Job Configuration&lt;/p&gt;

&lt;p&gt;From Jenkins dashboard:&lt;/p&gt;

&lt;p&gt;Click the existing job.&lt;/p&gt;

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

&lt;p&gt;Configure&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%2Fweygbv8bq3qkkr5hvzcj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fweygbv8bq3qkkr5hvzcj.png" alt=" " width="799" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 13: Enable Project-based Security&lt;/p&gt;

&lt;p&gt;Find:&lt;/p&gt;

&lt;p&gt;Enable project-based security&lt;/p&gt;

&lt;p&gt;Check the box.&lt;/p&gt;

&lt;p&gt;Step 14: Add siva to Job Permissions&lt;/p&gt;

&lt;p&gt;Add user:&lt;/p&gt;

&lt;p&gt;siva&lt;/p&gt;

&lt;p&gt;Grant ONLY:&lt;/p&gt;

&lt;p&gt;Job → Read&lt;/p&gt;

&lt;p&gt;Do NOT grant:&lt;/p&gt;

&lt;p&gt;Build&lt;br&gt;
Configure&lt;br&gt;
Delete&lt;br&gt;
Discover&lt;br&gt;
SCM&lt;br&gt;
Agent&lt;br&gt;
Workspace&lt;br&gt;
Any others&lt;/p&gt;

&lt;p&gt;Step 15: Save Configuration&lt;/p&gt;

&lt;p&gt;Click:&lt;/p&gt;

&lt;p&gt;Save&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%2Fjjsxrua08te99ae7z1zc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjjsxrua08te99ae7z1zc.png" alt=" " width="799" height="382"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🧠 Part 2: Simple Step-by-Step Explanation (Beginner Friendly)&lt;/p&gt;

&lt;p&gt;What Is Matrix Authorization?&lt;/p&gt;

&lt;p&gt;Matrix Authorization lets Jenkins control permissions very precisely.&lt;/p&gt;

&lt;p&gt;You can decide:&lt;/p&gt;

&lt;p&gt;Who can read&lt;br&gt;
Who can build&lt;br&gt;
Who can configure jobs&lt;br&gt;
Who can administer Jenkins&lt;br&gt;
Why Give siva Only Overall Read?&lt;/p&gt;

&lt;p&gt;This allows siva to:&lt;/p&gt;

&lt;p&gt;✅ Login&lt;br&gt;
✅ View Jenkins dashboard&lt;/p&gt;

&lt;p&gt;But NOT:&lt;/p&gt;

&lt;p&gt;❌ Change settings&lt;br&gt;
❌ Create jobs&lt;br&gt;
❌ Manage plugins&lt;br&gt;
❌ Administer Jenkins&lt;/p&gt;

&lt;p&gt;Why Remove Anonymous Permissions?&lt;/p&gt;

&lt;p&gt;Anonymous users are people who are NOT logged in.&lt;/p&gt;

&lt;p&gt;Removing Anonymous permissions prevents unauthorized access.&lt;/p&gt;

&lt;p&gt;This improves security.&lt;/p&gt;

&lt;p&gt;Why Keep Administer Permission for admin?&lt;/p&gt;

&lt;p&gt;Without:&lt;/p&gt;

&lt;p&gt;Overall → Administer&lt;/p&gt;

&lt;p&gt;the admin user loses control of Jenkins.&lt;/p&gt;

&lt;p&gt;You could accidentally lock yourself out completely.&lt;/p&gt;

&lt;p&gt;Why Use Project-based Security?&lt;/p&gt;

&lt;p&gt;Global permissions affect ALL jobs.&lt;/p&gt;

&lt;p&gt;Project-based security lets you control permissions for a specific job only.&lt;/p&gt;

&lt;p&gt;In this lab:&lt;/p&gt;

&lt;p&gt;siva can ONLY view the existing job&lt;br&gt;
Cannot modify or run it&lt;br&gt;
Important Lab Tip&lt;/p&gt;

&lt;p&gt;Before clicking Save on security settings:&lt;/p&gt;

&lt;p&gt;✅ Verify admin still has Administer permission.&lt;/p&gt;

&lt;p&gt;This is the most common Jenkins lab mistake.&lt;/p&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Resources &amp;amp; Next Steps&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📦 Full Code Repository: &lt;a href="https://github.com/thukhakyawe/100-Days-Of-DevOps-KodeKloud-Challenges-Solutions" rel="noopener noreferrer"&gt;KodeKloud Learning Labs&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📖 More Deep Dives: &lt;a href="https://thukhakyawe.hashnode.dev/" rel="noopener noreferrer"&gt;Whispering Cloud Insights&lt;/a&gt; - Read other technical articles
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💬 Join Discussion: &lt;a href="https://dev.to/thukhakyawe_cloud"&gt;DEV Community&lt;/a&gt; - Share your thoughts and questions
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💼 Let's Connect: &lt;a href="https://www.linkedin.com/in/thukhakyawe/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; - I'd love to connect with you
&lt;/h5&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Credits&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • All labs are from: &lt;a href="https://kodekloud.com/" rel="noopener noreferrer"&gt;KodeKloud&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • I sincerely appreciate your provision of these valuable resources.
&lt;/h5&gt;




</description>
      <category>kodekloud</category>
      <category>jenkins</category>
    </item>
    <item>
      <title>2.Install Jenkins Plugins</title>
      <dc:creator>Thu Kha Kyawe</dc:creator>
      <pubDate>Thu, 28 May 2026 04:08:39 +0000</pubDate>
      <link>https://dev.to/thukhakyawe_cloud/2install-jenkins-plugins-1a9m</link>
      <guid>https://dev.to/thukhakyawe_cloud/2install-jenkins-plugins-1a9m</guid>
      <description>&lt;h1&gt;
  
  
  Lab Information
&lt;/h1&gt;

&lt;p&gt;The Nautilus DevOps team has recently setup a Jenkins server, which they want to use for some CI/CD jobs. Before that they want to install some plugins which will be used in most of the jobs. Please find below more details about the task&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click on the Jenkins button on the top bar to access the Jenkins UI. Login using username admin and password Adm!n321.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once logged in, install the Git and GitLab plugins. You may need to restart Jenkins to complete the plugin installation; if required, opt to Restart Jenkins when installation is complete and no jobs are running on the plugin installation/update page (Update Centre).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;After restarting Jenkins, wait for the login page to reappear before proceeding.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For tasks involving web UI changes, capture screenshots to share for review or consider using screen recording software like loom.com for documentation and sharing.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Lab Solutions
&lt;/h1&gt;

&lt;p&gt;🧭 Part 1: Lab Step-by-Step Guidelines&lt;/p&gt;

&lt;p&gt;Step 1: Open Jenkins UI&lt;/p&gt;

&lt;p&gt;Click the Jenkins button from the lab top bar.&lt;/p&gt;

&lt;p&gt;Login using:&lt;/p&gt;

&lt;p&gt;Field       Value&lt;br&gt;
Username    admin&lt;br&gt;
Password    Adm!n321&lt;/p&gt;

&lt;p&gt;Step 2: Open Plugin Manager&lt;/p&gt;

&lt;p&gt;From the Jenkins dashboard:&lt;/p&gt;

&lt;p&gt;Manage Jenkins&lt;/p&gt;

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

&lt;p&gt;Plugins&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%2Fquny3drilheqmm7xojjm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fquny3drilheqmm7xojjm.png" alt=" " width="800" height="382"&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%2Fghj17nh9mjzy2kcbifrk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghj17nh9mjzy2kcbifrk.png" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Install Git Plugin&lt;/p&gt;

&lt;p&gt;Go to:&lt;/p&gt;

&lt;p&gt;Available plugins&lt;/p&gt;

&lt;p&gt;Search for:&lt;/p&gt;

&lt;p&gt;Git&lt;/p&gt;

&lt;p&gt;Check the box for:&lt;/p&gt;

&lt;p&gt;Git&lt;/p&gt;

&lt;p&gt;Step 4: Install GitLab Plugin&lt;/p&gt;

&lt;p&gt;In the search box type:&lt;/p&gt;

&lt;p&gt;GitLab&lt;/p&gt;

&lt;p&gt;Check the box for:&lt;/p&gt;

&lt;p&gt;GitLab&lt;/p&gt;

&lt;p&gt;Step 5: Install Selected Plugins&lt;/p&gt;

&lt;p&gt;Click:&lt;/p&gt;

&lt;p&gt;Install&lt;/p&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;p&gt;Install without restart&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%2Fms8wdmqf7oobcehuvxpk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fms8wdmqf7oobcehuvxpk.png" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 6: Restart Jenkins (If Prompted)&lt;/p&gt;

&lt;p&gt;If Jenkins displays:&lt;/p&gt;

&lt;p&gt;Restart Jenkins when installation is complete and no jobs are running&lt;/p&gt;

&lt;p&gt;Enable/check that option.&lt;/p&gt;

&lt;p&gt;Wait until Jenkins restarts completely.&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%2Fnctbh1h9l99hohlknnpy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnctbh1h9l99hohlknnpy.png" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 7: Verify Jenkins Is Back Online&lt;/p&gt;

&lt;p&gt;Wait for the login page to reappear.&lt;/p&gt;

&lt;p&gt;Login again using:&lt;/p&gt;

&lt;p&gt;Username        Password&lt;br&gt;
admin           Adm!n321&lt;/p&gt;

&lt;p&gt;Step 8: Verify Plugins Installed&lt;/p&gt;

&lt;p&gt;Go to:&lt;/p&gt;

&lt;p&gt;Manage Jenkins → Plugins → Installed plugins&lt;/p&gt;

&lt;p&gt;Verify both plugins appear:&lt;/p&gt;

&lt;p&gt;Git&lt;br&gt;
GitLab&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%2Fy4iqg0xamq74r97afi8z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy4iqg0xamq74r97afi8z.png" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🧠 Part 2: Simple Step-by-Step Explanation (Beginner Friendly)&lt;/p&gt;

&lt;p&gt;What Are Jenkins Plugins?&lt;/p&gt;

&lt;p&gt;Plugins add extra features to Jenkins.&lt;/p&gt;

&lt;p&gt;Without plugins, Jenkins only has basic functionality.&lt;/p&gt;

&lt;p&gt;Why Install the Git Plugin?&lt;/p&gt;

&lt;p&gt;The Git plugin allows Jenkins to:&lt;/p&gt;

&lt;p&gt;Clone repositories&lt;br&gt;
Pull source code&lt;br&gt;
Trigger builds from Git commits&lt;/p&gt;

&lt;p&gt;This is essential for CI/CD pipelines.&lt;/p&gt;

&lt;p&gt;Why Install the GitLab Plugin?&lt;/p&gt;

&lt;p&gt;The GitLab plugin connects Jenkins with GitLab.&lt;/p&gt;

&lt;p&gt;It helps Jenkins:&lt;/p&gt;

&lt;p&gt;Receive webhooks&lt;br&gt;
Trigger jobs automatically&lt;br&gt;
Integrate merge requests and pipelines&lt;/p&gt;

&lt;p&gt;Why Jenkins Sometimes Restarts&lt;/p&gt;

&lt;p&gt;Some plugins modify Jenkins core components.&lt;/p&gt;

&lt;p&gt;A restart ensures:&lt;/p&gt;

&lt;p&gt;New plugins load correctly&lt;br&gt;
Jenkins recognizes new functionality&lt;br&gt;
Why Verify Installed Plugins&lt;/p&gt;

&lt;p&gt;Checking Installed Plugins confirms:&lt;/p&gt;

&lt;p&gt;Installation succeeded&lt;br&gt;
Jenkins loaded the plugins correctly&lt;br&gt;
CI/CD jobs can use them later&lt;/p&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Resources &amp;amp; Next Steps&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📦 Full Code Repository: &lt;a href="https://github.com/thukhakyawe/100-Days-Of-DevOps-KodeKloud-Challenges-Solutions" rel="noopener noreferrer"&gt;KodeKloud Learning Labs&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📖 More Deep Dives: &lt;a href="https://thukhakyawe.hashnode.dev/" rel="noopener noreferrer"&gt;Whispering Cloud Insights&lt;/a&gt; - Read other technical articles
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💬 Join Discussion: &lt;a href="https://dev.to/thukhakyawe_cloud"&gt;DEV Community&lt;/a&gt; - Share your thoughts and questions
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💼 Let's Connect: &lt;a href="https://www.linkedin.com/in/thukhakyawe/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; - I'd love to connect with you
&lt;/h5&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Credits&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • All labs are from: &lt;a href="https://kodekloud.com/" rel="noopener noreferrer"&gt;KodeKloud&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • I sincerely appreciate your provision of these valuable resources.
&lt;/h5&gt;




</description>
      <category>kodekloud</category>
      <category>jenkins</category>
    </item>
    <item>
      <title>1.Set Up Jenkins Server</title>
      <dc:creator>Thu Kha Kyawe</dc:creator>
      <pubDate>Sat, 23 May 2026 03:53:10 +0000</pubDate>
      <link>https://dev.to/thukhakyawe_cloud/1set-up-jenkins-server-4do3</link>
      <guid>https://dev.to/thukhakyawe_cloud/1set-up-jenkins-server-4do3</guid>
      <description>&lt;h1&gt;
  
  
  Lab Information
&lt;/h1&gt;

&lt;p&gt;The DevOps team at xFusionCorp Industries is initiating the setup of CI/CD pipelines and has decided to utilize Jenkins as their server. Execute the task according to the provided requirements:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install Jenkins on the jenkins server using the apt utility only, and start it using the service command.&lt;/p&gt;

&lt;p&gt;If you face a timeout issue while starting the Jenkins service, first check the service status with service jenkins status&lt;br&gt;
Then review the logs in /var/log/jenkins/jenkins.log to identify the cause.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jenkin's admin user name should be theadmin, password should be Adm!n321, full name should be Jim and email should be &lt;a href="mailto:jim@jenkins.stratos.xfusioncorp.com"&gt;jim@jenkins.stratos.xfusioncorp.com&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;To access the jenkins server, connect from the jump host using the root user with the password S3curePass.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After Jenkins server installation, click the Jenkins button on the top bar to access the Jenkins UI and follow on-screen instructions to create an admin user.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  Lab Solutions
&lt;/h1&gt;

&lt;p&gt;🧭 Part 1: Lab Step-by-Step Guidelines&lt;/p&gt;

&lt;p&gt;Step 1: Connect to the Jenkins Server from the Jump Host&lt;/p&gt;

&lt;p&gt;From the jump host terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="k"&gt;ssh&lt;/span&gt; root@jenkins

&lt;span class="c1"&gt;# Password:&lt;/span&gt;

&lt;span class="k"&gt;S3curePass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2: Update Package Index&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: Install Java (Required for Jenkins)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;openjdk-21-jre &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Verify Java:
&lt;/h1&gt;

&lt;p&gt;java -version&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Step 4: Add Jenkins Repository Key

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;wget -O /usr/share/keyrings/jenkins-keyring.asc \&lt;br&gt;
&lt;a href="https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key" rel="noopener noreferrer"&gt;https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Step 5: Add Jenkins Repository

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \&lt;br&gt;
&lt;a href="https://pkg.jenkins.io/debian-stable" rel="noopener noreferrer"&gt;https://pkg.jenkins.io/debian-stable&lt;/a&gt; binary/ | tee \&lt;br&gt;
/etc/apt/sources.list.d/jenkins.list &amp;gt; /dev/null&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Step 6: Update apt Again

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;apt update&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Step 7: Install Jenkins Using apt ONLY

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;apt install jenkins -y&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
Step 8: Start Jenkins Service

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;service jenkins start&lt;/p&gt;

&lt;h1&gt;
  
  
  Check status:
&lt;/h1&gt;

&lt;p&gt;service jenkins status&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Step 9: If Jenkins Fails or Times Out

Check service status:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;service jenkins status&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Check logs:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;cat /var/log/jenkins/jenkins.log&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Common fix:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;systemctl daemon-reload&lt;br&gt;
service jenkins restart&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
Then recheck:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;service jenkins status&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

Step 10: Get Initial Admin Password

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;cat /var/lib/jenkins/secrets/initialAdminPassword&lt;/p&gt;



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


Copy the password.

Step 11: Open Jenkins UI

Open browser and click the Jenkins button from the lab top bar.

Or access:

http://&amp;lt;jenkins-server&amp;gt;:8080


Step 12: Unlock Jenkins

Paste the initial admin password.

Choose:

Install suggested plugins

![alt text](image.png)

Wait for installation.

Step 13: Create Admin User

Use these exact details:

Field               Value
Username            theadmin
Password            Adm!n321
Confirm Password    Adm!n321
Full Name           Jim
Email               jim@jenkins.stratos.xfusioncorp.com

Click:

Save and Continue

Then:

Start using Jenkins

![alt text](image-1.png)

![alt text](image-2.png)

![alt text](image-3.png)

![alt text](image-4.png)

---

🧠 Part 2: Simple Step-by-Step Explanation (Beginner Friendly)

What You Are Doing

You are setting up a Jenkins CI/CD server.

Jenkins helps automate:

Building applications
Running tests
Deploying software
Why Java Is Installed

Jenkins is a Java application.

Without Java, Jenkins cannot run.

Why We Add Jenkins Repository

Ubuntu/Debian default repositories may not contain the latest Jenkins package.

So we:

Add Jenkins official repository
Add its security key
Install Jenkins safely using apt
Why We Use service jenkins start

This command starts the Jenkins server process.

After starting, Jenkins listens on:

Port 8080
Why We Check Logs

If Jenkins fails to start:

Java may be missing
Port may be busy
Configuration may be broken

Logs in:

/var/log/jenkins/jenkins.log

help identify the exact issue.

What the Initial Admin Password Does

The first time Jenkins starts, it locks itself for security.

The password file:

/var/lib/jenkins/secrets/initialAdminPassword

is used to unlock Jenkins setup.

Why You Create an Admin User

This becomes the main Jenkins administrator account.

In this lab:

Username: theadmin
Password: Adm!n321

This account manages pipelines, jobs, plugins, and users.

---
##### **Resources &amp;amp; Next Steps**
##### 📦 Full Code Repository: [KodeKloud Learning Labs](https://github.com/thukhakyawe/100-Days-Of-DevOps-KodeKloud-Challenges-Solutions)
##### 📖 More Deep Dives: [Whispering Cloud Insights](https://thukhakyawe.hashnode.dev/) - Read other technical articles
##### 💬 Join Discussion: [DEV Community](https://dev.to/thukhakyawe_cloud) - Share your thoughts and questions
##### 💼 Let's Connect: [LinkedIn](https://www.linkedin.com/in/thukhakyawe/) - I'd love to connect with you
---
##### **Credits**
##### • All labs are from: [KodeKloud](https://kodekloud.com/)
##### • I sincerely appreciate your provision of these valuable resources.
---
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>jenkins</category>
      <category>kodekloud</category>
    </item>
    <item>
      <title>10.Translate Content with AI</title>
      <dc:creator>Thu Kha Kyawe</dc:creator>
      <pubDate>Fri, 22 May 2026 17:00:27 +0000</pubDate>
      <link>https://dev.to/thukhakyawe_cloud/10translate-content-with-ai-5e1k</link>
      <guid>https://dev.to/thukhakyawe_cloud/10translate-content-with-ai-5e1k</guid>
      <description>&lt;h1&gt;
  
  
  Lab Information
&lt;/h1&gt;

&lt;p&gt;The devops AI team is focusing on improving their translation capabilities by using OpenAI's API. Begin by creating a new Python file named translator.py inside the /root/openaiproject directory. Import the OpenAI class in this file to enable interaction with OpenAI models.&lt;/p&gt;

&lt;p&gt;Inside translator.py, create an OpenAI client using the API key and base URL provided for this session. Additionally, create a function named translate_to_language(text: str, language: str) -&amp;gt; str. This function should build a parameterized prompt that asks the AI to translate the English text into Spanish and French.&lt;/p&gt;

&lt;p&gt;Use the following text for translation:&lt;br&gt;
Good morning, how are you?&lt;/p&gt;

&lt;p&gt;Finally, update the file to send the prompt to the OpenAI model using:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model: openai/gpt-4.1-mini
messages: user → prompt
max_tokens: 100
temperature: 0.7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then print the translated Spanish &amp;amp; French output to the console.&lt;/p&gt;

&lt;p&gt;Notes:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ensure you are working in the /root/openaiproject directory.

Create and use the OpenAI client with API key + base_url from /root/.bash_profile.

Function must accept parameters text and language.

Prompt must be parameterized.

Use hardcoded values for api_key and base_url when initializing the OpenAI client or read them from environment variables via os.environ.get('OPENAI_API_KEY') and os.environ.get('OPENAI_BASE_URL').

Before running, create a virtual environment and install OpenAI:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;python3 -m venv venv &amp;amp;&amp;amp; source venv/bin/activate &amp;amp;&amp;amp; pip install openai&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are allowed a maximum of 10 requests. After this, you may encounter a rate limiter error, so use your calls wisely
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Lab Solutions
&lt;/h1&gt;

&lt;p&gt;🧭 Part 1: Lab Step-by-Step Guidelines&lt;/p&gt;

&lt;p&gt;Step 1: Navigate to the project directory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root/openaiproject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2: Create and activate the virtual environment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: Install the OpenAI package&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;openai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4: Create the translator.py file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vi translator.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize OpenAI client
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_BASE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Function to translate text
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;translate_to_language&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Translate the following English text into &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.

Text:
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai/gpt-4.1-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.7&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;


&lt;span class="c1"&gt;# Text for translation
&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Good morning, how are you?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Translate to Spanish
&lt;/span&gt;&lt;span class="n"&gt;spanish_translation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;translate_to_language&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Spanish&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Translate to French
&lt;/span&gt;&lt;span class="n"&gt;french_translation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;translate_to_language&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;French&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Print translations
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Spanish Translation:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spanish_translation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;French Translation:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;french_translation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 5: Save and exit vi editor&lt;/p&gt;

&lt;p&gt;Step 6: Load environment variables&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; /root/.bash_profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 7: Run the script&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python translator.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected Output Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Spanish Translation:
Buenos días, ¿cómo estás?

French Translation:
Bonjour, comment ça va ?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🧠 Part 2: Simple Step-by-Step Explanation (Beginner Friendly)&lt;/p&gt;

&lt;p&gt;What this lab does&lt;/p&gt;

&lt;p&gt;You are building an AI-powered translator.&lt;/p&gt;

&lt;p&gt;The script:&lt;/p&gt;

&lt;p&gt;Takes English text&lt;br&gt;
Sends it to an AI model&lt;br&gt;
Requests translations into other languages&lt;br&gt;
Prints the translated text&lt;br&gt;
Understanding the Code&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Importing modules&lt;br&gt;
import os&lt;br&gt;
from openai import OpenAI&lt;br&gt;
os reads environment variables&lt;br&gt;
OpenAI connects Python to the AI API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creating the OpenAI client&lt;br&gt;
client = OpenAI(&lt;br&gt;
api_key=os.environ.get("OPENAI_API_KEY"),&lt;br&gt;
base_url=os.environ.get("OPENAI_API_BASE")&lt;br&gt;
)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This connects your Python script to the AI server using credentials stored in /root/.bash_profile.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creating the translate_to_language function
def translate_to_language(text: str, language: str) -&amp;gt; str:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This function accepts:&lt;/p&gt;

&lt;p&gt;text → the English sentence&lt;br&gt;
language → target translation language&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;translate_to_language("Hello", "Spanish")&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Building the AI prompt
prompt = f"""
Translate the following English text into {language}.
"""&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The f creates an f-string.&lt;/p&gt;

&lt;p&gt;Python automatically inserts:&lt;/p&gt;

&lt;p&gt;the text&lt;br&gt;
the target language&lt;/p&gt;

&lt;p&gt;into the prompt.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sending the request to the AI
response = client.chat.completions.create(&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This sends the translation request to the AI model.&lt;/p&gt;

&lt;p&gt;Important settings:&lt;/p&gt;

&lt;p&gt;model="openai/gpt-4.1-mini" → supported model&lt;br&gt;
max_tokens=100 → enough space for translations&lt;br&gt;
temperature=0.7 → more natural language output&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Extracting the AI response
response.choices[0].message.content&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This extracts only the translated text from the API response.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Printing translations
print(spanish_translation)
print(french_translation)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Displays both translated outputs in the terminal.&lt;/p&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Resources &amp;amp; Next Steps&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📦 Full Code Repository: &lt;a href="https://github.com/thukhakyawe/100-Days-Of-DevOps-KodeKloud-Challenges-Solutions" rel="noopener noreferrer"&gt;KodeKloud Learning Labs&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📖 More Deep Dives: &lt;a href="https://thukhakyawe.hashnode.dev/" rel="noopener noreferrer"&gt;Whispering Cloud Insights&lt;/a&gt; - Read other technical articles
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💬 Join Discussion: &lt;a href="https://dev.to/thukhakyawe_cloud"&gt;DEV Community&lt;/a&gt; - Share your thoughts and questions
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💼 Let's Connect: &lt;a href="https://www.linkedin.com/in/thukhakyawe/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; - I'd love to connect with you
&lt;/h5&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Credits&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • All labs are from: &lt;a href="https://kodekloud.com/" rel="noopener noreferrer"&gt;KodeKloud&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • I sincerely appreciate your provision of these valuable resources.
&lt;/h5&gt;




</description>
      <category>ai</category>
      <category>kodekloud</category>
    </item>
    <item>
      <title>9.Summarize Text with AI</title>
      <dc:creator>Thu Kha Kyawe</dc:creator>
      <pubDate>Fri, 22 May 2026 16:58:45 +0000</pubDate>
      <link>https://dev.to/thukhakyawe_cloud/9summarize-text-with-ai-2o79</link>
      <guid>https://dev.to/thukhakyawe_cloud/9summarize-text-with-ai-2o79</guid>
      <description>&lt;h1&gt;
  
  
  Lab Information
&lt;/h1&gt;

&lt;p&gt;The xfusion AI Engineering Team is building an intelligent Summarization Assistant designed to transform lengthy or unclear developer-reported issues into concise, easy-to-understand one-line summaries. This helps improve clarity, reduce ambiguity, and make bug reports easier to analyze and reproduce.&lt;/p&gt;

&lt;p&gt;Inside /root/openaiproject/summarizer.py, create an OpenAI client using the api_key and base_url provided for this session. Additionally, create a function named summarize(text: str) -&amp;gt; str. This function should build a parameterized prompt that asks the AI to summarize the given paragraph into a single-line summary.&lt;/p&gt;

&lt;p&gt;Use the following paragraph for summarization:&lt;/p&gt;

&lt;p&gt;Artificial Intelligence enables machines to mimic human intelligence, performing tasks such as learning, problem-solving, and decision-making with increasing accuracy.&lt;/p&gt;

&lt;p&gt;Then send the previously defined prompt to the OpenAI chat model, save the result in a variable named response, and print the one-line summary to the console.&lt;/p&gt;

&lt;p&gt;Model requirements:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model: openai/gpt-4.1-mini
messages: role=user, content=prompt
max_tokens: 60
temperature: 0.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Notes:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your work directory must be /root/openaiproject.

OpenAI api_key and base_url are stored in /root/.bash_profile.

Prompt must be parameterized with the input paragraph.

Use hardcoded values for api_key and base_url when initializing the OpenAI client or read them from environment variables via os.environ.get('OPENAI_API_KEY') and os.environ.get('OPENAI_BASE_URL').

Before running, create and activate a virtual environment:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;python3 -m venv venv &amp;amp;&amp;amp; source venv/bin/activate &amp;amp;&amp;amp; pip install openai&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are allowed a maximum of 10 requests. After this, you may encounter a rate limiter error, so use your calls wisely.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h1&gt;
  
  
  Lab Solutions
&lt;/h1&gt;

&lt;p&gt;🧭 Part 1: Lab Step-by-Step Guidelines&lt;/p&gt;

&lt;p&gt;Step 1: Navigate to the project directory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root/openaiproject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2: Create and activate the virtual environment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: Install the OpenAI package&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;openai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4: Create the summarizer.py file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vi summarizer.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize OpenAI client
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_BASE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Function to summarize text
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;summarize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Summarize the following paragraph into a single concise line.

Paragraph:
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai/gpt-4.1-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;


&lt;span class="c1"&gt;# Paragraph for summarization
&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Artificial Intelligence enables machines to mimic human intelligence,
performing tasks such as learning, problem-solving, and decision-making
with increasing accuracy.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="c1"&gt;# Store AI response
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;summarize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Print summary
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 5: Save and exit vi editor&lt;/p&gt;

&lt;p&gt;CTRL + X&lt;br&gt;
Y&lt;br&gt;
ENTER&lt;/p&gt;

&lt;p&gt;Step 6: Load environment variables&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; /root/.bash_profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 7: Run the script&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python summarizer.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected Output Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Artificial Intelligence allows machines to replicate human intelligence by learning, problem-solving, and making decisions accurately.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🧠 Part 2: Simple Step-by-Step Explanation (Beginner Friendly)&lt;/p&gt;

&lt;p&gt;What this lab does&lt;/p&gt;

&lt;p&gt;You are building an AI-powered text summarizer.&lt;/p&gt;

&lt;p&gt;The script:&lt;/p&gt;

&lt;p&gt;Takes a paragraph as input&lt;br&gt;
Sends it to an AI model&lt;br&gt;
Requests a one-line summary&lt;br&gt;
Prints the summarized result&lt;br&gt;
Understanding the Code&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Importing modules&lt;br&gt;
import os&lt;br&gt;
from openai import OpenAI&lt;br&gt;
os reads environment variables&lt;br&gt;
OpenAI connects Python to the AI API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creating the OpenAI client&lt;br&gt;
client = OpenAI(&lt;br&gt;
api_key=os.environ.get("OPENAI_API_KEY"),&lt;br&gt;
base_url=os.environ.get("OPENAI_API_BASE")&lt;br&gt;
)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This connects your script to the OpenAI-compatible API server.&lt;/p&gt;

&lt;p&gt;Credentials are stored securely in /root/.bash_profile.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creating the summarize function
def summarize(text: str) -&amp;gt; str:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This function accepts any paragraph as input.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;summarize("Python is a programming language.")&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Building the AI prompt
prompt = f"""
Summarize the following paragraph...
"""&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The f creates an f-string.&lt;/p&gt;

&lt;p&gt;Python automatically inserts the paragraph into the prompt.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sending the request to the AI
response = client.chat.completions.create(&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This sends the summarization request to the AI model.&lt;/p&gt;

&lt;p&gt;Important settings:&lt;/p&gt;

&lt;p&gt;model="openai/gpt-4.1-mini" → supported AI model&lt;br&gt;
max_tokens=60 → short response limit&lt;br&gt;
temperature=0.5 → balanced creativity and consistency&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Extracting the AI response
response.choices[0].message.content&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This extracts only the generated summary text.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Printing the summary
print(response)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Displays the one-line AI-generated summary in the terminal.&lt;/p&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Resources &amp;amp; Next Steps&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📦 Full Code Repository: &lt;a href="https://github.com/thukhakyawe/100-Days-Of-DevOps-KodeKloud-Challenges-Solutions" rel="noopener noreferrer"&gt;KodeKloud Learning Labs&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📖 More Deep Dives: &lt;a href="https://thukhakyawe.hashnode.dev/" rel="noopener noreferrer"&gt;Whispering Cloud Insights&lt;/a&gt; - Read other technical articles
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💬 Join Discussion: &lt;a href="https://dev.to/thukhakyawe_cloud"&gt;DEV Community&lt;/a&gt; - Share your thoughts and questions
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💼 Let's Connect: &lt;a href="https://www.linkedin.com/in/thukhakyawe/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; - I'd love to connect with you
&lt;/h5&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Credits&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • All labs are from: &lt;a href="https://kodekloud.com/" rel="noopener noreferrer"&gt;KodeKloud&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • I sincerely appreciate your provision of these valuable resources.
&lt;/h5&gt;




</description>
      <category>ai</category>
      <category>kodekloud</category>
    </item>
    <item>
      <title>8.Generate Haikus with AI</title>
      <dc:creator>Thu Kha Kyawe</dc:creator>
      <pubDate>Fri, 22 May 2026 16:56:52 +0000</pubDate>
      <link>https://dev.to/thukhakyawe_cloud/8generate-haikus-with-ai-3kgn</link>
      <guid>https://dev.to/thukhakyawe_cloud/8generate-haikus-with-ai-3kgn</guid>
      <description>&lt;h1&gt;
  
  
  Lab Information
&lt;/h1&gt;

&lt;p&gt;The datacenter AI Development Team is experimenting with how artificial intelligence can create expressive short poetry through automation. In this task, you are required to build a Python-based AI module that generates three-line haikus (5-7-5 syllable pattern) based on a given topic.&lt;/p&gt;

&lt;p&gt;Inside /root/openaiproject/haiku_generator.py, create an OpenAI client using the api_key and base_url provided for this session. Additionally, define a function named generate_haiku(topic: str) -&amp;gt; str. This function should construct a parameterized prompt that instructs the AI to generate a haiku about the specified topic, strictly following the 5-7-5 syllable structure.&lt;/p&gt;

&lt;p&gt;Then, send the parameterized prompt to the OpenAI chat model using:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model: openai/gpt-4.1-mini
prompt: parameterized_prompt
max_tokens: 60
temperature: 0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Store the output in a variable named response and print the generated haiku (three distinct lines). Use the topic:&lt;/p&gt;

&lt;p&gt;Topic: 'sky'&lt;/p&gt;

&lt;p&gt;Notes:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Function should accept one parameter: topic.

Use the provided OpenAI  api_key and base_url under /root/.bash_profile.

The prompt must be parameterized with the topic.

Ensure you are working inside /root/openaiproject.

Use hardcoded values for api_key and base_url when initializing the OpenAI client or read them from environment variables via os.environ.get('OPENAI_API_KEY') and os.environ.get('OPENAI_BASE_URL').

Before running, create and activate a virtual environment and install OpenAI:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;python3 -m venv venv &amp;amp;&amp;amp; source venv/bin/activate &amp;amp;&amp;amp; pip install openai&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Final output should display three distinct lines (the haiku).

You are allowed a maximum of 10 requests before hitting rate limits.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h1&gt;
  
  
  Lab Solutions
&lt;/h1&gt;

&lt;p&gt;🧭 Part 1: Lab Step-by-Step Guidelines&lt;/p&gt;

&lt;p&gt;Step 1: Navigate to the project directory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root/openaiproject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2: Create and activate the virtual environment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: Install the OpenAI package&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;openai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4: Create the haiku_generator.py file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vi haiku_generator.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize OpenAI client
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_BASE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Function to generate haiku
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_haiku&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Generate a haiku about &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.

The haiku must:
- Follow the 5-7-5 syllable structure
- Contain exactly three lines
- Be concise and poetic
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai/gpt-4.1-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;


&lt;span class="c1"&gt;# Topic for haiku
&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sky&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Store AI response
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_haiku&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Print haiku
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 5: Save and exit vi editor&lt;br&gt;
Press &lt;code&gt;Esc&lt;/code&gt;, then type &lt;code&gt;:wq&lt;/code&gt; and hit &lt;code&gt;Enter&lt;/code&gt; to save and exit.&lt;/p&gt;

&lt;p&gt;Step 6: Load environment variables&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; /root/.bash_profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 7: Run the script&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python haiku_generator.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected Output Example&lt;/p&gt;

&lt;p&gt;Endless blue canvas,&lt;br&gt;&lt;br&gt;
Whispers of clouds drift softly,&lt;br&gt;&lt;br&gt;
Dreams float with the breeze.&lt;/p&gt;




&lt;p&gt;🧠 Part 2: Simple Step-by-Step Explanation (Beginner Friendly)&lt;/p&gt;

&lt;p&gt;What this lab does&lt;/p&gt;

&lt;p&gt;You are building an AI-powered poetry generator.&lt;/p&gt;

&lt;p&gt;The script:&lt;/p&gt;

&lt;p&gt;Takes a topic as input&lt;br&gt;
Sends it to an AI model&lt;br&gt;
Requests a haiku poem&lt;br&gt;
Prints the generated haiku&lt;/p&gt;

&lt;p&gt;A haiku is a short Japanese-style poem with:&lt;/p&gt;

&lt;p&gt;Line 1 → 5 syllables&lt;br&gt;
Line 2 → 7 syllables&lt;br&gt;
Line 3 → 5 syllables&lt;br&gt;
Understanding the Code&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Importing modules&lt;br&gt;
import os&lt;br&gt;
from openai import OpenAI&lt;br&gt;
os reads environment variables&lt;br&gt;
OpenAI connects Python to the AI API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creating the OpenAI client&lt;br&gt;
client = OpenAI(&lt;br&gt;
api_key=os.environ.get("OPENAI_API_KEY"),&lt;br&gt;
base_url=os.environ.get("OPENAI_API_BASE")&lt;br&gt;
)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This connects your Python script to the AI server using credentials stored in /root/.bash_profile.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creating the generate_haiku function
def generate_haiku(topic: str) -&amp;gt; str:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This function accepts a topic as input.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;generate_haiku("ocean")&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Building the AI prompt
prompt = f"""
Generate a haiku about {topic}.
"""&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The f creates an f-string.&lt;/p&gt;

&lt;p&gt;Python automatically inserts the topic into the prompt.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sending the request to the AI
response = client.chat.completions.create(&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This sends the poetry request to the AI model.&lt;/p&gt;

&lt;p&gt;Important settings:&lt;/p&gt;

&lt;p&gt;model="openai/gpt-4.1-mini" → supported AI model&lt;br&gt;
max_tokens=60 → enough space for 3 short lines&lt;br&gt;
temperature=0.0 → more consistent structure and formatting&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Extracting the AI response
response.choices[0].message.content&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This extracts only the generated haiku text.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Printing the haiku
print(response)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Displays the three-line haiku in the terminal.&lt;/p&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Resources &amp;amp; Next Steps&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📦 Full Code Repository: &lt;a href="https://github.com/thukhakyawe/100-Days-Of-DevOps-KodeKloud-Challenges-Solutions" rel="noopener noreferrer"&gt;KodeKloud Learning Labs&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  📖 More Deep Dives: &lt;a href="https://thukhakyawe.hashnode.dev/" rel="noopener noreferrer"&gt;Whispering Cloud Insights&lt;/a&gt; - Read other technical articles
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💬 Join Discussion: &lt;a href="https://dev.to/thukhakyawe_cloud"&gt;DEV Community&lt;/a&gt; - Share your thoughts and questions
&lt;/h5&gt;

&lt;h5&gt;
  
  
  💼 Let's Connect: &lt;a href="https://www.linkedin.com/in/thukhakyawe/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; - I'd love to connect with you
&lt;/h5&gt;




&lt;h5&gt;
  
  
  &lt;strong&gt;Credits&lt;/strong&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • All labs are from: &lt;a href="https://kodekloud.com/" rel="noopener noreferrer"&gt;KodeKloud&lt;/a&gt;
&lt;/h5&gt;

&lt;h5&gt;
  
  
  • I sincerely appreciate your provision of these valuable resources.
&lt;/h5&gt;




</description>
      <category>ai</category>
      <category>kodekloud</category>
    </item>
  </channel>
</rss>
