使用 GitHub Actions 实现自动部署,可以简化将 Golang 应用从代码提交到 VPS 服务器的整个流程。本文将详细介绍如何配置 GitHub Actions,以在每次提交代码后自动编译和部署应用,无需使用 Docker,直接通过 supervisord 启动二进制文件。以下是详细的配置步骤和流程。
Github Action 自动部署流程
- 提交代码到主分支。
- GitHub 拉取最新代码并运行单元测试,然后编译二进制文件。
- 使用 SCP 将编译后的二进制文件传输到 VPS 服务器。
- 通过 SSH 远程执行服务重启命令。
Github Action 自动部署配置步骤
1. 创建 SSH Key
由于是使用 ssh 进行部署,需要让 github 能登录服务器,因此先在 VPS 服务器上给 github actions 创建一个 ssh key:
cd ~/.ssh
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/github_action
...
将生成的公钥保存到 authorized_keys 文件中:
cat github_action.pub >> authorized_keys
2. 配置 Actions Secrets
由于部署过程会涉及一些隐私的变量,比如 scp、ssh 等需要的密钥信息等,可以将这些信息在代码仓库的 Settings/Secrets 中进行配置。如图:
在你的 Golang 应用的代码库页面进入 Settings 选择 Secrets 后,点击右上方的【New repository secret】创建 Secret 变量,Name 填变量名,Value 填变量值,
配置后可以在 Actions 的配置 yml 文件中使用${{ secrets.XXX }}
来使用。
3. 创建 GitHub Actions Workflows
你可以直接在代码目录新建配置文件 .github/workflows/deploy.yml
,也可以直接在 github 项目页面点击 Actions 页面创建并直接编辑提交,如图:
yml 文件内容设置如下:
name: deploy go
on:
push:
branches: [ main ] # main分支上push触发部署
pull_request:
branches: [ main ] # merge到main分支时触发部署
jobs:
build:
# 在ubuntu上进行构建操作
runs-on: ubuntu-latest
steps:
# 拉取代码
- uses: actions/checkout@v2
# 设置你项目的golang版本
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.16
# 执行单元测试
- name: Test
run: go test -v ./...
# 编译二进制
# 注意没有使用cgo的务必加上CGO_ENABLED=0,不然可能编译通过但VPS上没有GLIBC或GLIBC版本不一致会导致无法启动
- name: Build
run: CGO_ENABLED=0 go build -o app -tags=jsoniter
# 将编译出的二进制文件 scp 到你的VPS服务器
- name: SCP Files
uses: appleboy/scp-action@master
with:
host: ${{ secrets.REMOTE_HOST }} # Secrets中的配置:vps IP地址
username: ${{ secrets.REMOTE_USER }} # Secrets中的配置:vps 登录用户名
port: ${{ secrets.REMOTE_PORT }} # Secrets中的配置:vps 端口
key: ${{ secrets.SERVER_SSH_KEY }} # Secrets中的配置:vps 上创建的ssh key的私钥内容
source: 'app' # 编译出的二进制文件名
target: ${{ secrets.REMOTE_TARGET }} # Secrets中的配置:scp 到 vps 上的的目录
# 通过ssh远程执行命令重启vps上的服务
- name: SSH Remote Commands
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.REMOTE_HOST }} # Secrets中的配置:vps IP地址
username: ${{ secrets.REMOTE_USER }} # Secrets中的配置:vps 登录用户名
port: ${{ secrets.REMOTE_PORT }} # Secrets中的配置:vps 端口
key: ${{ secrets.SERVER_SSH_KEY }} # Secrets中的配置:vps 上创建的ssh key的私钥内容
script: ${{ secrets.AFTER_COMMAND }} # Secrets中的配置:scp二进制文件到vps服务器上后需要执行的相关shell命令重启服务
创建完成后,每次 push 到 main 分支就会自动执行 steps 中设置的步骤完成自动化部署。
你也可以根据你的实际需求,参考 官方文档 修改 yml 配置。
常见问题解答 (FAQ)
GitHub Actions 如何确保 key 安全性?
确保 SSH 密钥的权限设置为 600
,并限制对 authorized_keys
的访问。此外,使用 GitHub Secrets 存储敏感信息,避免直接在代码中写明。
我可以使用其他语言的应用程序吗?
虽然本文主要针对 Golang 应用程序,但可以根据需要调整相应的构建和部署步骤,支持其他编程语言。
GitHub Actions 如何调试部署失败的问题?
可以在 GitHub Actions 页面查看每一步的执行日志,定位错误发生的步骤,针对性进行调试。
小结
通过使用 GitHub Actions,可以高效地将 Golang 应用自动化部署到 VPS 服务器,节省开发者的时间和精力。以上步骤为基础配置,可以根据项目需求进行灵活调整和扩展。掌握这一技术将有助于提升工作效率,并确保持续交付的流畅性。