105 Commits

Author SHA1 Message Date
33fc7f66f9 Automatyczna zmiana: 1752257920 2025-07-11 20:18:40 +02:00
1426c8aff2 Automatyczna zmiana: 1752257802 2025-07-11 20:16:42 +02:00
7a26738ec7 Automatyczna zmiana: 1752257685 2025-07-11 20:14:45 +02:00
9168be6c3d Automatyczna zmiana: 1752257573 2025-07-11 20:12:53 +02:00
a8ab29d019 Automatyczna zmiana: 1752257456 2025-07-11 20:10:56 +02:00
40aba0972c Automatyczna zmiana: 1752257341 2025-07-11 20:09:01 +02:00
7735b0e283 Automatyczna zmiana: 1752257226 2025-07-11 20:07:06 +02:00
253b6c54a0 Automatyczna zmiana: 1752257113 2025-07-11 20:05:13 +02:00
1cc42b18b7 Automatyczna zmiana: 1752256999 2025-07-11 20:03:19 +02:00
54699d67f9 Automatyczna zmiana: 1752256877 2025-07-11 20:01:17 +02:00
8c0a55838e Automatyczna zmiana: 1752256761 2025-07-11 19:59:21 +02:00
e4d390a096 Automatyczna zmiana: 1752256633 2025-07-11 19:57:13 +02:00
0543580669 Automatyczna zmiana: 1752256510 2025-07-11 19:55:10 +02:00
453914a73b Automatyczna zmiana: 1752256388 2025-07-11 19:53:08 +02:00
640dae99f9 Automatyczna zmiana: 1752256251 2025-07-11 19:50:51 +02:00
5e4f750a42 Automatyczna zmiana: 1752256138 2025-07-11 19:48:58 +02:00
496c353ca1 Automatyczna zmiana: 1752256017 2025-07-11 19:46:57 +02:00
d060b629cf Automatyczna zmiana: 1752255893 2025-07-11 19:44:53 +02:00
858eacdc3f Automatyczna zmiana: 1752255763 2025-07-11 19:42:43 +02:00
f5398c1a9c Automatyczna zmiana: 1752255584 2025-07-11 19:39:44 +02:00
d855e795e2 Added 'cd' command to sh blocks 2025-07-10 22:26:13 +02:00
2f0ab04997 Replaced dir block by 'cd' command 2025-07-10 22:16:48 +02:00
c37d92a4cf Updated paths and branch in deploy repo 2025-07-10 21:43:48 +02:00
d8617d01eb Added overwrite output lines during waiting 2025-07-10 21:35:31 +02:00
dedd162bb5 Automatyczna zmiana: 1752168984 2025-07-10 19:36:24 +02:00
d273a4254f Automatyczna zmiana: 1752168860 2025-07-10 19:34:20 +02:00
2ddee5ddbb Automatyczna zmiana: 1752168728 2025-07-10 19:32:08 +02:00
033493b3f5 Automatyczna zmiana: 1752168604 2025-07-10 19:30:04 +02:00
039c9df549 Automatyczna zmiana: 1752168476 2025-07-10 19:27:56 +02:00
65992ecc75 Automatyczna zmiana: 1752168352 2025-07-10 19:25:52 +02:00
0347431341 Automatyczna zmiana: 1752168235 2025-07-10 19:23:55 +02:00
696d4557ab Automatyczna zmiana: 1752168113 2025-07-10 19:21:53 +02:00
d07f41ece6 Automatyczna zmiana: 1752167993 2025-07-10 19:19:53 +02:00
c2bc6761c3 Automatyczna zmiana: 1752167873 2025-07-10 19:17:53 +02:00
76383b030b Automatyczna zmiana: 1752167754 2025-07-10 19:15:54 +02:00
17ca39e4b0 Automatyczna zmiana: 1752167631 2025-07-10 19:13:51 +02:00
d04b88c6b8 Automatyczna zmiana: 1752167502 2025-07-10 19:11:42 +02:00
9a746322f9 Automatyczna zmiana: 1752167383 2025-07-10 19:09:43 +02:00
22bb43f63f Automatyczna zmiana: 1752167268 2025-07-10 19:07:48 +02:00
97716abc4c Automatyczna zmiana: 1752167129 2025-07-10 19:05:29 +02:00
501c9cc7c7 Automatyczna zmiana: 1752166998 2025-07-10 19:03:18 +02:00
b02c240e5b Automatyczna zmiana: 1752166872 2025-07-10 19:01:12 +02:00
d3cc1f6ff9 Automatyczna zmiana: 1752166750 2025-07-10 18:59:10 +02:00
ab75cec74a Automatyczna zmiana: 1752166465 2025-07-10 18:54:25 +02:00
36e7486726 Automatyczna zmiana: 1752093110 2025-07-09 22:31:50 +02:00
050916003f Automatyczna zmiana: 1752092853 2025-07-09 22:27:33 +02:00
6da6ea634e Automatyczna zmiana: 1752092595 2025-07-09 22:23:15 +02:00
3fadc63726 Automatyczna zmiana: 1752091222 2025-07-09 22:00:22 +02:00
d7da79d1d2 Automatyczna zmiana: 1752091083 2025-07-09 21:58:03 +02:00
4fbb54f446 Automatyczna zmiana: 1752090936 2025-07-09 21:55:36 +02:00
7034bf3dce Automatyczna zmiana: 1752090792 2025-07-09 21:53:12 +02:00
9ac5ca85bd Automatyczna zmiana: 1752090642 2025-07-09 21:50:42 +02:00
a514f374ed Automatyczna zmiana: 1752090505 2025-07-09 21:48:25 +02:00
5041f290fa Automatyczna zmiana: 1752090352 2025-07-09 21:45:52 +02:00
f364694af8 Automatyczna zmiana: 1752090205 2025-07-09 21:43:25 +02:00
d20a83431b Automatyczna zmiana: 1752090065 2025-07-09 21:41:05 +02:00
f845f5d7c2 Automatyczna zmiana: 1752089917 2025-07-09 21:38:37 +02:00
44ad02e6ae Automatyczna zmiana: 1752089436 2025-07-09 21:30:36 +02:00
745e9b5bac Automatyczna zmiana: 1752089288 2025-07-09 21:28:08 +02:00
225f998a8c Automatyczna zmiana: 1752088919 2025-07-09 21:21:59 +02:00
84c57feb84 Automatyczna zmiana: 1752088738 2025-07-09 21:18:58 +02:00
de405308bb Automatyczna zmiana: 1752088584 2025-07-09 21:16:24 +02:00
9c2848df4a Automatyczna zmiana: 1752088408 2025-07-09 21:13:28 +02:00
a7c6051995 Automatyczna zmiana: 1752088132 2025-07-09 21:08:52 +02:00
cbd6be779c Automatyczna zmiana: 1752087761 2025-07-09 21:02:41 +02:00
32e993da4d Automatyczna zmiana: 1752087570 2025-07-09 20:59:30 +02:00
32b9580a82 Automatyczna zmiana: 1752087363 2025-07-09 20:56:03 +02:00
abeb0e5271 Added script to trigger and measure deployment time 2025-07-09 20:50:42 +02:00
b7920e3644 Added build args to Dockerfile 2025-07-08 21:41:54 +02:00
e573c573bf Added build args 2025-07-08 21:31:02 +02:00
23814bef0c Moved clone command to sshagent block 2025-07-08 19:44:23 +02:00
49f19dabe6 Added saving known_hosts to file 2025-07-08 19:03:23 +02:00
1de32691c6 Corrected git remote command 2025-07-04 23:46:57 +02:00
f05d3940fa Modified git repo url to auth 2025-07-04 23:35:51 +02:00
023daf1d4b Added git clone and git push with credentials 2025-07-04 23:33:28 +02:00
e91273888a Changed command run for git container 2025-07-04 22:59:51 +02:00
247798abc8 Implemented auto commit new app version to GitOps by pipeline 2025-07-04 22:42:51 +02:00
600b5aeba8 Merge branch 'dev' into jenkins-pipeline 2025-07-03 23:36:31 +02:00
c9b1dac864 Added endpoint to fetch app version 2025-07-03 22:47:21 +02:00
a79ae2d50f Apply new features from branch 'dev' into jenkins-pipeline 2025-06-12 18:42:28 +00:00
cd4ab3fd27 Handled more errors during db initialization 2025-06-12 18:42:07 +00:00
301cf5922e Changed docker image base to Alpine and added curl 2025-06-11 22:15:37 +00:00
479ec4f917 Added healthcheck 2025-06-11 22:04:35 +00:00
3f40a6126c Added more descriptions of functions 2025-06-11 20:04:04 +00:00
dd9e9ce110 Improved function body 2025-06-11 19:57:15 +00:00
d3d3c98f99 Moved wait_for_db function to utils module 2025-06-11 19:48:58 +00:00
9e010ed389 Implemented waiting for db readiness 2025-06-11 19:43:47 +00:00
d9fe927832 Removed deprecated label option from pipeline 2025-06-11 17:51:55 +00:00
636a382cf5 Deleted jenkins pipeline from main branch 2025-06-11 17:13:27 +00:00
99cfdfddd0 Added annotation required to run Sysbox on pod 2025-06-11 16:52:16 +00:00
f579e440f8 Updated path to pod template yaml file 2025-06-11 16:43:22 +00:00
ba69728c81 Changed pod runtime to sysbox 2025-06-11 16:32:12 +00:00
5366e313c5 Moved Jenkinsfile and pod agent template to separate directory 2025-06-11 16:29:03 +00:00
283be1a1ec Deleted Goss 2025-06-11 16:28:08 +00:00
1b7204c2ba Changed name of variable to store ACR name instead of ACR username 2025-06-10 20:17:25 +00:00
8f9aed299d Added managed identity client id 2025-06-10 19:32:40 +00:00
6522977280 Changed basic auth to managed identity 2025-06-10 18:50:37 +00:00
c707974a2e Corrected agent declaration in Jenkinsfile 2025-06-08 16:56:35 +00:00
cc2f224d60 Moved pod agent code from Jenkins master to YAML file in repo 2025-06-08 16:45:05 +00:00
b14e6cf873 Restored dind container usage 2025-06-07 21:44:24 +00:00
87e3c0df80 Removed Goss tests 2025-06-07 21:14:40 +00:00
aea09a6081 Added bash installation 2025-06-07 15:08:58 +00:00
d05cede409 The command curl is replaced with wget 2025-06-07 15:06:19 +00:00
17162027b6 Removed unnecessary post cleanup 2025-06-07 14:57:35 +00:00
8887f1b2bd Updated Jenkins pipeline to use in Kubernetes 2025-06-07 13:31:03 +00:00
17 changed files with 299 additions and 280 deletions

