Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 21 additions & 93 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,45 +2,17 @@ name: CI Pipeline

on:
push:
branches: [ main, develop ]
branches: [ main ]
pull_request:
branches: [ main, develop ]
branches: [ main ]

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
# Build, Lint, and Validate
build-lint-validate:
name: Build, Lint, and Validate
runs-on: ubuntu-latest
steps:
- name: Checkout code
Expand All @@ -64,20 +36,28 @@ jobs:
- name: Download dependencies
run: go mod download

- name: Build application
- name: Install golangci-lint
run: |
go build -v ./cmd/...
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.3.1

- name: Run lint
run: make lint

- name: Validate schemas and examples
run: make validate

- name: Build application
run: make build
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

😍

(in line with my 'prefer using make commands locally and in CI to keep them in sync')


- name: Check for vulnerabilities
run: |
go install golang.org/x/vuln/cmd/govulncheck@latest
govulncheck ./...

# Unit Tests
unit-tests:
name: Unit Tests
# All Tests
tests:
name: Tests
runs-on: ubuntu-latest
needs: [lint, build]
steps:
- name: Checkout code
uses: actions/checkout@v4
Expand All @@ -100,9 +80,8 @@ jobs:
- name: Download dependencies
run: go mod download

- name: Run unit tests
run: |
go test -v -race -coverprofile=coverage.out -covermode=atomic ./internal/...
- name: Run all tests
run: make test-all

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
Expand All @@ -111,54 +90,3 @@ jobs:
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
52 changes: 0 additions & 52 deletions .github/workflows/integration-tests.yml

This file was deleted.

63 changes: 0 additions & 63 deletions .github/workflows/unit-tests.yml

This file was deleted.

2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@ cmd/registry/registry
validate-examples
validate-schemas
.idea/
coverage.out
coverage.html
7 changes: 6 additions & 1 deletion .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,11 @@ linters:
- return
nestif:
min-complexity: 8
revive:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

uncertain: Do we need this extra rule?

I'm not super familiar with golangci-lint, so apologies if this is a dumb question! Overall I think I'd like us to reduce custom config and use whatever the common/popular presets are: makes onboarding to the repo easier and AI tools more likely to get things right.

rules:
- name: use-any
severity: error
disabled: false
exclusions:
generated: lax
presets:
Expand Down Expand Up @@ -122,4 +127,4 @@ formatters:
paths:
- third_party$
- builtin$
- examples$
- examples$
70 changes: 70 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
.PHONY: help build test test-unit test-integration test-endpoints test-publish test-all lint lint-fix validate validate-schemas validate-examples check dev-local dev-compose clean publisher

# Default target
help: ## Show this help message
@echo "Available targets:"
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " %-20s %s\n", $$1, $$2}'

# Build targets
build: ## Build the registry application
go build ./cmd/registry

publisher: ## Build the publisher tool
cd tools/publisher && ./build.sh

# Test targets
test-unit: ## Run unit tests with coverage
go test -v -race -coverprofile=coverage.out -covermode=atomic ./internal/...
go tool cover -html=coverage.out -o coverage.html
@echo "Coverage report generated: coverage.html"

test: ## Run unit tests (use 'make test-all' to run all tests)
@echo "⚠️ Running unit tests only. Use 'make test-all' to run both unit and integration tests."
@$(MAKE) test-unit

test-integration: ## Run integration tests
./tests/integration/run.sh

test-endpoints: ## Test API endpoints (requires running server)
./scripts/test_endpoints.sh

test-publish: ## Test publish endpoint (requires BEARER_TOKEN env var)
./scripts/test_publish.sh

test-all: test-unit test-integration ## Run all tests (unit and integration)

# Validation targets
validate-schemas: ## Validate JSON schemas
./tools/validate-schemas.sh

validate-examples: ## Validate examples against schemas
./tools/validate-examples.sh

validate: validate-schemas validate-examples ## Run all validation checks

# Lint targets
lint: ## Run linter (includes formatting)
golangci-lint run --timeout=5m

lint-fix: ## Run linter with auto-fix (includes formatting)
golangci-lint run --fix --timeout=5m

# Combined targets
check: lint validate test-all ## Run all checks (lint, validate, unit tests)
@echo "All checks passed!"

# Development targets
dev-compose: ## Start development environment with Docker Compose (builds image automatically)
docker compose up --build

dev-local: ## Run registry locally (requires MongoDB)
go run cmd/registry/main.go

# Cleanup
clean: ## Clean build artifacts and coverage files
rm -f registry
rm -f coverage.out coverage.html
cd tools/publisher && rm -f publisher


.DEFAULT_GOAL := help
Loading
Loading