From 85a55111ccbb2ffedb157b058ac939bf5d205bf8 Mon Sep 17 00:00:00 2001 From: Jan Felix Wiebe Date: Fri, 11 Jul 2025 15:13:16 +0200 Subject: [PATCH] added forgejo runners --- .forgejo/README.md | 120 +++++++++++++++++++++++++ .forgejo/workflows/ci-simple.yml | 74 ++++++++++++++++ .forgejo/workflows/ci.yml | 147 +++++++++++++++++++++++++++++++ 3 files changed, 341 insertions(+) create mode 100644 .forgejo/README.md create mode 100644 .forgejo/workflows/ci-simple.yml create mode 100644 .forgejo/workflows/ci.yml diff --git a/.forgejo/README.md b/.forgejo/README.md new file mode 100644 index 0000000..11800f0 --- /dev/null +++ b/.forgejo/README.md @@ -0,0 +1,120 @@ +# Forgejo CI/CD Workflows + +This directory contains CI/CD workflows for the TschunkOrder project using Forgejo Actions. + +## Available Workflows + +### 1. `ci.yml` - Full CI Pipeline +A comprehensive CI pipeline that runs: +- **Backend Tests**: Runs pytest on the backend code +- **Backend Build**: Tests backend imports and startup +- **Frontend Build**: Type checking, linting, and build process +- **Docker Build**: Tests all Docker builds including docker-compose + +### 2. `ci-simple.yml` - Simplified CI Pipeline +A streamlined workflow that combines all tests and builds into a single job: +- Backend tests and import verification +- Frontend type checking, linting, and build +- Docker build verification + +## Setup Instructions + +### 1. Enable Forgejo Actions +Ensure that Forgejo Actions are enabled in your repository settings. + +### 2. Configure Runners +Set up Forgejo runners with the `docker` label. The workflows require runners that have declared the `docker` label. + +### 3. Required Software on Runners +Your runners should have: +- Python 3.11+ +- Node.js 18+ +- Docker (for Docker build tests) +- Git + +### 4. Workflow Triggers +The workflows are triggered on: +- Push to `master` or `develop` branches +- Pull requests to `master` or `develop` branches + +## Workflow Details + +### Backend Testing +- Installs Python dependencies from `backend/requirements.txt` +- Runs pytest with verbose output +- Tests backend module imports +- Verifies backend startup (with timeout) + +### Frontend Testing +- Installs Node.js dependencies +- Runs TypeScript type checking +- Runs ESLint for code quality +- Builds the production bundle +- Verifies build output exists + +### Docker Testing +- Builds backend Docker image +- Builds frontend Docker image +- Tests docker-compose build +- All builds are tagged for testing purposes + +## Customization + +### Adding New Tests +To add new test steps: + +1. **Backend Tests**: Add new pytest files in the `backend/` directory +2. **Frontend Tests**: Add new npm scripts in `frontend/package.json` +3. **Docker Tests**: Add new Dockerfile tests in the workflow + +### Modifying Triggers +Edit the `on` section in the workflow files to change when workflows run: + +```yaml +on: + push: + branches: [ master, develop, feature/* ] + pull_request: + branches: [ master ] + schedule: + - cron: '0 2 * * *' # Daily at 2 AM +``` + +### Environment Variables +Add environment variables if needed: + +```yaml +env: + PYTHONPATH: ./backend + NODE_ENV: production +``` + +### Runner Selection +The workflows currently use `runs-on: docker`. You can modify this to use different runner labels: + +```yaml +jobs: + my-job: + runs-on: ubuntu-latest # or any other label +``` + +## Troubleshooting + +### Common Issues + +1. **Python Import Errors**: Ensure all dependencies are in `requirements.txt` +2. **Node.js Build Failures**: Check that all dependencies are in `package.json` +3. **Docker Build Failures**: Verify Dockerfiles are valid and dependencies are available +4. **Runner Not Available**: Ensure you have runners with the `docker` label online + +### Debugging +- Check workflow logs in the Forgejo Actions tab +- Use `echo` statements in workflow steps for debugging +- Test workflows locally using `act` (GitHub Actions local runner) + +## Security Notes + +- Workflows run in isolated environments +- No secrets are exposed in logs +- Docker builds use temporary tags for testing +- All builds are cleaned up after testing \ No newline at end of file diff --git a/.forgejo/workflows/ci-simple.yml b/.forgejo/workflows/ci-simple.yml new file mode 100644 index 0000000..1884b84 --- /dev/null +++ b/.forgejo/workflows/ci-simple.yml @@ -0,0 +1,74 @@ +name: CI Simple + +on: + push: + branches: [ master, develop ] + pull_request: + branches: [ master, develop ] + +jobs: + test-and-build: + name: Test and Build + runs-on: docker + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + + - name: Install backend dependencies + working-directory: ./backend + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + + - name: Run backend tests + working-directory: ./backend + run: | + python -m pytest -v + + - name: Test backend import + working-directory: ./backend + run: | + python -c "import main; print('Backend imports successfully')" + + - name: Install frontend dependencies + working-directory: ./frontend + run: npm ci + + - name: Run frontend type check + working-directory: ./frontend + run: npm run type-check + + - name: Run frontend lint + working-directory: ./frontend + run: npm run lint + + - name: Build frontend + working-directory: ./frontend + run: npm run build + + - name: Verify frontend build + working-directory: ./frontend + run: | + if [ ! -d "dist" ]; then + echo "Frontend build failed - dist directory not found" + exit 1 + fi + echo "Frontend build successful" + + - name: Test Docker builds + run: | + cd backend && docker build -t tschunkorder-backend-test . + cd ../frontend && docker build -t tschunkorder-frontend-test . + cd .. && docker-compose build + echo "All Docker builds successful" \ No newline at end of file diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml new file mode 100644 index 0000000..cc28869 --- /dev/null +++ b/.forgejo/workflows/ci.yml @@ -0,0 +1,147 @@ +name: CI + +on: + push: + branches: [ master, develop ] + pull_request: + branches: [ master, develop ] + +jobs: + backend-tests: + name: Backend Tests + runs-on: docker + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Cache pip dependencies + uses: actions/cache@v3 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('backend/requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Install backend dependencies + working-directory: ./backend + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + + - name: Run backend tests + working-directory: ./backend + run: | + python -m pytest test_automated.py -v + + - name: Run backend tests with pytest directly + working-directory: ./backend + run: | + python -m pytest -v + + backend-build: + name: Backend Build + runs-on: docker + needs: backend-tests + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Install backend dependencies + working-directory: ./backend + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + + - name: Test backend import + working-directory: ./backend + run: | + python -c "import main; print('Backend imports successfully')" + + - name: Test backend startup + working-directory: ./backend + run: | + timeout 10s python main.py || true + echo "Backend startup test completed" + + frontend-build: + name: Frontend Build + runs-on: docker + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + cache-dependency-path: frontend/package-lock.json + + - name: Install frontend dependencies + working-directory: ./frontend + run: npm ci + + - name: Run frontend type check + working-directory: ./frontend + run: npm run type-check + + - name: Run frontend lint + working-directory: ./frontend + run: npm run lint + + - name: Build frontend + working-directory: ./frontend + run: npm run build + + - name: Test frontend build output + working-directory: ./frontend + run: | + if [ -d "dist" ]; then + echo "Frontend build successful - dist directory created" + ls -la dist/ + else + echo "Frontend build failed - dist directory not found" + exit 1 + fi + + docker-build: + name: Docker Build Test + runs-on: docker + needs: [backend-tests, frontend-build] + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Test backend Docker build + working-directory: ./backend + run: | + docker build -t tschunkorder-backend-test . + echo "Backend Docker build successful" + + - name: Test frontend Docker build + working-directory: ./frontend + run: | + docker build -t tschunkorder-frontend-test . + echo "Frontend Docker build successful" + + - name: Test docker-compose build + run: | + docker-compose build + echo "Docker Compose build successful" \ No newline at end of file