92
.jenkins/Jenkinsfile vendored Normal file
View File

@ -0,0 +1,92 @@
pipeline {
agent {
kubernetes {
yamlFile '.jenkins/podTemplate.yaml'
}
}
environment {
ACR_NAME = 'marcin00'
CLIENT_ID = 'c302726f-fafb-4143-94c1-67a70975574a'
DOCKER_REGISTRY_URL = 'marcin00.azurecr.io'
DOCKER_IMAGE = "${DOCKER_REGISTRY_URL}/user-microservice:${GIT_COMMIT}"
DEPLOY_REPO = 'ssh://git@srv22.mikr.us:20343/pikram/user-microservice-deploy.git'
}
stages {
stage('Code Tests') {
steps {
container('python') {
dir('api') {
sh '''
python3 -m venv env
source env/bin/activate
pip install -r requirements.txt pytest
python3 -m pytest --junit-xml=pytest_junit.xml
'''
}
}
}
post {
always {
junit testResults: '**/*pytest_junit.xml'
}
}
}
stage('Build & Push Docker') {
steps {
container('docker') {
sh '''
docker build -t ${DOCKER_IMAGE} --build-arg APP_VERSION=${GIT_COMMIT} --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}
'''
}
}
}
stage('Commit new version to GitOps repo') {
steps {
container('git') {
withCredentials([string(credentialsId: 'gitea-known-host', variable: 'GITEA_KNOWN_HOST')]) {
sh '''
mkdir -p ~/.ssh
echo "$GITEA_KNOWN_HOST" >> ~/.ssh/known_hosts
chmod 644 ~/.ssh/known_hosts
git config --global user.name "jenkins[bot]"
git config --global user.email "jenkins@marcin00.pl"
'''
sshagent(['gitea-deploy-key']) {
sh 'git clone ${DEPLOY_REPO} --branch fluxcd'
}
}
sh '''
cd user-microservice-deploy/apps/user-microservice
# Podmień tag obrazu w pliku deploy.yaml
awk -v commit="$GIT_COMMIT" '
$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
'''
sshagent(['gitea-deploy-key']) {
sh '''
cd user-microservice-deploy/apps/user-microservice
git add deploy.yaml
git diff-index --quiet HEAD || git commit -m "JENKINS: Changed deployed version to $GIT_COMMIT"
git push origin fluxcd
'''
}
}
}
}
}
}

