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 formattinggo vet - Static analysisgolangci-lint - Comprehensive lintinggo test - Unit tests
See Contributing Guide for details.
Basic Build#
1
| go build -o geoserver-cli ./cmd/geoserver-cli
|
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
|
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#
- Check Go version:
go version - Verify dependencies:
go mod download - Clean build cache:
go clean -cache
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
|