6.4 构建与部署
交叉编译
bash
# 查看支持的平台
go tool dist list
# 交叉编译
GOOS=linux GOARCH=amd64 go build -o app-linux
GOOS=windows GOARCH=amd64 go build -o app.exe
GOOS=darwin GOARCH=arm64 go build -o app-macos-arm
# 构建优化
go build -ldflags="-s -w" -o app
go build -ldflags="-s -w -X main.version=1.0.0" -o appMakefile 示例
makefile
.PHONY: build clean test
VERSION := 1.0.0
LDFLAGS := -s -w -X main.version=$(VERSION)
build:
go build -ldflags="$(LDFLAGS)" -o bin/app ./cmd/myapp
build-all:
GOOS=linux GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o bin/app-linux ./cmd/myapp
GOOS=darwin GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o bin/app-darwin ./cmd/myapp
GOOS=windows GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o bin/app-windows.exe ./cmd/myapp
clean:
rm -rf bin/
test:
go test -race -cover ./...Docker 容器化
dockerfile
# 多阶段构建
FROM golang:1.21-alpine AS builder
RUN apk add --no-cache git ca-certificates
WORKDIR /build
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build \
-ldflags="-s -w" \
-o /app/myapp \
./cmd/myapp
FROM scratch
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /app/myapp /app/myapp
EXPOSE 8080
ENTRYPOINT ["/app/myapp"]docker-compose
yaml
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
environment:
- APP_ENV=production
- DB_HOST=postgres
depends_on:
- postgres
restart: unless-stopped
postgres:
image: postgres:15-alpine
environment:
POSTGRES_USER: myapp
POSTGRES_PASSWORD: secret
POSTGRES_DB: myapp
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:CI/CD
yaml
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v4
with:
go-version: '1.21'
- name: Run tests
run: go test -race -coverprofile=coverage.txt ./...
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: golangci/golangci-lint-action@v3
build:
runs-on: ubuntu-latest
needs: [test, lint]
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v4
- name: Build
run: go build -v ./...
- name: Docker build
run: docker build -t myapp:${{ github.sha }} .