60
.jenkins/podTemplate.yaml Normal file
View File

@ -0,0 +1,60 @@
apiVersion: v1
kind: Pod
metadata:
annotations:
io.kubernetes.cri-o.userns-mode: "auto:size=65536"
labels:
jenkins: "slave"
jenkins/label: "kubernetes-agent"
spec:
runtimeClassName: sysbox-runc
containers:
- name: jnlp
image: jenkins/inbound-agent:alpine
tty: false
workingDir: /home/jenkins/agent
volumeMounts:
- name: workspace-volume
mountPath: /home/jenkins/agent
env:
- name: JENKINS_WEB_SOCKET
value: "true"
- name: REMOTING_OPTS
value: "-noReconnectAfter 1d"
- name: python
image: python:3.11.7-alpine
command:
- cat
tty: true
workingDir: /home/jenkins/agent
volumeMounts:
- name: workspace-volume
mountPath: /home/jenkins/agent
- name: docker
image: marcin00.azurecr.io/azure-cli-docker:slim-bookworm
tty: true
workingDir: /home/jenkins/agent
volumeMounts:
- name: workspace-volume
mountPath: /home/jenkins/agent
- name: git
image: alpine/git:latest
command:
- cat
tty: true
workingDir: /home/jenkins/agent
volumeMounts:
- name: workspace-volume
mountPath: /home/jenkins/agent
nodeSelector:
kubernetes.io/os: linux
restartPolicy: Never
volumes:
- name: workspace-volume
emptyDir: {}

