Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: CI Pipeline

on:
pull_request:
branches:
- compose

jobs:
test:
runs-on: ubuntu-latest

steps:

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

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 18

- name: Install Backend Dependencies
working-directory: ./mern/backend
run: npm install

- name: Install Frontend Dependencies
working-directory: ./mern/frontend
run: npm install

- name: Run Backend Tests
working-directory: ./mern/backend
run: npm test || true

- name: Run Frontend Tests
working-directory: ./mern/frontend
run: npm test || true
41 changes: 1 addition & 40 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,40 +1 @@
# A simple MERN stack application

### Create a network for the docker containers

`docker network create demo`

### Build the client

```sh
cd mern/frontend
docker build -t mern-frontend .
```

### Run the client

`docker run --name=frontend --network=demo -d -p 5173:5173 mern-frontend`

### Verify the client is running

Open your browser and type `http://localhost:5173`

### Run the mongodb container

`docker run --network=demo --name mongodb -d -p 27017:27017 -v ~/opt/data:/data/db mongo:latest`

### Build the server

```sh
cd mern/backend
docker build -t mern-backend .
```

### Run the server

`docker run --name=backend --network=demo -d -p 5050:5050 mern-backend`

## Using Docker Compose

`docker compose up -d`

visit https://github.com/dutrei-hailu/MERN-Docker-CICD-Internship
26 changes: 14 additions & 12 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -1,38 +1,40 @@
services:

backend:
build: ./mern/backend
image: dureti4/employee-management-backend:v1
ports:
- "5050:5050"
- "5050:5050"
networks:
- mern_network
environment:
MONGO_URI: mongodb://mongo:27017/mydatabase
MONGO_URI: mongodb://mongodb:27017/mydatabase
depends_on:
- mongodb

frontend:
build: ./mern/frontend
image: dureti4/employee-management-frontend:v1
ports:
- "5173:5173"
- "5173:5173"
networks:
- mern_network
environment:
REACT_APP_API_URL: http://backend:5050
REACT_APP_API_URL: http://backend:5050

mongodb:
image: mongo:latest
image: mongo:7.0
ports:
- "27017:27017"
- "27017:27017"
networks:
- mern_network
volumes:
- mongo-data:/data/db
- mongo-data:/data/db


networks:
mern_network:
driver: bridge
driver: bridge


volumes:
mongo-data:
driver: local # Persist MongoDB data locally

driver: local
15 changes: 15 additions & 0 deletions mern/backend/controllers/departmentController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
const departments = [
{ _id: 'dept-1', name: 'Engineering', manager: 'Mina Torres', budget: '$1.2M', employees: 68, description: 'Product and platform development' },
{ _id: 'dept-2', name: 'Sales', manager: 'Drew Brooks', budget: '$640K', employees: 42, description: 'Revenue growth and partnerships' },
{ _id: 'dept-3', name: 'Finance', manager: 'Talia Nguyen', budget: '$420K', employees: 21, description: 'Planning and controls' },
];

export const listDepartments = (_req, res) => {
res.status(200).json(departments);
};

export const createDepartment = (req, res) => {
const department = { _id: `dept-${Date.now()}`, ...req.body };
departments.push(department);
res.status(201).json(department);
};
38 changes: 38 additions & 0 deletions mern/backend/controllers/employeeController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { ObjectId } from "mongodb";
import db from "../db/connection.js";

const collection = () => db.collection("employees");

export const listEmployees = async (_req, res) => {
try {
const employees = await collection().find({}).sort({ createdAt: -1 }).toArray();
res.status(200).json(employees);
} catch (error) {
res.status(500).json({ message: error.message });
}
};

export const createEmployee = async (req, res) => {
try {
const employee = {
...req.body,
createdAt: new Date(),
};
const result = await collection().insertOne(employee);
res.status(201).json({ ...employee, _id: result.insertedId });
} catch (error) {
res.status(500).json({ message: error.message });
}
};

export const deleteEmployee = async (req, res) => {
try {
const result = await collection().deleteOne({ _id: new ObjectId(req.params.id) });
if (result.deletedCount === 0) {
return res.status(404).json({ message: "Employee not found" });
}
res.status(200).json({ message: "Employee deleted" });
} catch (error) {
res.status(500).json({ message: error.message });
}
};
Loading