robot-u-site/.forgejo/workflows/ci.yml
kacper 56077a22b7
All checks were successful
CI / check (push) Successful in 18s
CI / deploy (push) Successful in 25s
Retry deployment health check
2026-04-15 06:30:38 -04:00

130 lines
3.9 KiB
YAML

name: CI
on:
push:
branches:
- main
pull_request:
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' }}
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
'