version: '3' vars: BINARIES: client server VERSION: sh: git describe --tags --always --dirty 2>/dev/null || echo dev LDFLAGS: -s -w -checklinkname=0 -X main.version={{.VERSION}} GOLANGCI_VERSION: v2.12.2 GOVULN_VERSION: v1.6.0 GOIMPORTS_VERSION: v0.49.0 GORELEASER_VERSION: v2.17.1 TASK_VERSION: v3.52.0 tasks: default: cmds: - task --list silent: true build: desc: Build host binaries (client + server) to dist/ cmds: - for: { var: BINARIES } cmd: go build -ldflags "{{.LDFLAGS}}" -trimpath -o dist/{{.ITEM}} ./cmd/{{.ITEM}} build:all: desc: Cross-compile all targets via goreleaser snapshot cmds: # checksum.extra_files глобит mobile-dist, а снапшот идёт без mobile-таргетов - cmd: mkdir -p mobile-dist && touch mobile-dist/freeturn.aar mobile-dist/freeturn-sources.jar mobile-dist/Mobile.xcframework.zip platforms: [linux, darwin] - cmd: powershell -Command "New-Item -ItemType Directory -Force mobile-dist > $null; @('freeturn.aar','freeturn-sources.jar','Mobile.xcframework.zip') | ForEach-Object { if (-not (Test-Path \"mobile-dist/$_\")) { New-Item -ItemType File \"mobile-dist/$_\" > $null } }" platforms: [windows] - goreleaser release --snapshot --clean --skip=publish,sign build:ios: desc: Build iOS XCFramework to dist/Mobile.xcframework platforms: [darwin] cmds: - rm -rf dist/Mobile.xcframework - mkdir -p dist - gomobile bind -target ios,iossimulator -ldflags "-checklinkname=0" -o dist/Mobile.xcframework ./mobile build:android: desc: Build Android Archive (AAR) to dist/freeturn.aar vars: # ABI ровно те, что собирает приложение (splits в build.gradle.kts). # androidapi 24 - minSdk приложения. # -s -w срезают отладочную информацию: 23 МБ -> 13 МБ на оба ABI. GOMOBILE_FLAGS: >- -target android/arm64,android/arm -androidapi 24 -javapkg com.freeturn.core -ldflags "-checklinkname=0 -s -w -X github.com/samosvalishe/free-turn-proxy/mobile.version={{.VERSION}}" cmds: - rm -rf dist/freeturn.aar dist/freeturn-sources.jar - mkdir -p dist - cmd: gomobile bind {{.GOMOBILE_FLAGS}} -o dist/freeturn.aar ./mobile platforms: [linux, darwin] - cmd: | powershell -NoProfile -Command '$env:JAVA_HOME = "C:\Program Files\Android\Android Studio\jbr"; $env:PATH = "$env:JAVA_HOME\bin;$env:PATH"; gomobile bind {{.GOMOBILE_FLAGS}} -o dist/freeturn.aar ./mobile' platforms: [windows] test: desc: Run unit tests with race detector cmds: - go test -race -count=1 ./... test:sh: desc: Run install.sh tests (bats) cmds: - bats scripts/tests test:cover: desc: Run tests with coverage report (cover.html) cmds: - go test -race -count=1 -coverprofile=cover.out ./... - go tool cover -html=cover.out -o cover.html lint: desc: Run golangci-lint cmds: - golangci-lint run --timeout=5m ./... fmt: desc: Format code (gofmt + goimports) cmds: - gofmt -w . - goimports -w . fmt:check: desc: Verify formatting (fails on diff) cmds: - cmd: | out=$(gofmt -l .) if [ -n "$out" ]; then echo "Files need formatting:" echo "$out" exit 1 fi vet: desc: Run go vet cmds: - go vet ./... vuln: desc: Run govulncheck cmds: - govulncheck ./... captcha:page: desc: Fetch a live VK captcha page (diff it against the parser fixture) cmds: - bash scripts/captcha_page.sh {{.CLI_ARGS | default "captcha_page.html"}} tidy: desc: Tidy go.mod / go.sum cmds: - go mod tidy ci: desc: Run full CI suite locally (fmt-check, vet, lint, test, vuln) deps: [fmt:check, vet, lint, test, vuln] tools:install: desc: Install dev tools (golangci-lint, govulncheck, goreleaser, goimports) cmds: - go install golang.org/x/tools/cmd/goimports@{{.GOIMPORTS_VERSION}} - go install golang.org/x/vuln/cmd/govulncheck@{{.GOVULN_VERSION}} - go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@{{.GOLANGCI_VERSION}} - go install github.com/goreleaser/goreleaser/v2@{{.GORELEASER_VERSION}} clean: desc: Remove build artifacts cmds: - cmd: rm -rf dist/ cover.out cover.html platforms: [linux, darwin] - cmd: powershell -Command "Remove-Item -Recurse -Force dist,cover.out,cover.html -ErrorAction SilentlyContinue" platforms: [windows]