Initial Flask demo

This commit is contained in:
Galyaviev Ruslan
2025-09-01 10:54:35 +03:00
commit 646f36716d
13 changed files with 125 additions and 0 deletions

3
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

10
.idea/flask-demo.iml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

7
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.10 (flask-demo)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (flask-demo)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/flask-demo.iml" filepath="$PROJECT_DIR$/.idea/flask-demo.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

33
.woodpecker.yml Normal file
View File

@@ -0,0 +1,33 @@
variables:
IMAGE: flask-demo:latest
volumes:
- name: dockersock
host:
path: /var/run/docker.sock
pipeline:
test:
image: python:3.11
commands:
- pip install -r requirements.txt
- pytest -q
build:
image: docker:27-cli
volumes:
- name: dockersock
path: /var/run/docker.sock
commands:
- docker build -t ${IMAGE} .
deploy:
image: docker:27-cli
volumes:
- name: dockersock
path: /var/run/docker.sock
commands:
- docker compose up -d
when:
event: push
branch: main

12
Dockerfile Normal file
View File

@@ -0,0 +1,12 @@
FROM python:3.11-slim
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["gunicorn", "-w", "2", "-b", "0.0.0.0:8000", "app:app"]

10
app.py Normal file
View File

@@ -0,0 +1,10 @@
from flask import Flask, render_template
app = Flask(__name__)
@app.get("/")
def home():
return render_template("index.html", title="Flask CI/CD demo")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000) # внутри контейнера слушаем 8000

8
docker-compose.yml Normal file
View File

@@ -0,0 +1,8 @@
version: "3.8"
services:
web:
image: flask-demo:latest
container_name: flask-demo
ports:
- "8888:8000"
restart: unless-stopped

3
requirements.txt Normal file
View File

@@ -0,0 +1,3 @@
Flask==3.0.3
gunicorn==21.2.0
pytest==8.3.2

8
templates/index.html Normal file
View File

@@ -0,0 +1,8 @@
<!doctype html>
<html lang="ru">
<head><meta charset="utf-8"><title>{{ title }}</title></head>
<body>
<h1>{{ title }}</h1>
<p>Если вы это видите — пайплайн сработал 🎉</p>
</body>
</html>

11
tests/test_app.py Normal file
View File

@@ -0,0 +1,11 @@
from app import app
def test_home_status():
client = app.test_client()
r = client.get("/")
assert r.status_code == 200
def test_home_text():
client = app.test_client()
r = client.get("/")
assert b"Flask CI/CD demo" in r.data