Skip to content

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 app

Makefile 示例 ​

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 }} .