From f1d11085a11100ca5b7e455bbcb5bab4a2bd6f10 Mon Sep 17 00:00:00 2001 From: Ksan Date: Sun, 31 May 2026 14:25:07 +0200 Subject: [PATCH] testing build and deploy --- .gitea/workflows/ci.yaml | 48 +++++++++++++++++++++++++++++----------- Dockerfile | 12 ++++++++++ calculator.py | 14 ------------ docker-compose.yaml | 22 ++++++++++++++++++ index.html | 15 +++++++++++++ package.json | 18 +++++++++++++++ requirements.txt | 1 - src/App.jsx | 10 +++++++++ src/main.jsx | 10 +++++++++ test_calculator.py | 25 --------------------- vite.config.js | 7 ++++++ 11 files changed, 129 insertions(+), 53 deletions(-) create mode 100644 Dockerfile delete mode 100644 calculator.py create mode 100644 docker-compose.yaml create mode 100644 index.html create mode 100644 package.json delete mode 100644 requirements.txt create mode 100644 src/App.jsx create mode 100644 src/main.jsx delete mode 100644 test_calculator.py create mode 100644 vite.config.js diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 3a44f74..1ab3a24 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -1,27 +1,49 @@ -name: CI +name: CI/CD on: push: - branches: [main] + branches: [main, dev] pull_request: - branches: [main] + branches: [main, dev] jobs: - test: + build: runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 + - uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v5 + - uses: actions/setup-node@v4 with: - python-version: "3.12" + node-version: 20 - name: Install dependencies - run: pip install -r requirements.txt + run: npm ci - - name: Run tests - run: pytest -v + - name: Build + run: npm run build + deploy: + runs-on: ubuntu-latest + needs: build + if: gitea.ref == 'refs/heads/main' + steps: + - uses: actions/checkout@v4 + + - name: Build & push Docker image + run: | + echo "${{ secrets.REGISTRY_PASSWORD }}" | \ + docker login git.${{ secrets.DOMAIN }} \ + -u ${{ secrets.REGISTRY_USER }} --password-stdin + docker build -t git.${{ secrets.DOMAIN }}/${{ secrets.REGISTRY_USER }}/testapp:latest . + docker push git.${{ secrets.DOMAIN }}/${{ secrets.REGISTRY_USER }}/testapp:latest + + - name: Deploy to VPS + uses: appleboy/ssh-action@v1 + with: + host: ${{ secrets.DEPLOY_HOST }} + username: ${{ secrets.DEPLOY_USER }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + script: | + cd ~/programs/testapp + docker compose pull + docker compose up -d --remove-orphans diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1b60a53 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +# Stage 1 - build the React app +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +# Stage 2 - serve with nginx +FROM nginx:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +EXPOSE 80 diff --git a/calculator.py b/calculator.py deleted file mode 100644 index ea88c0e..0000000 --- a/calculator.py +++ /dev/null @@ -1,14 +0,0 @@ -def add(a, b): - return a + b - -def subtract(a, b): - return a - b - -def multiply(a, b): - return a * b - -def divide(a, b): - if b == 0: - raise ValueError("Cannot divide by zero") - return a / b - diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..c82b2fd --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,22 @@ +services: + nginx: + build: + context: . + dockerfile: Dockerfile + image: git.ksan.dev/ksan/testapp:latest + container_name: testapp_nginx + networks: + - frontend + labels: + - traefik.enable=true + - traefik.http.routers.testapp-https.rule=Host(`${DOMAIN}`) + - traefik.http.routers.testapp-https.entrypoints=websecure + - traefik.http.routers.testapp-https.tls=true + - traefik.http.routers.testapp-https.tls.certresolver=cloudflare + - traefik.http.services.testapp.loadbalancer.server.port=80 + restart: unless-stopped + +networks: + frontend: + external: true + diff --git a/index.html b/index.html new file mode 100644 index 0000000..84d6c80 --- /dev/null +++ b/index.html @@ -0,0 +1,15 @@ + + + + + + + Testapp + + + +
+ + + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..5c407b5 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "testapp", + "version": "1.0.0", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.3.1", + "vite": "^5.4.1" + } +} + diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 2c78728..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -pytest==8.3.5 diff --git a/src/App.jsx b/src/App.jsx new file mode 100644 index 0000000..22866a0 --- /dev/null +++ b/src/App.jsx @@ -0,0 +1,10 @@ +function App() { + return ( +
+

Does this work?

+
+ ) +} + +export default App + diff --git a/src/main.jsx b/src/main.jsx new file mode 100644 index 0000000..f3e379e --- /dev/null +++ b/src/main.jsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import App from './App.jsx' + +createRoot(document.getElementById('root')).render( + + + +) + diff --git a/test_calculator.py b/test_calculator.py deleted file mode 100644 index 53faec7..0000000 --- a/test_calculator.py +++ /dev/null @@ -1,25 +0,0 @@ -import pytest -from calculator import add, subtract, multiply, divide - -def test_add(): - assert add(2, 3) == 5 - assert add(-1, 1) == 0 - assert add(0, 0) == 0 - -def test_subtract(): - assert subtract(10, 4) == 6 - assert subtract(0, 5) == -5 - -def test_multiply(): - assert multiply(3, 4) == 12 - assert multiply(-2, 5) == -10 - assert multiply(0, 100) == 0 - -def test_divide(): - assert divide(10, 2) == 5 - assert divide(7, 2) == 3.5 - -def test_divide_by_zero(): - with pytest.raises(ValueError, match="Cannot divide by zero"): - divide(5, 0) - diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..f65e4aa --- /dev/null +++ b/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], +}) +