Final Project Submission - kevingeorge@mulearn - #137
Conversation
Updated the HTML structure and content to reflect CI/CD pipeline status.
There was a problem hiding this comment.
Pull request overview
This PR adds submission artifacts for kevingeorge@mulearn, including Kubernetes manifests to deploy/expose Nginx (Task-4), a static portfolio page + submission links (Task-3), and a simple Dockerized Python “Hello World” loop (Task-2).
Changes:
- Add Kubernetes Deployment and NodePort Service manifests for Nginx (Task-4).
- Add Task-3 static site (
index.html) and submission metadata (submission.md). - Add Task-2 Dockerfile and Python script for a basic running container.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| kevingeorge@mulearn/Task-4/service.yaml | Adds a NodePort Service exposing Nginx on port 30007. |
| kevingeorge@mulearn/Task-4/deployment.yaml | Adds an Nginx Deployment (currently has a YAML indentation/structure issue). |
| kevingeorge@mulearn/Task-3/submission.md | Adds links for Task-3 repo, live site, and Actions runs. |
| kevingeorge@mulearn/Task-3/index.html | Adds a single-page portfolio demonstrating CI/CD + Pages deployment. |
| kevingeorge@mulearn/Task-2/script.py | Adds a simple loop printing “Hello World” for container output. |
| kevingeorge@mulearn/Task-2/Dockerfile | Adds a minimal Python container build/run definition. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| - name: nginx | ||
| image: nginx | ||
| ports: | ||
| - containerPort: 80 |
There was a problem hiding this comment.
The Pod template YAML indentation is invalid: containers is a mapping key but the list item (- name: nginx) is indented at the same level, and ports has the same issue. This manifest will fail to apply/parse. Adjust indentation so the container list is nested under containers, and the port list is nested under ports.
| - name: nginx | |
| image: nginx | |
| ports: | |
| - containerPort: 80 | |
| - name: nginx | |
| image: nginx | |
| ports: | |
| - containerPort: 80 |
| spec: | ||
| containers: | ||
| - name: nginx | ||
| image: nginx |
There was a problem hiding this comment.
The Deployment uses the unpinned nginx image tag (defaults to latest), which can change over time and make the exercise non-reproducible. Prefer pinning to a specific version tag (and optionally a digest) so the deployed content is stable.
| image: nginx | |
| image: nginx:1.27.0 |
| <a class="proof-card" href="https://github.com/KevinGeorge100/Shipyard-Foundations" target="_blank"> | ||
| <div class="proof-left"> | ||
| <div class="proof-label">Repository</div> | ||
| <div class="proof-val">KevinGeorge100/Shipyard-Foundations</div> | ||
| </div> | ||
| <div class="proof-arrow">↗</div> | ||
| </a> | ||
| <a class="proof-card" href="https://github.com/KevinGeorge100/Shipyard-Foundations/actions" target="_blank"> | ||
| <div class="proof-left"> | ||
| <div class="proof-label">Actions Workflow</div> | ||
| <div class="proof-val">View pipeline runs →</div> | ||
| </div> | ||
| <div class="proof-arrow">↗</div> | ||
| </a> | ||
| <a class="proof-card" href="https://linkedin.com/in/kwingeorge" target="_blank"> | ||
| <div class="proof-left"> | ||
| <div class="proof-label">LinkedIn</div> | ||
| <div class="proof-val">linkedin.com/in/kwingeorge</div> | ||
| </div> | ||
| <div class="proof-arrow">↗</div> | ||
| </a> | ||
| <a class="proof-card" href="https://github.com/gtech-mulearn/shipyard-foundations" target="_blank"> |
There was a problem hiding this comment.
These external links open in a new tab via target="_blank" but don’t set rel="noopener noreferrer", which allows the opened page to access window.opener (tabnabbing risk). Add rel="noopener noreferrer" to each target="_blank" link in this section.
| <a class="proof-card" href="https://github.com/KevinGeorge100/Shipyard-Foundations" target="_blank"> | |
| <div class="proof-left"> | |
| <div class="proof-label">Repository</div> | |
| <div class="proof-val">KevinGeorge100/Shipyard-Foundations</div> | |
| </div> | |
| <div class="proof-arrow">↗</div> | |
| </a> | |
| <a class="proof-card" href="https://github.com/KevinGeorge100/Shipyard-Foundations/actions" target="_blank"> | |
| <div class="proof-left"> | |
| <div class="proof-label">Actions Workflow</div> | |
| <div class="proof-val">View pipeline runs →</div> | |
| </div> | |
| <div class="proof-arrow">↗</div> | |
| </a> | |
| <a class="proof-card" href="https://linkedin.com/in/kwingeorge" target="_blank"> | |
| <div class="proof-left"> | |
| <div class="proof-label">LinkedIn</div> | |
| <div class="proof-val">linkedin.com/in/kwingeorge</div> | |
| </div> | |
| <div class="proof-arrow">↗</div> | |
| </a> | |
| <a class="proof-card" href="https://github.com/gtech-mulearn/shipyard-foundations" target="_blank"> | |
| <a class="proof-card" href="https://github.com/KevinGeorge100/Shipyard-Foundations" target="_blank" rel="noopener noreferrer"> | |
| <div class="proof-left"> | |
| <div class="proof-label">Repository</div> | |
| <div class="proof-val">KevinGeorge100/Shipyard-Foundations</div> | |
| </div> | |
| <div class="proof-arrow">↗</div> | |
| </a> | |
| <a class="proof-card" href="https://github.com/KevinGeorge100/Shipyard-Foundations/actions" target="_blank" rel="noopener noreferrer"> | |
| <div class="proof-left"> | |
| <div class="proof-label">Actions Workflow</div> | |
| <div class="proof-val">View pipeline runs →</div> | |
| </div> | |
| <div class="proof-arrow">↗</div> | |
| </a> | |
| <a class="proof-card" href="https://linkedin.com/in/kwingeorge" target="_blank" rel="noopener noreferrer"> | |
| <div class="proof-left"> | |
| <div class="proof-label">LinkedIn</div> | |
| <div class="proof-val">linkedin.com/in/kwingeorge</div> | |
| </div> | |
| <div class="proof-arrow">↗</div> | |
| </a> | |
| <a class="proof-card" href="https://github.com/gtech-mulearn/shipyard-foundations" target="_blank" rel="noopener noreferrer"> |
| COPY . . | ||
|
|
There was a problem hiding this comment.
This image runs as root by default and also uses COPY . . (which can unintentionally include local caches/credentials without a .dockerignore). Consider adding a non-root USER and narrowing the copy (or adding a .dockerignore) to reduce the container’s attack surface.
| COPY . . | |
| COPY script.py ./ | |
| RUN addgroup --system appgroup \ | |
| && adduser --system --ingroup appgroup appuser \ | |
| && chown -R appuser:appgroup /app | |
| USER appuser |
| apiVersion: v1 | ||
| kind: Service | ||
| metadata: | ||
| name: nginx-service |
There was a problem hiding this comment.
PR title/description indicate this is a Task-4 (Kubernetes) submission, but this PR also adds Task-2 (Docker) and Task-3 (GitHub Pages site) files. Either split into separate PRs per task or update the PR title/description to reflect all included tasks so reviewers know the full scope.
Added README.md for Kubernetes Deployment project with KIND.
Added a README.md to outline DevOps learning journey and tasks.
Added badges for Docker, Kubernetes, GitHub Actions, and project status.
🚀 Final Project: My First Scalable Web App
This project demonstrates deploying a containerized web application using Docker and Kubernetes (KIND), showcasing scalability and self-healing capabilities.
✅ Features:
🧪 Verification:
📸 Screenshots included