name: CI on: push: branches: [main] pull_request: branches: [main] permissions: contents: read jobs: test: name: Test runs-on: ubuntu-latest strategy: matrix: go-version: ["1.25"] steps: - uses: actions/checkout@v6 - name: Set up Go uses: actions/setup-go@v6 with: go-version: ${{ matrix.go-version }} - name: Run tests run: go test -v -race -count=1 ./... build: name: Build runs-on: ubuntu-latest strategy: matrix: goos: [linux, darwin, windows] goarch: [amd64, arm64] steps: - uses: actions/checkout@v6 - name: Set up Go uses: actions/setup-go@v6 with: go-version: "1.25" - name: Build env: GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} run: go build -o unarr ./cmd/unarr/ lint: name: Lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Set up Go uses: actions/setup-go@v6 with: go-version: "1.25" - name: Run golangci-lint uses: golangci/golangci-lint-action@v9 with: version: v2.11.4 coverage: name: Coverage runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Set up Go uses: actions/setup-go@v6 with: go-version: "1.25" - name: Run tests with coverage (all packages) run: | go test -race -coverprofile=coverage.out -covermode=atomic \ ./internal/engine/... \ ./internal/agent/... \ ./internal/cmd/... - name: Check coverage threshold (engine + agent) run: | # Threshold applies only to engine and agent — cmd contains interactive UI # commands (config menus, daemon, auth browser) that are not unit-testable. go test -race -coverprofile=coverage-core.out -covermode=atomic \ ./internal/engine/... \ ./internal/agent/... COVERAGE=$(go tool cover -func=coverage-core.out | grep ^total | awk '{print $3}' | tr -d '%') echo "Coverage on engine+agent: ${COVERAGE}%" python3 -c " coverage = float('${COVERAGE}') threshold = 50.0 print(f'Coverage: {coverage:.1f}% (threshold: {threshold}%)') if coverage < threshold: print(f'ERROR: Coverage {coverage:.1f}% is below minimum {threshold}%') exit(1) else: print('OK: Coverage meets minimum threshold') " - name: Upload coverage to Codecov uses: codecov/codecov-action@v6 with: files: ./coverage.out fail_ci_if_error: false env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} vet: name: Vet runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Set up Go uses: actions/setup-go@v6 with: go-version: "1.25" - name: Run go vet run: go vet ./...