name: CI/CD Pipeline on: push: branches: - master paths: - 'bugulma/**' - 'k8s/**' - '.gitea/workflows/**' pull_request: branches: - master paths: - 'bugulma/**' - 'k8s/**' jobs: frontend-lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '24' - name: Enable Corepack (for Yarn) run: corepack enable - name: Install dependencies working-directory: bugulma/frontend run: yarn install --immutable - name: Lint working-directory: bugulma/frontend run: yarn lint - name: Test working-directory: bugulma/frontend run: yarn test --run frontend-build: runs-on: ubuntu-latest needs: frontend-lint if: gitea.event_name == 'push' && gitea.ref == 'refs/heads/master' steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: driver-opts: | image=moby/buildkit:latest - name: Login to Container Registry uses: docker/login-action@v3 with: registry: registry.bk.glpx.pro username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and push frontend uses: docker/build-push-action@v5 with: context: bugulma/frontend file: bugulma/frontend/Dockerfile push: true tags: | registry.bk.glpx.pro/turash/turash-frontend:latest registry.bk.glpx.pro/turash/turash-frontend:${{ gitea.sha }} cache-from: type=registry,ref=registry.bk.glpx.pro/turash/turash-frontend:buildcache cache-to: type=registry,ref=registry.bk.glpx.pro/turash/turash-frontend:buildcache,mode=max platforms: linux/amd64 build-args: | BUILDKIT_INLINE_CACHE=1 backend-lint: runs-on: ubuntu-latest services: postgres: image: postgis/postgis:16-3.4 env: POSTGRES_USER: turash POSTGRES_PASSWORD: turash123 POSTGRES_DB: postgres ports: - 5432:5432 options: >- --health-cmd "pg_isready -U turash" --health-interval 10s --health-timeout 5s --health-retries 5 env: POSTGRES_HOST: localhost POSTGRES_PORT: 5432 POSTGRES_USER: turash POSTGRES_PASSWORD: turash123 POSTGRES_DB: postgres steps: - uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.25.3' cache: true - name: Install CGO dependencies (for race detector) id: cgo-setup run: | echo "Checking for gcc (required for race detector)..." CGO_AVAILABLE=0 # Check if gcc is already available if command -v gcc &> /dev/null; then echo "✓ gcc is already available" gcc --version CGO_AVAILABLE=1 else echo "gcc not found, attempting to install..." # Detect package manager and install gcc if command -v apt-get &> /dev/null; then echo "Using apt-get (Debian/Ubuntu)..." if [ "$(id -u)" -eq 0 ]; then apt-get update -qq && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq build-essential && CGO_AVAILABLE=1 || true else (sudo apt-get update -qq && DEBIAN_FRONTEND=noninteractive sudo apt-get install -y -qq build-essential && CGO_AVAILABLE=1) || \ (apt-get update -qq && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq build-essential && CGO_AVAILABLE=1) || true fi elif command -v apk &> /dev/null; then echo "Using apk (Alpine)..." apk add --no-cache gcc musl-dev && CGO_AVAILABLE=1 || true elif command -v yum &> /dev/null; then echo "Using yum (RHEL/CentOS)..." yum install -y gcc && CGO_AVAILABLE=1 || true elif command -v dnf &> /dev/null; then echo "Using dnf (Fedora)..." dnf install -y gcc && CGO_AVAILABLE=1 || true else echo "⚠ No supported package manager found (apt-get, apk, yum, dnf)" echo "⚠ gcc installation skipped - race detector will be disabled" fi # Verify installation if command -v gcc &> /dev/null || [ -f /usr/bin/gcc ]; then echo "✓ gcc successfully installed" gcc --version || /usr/bin/gcc --version CGO_AVAILABLE=1 else echo "⚠ gcc installation failed - race detector will be disabled" fi fi echo "cgo_available=$CGO_AVAILABLE" >> $GITHUB_OUTPUT continue-on-error: true - name: Install dependencies working-directory: bugulma/backend run: go mod download env: GO111MODULE: on CGO_ENABLED: 1 GOPROXY: https://proxy.golang.org,direct GOSUMDB: sum.golang.org - name: Tidy and verify modules working-directory: bugulma/backend run: | go mod tidy go mod verify env: GO111MODULE: on CGO_ENABLED: 0 GOPROXY: https://proxy.golang.org,direct GOSUMDB: sum.golang.org - name: Verify module setup working-directory: bugulma/backend run: | pwd ls -la go.mod go list -m # Verify all packages can be listed go list ./... env: GO111MODULE: on CGO_ENABLED: 0 GOPROXY: https://proxy.golang.org,direct GOSUMDB: sum.golang.org - name: Build module to populate cache working-directory: bugulma/backend run: go build ./... env: GO111MODULE: on CGO_ENABLED: 0 GOPROXY: https://proxy.golang.org,direct GOSUMDB: sum.golang.org - name: Vet working-directory: bugulma/backend run: go vet ./... env: GO111MODULE: on CGO_ENABLED: 0 GOPROXY: https://proxy.golang.org,direct GOSUMDB: sum.golang.org - name: Wait for PostgreSQL to be ready run: | echo "Waiting for PostgreSQL to be ready..." # Use bash built-in TCP check (works without external tools) for i in {1..60}; do # Check if port 5432 is open using bash built-in /dev/tcp if timeout 1 bash -c "echo > /dev/tcp/localhost/5432" 2>/dev/null; then echo "PostgreSQL port is accessible!" # Give it a moment to fully initialize sleep 3 echo "PostgreSQL is ready!" exit 0 fi # Alternative: try with cat if timeout not available if bash -c "cat < /dev/null > /dev/tcp/localhost/5432" 2>/dev/null; then echo "PostgreSQL port is accessible (via cat)!" sleep 3 echo "PostgreSQL is ready!" exit 0 fi echo "Waiting for PostgreSQL... (attempt $i/60)" sleep 2 done echo "⚠ PostgreSQL did not become ready in time" echo "This may be expected if services are not fully supported in this Gitea Actions version" echo "Tests will continue but may fail if PostgreSQL is required" continue-on-error: true - name: Test working-directory: bugulma/backend run: | # Check if CGO is available for race detector CGO_AVAILABLE="${{ steps.cgo-setup.outputs.cgo_available || '0' }}" if [ "$CGO_AVAILABLE" = "1" ] && command -v gcc &> /dev/null; then echo "Running tests with race detector..." CGO_ENABLED=1 go test -v -race -coverprofile=coverage.out ./... else echo "Running tests without race detector (CGO not available)..." CGO_ENABLED=0 go test -v -coverprofile=coverage.out ./... fi env: GO111MODULE: on GOPROXY: https://proxy.golang.org,direct GOSUMDB: sum.golang.org - name: Coverage working-directory: bugulma/backend run: go tool cover -html=coverage.out -o coverage.html backend-build: runs-on: ubuntu-latest needs: backend-lint if: gitea.event_name == 'push' && gitea.ref == 'refs/heads/master' steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: driver-opts: | image=moby/buildkit:latest - name: Login to Container Registry uses: docker/login-action@v3 with: registry: registry.bk.glpx.pro username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and push backend uses: docker/build-push-action@v5 with: context: bugulma/backend file: bugulma/backend/Dockerfile push: true tags: | registry.bk.glpx.pro/turash/turash-backend:latest registry.bk.glpx.pro/turash/turash-backend:${{ gitea.sha }} cache-from: type=registry,ref=registry.bk.glpx.pro/turash/turash-backend:buildcache cache-to: type=registry,ref=registry.bk.glpx.pro/turash/turash-backend:buildcache,mode=max platforms: linux/amd64 build-args: | BUILDKIT_INLINE_CACHE=1 e2e-test: runs-on: ubuntu-latest needs: [frontend-build, backend-build] if: gitea.event_name == 'push' && gitea.ref == 'refs/heads/master' steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '24' - name: Enable Corepack (for Yarn) run: corepack enable - name: Install dependencies working-directory: bugulma/frontend run: yarn install --immutable - name: Run E2E tests working-directory: bugulma/frontend run: yarn test:e2e --headed=false