Compare commits
21 Commits
main
...
e6c9675abc
Author | SHA1 | Date | |
---|---|---|---|
e6c9675abc | |||
ebf713f75f | |||
13f098fc7c | |||
8cf8a92f8d | |||
571a45d3de | |||
560090319a | |||
cefb8eba4d | |||
1e54ba614a | |||
7469609600 | |||
b7a1fcfe49 | |||
a9743ecfbe | |||
76f33f50f5 | |||
203a81573d | |||
383e906102 | |||
e7330f07ee | |||
c996be5953 | |||
bf60011948 | |||
82d5962020 | |||
1254b036f5 | |||
6d84bf694e | |||
c2df9d136e |
67
.woodpecker/build.yaml
Normal file
67
.woodpecker/build.yaml
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
when:
|
||||||
|
- event: push
|
||||||
|
branch: woodpecker
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: code-tests
|
||||||
|
image: python:3.11.7-alpine
|
||||||
|
commands:
|
||||||
|
- cd api
|
||||||
|
- python3 -m venv env
|
||||||
|
- source env/bin/activate
|
||||||
|
- pip install -r requirements.txt pytest
|
||||||
|
- python3 -m pytest --junit-xml=pytest_junit.xml
|
||||||
|
|
||||||
|
- name: build-and-push
|
||||||
|
image: marcin00.azurecr.io/azure-cli-docker:slim-bookworm
|
||||||
|
environment:
|
||||||
|
ACR_NAME: marcin00
|
||||||
|
CLIENT_ID: c302726f-fafb-4143-94c1-67a70975574a
|
||||||
|
DOCKER_IMAGE: marcin00.azurecr.io/user-microservice:${CI_COMMIT_SHA}
|
||||||
|
commands:
|
||||||
|
- docker build -t ${DOCKER_IMAGE} --build-arg APP_VERSION=${CI_COMMIT_SHA} --build-arg BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") .
|
||||||
|
- az login --identity --client-id ${CLIENT_ID}
|
||||||
|
- az acr login --name ${ACR_NAME}
|
||||||
|
- docker push ${DOCKER_IMAGE}
|
||||||
|
backend_options:
|
||||||
|
kubernetes:
|
||||||
|
runtimeClassName: sysbox-runc
|
||||||
|
|
||||||
|
- name: gitops-commit
|
||||||
|
image: alpine/git
|
||||||
|
environment:
|
||||||
|
DEPLOY_REPO: ssh://git@srv22.mikr.us:20343/pikram/user-microservice-deploy.git
|
||||||
|
GITEA_DEPLOY_KEY:
|
||||||
|
from_secret: gitea-deploy-key
|
||||||
|
GITEA_KNOWN_HOST:
|
||||||
|
from_secret: gitea-known-host
|
||||||
|
commands:
|
||||||
|
- mkdir -p ~/.ssh
|
||||||
|
|
||||||
|
- echo "${GITEA_KNOWN_HOST}" >> ~/.ssh/known_hosts
|
||||||
|
- chmod 644 ~/.ssh/known_hosts
|
||||||
|
|
||||||
|
- echo "${GITEA_DEPLOY_KEY}" > ~/.ssh/id_rsa
|
||||||
|
- chmod 600 ~/.ssh/id_rsa
|
||||||
|
|
||||||
|
- git config --global user.name "woodpecker[bot]"
|
||||||
|
- git config --global user.email "woodpecker@marcin00.pl"
|
||||||
|
|
||||||
|
- git clone "${DEPLOY_REPO}" --branch woodpecker-deploy
|
||||||
|
- cd user-microservice-deploy
|
||||||
|
|
||||||
|
- |
|
||||||
|
awk -v commit="$CI_COMMIT_SHA" '
|
||||||
|
$0 ~ /name:[[:space:]]*api/ { in_api_container = 1; print; next }
|
||||||
|
in_api_container && $0 ~ /^[[:space:]]*image:[[:space:]]*/ {
|
||||||
|
sub(/:[^:[:space:]]+$/, ":" commit)
|
||||||
|
in_api_container = 0
|
||||||
|
print
|
||||||
|
next
|
||||||
|
}
|
||||||
|
{ print }
|
||||||
|
' deploy.yaml > deploy.tmp && mv deploy.tmp deploy.yaml
|
||||||
|
|
||||||
|
- git add deploy.yaml
|
||||||
|
- 'git diff-index --quiet HEAD || git commit -m "WOODPECKER: Changed deployed version to $CI_COMMIT_SHA"'
|
||||||
|
- git push origin woodpecker-deploy
|
15
Dockerfile
15
Dockerfile
@ -1,5 +1,18 @@
|
|||||||
FROM python:3.11.7-slim-bookworm
|
FROM python:3.11.7-alpine
|
||||||
|
|
||||||
|
# Wersja i data builda jako build-arg
|
||||||
|
ARG APP_VERSION=unknown
|
||||||
|
ARG BUILD_DATE=unknown
|
||||||
|
|
||||||
|
# Ustawiamy zmienne w ENV, by były dostępne w kontenerze
|
||||||
|
ENV APP_VERSION=$APP_VERSION
|
||||||
|
ENV BUILD_DATE=$BUILD_DATE
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY api .
|
COPY api .
|
||||||
|
|
||||||
|
RUN apk add --no-cache curl
|
||||||
RUN pip install -r requirements.txt
|
RUN pip install -r requirements.txt
|
||||||
|
|
||||||
CMD python3 app.py
|
CMD python3 app.py
|
||||||
|
@ -4,7 +4,7 @@ from flask_jwt_extended import JWTManager
|
|||||||
from jwt import ExpiredSignatureError
|
from jwt import ExpiredSignatureError
|
||||||
from models import db, RevokedToken
|
from models import db, RevokedToken
|
||||||
import os
|
import os
|
||||||
from utils import init_db, wait_for_db
|
from utils import init_db
|
||||||
from views import user_bp
|
from views import user_bp
|
||||||
from werkzeug.exceptions import HTTPException
|
from werkzeug.exceptions import HTTPException
|
||||||
|
|
||||||
@ -53,7 +53,6 @@ def create_app(config_name="default"):
|
|||||||
|
|
||||||
# Fill database by initial values (only if we are not testing)
|
# Fill database by initial values (only if we are not testing)
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
wait_for_db()
|
|
||||||
db.create_all()
|
db.create_all()
|
||||||
if config_name != "testing":
|
if config_name != "testing":
|
||||||
init_db()
|
init_db()
|
||||||
|
19
api/utils.py
19
api/utils.py
@ -2,9 +2,6 @@ from flask import abort
|
|||||||
from flask_jwt_extended import get_jwt_identity
|
from flask_jwt_extended import get_jwt_identity
|
||||||
from models import User, db
|
from models import User, db
|
||||||
import os
|
import os
|
||||||
from sqlalchemy import text
|
|
||||||
from sqlalchemy.exc import DatabaseError
|
|
||||||
import time
|
|
||||||
from werkzeug.security import generate_password_hash
|
from werkzeug.security import generate_password_hash
|
||||||
|
|
||||||
|
|
||||||
@ -30,22 +27,6 @@ def get_user_or_404(user_id):
|
|||||||
return user
|
return user
|
||||||
|
|
||||||
|
|
||||||
MAX_RETRIES = 100
|
|
||||||
|
|
||||||
def wait_for_db():
|
|
||||||
for retries in range(MAX_RETRIES):
|
|
||||||
try:
|
|
||||||
with db.engine.connect() as connection:
|
|
||||||
connection.execute(text("SELECT 1"))
|
|
||||||
print("Successfully connected with database.")
|
|
||||||
return
|
|
||||||
except DatabaseError:
|
|
||||||
print(f"Waiting for database... (retry {retries + 1})")
|
|
||||||
time.sleep(3)
|
|
||||||
print("Failed to connect to database.")
|
|
||||||
raise Exception("Database not ready after multiple retries.")
|
|
||||||
|
|
||||||
|
|
||||||
def init_db():
|
def init_db():
|
||||||
"""Create default admin account if database is empty"""
|
"""Create default admin account if database is empty"""
|
||||||
with db.session.begin():
|
with db.session.begin():
|
||||||
|
54
deployment_timer.sh
Executable file
54
deployment_timer.sh
Executable file
@ -0,0 +1,54 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# === KONFIGURACJA ===
|
||||||
|
APP_URL="https://user-microservice.marcin00.pl/version"
|
||||||
|
MARKER_FILE="version_marker.txt"
|
||||||
|
OUTPUT_FILE="deployment_times.csv"
|
||||||
|
CHECK_INTERVAL=1 # sekundy
|
||||||
|
|
||||||
|
# === POBRANIE AKTUALNEJ WERSJI APLIKACJI ===
|
||||||
|
echo "[INFO] Pobieranie aktualnej wersji z /version..."
|
||||||
|
OLD_VERSION=$(curl -s "$APP_URL" | jq -r '.version')
|
||||||
|
|
||||||
|
if [[ -z "$OLD_VERSION" ]]; then
|
||||||
|
echo "[ERROR] Nie udało się pobrać aktualnej wersji aplikacji."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[INFO] Aktualna wersja: $OLD_VERSION"
|
||||||
|
|
||||||
|
# === Modyfikacja pliku, commit i push ===
|
||||||
|
TIMESTAMP=$(date +%s)
|
||||||
|
echo "$TIMESTAMP" > "$MARKER_FILE"
|
||||||
|
|
||||||
|
git add "$MARKER_FILE"
|
||||||
|
git commit -m "Automatyczna zmiana: $TIMESTAMP"
|
||||||
|
START_TIME=$(date +%s)
|
||||||
|
|
||||||
|
echo "[INFO] Wykonuję git push..."
|
||||||
|
git push
|
||||||
|
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo "[ERROR] Push nie powiódł się."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[INFO] Oczekiwanie na wdrożenie nowej wersji..."
|
||||||
|
|
||||||
|
# === Odpytywanie endpointa /version ===
|
||||||
|
while true; do
|
||||||
|
sleep $CHECK_INTERVAL
|
||||||
|
NEW_VERSION=$(curl -s "$APP_URL" | jq -r '.version')
|
||||||
|
|
||||||
|
if [[ "$NEW_VERSION" != "$OLD_VERSION" ]]; then
|
||||||
|
END_TIME=$(date +%s)
|
||||||
|
DURATION=$((END_TIME - START_TIME))
|
||||||
|
echo "[INFO] Nowa wersja wdrożona: $NEW_VERSION"
|
||||||
|
echo "[INFO] Czas wdrożenia: $DURATION sekund"
|
||||||
|
|
||||||
|
echo "$START_TIME,$END_TIME,$DURATION,$OLD_VERSION,$NEW_VERSION" >> "$OUTPUT_FILE"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo "[WAIT] Czekam... ($NEW_VERSION)"
|
||||||
|
fi
|
||||||
|
done
|
Reference in New Issue
Block a user