使用 GitHub Actions 实现自动部署,可以简化将 Golang 应用从代码提交到 VPS 服务器的整个流程。本文将详细介绍如何配置 GitHub Actions,以在每次提交代码后自动编译和部署应用,无需使用 Docker,直接通过 supervisord 启动二进制文件。以下是详细的配置步骤和流程。

Github Action 自动部署流程

  1. 提交代码到主分支。
  2. GitHub 拉取最新代码并运行单元测试,然后编译二进制文件。
  3. 使用 SCP 将编译后的二进制文件传输到 VPS 服务器。
  4. 通过 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 中进行配置。如图:

配置 Actions Secrets

在你的 Golang 应用的代码库页面进入 Settings 选择 Secrets 后,点击右上方的【New repository secret】创建 Secret 变量,Name 填变量名,Value 填变量值, 配置后可以在 Actions 的配置 yml 文件中使用${{ secrets.XXX }}来使用。

3. 创建 GitHub Actions Workflows

你可以直接在代码目录新建配置文件 .github/workflows/deploy.yml,也可以直接在 github 项目页面点击 Actions 页面创建并直接编辑提交,如图:

创建 Github Actions workflows

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 服务器,节省开发者的时间和精力。以上步骤为基础配置,可以根据项目需求进行灵活调整和扩展。掌握这一技术将有助于提升工作效率,并确保持续交付的流畅性。


也可以看看