View File

@ -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
COPY api .
RUN apk add --no-cache curl
RUN pip install -r requirements.txt
CMD python3 app.py

72
Jenkinsfile vendored
View File

@ -1,72 +0,0 @@
pipeline {
agent any
environment {
DOCKER_REGISTRY_URL = 'marcin00.azurecr.io'
DOCKER_IMAGE = "${DOCKER_REGISTRY_URL}/user-microservice:${GIT_COMMIT}"
ACR_NAME = 'marcin00'
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Test python app') {
steps {
script {
dir('api') {
sh '''
python3 -m venv env
source env/bin/activate
pip install -r requirements.txt pytest
python3 -m pytest --junit-xml=pytest_junit.xml
'''
}
}
}
post {
always {
junit testResults: '**/*pytest_junit.xml'
}
}
}
stage('Build & test docker image') {
steps {
script {
appImage = docker.build("${DOCKER_IMAGE}")
sh label: 'Install dgoss', script: '''
curl -s -L https://github.com/aelsabbahy/goss/releases/latest/download/goss-linux-amd64 -o goss
curl -s -L https://github.com/aelsabbahy/goss/releases/latest/download/dgoss -o dgoss
chmod +rx *goss
'''
withEnv(['GOSS_OPTS=-f junit', 'GOSS_PATH=./goss', 'GOSS_SLEEP=3', 'SQLALCHEMY_DATABASE_URI=sqlite:///:memory:']) {
sh label: 'run image tests', script: './dgoss run -e SQLALCHEMY_DATABASE_URI=sqlite:///:memory: ${DOCKER_IMAGE} > goss_junit.xml'
}
}
}
post {
always {
junit testResults: '**/*goss_junit.xml'
}
}
}
stage('Deploy') {
steps {
script {
sh '''
az login --identity
az acr login --name ${ACR_NAME}
docker push ${DOCKER_IMAGE}
'''
}
}
}
}
post {
cleanup {
script { cleanWs() }
}
}
}

View File

@ -4,7 +4,8 @@ from flask_jwt_extended import JWTManager
from jwt import ExpiredSignatureError
from models import db, RevokedToken
import os
from utils import init_db
from tech_views import tech_bp
from utils import init_db, wait_for_db
from views import user_bp
from werkzeug.exceptions import HTTPException
@ -26,6 +27,7 @@ def create_app(config_name="default"):
# Blueprints registration
app.register_blueprint(user_bp)
app.register_blueprint(tech_bp)
# Database and JWT initialization
db.init_app(app)
@ -53,6 +55,7 @@ def create_app(config_name="default"):
# Fill database by initial values (only if we are not testing)
with app.app_context():
wait_for_db(max_retries=100)
db.create_all()
if config_name != "testing":
init_db()

20
api/tech_views.py Normal file
View File

@ -0,0 +1,20 @@
from flask import Blueprint, jsonify
from models import db
from sqlalchemy import text
from utils import db_ready
# Blueprint with technical endpoints
tech_bp = Blueprint('tech_bp', __name__)
@tech_bp.route('/health', methods=['GET'])
def health_check():
"Check if service works and database is functional"
try:
with db.engine.connect() as connection:
connection.execute(text("SELECT 1"))
return jsonify(status="healthy"), 200
except Exception:
if db_ready:
return jsonify(status="unhealthy"), 500
else:
return jsonify(status="starting"), 503

