编译部署
前言
本文将引导你完成Go项目的编译与部署,如果您只想知道怎么做,请跳转到总结。
第一步:编译
1. Go 编译命令
go build
默认情况下,go build
会根据当前的操作系统和架构生成适用于本机的静态链接的二进制文件,即所有依赖(包括 Go 标准库)都会打包到同一个可执行文件中,这样做的好处是部署时无需担心依赖库的缺失。
动态编译与静态编译的区别在于,动态编译的二进制文件需要在运行时加载依赖库,而静态编译的二进制文件则包含所有的依赖,确保了程序的可移植性。
2. 静态编译
CGO_ENABLED=0 go build
3. 动态编译
CGO_ENABLED=1 go build
4. 强制动态编译
CGO_ENABLED=1 go build -ldflags '-linkmode=external -extldflags "-shared"'
5. 交叉编译
Go 语言的跨平台能力是其优势之一。Go 原生支持交叉编译,你可以在一个平台上编译适用于不同操作系统和架构的可执行文件。
通过设置环境变量 GOOS
和 GOARCH
,可以实现交叉编译:
# 为 Linux 平台编译
GOOS=linux GOARCH=amd64 go build
# 为 Windows 平台编译
GOOS=windows GOARCH=amd64 go build
常见的 GOOS
取值包括:windows
, linux
, darwin
(macOS);GOARCH
则对应 amd64
, 386
, arm
等架构。
6. 编译优化
Go 编译器提供了一些选项来优化生成的二进制文件:
-
-ldflags
:用于链接时传递标志,可以用来减少二进制文件的大小,例如通过去除符号表和调试信息:go build -ldflags="-s -w"
-
-trimpath
:用于移除构建过程中生成的路径信息,以减少信息泄露:go build -trimpath
这些选项可以在编译阶段对二进制文件进行优化,从而减少大小并提高运行效率。
第二步:部署
1. 文件部署
部署 Go 应用的最简单方式是直接将编译好的二进制文件传输到目标服务器。由于 Go 的静态链接特性,只需要将可执行文件部署到目标机器即可。
常见的部署步骤:
- 编译项目:
GOOS=linux GOARCH=amd64 go build -o myapp
- 将生成的
myapp
二进制文件通过scp
或rsync
传输到服务器:scp myapp user@server:/path/to/deploy
- 在服务器上运行:
./myapp
2. 容器化部署
Docker 是现代部署中常用的工具之一,能够将应用及其依赖打包成镜像,并在任意环境下运行。Go 的静态编译特性使其非常适合 Docker 容器化。
Dockerfile 示例
# 使用官方的 Golang 镜像作为基础镜像
FROM golang:1.20 AS builder
# 设置工作目录
WORKDIR /app
# 复制源代码到容器中
COPY . .
# 编译应用
RUN go build -o myapp
# 使用更小的基础镜像来运行应用
FROM alpine:latest
WORKDIR /root/
# 复制编译好的二进制文件到新镜像
COPY /app/myapp .
# 设置执行命令
CMD ["./myapp"]
构建和运行 Docker 镜像:
docker build -t myapp .
docker run -d -p 8080:8080 myapp
3. 自动化编译与部署(CI/CD)
在现代软件开发流程中,自动化构建与部署(CI/CD)是确保高效、可靠交付的重要环节。常用的 CI 工具包括 GitLab CI、GitHub Actions 和 Jenkins。
示例:使用 GitHub Actions 进行自动化部署
在 GitHub 项目中添加 .github/workflows/main.yml
:
name: Go CI
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.20
- name: Build
run: go build -o myapp
- name: Deploy to server
run: scp myapp user@server:/path/to/deploy
这个 CI 文件会在每次推送到 main
分支时触发构建并将应用部署到服务器。
总结
编译部署脚本,您可以根据自己的需要修改。
#!/bin/bash
set -e
KEY=auth
USER=your-user-name
HOST=127.0.0.1
DOMAIN=gostartkit.com
GIT_COMMIT=$(git rev-parse HEAD)
# 编译
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build \
-ldflags "-X 'main.osarch=linux/amd64' -X 'main.gitrev=${GIT_COMMIT}' -s -w" \
-trimpath \
-buildmode=exe \
-tags release \
-o bin/${KEY}-linux-amd64
# 部署
rsync -avzP ./bin/$KEY-linux-amd64 -e "ssh -o ProxyCommand='nc -x 127.0.0.1:1080 %h %p'" $USER@$HOST:/opt/local/www/$KEY.$DOMAIN/bin/