name: CI on: push: branches: - main pull_request: branches: - main jobs: check: runs-on: docker steps: - name: Install SSH clone key run: | set -euo pipefail mkdir -p ~/.ssh printf '%s\n' "${{ secrets.CI_REPO_SSH_KEY }}" > ~/.ssh/robot_u_site_clone chmod 600 ~/.ssh/robot_u_site_clone ssh-keyscan aksal.cloud >> ~/.ssh/known_hosts cat > ~/.ssh/config <<'EOF' Host aksal.cloud IdentityFile ~/.ssh/robot_u_site_clone IdentitiesOnly yes EOF - name: Clone repository over SSH run: | set -euo pipefail git clone --depth 1 git@aksal.cloud:Robot-U/robot-u-site.git robot-u-site - name: Install CI tooling and dependencies run: | set -euo pipefail curl -LsSf https://astral.sh/uv/install.sh | sh curl -fsSL https://bun.sh/install | bash export PATH="$HOME/.local/bin:$HOME/.bun/bin:$PATH" cd robot-u-site uv venv .venv uv pip install -r requirements.txt cd frontend bun install --frozen-lockfile --ignore-scripts - name: Check Python run: | export PATH="$HOME/.local/bin:$HOME/.bun/bin:$PATH" cd robot-u-site ./scripts/check_python_quality.sh - name: Check Frontend run: | export PATH="$HOME/.local/bin:$HOME/.bun/bin:$PATH" cd robot-u-site ./scripts/check_frontend_quality.sh deploy: runs-on: docker needs: - check if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} steps: - name: Install deploy tooling run: | set -euo pipefail if ! command -v rsync >/dev/null 2>&1; then apt-get update apt-get install -y rsync openssh-client fi - name: Install SSH keys run: | set -euo pipefail mkdir -p ~/.ssh printf '%s\n' "${{ secrets.CI_REPO_SSH_KEY }}" > ~/.ssh/robot_u_site_clone printf '%s\n' "${{ secrets.DEPLOY_SSH_KEY }}" > ~/.ssh/robot_u_site_deploy chmod 600 ~/.ssh/robot_u_site_clone ~/.ssh/robot_u_site_deploy ssh-keyscan aksal.cloud >> ~/.ssh/known_hosts ssh-keyscan 192.168.1.220 >> ~/.ssh/known_hosts cat > ~/.ssh/config <<'EOF' Host aksal.cloud IdentityFile ~/.ssh/robot_u_site_clone IdentitiesOnly yes Host robot-u-app HostName 192.168.1.220 User root IdentityFile ~/.ssh/robot_u_site_deploy IdentitiesOnly yes EOF - name: Clone repository over SSH run: | set -euo pipefail git clone --depth 1 git@aksal.cloud:Robot-U/robot-u-site.git robot-u-site - name: Sync application files run: | set -euo pipefail rsync -az --delete \ --exclude='.git/' \ --exclude='.venv/' \ --exclude='__pycache__/' \ --exclude='.pytest_cache/' \ --exclude='.ruff_cache/' \ --exclude='.env' \ --exclude='.env.*' \ --exclude='frontend/node_modules/' \ --exclude='frontend/dist/' \ --exclude='frontend/.vite/' \ --exclude='examples/quadrature-encoder-course/' \ robot-u-site/ robot-u-app:/opt/robot-u-site/ - name: Rebuild and restart app run: | set -euo pipefail ssh robot-u-app ' set -euo pipefail cd /opt/robot-u-site ./scripts/check_deploy_config.py docker compose up --build -d for attempt in $(seq 1 30); do if curl -fsS http://127.0.0.1:8800/health; then exit 0 fi sleep 2 done docker compose logs --tail=100 robot-u-site exit 1 '