View File

@ -2,17 +2,22 @@ from flask import abort
from flask_jwt_extended import get_jwt_identity
from models import User, db
import os
from sqlalchemy import text
from sqlalchemy.exc import DatabaseError, InterfaceError
import time
from werkzeug.security import generate_password_hash
db_ready = False
def admin_required(user_id, message='Access denied.'):
"Check if common user try to make administrative action."
user = db.session.get(User, user_id)
if user is None or user.role != "Administrator":
abort(403, message)
def validate_access(owner_id, message='Access denied.'):
# Check if user try to access or edit resource that does not belong to them
"Check if user try to access or edit resource that does not belong to them."
logged_user_id = int(get_jwt_identity())
logged_user_role = db.session.get(User, logged_user_id).role
if logged_user_role != "Administrator" and logged_user_id != owner_id:
@ -27,6 +32,20 @@ def get_user_or_404(user_id):
return user
def wait_for_db(max_retries):
"Try to connect with database <max_retries> times."
global db_ready
for _ in range(max_retries):
try:
with db.engine.connect() as connection:
connection.execute(text("SELECT 1"))
db_ready = True
return
except DatabaseError | InterfaceError:
time.sleep(3)
raise Exception("Failed to connect to database.")
def init_db():
"""Create default admin account if database is empty"""
with db.session.begin():

View File

@ -2,6 +2,7 @@ from flask import Blueprint, jsonify, request, abort
from flask_jwt_extended import create_access_token, set_access_cookies, jwt_required, \
verify_jwt_in_request, get_jwt_identity, unset_jwt_cookies, get_jwt
from models import db, RevokedToken, User
import os
from utils import admin_required, validate_access, get_user_or_404
from werkzeug.security import check_password_hash, generate_password_hash
@ -110,3 +111,10 @@ def user_logout():
response = jsonify({"msg": "User logged out successfully."})
unset_jwt_cookies(response)
return response
@user_bp.route('/version', methods=['GET'])
def version():
return jsonify({
"version": os.getenv("APP_VERSION", "unknown"),
"build_time": os.getenv("BUILD_DATE", "unknown")
})

View File

@ -1,5 +0,0 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: edu-agentpool
namespace: argo

View File

@ -1,12 +0,0 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: argo
name: argo-workflow-manager
rules:
- apiGroups: ["argoproj.io"]
resources: ["workflowtaskresults"]
verbs: ["create", "get", "list", "update", "patch", "delete"]
- apiGroups: ["argoproj.io"]
resources: ["workflows"]
verbs: ["create", "get", "list", "update", "patch", "delete"]

View File

