Building#

Build instructions for GeoServer CLI.

Prerequisites#

  • Go 1.24 or later
  • Git (for version information)

Development Setup#

If you’re contributing or making changes, set up the development environment:

1
2
3
4
5
# Install pre-commit hooks (runs checks before each commit)
./scripts/setup-git-hooks.sh

# Install development tools (golangci-lint, etc.)
./scripts/install-tools.sh

The pre-commit hooks ensure code quality by running:

  • gofmt - Code formatting
  • go vet - Static analysis
  • golangci-lint - Comprehensive linting
  • go test - Unit tests

See Contributing Guide for details.

Basic Build#

1
go build -o geoserver-cli ./cmd/geoserver-cli

Build with Version Information#

1
2
go build -ldflags "-X geoserver-cli/internal/cli.version=v1.0.0 -X geoserver-cli/internal/cli.commit=$(git rev-parse --short HEAD)" \
  -o geoserver-cli ./cmd/geoserver-cli

Cross-Platform Builds#

Linux#

1
GOOS=linux GOARCH=amd64 go build -o geoserver-cli-linux-amd64 ./cmd/geoserver-cli

macOS#

1
2
GOOS=darwin GOARCH=amd64 go build -o geoserver-cli-darwin-amd64 ./cmd/geoserver-cli
GOOS=darwin GOARCH=arm64 go build -o geoserver-cli-darwin-arm64 ./cmd/geoserver-cli

Windows#

1
GOOS=windows GOARCH=amd64 go build -o geoserver-cli-windows-amd64.exe ./cmd/geoserver-cli

Build Script#

Create a build script for convenience:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash
# build.sh

VERSION=${1:-dev}
COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")

echo "Building geoserver-cli version $VERSION (commit $COMMIT)"

go build \
  -ldflags "-X geoserver-cli/internal/cli.version=$VERSION -X geoserver-cli/internal/cli.commit=$COMMIT" \
  -o geoserver-cli \
  ./cmd/geoserver-cli

echo "Build complete: ./geoserver-cli"

Usage:

1
2
chmod +x build.sh
./build.sh v1.0.0

Testing Build#

1
2
3
4
# Build and test
go build -o geoserver-cli ./cmd/geoserver-cli
./geoserver-cli version
./geoserver-cli --help

Release Builds#

For releases, build for all platforms:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
# build-release.sh

VERSION=$1
if [ -z "$VERSION" ]; then
  echo "Usage: $0 <version>"
  exit 1
fi

COMMIT=$(git rev-parse --short HEAD)

PLATFORMS=(
  "linux/amd64"
  "darwin/amd64"
  "darwin/arm64"
  "windows/amd64"
)

mkdir -p dist

for platform in "${PLATFORMS[@]}"; do
  GOOS=${platform%/*}
  GOARCH=${platform#*/}
  OUTPUT="dist/geoserver-cli-${VERSION}-${GOOS}-${GOARCH}"
  
  if [ "$GOOS" = "windows" ]; then
    OUTPUT="${OUTPUT}.exe"
  fi
  
  echo "Building ${OUTPUT}..."
  GOOS=$GOOS GOARCH=$GOARCH go build \
    -ldflags "-X geoserver-cli/internal/cli.version=$VERSION -X geoserver-cli/internal/cli.commit=$COMMIT" \
    -o "$OUTPUT" \
    ./cmd/geoserver-cli
done

echo "Release builds complete in dist/"

Docker Build#

Create a Dockerfile for containerized builds:

1
2
3
4
5
6
7
8
9
FROM golang:1.24-alpine AS builder

WORKDIR /build
COPY . .
RUN go build -o geoserver-cli ./cmd/geoserver-cli

FROM alpine:latest
COPY --from=builder /build/geoserver-cli /usr/local/bin/
ENTRYPOINT ["geoserver-cli"]

Build:

1
docker build -t geoserver-cli:latest .

CI/CD Builds#

GitLab CI automatically builds on push. See .gitlab-ci.yml for configuration.

Troubleshooting#

Build Fails#

  1. Check Go version: go version
  2. Verify dependencies: go mod download
  3. Clean build cache: go clean -cache

Version Information Missing#

Ensure git repository is available:

1
git rev-parse --short HEAD

If not in git repo, build without version:

1
go build -o geoserver-cli ./cmd/geoserver-cli