name: Quality checks on: pull_request: push: branches: - main permissions: contents: read jobs: backend: name: Backend checks runs-on: ubuntu-latest defaults: run: working-directory: backend steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: go-version-file: backend/go.mod cache: true - name: Check formatting run: test -z "$(gofmt -l .)" - name: Run Go tests run: go test ./... web: name: Web checks runs-on: ubuntu-latest defaults: run: working-directory: web steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: oven-sh/setup-bun@v2 with: bun-version: 1.3.9 - name: Install dependencies run: bun install --frozen-lockfile - name: Install Canvas Agent dependencies working-directory: canvas-agent run: bun install --frozen-lockfile - name: Check formatting env: BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.before }} run: | changed_files=() repo_prefix="$(git rev-parse --show-prefix)" while IFS= read -r -d '' file; do case "$file" in *.css|*.html|*.json|*.js|*.jsx|*.md|*.mdx|*.mjs|*.cjs|*.ts|*.tsx|*.yaml|*.yml) base_path="${repo_prefix}${file}" if git cat-file -e "$BASE_SHA:$base_path" 2>/dev/null \ && ! diff -q \ <(git show "$BASE_SHA:$base_path") \ <(git show "$BASE_SHA:$base_path" | bunx prettier --ignore-path /dev/null --stdin-filepath "$file") \ >/dev/null; then echo "Skipping legacy unformatted file: $file" continue fi changed_files+=("$file") ;; esac done < <(git diff --relative --name-only --diff-filter=ACMR -z "$BASE_SHA" "$GITHUB_SHA" -- .) if (( ${#changed_files[@]} > 0 )); then bunx prettier --check "${changed_files[@]}" else echo "No changed web files require formatting checks." fi - name: Typecheck run: bun run typecheck - name: Run tests run: bun run test # ubuntu-latest 预装 google-chrome;脚本的解析顺序已覆盖该路径, # 因此不引入第三方 setup action,也不需要任何 secret。 - name: Director P0 Chrome E2E run: | google-chrome --version || chromium --version bun run test:director:e2e