name: CI Pipeline on: push: branches: [ main, develop ] pull_request: branches: [ main, develop ] env: GO_VERSION: '1.23.x' jobs: # Lint and Format Check lint: name: Lint and Format runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Install golangci-lint run: | curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.3.1 - name: Run golangci-lint run: golangci-lint run --timeout=5m - name: Check Go formatting run: | if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then echo "The following files are not properly formatted:" gofmt -s -l . exit 1 fi # Build check build: name: Build 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: ${{ env.GO_VERSION }} - name: Cache Go modules uses: actions/cache@v4 with: path: | ~/.cache/go-build ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - name: Download dependencies run: go mod download - name: Build application run: | go build -v ./cmd/... - name: Check for vulnerabilities run: | go install golang.org/x/vuln/cmd/govulncheck@latest govulncheck ./... # Unit Tests unit-tests: name: Unit Tests runs-on: ubuntu-latest needs: [lint, build] steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Cache Go modules uses: actions/cache@v4 with: path: | ~/.cache/go-build ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - name: Download dependencies run: go mod download - name: Run unit tests run: | go test -v -race -coverprofile=coverage.out -covermode=atomic ./internal/... - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 with: file: ./coverage.out flags: unittests name: codecov-unit fail_ci_if_error: false # Integration Tests integration-tests: name: Integration Tests runs-on: ubuntu-latest needs: [lint, build] steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Cache Go modules uses: actions/cache@v4 with: path: | ~/.cache/go-build ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - name: Download dependencies run: go mod download - name: Run integration tests run: | chmod +x ./tests/integration/run.sh ./tests/integration/run.sh # Overall status check test-summary: name: Test Summary runs-on: ubuntu-latest needs: [unit-tests, integration-tests] if: always() steps: - name: Check test results run: | if [[ "${{ needs.unit-tests.result }}" == "success" && "${{ needs.integration-tests.result }}" == "success" ]]; then echo "✅ All tests passed!" exit 0 else echo "❌ Some tests failed:" echo " Unit tests: ${{ needs.unit-tests.result }}" echo " Integration tests: ${{ needs.integration-tests.result }}" exit 1 fi