name: CI Test on: push: branches: [main, windows-ci] workflow_dispatch: env: # WIN_HOST is the host machine reachable from inside the job container. # Resolved at runtime to the container's default gateway, since Forgejo Runner # creates a per-job Docker network whose gateway IP varies between runs. WIN_PORT: 2210 WIN_USER: edr jobs: hello: runs-on: docker steps: - name: Say hello run: | echo "Hello from Forgejo Actions!" echo "Runner: $RUNNER_NAME" uname -a node --version - name: Math check run: echo "2+2 = $((2+2))" windows-test: runs-on: docker steps: - name: Install sshpass run: | apt-get update -qq apt-get install -y -qq sshpass openssh-client iproute2 - name: Resolve host gateway run: | GW=$(ip route | awk '/default/ {print $3; exit}') echo "WIN_HOST=$GW" >> "$GITHUB_ENV" echo "Using host gateway: $GW" - name: Wait for Windows VM SSH env: SSHPASS: ${{ secrets.WINDOWS_SSH_PASSWORD }} run: | for i in $(seq 1 30); do if sshpass -e ssh -o StrictHostKeyChecking=no -o ConnectTimeout=3 \ -p "$WIN_PORT" "$WIN_USER@$WIN_HOST" "exit" 2>/dev/null; then echo "VM SSH ready"; exit 0 fi echo "[$i/30] waiting for VM..."; sleep 5 done echo "VM SSH never became ready"; exit 1 - name: Smoke test on Windows env: SSHPASS: ${{ secrets.WINDOWS_SSH_PASSWORD }} run: | sshpass -e ssh -o StrictHostKeyChecking=no \ -p "$WIN_PORT" "$WIN_USER@$WIN_HOST" \ "whoami && ver && echo windows-smoke-ok" # The actual test step — runs the test inside the Windows VM. # Customise the command to fit the project once Windows test tooling is in place. - name: Run Windows test env: SSHPASS: ${{ secrets.WINDOWS_SSH_PASSWORD }} run: | sshpass -e ssh -o StrictHostKeyChecking=no \ -p "$WIN_PORT" "$WIN_USER@$WIN_HOST" \ "echo TODO: run actual test command here" # Always-runs cleanup: rolls the VM back to the gold snapshot on the host. # In a separate job so it fires even when windows-test crashes mid-step. revert-vm: runs-on: docker needs: [windows-test] if: always() steps: - name: Install client tools run: | apt-get update -qq apt-get install -y -qq curl iproute2 - name: Trigger revert on host env: REVERT_TOKEN: ${{ secrets.REVERT_TOKEN }} run: | GW=$(ip route | awk '/default/ {print $3; exit}') echo "calling revert endpoint at $GW:8765" curl -fsSL --max-time 90 -X POST \ -H "Authorization: Bearer $REVERT_TOKEN" \ "http://$GW:8765/revert"