# Metering Server Build Guide

## Local Build

### Build Binary
```bash
# Build for current platform
make metering-server

# Build for Docker (linux/amd64)
make build-for-docker
```

### Build Docker Image
```bash
# Build Docker image
make docker

# Build and push Docker image
DOCKER_IMAGE=your-registry/metering-server:tag make docker-push
```

## CI/CD Build

The metering server is automatically built and pushed to multiple container registries via GitHub Actions.

### Trigger Build

**Automatic:**
- Push to `main` branch with changes in `o11ymetering/**`

**Manual:**
```bash
# Via GitHub UI: Actions -> Metering Server CD -> Run workflow
# Select git-ref and environment (dev/staging/prod)
```

### Build Artifacts

Images are pushed to:
- **AWS ECR**: `{account}.dkr.ecr.us-west-2.amazonaws.com/observability/metering-server:{sha}`
- **GCP Artifact Registry**: `us-west1-docker.pkg.dev/{project}/observability-regional-server/metering-server:{sha}`
- **Azure ACR**: `{registry}.azurecr.io/metering-server:{sha}`
- **Alicloud CR**: `{registry}.ap-southeast-1.cr.aliyuncs.com/{env}/metering-server:{sha}`

## Dockerfile

Location: `build/package/metering/Dockerfile`

The Dockerfile uses a minimal Alpine-based image:
```dockerfile
FROM gcr.io/pingcap-public/pingcap/alpine-glibc:alpine-3.14.6
COPY observability-regional-metering-server /usr/local/bin/
ENTRYPOINT ["/usr/local/bin/observability-regional-metering-server"]
```

## Build Requirements

- Go 1.24+
- Docker (for image builds)
- Make

## Environment Variables

Set these when building:
- `DOCKER_IMAGE`: Full image name with tag (default: AWS ECR dev)
