Skip to content
Open

Lab3 #1070

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
10d3eec
created the project foler
haraphat01 Jun 5, 2023
ea7d0ac
Submitting the first lab for review
haraphat01 Jun 5, 2023
730c9a4
updated the readme with the docker instruction and also added docker …
haraphat01 Jun 5, 2023
274912b
Added Github action to the project
haraphat01 Jun 5, 2023
33ce6ee
Added Github action to the project
haraphat01 Jun 5, 2023
799ebdb
Added Github action to the project
haraphat01 Jun 5, 2023
6ae43df
added the github workflows
haraphat01 Jun 5, 2023
8c60aef
Fixing the bug on the github action
haraphat01 Jun 5, 2023
9a03421
Fixing the bug on the github action
haraphat01 Jun 5, 2023
7705a25
Fixing the bug on the github action
haraphat01 Jun 6, 2023
6808a07
Fixing the bug on the github action
haraphat01 Jun 6, 2023
54626b3
Fixing the bug on the github action
haraphat01 Jun 6, 2023
4e829ba
Fixing the bug on the github action
haraphat01 Jun 6, 2023
848afa1
Fixing the bug on the github action
haraphat01 Jun 6, 2023
6794b88
Fixing the bug on the github action
haraphat01 Jun 6, 2023
34181a4
Fixing the bug on the github action
haraphat01 Jun 6, 2023
93f19e4
Fixing the bug on the github action
haraphat01 Jun 6, 2023
e7df1e9
Fixing the bug on the github action configuration
haraphat01 Jun 6, 2023
e81501b
Updated the CI action
haraphat01 Jun 6, 2023
3f7c037
Fixing the bug on the github action configuration
haraphat01 Jun 6, 2023
053db9d
Fixing the bug on the github action configuration
haraphat01 Jun 6, 2023
7386686
Added a comment to the main file
haraphat01 Jun 6, 2023
c6875ba
Added a comment to the main file
haraphat01 Jun 6, 2023
3d21bdf
Added a comment to the main file
haraphat01 Jun 6, 2023
a9bd2c6
Fixing the bug on the github action configuration
haraphat01 Jun 6, 2023
6fe7211
Fixing the bug on the github action configuration
haraphat01 Jun 7, 2023
0a609e4
Added a comment to the main file
haraphat01 Jun 7, 2023
2e00bc8
Reworked on the github action
haraphat01 Jun 7, 2023
1ece351
Reworked on the github action
haraphat01 Jun 7, 2023
a93ef12
Reworked on the github action
haraphat01 Jun 7, 2023
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
48 changes: 48 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
name: Python CI

on:
push:
branches: [lab3]
paths:
- "app_python/**"
- ".github/workflows/main.yaml"

jobs:
build_test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.10.7'
- name: Install dependencies
run: pip install -r app_python/requirements.txt
- name: Upgrade Flask and Werkzeug
run: pip install --upgrade Flask
- name: Run unit tests
run: python3 app_python/test_main.py

deploy:
needs: build_test
runs-on: ubuntu-latest

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

- name: Log in to Docker registry
uses: docker/login-action@v1
with:
registry: docker.io
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
file: app_python/Dockerfile
push: true
tags: docker.io/haraphat01/moscowtime:tagname

80 changes: 38 additions & 42 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,66 +1,62 @@
# Labs
# Current Time in Moscow

