132 lines
3.9 KiB
YAML
132 lines
3.9 KiB
YAML
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
|
|
'
|