之前在服务器上有多个Go
编写的微服务,基本全是基于Gin
的web
服务。因为业务范围小,部署起来都是简单粗暴,复制二进制文件,改软连接,重启服务。但是时间长了,尤其是初期开发迭代速度很快,要经常部署,就很烦。这次,我终于有时间,把它完全自动化了,不再手动部署。
整体规划(其实还是模拟手动步骤):
使用Compose
管理(现状,维持不变),使用GitHub Actions
部署;
编译好二进制,直接拷贝到服务器,然后重启服务;
Actions
文件如下
name: Build and Deploy Go Application
on:
push:
branches:
- main # 当推送到主分支时触发
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# 1. 检出最新代码
- name: Checkout code
uses: actions/checkout@v3
# 2. 设置 Go 环境
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: '1.20' # 替换为你的 Go 版本
# 3. 编译 Go 项目
- name: Build Go binary
run: |
go mod tidy # 清理和安装依赖
go build -o app . # 编译 Go 项目并生成二进制文件
# 4. 设置 SSH 密钥
- name: Setup SSH
uses: webfactory/ssh-agent@v0.5.3
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
# 5. 将服务器的主机密钥添加到 known_hosts 文件
- name: Add server to known_hosts
run: |
ssh-keyscan -H ${{ secrets.ALIYUN_SERVER_IP }} >> ~/.ssh/known_hosts
# 6. 将编译好的二进制文件传输到阿里云服务器
- name: Copy binary via SCP
run: scp -r ./app your-username@${{ secrets.ALIYUN_SERVER_IP }}:/path/to/your/project
# 7. 连接到阿里云服务器并使用 Docker Compose 构建和启动容器
- name: SSH and deploy
run: |
ssh your-username@${{ secrets.ALIYUN_SERVER_IP }} << 'EOF'
cd /path/to/your/project
docker compose down
docker compose up --build -d
EOF
其他说明:
服务器是阿里云
该服务和它的关联服务是可以短暂停止的,如果不能,就把docker compose down
去掉
Alex