name: Tests on: push: branches: [main] pull_request: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: python: name: Python (xiaozhi-server) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.10' cache: 'pip' cache-dependency-path: 'main/xiaozhi-server/requirements.txt' - name: Install system dependencies run: | # opuslib_next 是 ctypes 绑定,pip 装上的是纯 Python 包,真正的编解码 # 靠系统里的 libopus.so。runner 上默认没有,import 会失败,音频相关的 # 用例直接报错。正式镜像 Dockerfile-server-base 里也是装 libopus0 的 sudo apt-get update sudo apt-get install -y --no-install-recommends libopus0 - name: Install dependencies working-directory: main/xiaozhi-server run: | pip install -r requirements.txt pip install pytest pytest-asyncio freezegun - name: Prepare test config working-directory: main/xiaozhi-server run: | # config/settings.py 在 import 期就要这个文件,缺了整套用例连收集都过不去。 # data/ 在 .gitignore 里,只能由这一步现造 mkdir -p data printf '{}\n' > data/.config.yaml - name: Run tests working-directory: main/xiaozhi-server run: | # Edge TTS 那条要连微软公网,runner 的出口 IP 会被风控挡掉,先排除。 # 根治办法是给它打 live 标记,让 mock 模式下自动不收(另开一条改) pytest tests/ -v -k "not test_tts_text_to_speak_writes_file" java: name: Java (manager-api) runs-on: ubuntu-latest # 三个 @SpringBootTest 要真连 MySQL 和 Redis,空库即可,Liquibase 会自己建表 services: mysql: image: mysql:8.0 env: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: xiaozhi_esp32_server ports: - 3306:3306 options: >- --health-cmd="mysqladmin ping -h 127.0.0.1 -uroot -p123456" --health-interval=10s --health-timeout=5s --health-retries=20 redis: image: redis:8.0 ports: - 6379:6379 options: >- --health-cmd="redis-cli ping" --health-interval=10s --health-timeout=5s --health-retries=20 steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '21' cache: 'maven' - name: Run tests working-directory: main/manager-api run: mvn -B test -DskipTests=false -DfailIfNoTests=false - name: Check the integration tests really ran working-directory: main/manager-api # 守卫在依赖不齐时会把整类集成测试跳过,这里盯一下它们有没有真跑, # 免得门禁被悄悄掏空 run: bash scripts/check-integration-tests.sh web: name: Vue (manager-web) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' cache-dependency-path: main/manager-web/package-lock.json - name: Run tests working-directory: main/manager-web run: | npm ci --no-audit --no-fund npm run test:contract npm run test:unit npm run build