131 Commits
Author SHA1 Message Date
Marcin-Ramotowski d6ade884cf Automatyczna zmiana: 1753736103
ci/woodpecker/push/build Pipeline was successful
2025-07-28 22:55:03 +02:00
Marcin-Ramotowski b890fdb29a Automatyczna zmiana: 1753735432
ci/woodpecker/push/build Pipeline was successful
2025-07-28 22:43:52 +02:00
Marcin-Ramotowski e18fc0cdc9 Automatyczna zmiana: 1753735101
ci/woodpecker/push/build Pipeline was successful
2025-07-28 22:38:21 +02:00
Marcin-Ramotowski 39eacf7df9 Automatyczna zmiana: 1753734759
ci/woodpecker/push/build Pipeline was successful
2025-07-28 22:32:39 +02:00
Marcin-Ramotowski 8572d8834a Automatyczna zmiana: 1753734421
ci/woodpecker/push/build Pipeline was successful
2025-07-28 22:27:01 +02:00
Marcin-Ramotowski 5e726bbed7 Automatyczna zmiana: 1753734075
ci/woodpecker/push/build Pipeline was successful
2025-07-28 22:21:15 +02:00
Marcin-Ramotowski aaeeafdb2f Automatyczna zmiana: 1753733719
ci/woodpecker/push/build Pipeline was successful
2025-07-28 22:15:19 +02:00
Marcin-Ramotowski a74627b567 Automatyczna zmiana: 1753733365
ci/woodpecker/push/build Pipeline was successful
2025-07-28 22:09:25 +02:00
Marcin-Ramotowski e31a270e32 Automatyczna zmiana: 1753732599
ci/woodpecker/push/build Pipeline was successful
2025-07-28 21:56:39 +02:00
Marcin-Ramotowski 1d36b1cf97 Automatyczna zmiana: 1753732590
ci/woodpecker/push/build Pipeline failed
2025-07-28 21:56:30 +02:00
Marcin-Ramotowski ae4c508b1f Automatyczna zmiana: 1753732234
ci/woodpecker/push/build Pipeline was successful
2025-07-28 21:50:34 +02:00
Marcin-Ramotowski 4b36e56b2d Automatyczna zmiana: 1753732229
ci/woodpecker/push/build Pipeline failed
2025-07-28 21:50:29 +02:00
Marcin-Ramotowski e320947a94 Automatyczna zmiana: 1753731887
ci/woodpecker/push/build Pipeline was successful
2025-07-28 21:44:47 +02:00
Marcin-Ramotowski f0ff6050c1 Automatyczna zmiana: 1753731880
ci/woodpecker/push/build Pipeline failed
2025-07-28 21:44:40 +02:00
Marcin-Ramotowski dda7cec696 Automatyczna zmiana: 1753731525
ci/woodpecker/push/build Pipeline was successful
2025-07-28 21:38:45 +02:00
Marcin-Ramotowski dd41969be0 Automatyczna zmiana: 1753731518
ci/woodpecker/push/build Pipeline failed
2025-07-28 21:38:38 +02:00
Marcin-Ramotowski 392bb45caa Automatyczna zmiana: 1753731182
ci/woodpecker/push/build Pipeline was successful
2025-07-28 21:33:02 +02:00
Marcin-Ramotowski e480b9a010 Automatyczna zmiana: 1753730840
ci/woodpecker/push/build Pipeline was successful
2025-07-28 21:27:20 +02:00
Marcin-Ramotowski 4b38189a87 Automatyczna zmiana: 1753730833
ci/woodpecker/push/build Pipeline failed
2025-07-28 21:27:13 +02:00
Marcin-Ramotowski 46a5811bd1 Automatyczna zmiana: 1753730494
ci/woodpecker/push/build Pipeline was successful
2025-07-28 21:21:34 +02:00
Marcin-Ramotowski bc8aa5e39d Automatyczna zmiana: 1753730135
ci/woodpecker/push/build Pipeline was successful
2025-07-28 21:15:35 +02:00
Marcin-Ramotowski 8271e8e5a6 Automatyczna zmiana: 1753729792
ci/woodpecker/push/build Pipeline was successful
2025-07-28 21:09:52 +02:00
Marcin-Ramotowski dd6b305fbe Automatyczna zmiana: 1753729784
ci/woodpecker/push/build Pipeline failed
2025-07-28 21:09:44 +02:00
Marcin-Ramotowski 19856922b1 Automatyczna zmiana: 1753729446
ci/woodpecker/push/build Pipeline was successful
2025-07-28 21:04:06 +02:00
Marcin-Ramotowski 4eb2fa7564 Automatyczna zmiana: 1753729438
ci/woodpecker/push/build Pipeline failed
2025-07-28 21:03:58 +02:00
Marcin-Ramotowski a3e15913c1 Automatyczna zmiana: 1753729112
ci/woodpecker/push/build Pipeline was successful
2025-07-28 20:58:32 +02:00
Marcin-Ramotowski 829e2540e9 Automatyczna zmiana: 1753728767
ci/woodpecker/push/build Pipeline was successful
2025-07-28 20:52:47 +02:00
Marcin-Ramotowski 7781eaaa0b Automatyczna zmiana: 1753728411
ci/woodpecker/push/build Pipeline was successful
2025-07-28 20:46:51 +02:00
Marcin-Ramotowski 8e99f545c7 Automatyczna zmiana: 1753726377
ci/woodpecker/push/build Pipeline was successful
2025-07-28 20:12:57 +02:00
Marcin-Ramotowski 2da59e2250 Automatyczna zmiana: 1753725775
ci/woodpecker/push/build Pipeline was successful
2025-07-28 20:02:55 +02:00
Marcin-Ramotowski 759fc8afc8 Automatyczna zmiana: 1753725292
ci/woodpecker/push/build Pipeline was successful
2025-07-28 19:54:52 +02:00
Marcin-Ramotowski b5be4f4f75 Automatyczna zmiana: 1753724795
ci/woodpecker/push/build Pipeline was successful
2025-07-28 19:46:35 +02:00
Marcin-Ramotowski 4d64e51771 Automatyczna zmiana: 1753632242
ci/woodpecker/push/build Pipeline was successful
2025-07-27 18:04:02 +02:00
Marcin-Ramotowski 7c31f88080 Automatyczna zmiana: 1753631155
ci/woodpecker/push/build Pipeline was successful
2025-07-27 17:45:55 +02:00
Marcin-Ramotowski 9fde6fe98d Automatyczna zmiana: 1753631147
ci/woodpecker/push/build Pipeline failed
2025-07-27 17:45:47 +02:00
Marcin-Ramotowski 208adc8258 Automatyczna zmiana: 1753630796
ci/woodpecker/push/build Pipeline was successful
2025-07-27 17:39:56 +02:00
Marcin-Ramotowski 93bb32c86f Automatyczna zmiana: 1753630789
ci/woodpecker/push/build Pipeline failed
2025-07-27 17:39:49 +02:00
Marcin-Ramotowski 6b5dafcbf5 Automatyczna zmiana: 1753630408
ci/woodpecker/push/build Pipeline was successful
2025-07-27 17:33:28 +02:00
Marcin-Ramotowski ed95b4ce91 Automatyczna zmiana: 1753630035
ci/woodpecker/push/build Pipeline was successful
2025-07-27 17:27:15 +02:00
Marcin-Ramotowski 09ebc9f4b4 Automatyczna zmiana: 1753629562
ci/woodpecker/push/build Pipeline was successful
2025-07-27 17:19:22 +02:00
Marcin-Ramotowski 963a192935 Automatyczna zmiana: 1753628608
ci/woodpecker/push/build Pipeline was successful
2025-07-27 17:03:28 +02:00
Marcin-Ramotowski 0acfabc0ee Automatyczna zmiana: 1753627976
ci/woodpecker/push/build Pipeline was successful
2025-07-27 16:52:57 +02:00
Marcin-Ramotowski acfc9fab90 Automatyczna zmiana: 1753626456
ci/woodpecker/push/build Pipeline was successful
2025-07-27 16:27:36 +02:00
Marcin-Ramotowski ae2a7d7608 Automatyczna zmiana: 1753625345
ci/woodpecker/push/build Pipeline was successful
2025-07-27 16:09:05 +02:00
Marcin-Ramotowski ddfd529fff Automatyczna zmiana: 1753624962
ci/woodpecker/push/build Pipeline was successful
2025-07-27 16:02:42 +02:00
Marcin-Ramotowski ce82dbe1cf Automatyczna zmiana: 1753624408
ci/woodpecker/push/build Pipeline was successful
2025-07-27 15:53:28 +02:00
Marcin-Ramotowski ad09eab10b Automatyczna zmiana: 1753624006
ci/woodpecker/push/build Pipeline was successful
2025-07-27 15:46:46 +02:00
Marcin-Ramotowski 58fac1fd68 Automatyczna zmiana: 1753623624
ci/woodpecker/push/build Pipeline was successful
2025-07-27 15:40:24 +02:00
Marcin-Ramotowski fca0219235 Updated path in repo
ci/woodpecker/push/build Pipeline was successful
2025-07-27 14:56:00 +02:00
Marcin-Ramotowski 39cf921a19 Changed deploy repo branch
ci/woodpecker/push/build Pipeline failed
2025-07-27 14:46:42 +02:00
Marcin-Ramotowski 37aa5692ef Automatyczna zmiana: 1753616849
ci/woodpecker/push/build Pipeline was successful
2025-07-27 13:47:29 +02:00
Marcin-Ramotowski c266121cb9 Automatyczna zmiana: 1753616502
ci/woodpecker/push/build Pipeline was successful
2025-07-27 13:41:42 +02:00
Marcin-Ramotowski 7c5845b059 Automatyczna zmiana: 1753616108
ci/woodpecker/push/build Pipeline was successful
2025-07-27 13:35:08 +02:00
Marcin-Ramotowski de2211d324 Automatyczna zmiana: 1753615758
ci/woodpecker/push/build Pipeline was successful
2025-07-27 13:29:18 +02:00
Marcin-Ramotowski 59ce5f2159 Automatyczna zmiana: 1753615368
ci/woodpecker/push/build Pipeline was successful
2025-07-27 13:22:48 +02:00
Marcin-Ramotowski a01e83f40c Automatyczna zmiana: 1753614999
ci/woodpecker/push/build Pipeline was successful
2025-07-27 13:16:39 +02:00
Marcin-Ramotowski e6f5f61ccd Automatyczna zmiana: 1753614530
ci/woodpecker/push/build Pipeline was successful
2025-07-27 13:08:50 +02:00
Marcin-Ramotowski aeb137fb20 Automatyczna zmiana: 1753614180
ci/woodpecker/push/build Pipeline was successful
2025-07-27 13:03:00 +02:00
Marcin-Ramotowski ff5d0773c8 Automatyczna zmiana: 1753613799
ci/woodpecker/push/build Pipeline was successful
2025-07-27 12:56:39 +02:00
Marcin-Ramotowski 42e2812f42 Automatyczna zmiana: 1753613462
ci/woodpecker/push/build Pipeline was successful
2025-07-27 12:51:02 +02:00
Marcin-Ramotowski f284adc213 Automatyczna zmiana: 1753613114
ci/woodpecker/push/build Pipeline was successful
2025-07-27 12:45:14 +02:00
Marcin-Ramotowski c3014d63aa Automatyczna zmiana: 1753612757
ci/woodpecker/push/build Pipeline was successful
2025-07-27 12:39:17 +02:00
Marcin-Ramotowski 552278e47a Automatyczna zmiana: 1753612361
ci/woodpecker/push/build Pipeline was successful
2025-07-27 12:32:41 +02:00
Marcin-Ramotowski 97f3b3432a Automatyczna zmiana: 1753611948
ci/woodpecker/push/build Pipeline was successful
2025-07-27 12:25:48 +02:00
Marcin-Ramotowski c08099f81b Automatyczna zmiana: 1753611496
ci/woodpecker/push/build Pipeline was successful
2025-07-27 12:18:16 +02:00
Marcin-Ramotowski e06466e54a Automatyczna zmiana: 1753610498
ci/woodpecker/push/build Pipeline was successful
2025-07-27 12:01:38 +02:00
Marcin-Ramotowski 27cdaa7c0e Automatyczna zmiana: 1753610020
ci/woodpecker/push/build Pipeline was successful
2025-07-27 11:53:40 +02:00
Marcin-Ramotowski feefee6cc9 Automatyczna zmiana: 1753609102
ci/woodpecker/push/build Pipeline was successful
2025-07-27 11:38:22 +02:00
Marcin-Ramotowski 8ed4522df3 Automatyczna zmiana: 1753608508
ci/woodpecker/push/build Pipeline was successful
2025-07-27 11:28:28 +02:00
Marcin-Ramotowski 3d82736e2d Automatyczna zmiana: 1753607776
ci/woodpecker/push/build Pipeline was successful
2025-07-27 11:16:16 +02:00
Marcin-Ramotowski 156c475b82 Changed deploy repo branch
ci/woodpecker/push/build Pipeline failed
2025-07-27 10:58:58 +02:00
Marcin-Ramotowski 78613948f5 Added manual trigger for pipeline
ci/woodpecker/push/build Pipeline was successful
2025-07-27 09:45:06 +02:00
Marcin-Ramotowski 6b0e6486d0 Automatyczna zmiana: 1753553628
ci/woodpecker/push/build Pipeline was successful
2025-07-26 20:13:48 +02:00
Marcin-Ramotowski a51288df7e Automatyczna zmiana: 1753553193
ci/woodpecker/push/build Pipeline was successful
2025-07-26 20:06:33 +02:00
Marcin-Ramotowski 2bb5301264 Automatyczna zmiana: 1753552782
ci/woodpecker/push/build Pipeline was successful
2025-07-26 19:59:42 +02:00
Marcin-Ramotowski 1f57e0ba7f Automatyczna zmiana: 1753552092
ci/woodpecker/push/build Pipeline was successful
2025-07-26 19:48:12 +02:00
Marcin-Ramotowski d420e62aac Automatyczna zmiana: 1753547089
ci/woodpecker/push/build Pipeline was successful
2025-07-26 18:24:49 +02:00
Marcin-Ramotowski 9a37f25948 Automatyczna zmiana: 1753547083
ci/woodpecker/push/build Pipeline failed
2025-07-26 18:24:43 +02:00
Marcin-Ramotowski 9ba8c09519 Automatyczna zmiana: 1753546725
ci/woodpecker/push/build Pipeline was successful
2025-07-26 18:18:45 +02:00
Marcin-Ramotowski de7040cc0a Automatyczna zmiana: 1753546382
ci/woodpecker/push/build Pipeline was successful
2025-07-26 18:13:02 +02:00
Marcin-Ramotowski 6127e7a19c Automatyczna zmiana: 1753546027
ci/woodpecker/push/build Pipeline was successful
2025-07-26 18:07:07 +02:00
Marcin-Ramotowski 9b26757c1c Automatyczna zmiana: 1753546019
ci/woodpecker/push/build Pipeline failed
2025-07-26 18:06:59 +02:00
Marcin-Ramotowski 88aec64018 Automatyczna zmiana: 1753545670
ci/woodpecker/push/build Pipeline was successful
2025-07-26 18:01:10 +02:00
Marcin-Ramotowski 829e8f09a3 Automatyczna zmiana: 1753545313
ci/woodpecker/push/build Pipeline was successful
2025-07-26 17:55:13 +02:00
Marcin-Ramotowski 75aa55b698 Automatyczna zmiana: 1753544961
ci/woodpecker/push/build Pipeline was successful
2025-07-26 17:49:21 +02:00
Marcin-Ramotowski 532010790d Automatyczna zmiana: 1753544601
ci/woodpecker/push/build Pipeline was successful
2025-07-26 17:43:21 +02:00
Marcin-Ramotowski 71579de019 Automatyczna zmiana: 1753544244
ci/woodpecker/push/build Pipeline was successful
2025-07-26 17:37:24 +02:00
Marcin-Ramotowski d0ae8432af Automatyczna zmiana: 1753543913
ci/woodpecker/push/build Pipeline was successful
2025-07-26 17:31:53 +02:00
Marcin-Ramotowski 6aad4f0e7f Automatyczna zmiana: 1753543905
ci/woodpecker/push/build Pipeline failed
2025-07-26 17:31:45 +02:00
Marcin-Ramotowski f6215cd286 Automatyczna zmiana: 1753543565
ci/woodpecker/push/build Pipeline was successful
2025-07-26 17:26:05 +02:00
Marcin-Ramotowski 7a8cb55b70 Automatyczna zmiana: 1753543214
ci/woodpecker/push/build Pipeline was successful
2025-07-26 17:20:14 +02:00
Marcin-Ramotowski 1fd5bafdbd Automatyczna zmiana: 1753542850
ci/woodpecker/push/build Pipeline was successful
2025-07-26 17:14:10 +02:00
Marcin-Ramotowski 9f50ed2f60 Automatyczna zmiana: 1753542843
ci/woodpecker/push/build Pipeline failed
2025-07-26 17:14:03 +02:00
Marcin-Ramotowski 7919c055af Automatyczna zmiana: 1753542507
ci/woodpecker/push/build Pipeline was successful
2025-07-26 17:08:27 +02:00
Marcin-Ramotowski 291f8229ac Automatyczna zmiana: 1753542159
ci/woodpecker/push/build Pipeline was successful
2025-07-26 17:02:39 +02:00
Marcin-Ramotowski cedc4c52e1 Automatyczna zmiana: 1753541713
ci/woodpecker/push/build Pipeline was successful
2025-07-26 16:55:13 +02:00
Marcin-Ramotowski af829bc5bb Added overwrite output lines during waiting
ci/woodpecker/push/build Pipeline was successful
2025-07-26 16:47:54 +02:00
Marcin-Ramotowski 66e2a0e3b9 Merge branch 'dev' into woodpecker
ci/woodpecker/push/build Pipeline was successful
2025-07-26 16:35:10 +02:00
Marcin-Ramotowski 6bfcbb1c96 Automatyczna zmiana: 1753539316
ci/woodpecker/push/build Pipeline was successful
2025-07-26 16:15:16 +02:00
Marcin-Ramotowski 7072671564 Added dockerd command
ci/woodpecker/push/build Pipeline was successful
2025-07-22 19:36:56 +02:00
Marcin-Ramotowski a2c2e39a1b Corrected commands variables expansion
ci/woodpecker/push/build Pipeline failed
2025-07-22 19:30:03 +02:00
Marcin-Ramotowski 55eeec730d Added userns-mode annotation
ci/woodpecker/push/build Pipeline failed
2025-07-21 15:39:06 +02:00
Marcin-Ramotowski e6c9675abc Added sysbox as runtimeClass
ci/woodpecker/push/build Pipeline failed
2025-07-20 11:15:32 +02:00
Marcin-Ramotowski ebf713f75f Removed Goss from pipeline; added GitOps commit 2025-07-20 11:01:12 +02:00
Marcin-Ramotowski 13f098fc7c Removed Goss 2025-07-20 10:02:27 +02:00
Marcin-Ramotowski 8cf8a92f8d Removed Jenkinsfile 2025-07-20 10:01:57 +02:00
Marcin-Ramotowski 571a45d3de Added script to trigger and measure deployment time 2025-07-20 10:00:29 +02:00
Marcin-Ramotowski 560090319a Added build args to Dockerfile 2025-07-20 09:59:53 +02:00
Marcin-Ramotowski e6c68f839a Added script to trigger and measure deployment time 2025-07-20 09:54:38 +02:00
Marcin-Ramotowski fcb93a5cf8 Added build args to Dockerfile 2025-07-20 09:54:31 +02:00
Marcin-Ramotowski c9b1dac864 Added endpoint to fetch app version 2025-07-03 22:47:21 +02:00
Marcin-Ramotowski cd4ab3fd27 Handled more errors during db initialization 2025-06-12 18:42:07 +00:00
Marcin-Ramotowski 301cf5922e Changed docker image base to Alpine and added curl 2025-06-11 22:15:37 +00:00
Marcin-Ramotowski 479ec4f917 Added healthcheck 2025-06-11 22:04:35 +00:00
Marcin-Ramotowski 3f40a6126c Added more descriptions of functions 2025-06-11 20:04:04 +00:00
Marcin-Ramotowski dd9e9ce110 Improved function body 2025-06-11 19:57:15 +00:00
Marcin-Ramotowski cefb8eba4d Added missing dgoss installation
ci/woodpecker/push/build Pipeline was successful
2025-05-25 20:09:14 +00:00
Marcin-Ramotowski 1e54ba614a Corrected output path for dgoss command
ci/woodpecker/push/build Pipeline failed
2025-05-25 20:05:49 +00:00
Marcin-Ramotowski 7469609600 Removed redundant quote around dgoss command
ci/woodpecker/push/build Pipeline failed
2025-05-25 20:01:31 +00:00
Marcin-Ramotowski b7a1fcfe49 Added double quotes around dgoss run command 2025-05-25 20:00:13 +00:00
Marcin-Ramotowski a9743ecfbe Restored old procedure for Goss tests 2025-05-25 19:59:21 +00:00
Marcin-Ramotowski 76f33f50f5 Extended time to dockerd start
ci/woodpecker/push/build Pipeline failed
2025-05-25 19:54:30 +00:00
Marcin-Ramotowski 203a81573d Added dockerd start in the background
ci/woodpecker/push/build Pipeline failed
2025-05-25 19:43:19 +00:00
Marcin-Ramotowski 383e906102 Corrected image name
ci/woodpecker/push/build Pipeline failed
2025-05-25 19:36:16 +00:00
Marcin-Ramotowski e7330f07ee Returned to privileged mode
ci/woodpecker/push/build Pipeline failed
2025-05-25 19:34:22 +00:00
Marcin-Ramotowski c996be5953 Modified building step 2025-05-25 17:44:17 +00:00
Marcin-Ramotowski bf60011948 Added double quotes around command to run Dgoss 2025-05-25 17:17:11 +00:00
Marcin-Ramotowski 82d5962020 Added steps to build, test and push docker image 2025-05-25 17:14:18 +00:00
Marcin-Ramotowski 1254b036f5 Added cd to api directory
ci/woodpecker/push/build Pipeline was successful
2025-05-25 16:54:15 +00:00
Marcin-Ramotowski 6d84bf694e Added python tests to Woodpecker Workflow
ci/woodpecker/push/build Pipeline failed
2025-05-25 16:43:44 +00:00
Marcin-Ramotowski c2df9d136e Test first Woodpecker workflow
ci/woodpecker/push/my-first-workflow Pipeline failed
2025-05-25 16:19:25 +00:00
10 changed files with 208 additions and 366 deletions
+71
View File
@@ -0,0 +1,71 @@
when:
- event: [push, manual]
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
commands:
- dockerd &
- export DOCKER_IMAGE=marcin00.azurecr.io/user-microservice:${CI_COMMIT_SHA}
- 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:
annotations:
io.kubernetes.cri-o.userns-mode: "auto:size=65536"
runtimeClassName: sysbox-runc
- name: gitops-commit
image: alpine/git
environment:
DEPLOY_REPO_URL: ssh://[email protected]:20343/pikram/user-microservice-deploy.git
DEPLOY_REPO_BRANCH: woodpecker-fluxcd-deploy
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 "[email protected]"
- git clone $DEPLOY_REPO_URL --branch $DEPLOY_REPO_BRANCH
- cd user-microservice-deploy/apps/user-microservice
- |
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 $DEPLOY_REPO_BRANCH
+14 -1
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 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
-353
View File
@@ -1,353 +0,0 @@
# user-microservice
Mikroserwis REST do zarządzania kontami użytkowników, zbudowany w celu **porównania
narzędzi CI/CD do automatycznego budowania i wdrażania aplikacji skonteneryzowanych**.
Projekt powstał w ramach pracy magisterskiej.
To repozytorium zawiera **kod aplikacji** oraz **potoki CI** (budowanie, testy, publikacja
obrazu, aktualizacja repozytorium GitOps). Manifesty Kubernetes i konfiguracje narzędzi CD
znajdują się w drugim repozytorium: **[`user-microservice-deploy`](../user-microservice-deploy)**.
---
## Spis treści
- [Cel projektu](#cel-projektu)
- [Architektura rozwiązania](#architektura-rozwiązania)
- [Porównywane narzędzia (5)](#porównywane-narzędzia-5)
- [Scenariusze pomiarowe](#scenariusze-pomiarowe)
- [Mapa branchy](#mapa-branchy)
- [Aplikacja](#aplikacja)
- [Stos technologiczny](#stos-technologiczny)
- [API](#api)
- [Model danych](#model-danych)
- [Konfiguracja (zmienne środowiskowe)](#konfiguracja-zmienne-środowiskowe)
- [Uruchomienie lokalne](#uruchomienie-lokalne)
- [Testy](#testy)
- [Potoki CI](#potoki-ci)
- [Jenkins](#jenkins)
- [Woodpecker CI](#woodpecker-ci)
- [Argo Workflows](#argo-workflows)
- [Wspólny schemat potoku CI](#wspólny-schemat-potoku-ci)
- [Infrastruktura](#infrastruktura)
- [Pomiar dostarczenia zmiany](#pomiar-dostarczenia-zmiany)
- [Struktura repozytorium](#struktura-repozytorium)
---
## Cel projektu
Zaprojektowano jednolity proces CI/CD (build → test → publikacja obrazu → wdrożenie na
Kubernetes) i zaimplementowano go w **pięciu narzędziach**, a następnie **zmierzono czas
dostarczenia zmiany** (od commita do działającej aplikacji) dla różnych kombinacji narzędzi
CI i CD. Celem była obiektywna, ilościowa i jakościowa charakterystyka tych narzędzi.
Proces jest identyczny funkcjonalnie w każdym narzędziu:
1. Uruchomienie po zdarzeniu `push` do repozytorium aplikacji.
2. Uruchomienie testów jednostkowych (`pytest`).
3. Zbudowanie obrazu kontenera i opublikowanie go w rejestrze (Azure Container Registry),
z tagiem równym SHA commita.
4. Zaktualizowanie manifestu wdrożenia w repozytorium GitOps (`user-microservice-deploy`) —
podmiana taga obrazu na nowy SHA.
5. Wdrożenie nowej wersji na klaster Kubernetes (Azure AKS) przez narzędzie CD.
## Architektura rozwiązania
```
┌──────────────────────────┐ push ┌───────────────────────────┐
│ user-microservice (Git) │ ────────────────────▶ │ Potok CI │
│ kod aplikacji + potoki │ │ Jenkins / Woodpecker / │
└──────────────────────────┘ │ Argo Workflows │
└────────────┬──────────────┘
┌──────────────────────────────────┬──────────┴───────┐
│ 1. pytest │ │
│ 2. docker build + push ▼ ▼
│ ┌────────────────────┐ ┌───────────────┐
│ │ Azure Container │ │ commit taga │
│ │ Registry (ACR) │ │ do repo │
│ └────────────────────┘ │ GitOps │
│ └───────┬───────┘
▼ │
┌──────────────────────────┐ obserwuje / webhook ┌───────────────────────────┐
│ user-microservice-deploy │ ◀──────────────────────────────▶│ Potok CD │
│ manifesty K8s (GitOps) │ │ kubectl / ArgoCD / Flux │
└──────────────────────────┘ └────────────┬──────────────┘
│ apply / sync
┌───────────────────────────┐
│ Azure Kubernetes (AKS) │
│ namespace: user-... │
└───────────────────────────┘
```
## Porównywane narzędzia (5)
| Rola | Narzędzie | Model działania |
|------|-----------|-----------------|
| **CI** (build/test/push) | **Jenkins** | Potok deklaratywny (`Jenkinsfile`), agent w Kubernetes (pod z wieloma kontenerami) |
| **CI** | **Woodpecker CI** | Potok YAML (`.woodpecker/build.yaml`), backend Kubernetes |
| **CI** | **Argo Workflows** | Sterowany zdarzeniami (Argo Events: `EventSource` + `Sensor``Workflow`) |
| **CD** (deploy) | **ArgoCD** | GitOps typu *pull* — synchronizuje stan klastra z repo deploymentowym |
| **CD** | **FluxCD** | GitOps typu *pull*`GitRepository` + `Kustomization` + `Receiver` |
Dodatkowo każde narzędzie CI potrafi też pełnić rolę CD w wariancie „to samo narzędzie":
wdrożenie realizowane jest wtedy imperatywnie przez `kubectl apply` (potok wyzwalany
commitem do repo GitOps).
## Scenariusze pomiarowe
Pełna macierz to **3 narzędzia CI × 3 warianty CD = 9 scenariuszy**:
| # | CI | CD |
|---|----|----|
| Scenariusz 1 | Jenkins | Jenkins (`kubectl apply`) |
| Scenariusz 2 | Jenkins | ArgoCD |
| Scenariusz 3 | Jenkins | FluxCD |
| Scenariusz 4 | Woodpecker | Woodpecker (`kubectl apply`) |
| Scenariusz 5 | Woodpecker | ArgoCD |
| Scenariusz 6 | Woodpecker | FluxCD |
| Scenariusz 7 | Argo Workflows | Argo Workflows |
| Scenariusz 8 | Argo Workflows | ArgoCD |
| Scenariusz 9 | Argo Workflows | FluxCD |
> Scenariusze 13 obejmują Jenkinsa, 46 Woodpeckera, a 79 Argo Workflows — w każdej trójce
> kolejno: to samo narzędzie do CD, ArgoCD oraz FluxCD.
## Mapa branchy
Każda kombinacja narzędzi ma osobny branch — w obu repozytoriach. Poniżej odwzorowanie
scenariuszy na branche.
**Repozytorium aplikacji (`user-microservice`) — definicje CI:**
| Branch | Zawartość |
|--------|-----------|
| `main` | Kod aplikacji (bazowy), ten README, skrypty analizy |
| `dev` | Gałąź rozwojowa aplikacji + narzędzia pomiarowe (`deployment_timer.sh`, `data_analysis.py`) |
| `jenkins-pipeline` | CI w Jenkins (`.jenkins/Jenkinsfile`, `podTemplate.yaml`) |
| `woodpecker` | CI w Woodpecker (`.woodpecker/build.yaml`) |
| `argo-workflows` | CI w Argo Workflows / Argo Events (`argo-workflows/*`) |
| `jenkins-fluxcd`, `woodpecker-argocd`, `woodpecker-fluxcd`, `argoworkflow-argocd`, `argoworkflow-fluxcd` | Warianty CI dostrojone do konkretnego narzędzia CD (np. docelowy branch repo GitOps) |
**Repozytorium deploymentowe (`user-microservice-deploy`) — manifesty i CD:**
| Branch | Scenariusz |
|--------|-----------|
| `master` | Baza manifestów |
| `jenkins-kubernetes` | Sc 1 — Jenkins wdraża przez `kubectl` |
| `jenkins-argocd-deploy` | Sc 2 — ArgoCD |
| `jenkins-fluxcd-deploy` | Sc 3 — FluxCD |
| `woodpecker-deploy` | Sc 4 — Woodpecker wdraża przez `kubectl` |
| `woodpecker-argocd-deploy` | Sc 5 — ArgoCD |
| `woodpecker-fluxcd-deploy` | Sc 6 — FluxCD |
| `argo-deploy` | Sc 7 — Argo Workflows |
| `argoworkflow-argocd` | Sc 8 — ArgoCD |
| `argoworkflow-fluxcd` / `fluxcd` | Sc 9 — FluxCD |
> Uwaga: warianty FluxCD używają układu katalogów `apps/` + `clusters/prod/` wymaganego przez
> Flux, pozostałe warianty trzymają manifesty w katalogu głównym repo GitOps.
---
## Aplikacja
Mikroserwis udostępnia API REST do zarządzania kontami użytkowników wraz z uwierzytelnianiem
JWT (tokeny w ciasteczkach), rolami oraz mechanizmem wylogowania (unieważnianie tokenów).
### Stos technologiczny
- **Python 3.11**, **Flask 3**
- **Flask-JWT-Extended** — uwierzytelnianie JWT
- **Flask-SQLAlchemy / SQLAlchemy 2** — ORM
- **MySQL** (produkcyjnie), **SQLite in-memory** (testy)
- **waitress** — produkcyjny serwer WSGI
- **pytest** — testy jednostkowe
- **Docker** — konteneryzacja (obraz bazowy `python:3.11.7-slim-bookworm`)
### API
| Metoda | Ścieżka | Opis | Autoryzacja |
|--------|---------|------|-------------|
| `POST` | `/users` | Utworzenie użytkownika | brak (konto `Administrator` wymaga tokena admina) |
| `GET` | `/users` | Lista wszystkich użytkowników | tylko `Administrator` |
| `GET` | `/users/<id>` | Szczegóły użytkownika | właściciel lub `Administrator` |
| `PUT`/`PATCH` | `/users/<id>` | Edycja użytkownika (`PUT` wymaga wszystkich pól) | właściciel lub `Administrator` |
| `DELETE` | `/users/<id>` | Usunięcie użytkownika | właściciel lub `Administrator` |
| `POST` | `/login` | Logowanie, ustawia token JWT w ciasteczku | brak |
| `GET` | `/logout` | Wylogowanie (unieważnienie tokena) | zalogowany |
| `GET` | `/health` | Sprawdzenie stanu aplikacji i połączenia z bazą | brak *(dostępne na branchach z potokami CI/CD)* |
| `GET` | `/version` | Zwraca wdrożoną wersję (`APP_VERSION` = SHA commita) i czas budowy | brak *(dostępne na branchach z potokami CI/CD)* |
Przy pierwszym uruchomieniu, jeśli baza jest pusta, tworzone jest domyślne konto administratora
(zob. zmienne `ADMIN_*`).
### Model danych
- **`User`** — `id`, `username` (unikalny), `email` (unikalny), `role` (`Administrator`/`User`),
`password` (hash).
- **`RevokedToken`** — `jti` unieważnionych tokenów JWT (blocklist przy wylogowaniu).
### Konfiguracja (zmienne środowiskowe)
| Zmienna | Opis | Domyślna |
|---------|------|----------|
| `SQLALCHEMY_DATABASE_URI` | Połączenie do bazy MySQL | — (wymagana poza testami) |
| `JWT_SECRET_KEY` | Klucz podpisujący tokeny JWT | `changeme` |
| `APP_PORT` | Port serwera | `80` |
| `ADMIN_USERNAME` | Login domyślnego admina | `admin` |
| `ADMIN_EMAIL` | E-mail domyślnego admina | `[email protected]` |
| `ADMIN_PASSWORD` | Hasło domyślnego admina | `admin` |
Produkcyjnie sekrety (`SQLALCHEMY_DATABASE_URI`, hasła MySQL) są dostarczane z **Azure Key
Vault** przez sterownik CSI `secrets-store` — zob. repozytorium deploymentowe.
### Uruchomienie lokalne
Za pomocą Docker Compose (uruchamia API + MySQL):
```bash
# przygotuj pliki api/.env oraz db/.env ze zmiennymi środowiskowymi
docker compose up --build
```
Bez konteneryzacji:
```bash
cd api
python3 -m venv env && source env/bin/activate
pip install -r requirements.txt
python3 app.py
```
Aplikacja czeka na gotowość bazy danych przy starcie (`wait_for_db`, do 100 prób co 3 s).
### Testy
```bash
cd api
python3 -m venv env && source env/bin/activate
pip install -r requirements.txt pytest
python3 -m pytest
```
Testy używają bazy SQLite w pamięci (konfiguracja `testing`) i pokrywają operacje CRUD oraz
uwierzytelnianie. Ten sam zestaw testów jest uruchamiany w każdym potoku CI.
> Wcześniejsze wersje potoków korzystały dodatkowo z testów kontenera **Goss** — zostały one
> ostatecznie usunięte z potoków (por. historia commitów), a walidację przejęły testy
> `pytest` oraz health check po wdrożeniu.
---
## Potoki CI
Definicje potoków znajdują się na branchach poszczególnych narzędzi. Wszystkie realizują ten
sam trzyetapowy proces: **testy → build&push → commit do GitOps**.
### Jenkins
Branch `jenkins-pipeline`, plik `.jenkins/Jenkinsfile`. Potok deklaratywny uruchamiany na
**agencie w Kubernetes** — pod z osobnymi kontenerami do każdego etapu (`podTemplate.yaml`):
- `python` — uruchomienie `pytest` (wyniki jako JUnit XML),
- `docker``docker build` + logowanie do ACR (Azure managed identity) + `docker push`,
- `git` — sklonowanie repo GitOps, podmiana taga obrazu (`awk`) i commit na branch
`jenkins-kubernetes`.
Build kontenera działa bez uprawnień roota dzięki **sysbox** (`runtimeClassName: sysbox-runc`).
### Woodpecker CI
Branch `woodpecker`, plik `.woodpecker/build.yaml`. Trzy kroki (`code-tests`,
`build-and-push`, `gitops-commit`) na backendzie Kubernetes. Docker-in-Docker uruchamiany
lokalnie (`dockerd &`) w kontenerze z sysbox. Sekrety (klucz deploy do Gitea, known hosts)
pobierane z sekretów Woodpeckera.
### Argo Workflows
Branch `argo-workflows`, katalog `argo-workflows/`. Podejście **sterowane zdarzeniami** przez
Argo Events:
- `source.yaml``EventSource` (webhook, dwa endpointy: dla repo aplikacji i deploymentowego),
- `sensor.yaml``Sensor` reagujący na push i tworzący `Workflow` budujący (etapy:
`checkout``tests``build-and-push-image``gitops-commit`),
- `eventbus-default.yaml` — szyna zdarzeń (NATS),
- `permissions.yaml``ServiceAccount` + `Role`/`RoleBinding`,
- `secret-store.yaml` — dostęp do sekretów z Key Vault.
### Wspólny schemat potoku CI
Wszystkie trzy narzędzia wykonują tę samą logikę, różniąc się jedynie składnią i modelem
uruchamiania:
```
push → [pytest] → [docker build → az acr login → docker push (tag = SHA)] → [clone repo GitOps → awk: podmiana tagu → commit → push]
```
Aktualizacja manifestu w repo GitOps jest realizowana identycznym skryptem `awk`, który
znajduje kontener `api` i podmienia w nim tag obrazu na SHA nowego commita.
## Infrastruktura
| Element | Zastosowanie |
|---------|--------------|
| **Azure Kubernetes Service (AKS)** | Klaster docelowy; działają na nim także agenci CI oraz kontrolery CD |
| **Azure Container Registry** (`marcin00.azurecr.io`) | Rejestr obrazów |
| **Azure Key Vault** + CSI `secrets-store` | Dostarczanie sekretów do podów |
| **Managed Identity** | Bezhasłowe uwierzytelnianie do ACR / AKS / Key Vault |
| **Gitea** (self-hosted, `gitea.marcin00.pl`) | Repozytoria Git + webhooki wyzwalające potoki |
| **sysbox** (`sysbox-runc`) | Budowanie obrazów bez uprawnień roota (rootless DinD) |
| **NGINX Ingress** | Wystawienie aplikacji (`user-microservice.marcin00.pl`) |
## Pomiar dostarczenia zmiany
Metryką porównawczą jest **czas dostarczenia zmiany** — od commita do momentu, w którym nowa
wersja aplikacji faktycznie działa na klastrze. Pomiar jest w pełni zautomatyzowany, a
narzędzia znajdują się na branchu **`dev`**:
- **[`deployment_timer.sh`](../../tree/dev/deployment_timer.sh)** — automatyczny pomiar
pojedynczego wdrożenia. Skrypt:
1. odczytuje aktualną wersję z endpointu `/version`,
2. zapisuje znacznik czasu do pliku, commituje go (`Automatyczna zmiana: <timestamp>`)
i wykonuje `git push` — co wyzwala cały łańcuch CI/CD,
3. odpytuje `/version` co sekundę, aż zwrócona wersja się zmieni,
4. zapisuje wynik (`start,koniec,czas,stara_wersja,nowa_wersja`) do pliku
`deployment_times.csv`.
Wykrycie zmiany opiera się na tym, że potok CI buduje obraz z `APP_VERSION` równym SHA
commita, a `/version` zwraca tę wartość. Commity `Automatyczna zmiana: <timestamp>` widoczne
w historii repozytorium pochodzą właśnie z kolejnych przebiegów tego skryptu.
- **[`data_analysis.py`](../../tree/dev/data_analysis.py)** — agreguje zebrane pomiary
(po 20 wdrożeń na scenariusz) i generuje wykresy słupkowe średnich czasów dostarczenia do
katalogu `plots/`. Tworzy 6 porównań: trzy według narzędzia CI (dla każdego CD) i trzy
według narzędzia CD (dla każdego CI), obejmując wszystkie [9 scenariuszy](#scenariusze-pomiarowe).
```bash
pip install matplotlib
python3 data_analysis.py # zapisuje plots/mean_times_0..5.png
```
> Pliki wynikowe pomiarów (`deployment_times.csv`, katalog `plots/`) są generowane przez
> powyższe skrypty i nie są śledzone w repozytorium.
## Struktura repozytorium
```
user-microservice/
├── api/
│ ├── app.py # fabryka aplikacji Flask, konfiguracja, start serwera waitress
│ ├── views.py # endpointy API (użytkownicy, login/logout)
│ ├── models.py # modele SQLAlchemy: User, RevokedToken
│ ├── utils.py # autoryzacja, oczekiwanie na bazę, inicjalizacja admina
│ ├── requirements.txt # zależności aplikacji
│ └── tests/ # testy pytest (conftest.py, test_users.py)
├── Dockerfile # obraz aplikacji
└── docker-compose.yml # lokalne uruchomienie API + MySQL
```
> Definicje potoków CI (`Jenkinsfile`, `.woodpecker/`, `argo-workflows/`) znajdują się na
> odpowiednich branchach — zob. [Mapa branchy](#mapa-branchy).
+3 -1
View File
@@ -4,6 +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 tech_views import tech_bp
from utils import init_db, wait_for_db from utils import init_db, wait_for_db
from views import user_bp from views import user_bp
from werkzeug.exceptions import HTTPException from werkzeug.exceptions import HTTPException
@@ -26,6 +27,7 @@ def create_app(config_name="default"):
# Blueprints registration # Blueprints registration
app.register_blueprint(user_bp) app.register_blueprint(user_bp)
app.register_blueprint(tech_bp)
# Database and JWT initialization # Database and JWT initialization
db.init_app(app) db.init_app(app)
@@ -53,7 +55,7 @@ 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() wait_for_db(max_retries=100)
db.create_all() db.create_all()
if config_name != "testing": if config_name != "testing":
init_db() init_db()
+20
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
+11 -11
View File
@@ -3,19 +3,21 @@ 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 import text
from sqlalchemy.exc import DatabaseError from sqlalchemy.exc import DatabaseError, InterfaceError
import time import time
from werkzeug.security import generate_password_hash from werkzeug.security import generate_password_hash
db_ready = False
def admin_required(user_id, message='Access denied.'): def admin_required(user_id, message='Access denied.'):
"Check if common user try to make administrative action."
user = db.session.get(User, user_id) user = db.session.get(User, user_id)
if user is None or user.role != "Administrator": if user is None or user.role != "Administrator":
abort(403, message) abort(403, message)
def validate_access(owner_id, message='Access denied.'): 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_id = int(get_jwt_identity())
logged_user_role = db.session.get(User, logged_user_id).role logged_user_role = db.session.get(User, logged_user_id).role
if logged_user_role != "Administrator" and logged_user_id != owner_id: if logged_user_role != "Administrator" and logged_user_id != owner_id:
@@ -30,20 +32,18 @@ def get_user_or_404(user_id):
return user return user
MAX_RETRIES = 100 def wait_for_db(max_retries):
"Try to connect with database <max_retries> times."
def wait_for_db(): global db_ready
for retries in range(MAX_RETRIES): for _ in range(max_retries):
try: try:
with db.engine.connect() as connection: with db.engine.connect() as connection:
connection.execute(text("SELECT 1")) connection.execute(text("SELECT 1"))
print("Successfully connected with database.") db_ready = True
return return
except DatabaseError: except DatabaseError | InterfaceError:
print(f"Waiting for database... (retry {retries + 1})")
time.sleep(3) time.sleep(3)
print("Failed to connect to database.") raise Exception("Failed to connect to database.")
raise Exception("Database not ready after multiple retries.")
def init_db(): def init_db():
+8
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, \ 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 verify_jwt_in_request, get_jwt_identity, unset_jwt_cookies, get_jwt
from models import db, RevokedToken, User from models import db, RevokedToken, User
import os
from utils import admin_required, validate_access, get_user_or_404 from utils import admin_required, validate_access, get_user_or_404
from werkzeug.security import check_password_hash, generate_password_hash from werkzeug.security import check_password_hash, generate_password_hash
@@ -110,3 +111,10 @@ def user_logout():
response = jsonify({"msg": "User logged out successfully."}) response = jsonify({"msg": "User logged out successfully."})
unset_jwt_cookies(response) unset_jwt_cookies(response)
return 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")
})
+65
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 ""
+15
View File
@@ -7,9 +7,24 @@ services:
build: . build: .
env_file: env_file:
- api/.env - api/.env
ports:
- 80:80
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 10s
timeout: 5s
retries: 5
start_period: 15s
db: db:
container_name: db container_name: db
hostname: db hostname: db
image: mysql:latest image: mysql:latest
env_file: env_file:
- db/.env - db/.env
ports:
- 3306:3306
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
+1
View File
@@ -0,0 +1 @@
1753736103