## Introduction
![Python CI](https://github.com/haraphat01/moscow_time/workflows/Python%20CI/badge.svg)

Welcome to DevOps course labs. All labs are practical and will be built on each other. You will implement simple application, containerize it, implement simple tests, prepare an infrastructure and CI/CD processes, collect metrics, logs, etc.

## Architecture
## Overview
This is a simple Python web application that displays the current time in Moscow. It uses the Flask web framework and the datetime module to get the current time in the Europe/Moscow timezone. The time is displayed in a user-friendly format on a web page.

This repository contains a master branch with introduction and one branch with instructions for each lab.
## Build
To build this application, you need to create a Python file with a main.py extension, for example, app.py. Then, copy the code in main.py to your file. Save the file and run it using the command python app.py in a terminal or command prompt.
The application will start running on your local machine.

## Rules
## Usage
To use the application, open a web browser and navigate to http://localhost:5000/. The current time in Moscow will be displayed on the web page. The time will be updated every time you refresh the page.

Each labs requires the participant to finish all previous labs, therefore **participants are required to submit each lab and get at least 6/10 points for each lab to pass the course**.
## To run the Dockerfile in your project, you can follow these steps:

Grading is based on PRs with your solution to the corresponding branch of this repository. This repository is read-only for all participants, therefore to be able to create a pull request, a participant should fork this repository to his own workspace and solve the lab there. It is recommended to build a solution of a lab N upon a solution of lab N-1, so choose workflow in your fork of this repository wisely. Structure of your repository will not affect your grade, only state of your repository from which the PR is created will be checked and graded (state after last commit in your PR on corresponding lab).
1. Make sure that you have Docker installed on your local machine. You can download Docker from the official website: https://www.docker.com/products/docker-desktop

### Recommended workflow
2. Open a terminal or command prompt and navigate to the directory that contains your Dockerfile.

#### For the first lab
3. Build the Docker image using the following command:
docker build -t <image-name> .
Make sure to replace <image-name> with the name that you want to give to your Docker image. The . at the end of the command specifies that the build context is the current directory.

1. Fork this repository.
2. Checkout to lab1 branch.
3. Complete lab1 tasks.
4. Push the code to your repository.
5. Create a PR to the lab1 branch on this repository from your fork's lab1 branch.
6. Create an archive with the current version of your code and submit a zip file to Moodle.
7. Create a team with with your classmates, 6 people max.
8. Each student must review PRs of all teammates.
9. Wait for your grade.
4. Once the build is complete, you can run the Docker container using the following command:
docker run -p <host-port>:<container-port> <image-name>

## Grading
Make sure to replace <host-port> with the port number on your local machine that you want to use to access the container, <container-port> with the port number that your application is listening on inside the container, and <image-name> with the name of the Docker image that you built in step 3.

### Points distribution for the course
For example, if your application is listening on port 80 inside the container and you want to access it on port 8080 on your local machine, you can use the following command:
docker run -p 8080:80 <image-name>

```
70 - labs
20 - final exam
10 - attendance on lectures
```
5. Once the container is running, you can access your application by opening a web browser and navigating to http://localhost:<host-port>. In the example above, you would navigate to http://localhost:8080.

### Grade ranges
## Unit tests

```
[90;100] - A
[75;90) - B
[60;75) - C
[0;60) - D
```
I have written unit tests for the Python web application that displays the current time in Moscow. These tests ensure that the application is working as expected and help us catch any bugs early in the development process.

### Labs grading
To run the unit tests, navigate to the directory where the `test_main.py` file is located and run the following command:
python test_main.py

Each lab is marked out of 10. All labs have a set of main tasks and a set of extra tasks.

Completing main tasks correctly will give you 10 points out of 10. Completing extra tasks correctly will give you some additional points, depends on the bonus task difficulty. Your points for main and extra tasks will be summed up and will help you to get a better grade.
Make sure that you have all the necessary dependencies installed, including Flask and any other modules that your application depends on.

If you finish all bonus tasks correctly the **permission to skip the exam will be granted to you + 10 extra points**. If you finish not all of them you will must pass the exam, but it can save you from the exam's failure.
If the tests pass successfully, you should see output similar to the following:

## Deadlines and labs distribution
Ran 1 test in 0.001s

Participants have 2 new labs every week simultaneously and 1 week to submit solutions. Moodle will contain presentations and deadlines.
OK

You are required to submit a zip file with your source code to corresponding assignment in moodle. This is required for the university as a proof of work.

## Submission policy
## Git Actions CI

I have set up a continuous integration (CI) workflow using Git Actions to build and test our Python web application. The workflow has three steps: installing dependencies, running linters, and running unit tests.

To run the workflow, push changes to the `main` branch of the repository. The workflow will automatically be triggered and the steps will be run in order. Make sure that you have all the necessary dependencies installed, including Flask and any other modules that your application depends on.

I have also added Docker-related steps to our workflow to log in to a Docker registry, build a Docker image, and push the image to the registry. To use these steps, you will need to set up the `DOCKER_USERNAME` and `DOCKER_PASSWORD` secrets in your repository settings.

By following these best practices and including a Git Actions CI workflow in your project, I can ensure that my application is thoroughly tested and working as expected.

**Submitting results after the deadline will result in maximum of 6 points for the corresponding lab. As stated before, all labs must be submitted to pass the course.**
15 changes: 15 additions & 0 deletions app_python/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
FROM python:3-alpine
USER root
WORKDIR /main

COPY app_python/requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8081

CMD ["python3", "main.py"]


17 changes: 17 additions & 0 deletions app_python/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from datetime import datetime

from flask import Flask

app = Flask(__name__)

def get_current_time():
now = datetime.now()
current_time = now.strftime("Current Time in Moscow: %Y-%m-%d %H:%M:%S")
return current_time

@app.route('/')
def home():
return get_current_time()

if __name__ == '__main__':
app.run(host="0.0.0.0", debug=True)
2 changes: 2 additions & 0 deletions app_python/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pytz
Flask==2.0.1
14 changes: 14 additions & 0 deletions app_python/test_main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import unittest
from main import app

class TestApp(unittest.TestCase):
def setUp(self):
self.app = app.test_client()

def test_homepage(self):
response = self.app.get('/')
self.assertEqual(response.status_code, 200)
self.assertIn(b'Current Time in Moscow', response.data)

if __name__ == '__main__':
unittest.main()