@ -1,142 +0,0 @@
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: build-workflow-
spec:
entrypoint: main
arguments:
parameters:
- name: repo
value: https://gitea.marcin00.pl/pikram/user-microservice.git
- name: branch
value: main
- name: image
value: marcin00.azurecr.io/user-microservice
- name: registry_server
value: marcin00.azurecr.io
serviceAccountName: edu-agentpool
volumeClaimTemplates:
- metadata:
name: workspace
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 128Mi
volumes:
- name: secrets-store
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: azure-keyvault
templates:
# 🔁 Main steps sequence
- name: main
steps:
- - name: checkout
template: checkout
arguments:
parameters:
- name: repo
value: "{{workflow.parameters.repo}}"
- name: branch
value: "{{workflow.parameters.branch}}"
- - name: tests
template: tests
- - name: build-test-and-push-image
template: build-test-and-push-image
arguments:
parameters:
- name: git-sha
value: "{{steps.checkout.outputs.parameters.git-sha}}"
# 📦 GIT CHECKOUT
- name: checkout
inputs:
parameters:
- name: repo
- name: branch
container:
image: alpine/git
command: [sh,-c]
workingDir: /workspace
args:
- |
git clone --depth 1 --branch "{{inputs.parameters.branch}}" --single-branch "{{inputs.parameters.repo}}" repo
cd repo
git rev-parse HEAD > /tmp/gitsha.txt
volumeMounts:
- name: workspace
mountPath: /workspace
outputs:
parameters:
- name: git-sha
valueFrom:
path: /tmp/gitsha.txt
# 🧪 PYTHON TESTS
- name: tests
script:
image: python:3.11.7-alpine
command: [sh]
workingDir: /workspace/repo/api
source: |
python3 -m venv env
. env/bin/activate
pip install -r requirements.txt pytest
python3 -m pytest --junit-xml=pytest_junit.xml
volumeMounts:
- name: workspace
mountPath: /workspace
# 🐳 BUILDS AND GOSS TESTS
- name: build-test-and-push-image
inputs:
parameters:
- name: git-sha
container:
image: docker:dind
command: [sh, -c]
workingDir: /workspace/repo
args:
- |
dockerd-entrypoint.sh &
sleep 3
DOCKER_IMAGE={{workflow.parameters.image}}:{{inputs.parameters.git-sha}}
docker build -t $DOCKER_IMAGE .
apk add --no-cache bash
wget https://github.com/aelsabbahy/goss/releases/latest/download/goss-linux-amd64 -O goss
wget https://github.com/aelsabbahy/goss/releases/latest/download/dgoss -O dgoss
chmod +rx *goss
export GOSS_OPTS="-f junit"
export GOSS_PATH=./goss
export GOSS_SLEEP=3
./dgoss run -e SQLALCHEMY_DATABASE_URI=sqlite:///:memory: $DOCKER_IMAGE > /workspace/goss_junit.xml
echo "===> Logging into ACR"
ACR_PASSWORD=$(cat /mnt/secrets/acr-password)
echo "$ACR_PASSWORD" | docker login {{workflow.parameters.registry_server}} -u $ACR_USERNAME --password-stdin
echo "===> Pushing image to ACR"
docker push $DOCKER_IMAGE
env:
- name: ACR_USERNAME
value: marcin00
securityContext:
privileged: true
volumeMounts:
- name: workspace
mountPath: /workspace
- name: docker-library
mountPath: /var/lib/docker
- name: secrets-store
mountPath: "/mnt/secrets"
readOnly: true
volumes:
- name: docker-library
emptyDir: {}

View File

@ -1,13 +0,0 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: argo-edu-agentpool-binding
namespace: argo
subjects:
- kind: ServiceAccount
name: edu-agentpool
namespace: argo
roleRef:
kind: Role
name: argo-workflow-manager
apiGroup: rbac.authorization.k8s.io

View File

@ -1,25 +0,0 @@
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: azure-keyvault
namespace: argo
spec:
provider: azure
secretObjects:
- secretName: acr-creds
type: Opaque
data:
- objectName: acr-password
- key: password
parameters:
usePodIdentity: "false"
useVMManagedIdentity: "true"
userAssignedIdentityID: "0c2780e4-8594-4aab-8f1a-8a19f71924bd" # client_id of the user-assigned managed identity
clientID: "0c2780e4-8594-4aab-8f1a-8a19f71924bd" # client_id of the user-assigned managed identity
keyvaultName: "dev-aks"
objects: |
array:
- |
objectName: acr-password
objectType: secret
tenantID: "f4e3e6f7-d21c-460e-b201-2192174e7f41"

65
deployment_timer.sh Executable file
View File

@ -0,0 +1,65 @@
#!/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 ===
WAITED=0
echo "[WAIT] Oczekiwanie na nową wersję..."
while true; do
sleep $CHECK_INTERVAL
WAITED=$((WAITED + 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))
# Nadpisujemy linię z licznikiem
printf "\r[INFO] Nowa wersja wdrożona po %ds: %s\n" "$WAITED" "$NEW_VERSION"
echo "[INFO] Czas wdrożenia: $DURATION sekund"
echo "$START_TIME,$END_TIME,$DURATION,$OLD_VERSION,$NEW_VERSION" >> "$OUTPUT_FILE"
break
else
# Nadpisujemy TYLKO linię z licznikiem
printf "\r[WAIT] Czekam... %ds" "$WAITED"
fi
done
# Żeby kursor przeszedł do nowej linii po zakończeniu
echo ""

View File

@ -7,9 +7,24 @@ services:
build: .
env_file:
- api/.env
ports:
- 80:80
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 10s
timeout: 5s
retries: 5
start_period: 15s
db:
container_name: db
hostname: db
image: mysql:latest
env_file:
- db/.env
ports:
- 3306:3306
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5

View File

@ -1,8 +0,0 @@
port:
tcp:80:
listening: true
ip:
- 0.0.0.0
process:
python3:
running: true

1
version_marker.txt Normal file
View File

@ -0,0 +1 @@
1752257920