name: CI on: push: branches: [ main, develop ] pull_request: branches: [ main, develop ] jobs: test: name: Test runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.25.3' - name: Cache Go modules uses: actions/cache@v4 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - name: Download dependencies run: go mod download - name: Verify dependencies run: go mod verify - name: Install protoc and plugins run: | apk add --no-cache protobuf-dev protoc go install google.golang.org/protobuf/cmd/protoc-gen-go@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest echo "$HOME/go/bin" >> $GITHUB_PATH - name: Generate protobuf files run: make generate-proto - name: Generate Ent ORM files run: | go install entgo.io/ent/cmd/ent@latest if [ -d "ent" ] && [ -f "ent/generate.go" ]; then cd ent && go generate ./... fi - name: Check for test files id: check-tests run: | echo "Checking for test files..." TEST_FILES=$(find . -name "*_test.go" -not -path "./vendor/*" -not -path "./.git/*" 2>/dev/null || true) if [ -n "$TEST_FILES" ]; then echo "Found test files:" echo "$TEST_FILES" echo "tests_exist=true" >> $GITHUB_OUTPUT else echo "No test files found. Skipping test execution." echo "tests_exist=false" >> $GITHUB_OUTPUT fi - name: Run tests if: steps.check-tests.outputs.tests_exist == 'true' env: CGO_ENABLED: 1 run: go test -v -race -coverprofile=coverage.out -timeout=5m ./... - name: Upload coverage if: steps.check-tests.outputs.tests_exist == 'true' uses: codecov/codecov-action@v3 with: file: ./coverage.out fail_ci_if_error: false - name: Verify build (no tests) if: steps.check-tests.outputs.tests_exist == 'false' run: | echo "No tests found. Verifying code compiles instead..." go build ./... lint: name: Lint runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.25.3' - name: Download dependencies run: go mod download - name: Install protoc and plugins run: | apk add --no-cache protobuf-dev protoc go install google.golang.org/protobuf/cmd/protoc-gen-go@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest echo "$HOME/go/bin" >> $GITHUB_PATH - name: Generate protobuf files run: make generate-proto - name: Generate Ent ORM files run: | go install entgo.io/ent/cmd/ent@latest if [ -d "ent" ] && [ -f "ent/generate.go" ]; then cd ent && go generate ./... fi - name: golangci-lint uses: golangci/golangci-lint-action@v7 with: version: latest args: --timeout=5m build: name: Build runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.25.3' - name: Cache Go modules uses: actions/cache@v4 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - name: Download dependencies run: go mod download - name: Install protoc and plugins run: | apk add --no-cache protobuf-dev protoc go install google.golang.org/protobuf/cmd/protoc-gen-go@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest echo "$HOME/go/bin" >> $GITHUB_PATH - name: Generate protobuf files run: make generate-proto - name: Generate Ent ORM files run: | go install entgo.io/ent/cmd/ent@latest if [ -d "ent" ] && [ -f "ent/generate.go" ]; then cd ent && go generate ./... fi - name: Build run: make build - name: Upload build artifacts uses: actions/upload-artifact@v3 with: name: binaries path: | bin/platform bin/api-gateway bin/auth-service bin/identity-service bin/authz-service bin/audit-service retention-days: 7 fmt: name: Format Check runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.25.3' - name: Check formatting run: | if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then echo "The following files need formatting:" gofmt -s -d . exit 1 fi