likes
comments
collection
share

GitHub actions 自动部署 goframe 项目到云服务器

作者站长头像
站长
· 阅读数 21

万万没想到一个 goframe 项目部署居然会让我来来回回折腾三次然后也就有了三篇文章

还有现在看到的 GitHub actions 自动部署 goframe 项目到云服务器

可以看出来三篇文章对应我三次不同场景的部署需求🫠

第一篇文章是刚开始使用 goframe 开发完成后打包丢到服务器部署了

第二篇是因为每次部署都需要手动操作,然后就经过一番折腾实现了GitHub actions + docker 自动部署 goframe 项目

这一篇呢是因为最近国内访问 docker hub 受限,大部分的代理网站也被 dns 污染拉取镜像的时候总失败也就没法成功部署😐

聪明的我当然想到了使用阿里云的镜像加速服务事实上我也这么干了但前几天收到了一份来自阿里云的邮件

GitHub actions 自动部署 goframe 项目到云服务器

我的理解是在 github actions 中不能使用阿里云镜像加速拉取镜像而且也不能拉取全部镜像

那咋办? 不用了呗!

本文实现目标

在代码推送到 github 时触发 github actions 打包应用,然后将打包后的产物发送到服务器部署

如果您已经了解相关知识,请直接滑到底部有完整 github actios 配置

步骤

由上边描述可以将过程拆解为

  1. 代码推送触发构建
  2. 在 github actions 中打包应用
  3. 将打包后的产物发送到需要部署的服务器
  4. 连接部署服务器执行相关部署操作

代码推送触发构建

在项目的根目录下新建 .github/workflows 然后创建 deploy.yml

写入如下内容 dev 分支推送即触发构建

name: Build and Deploy # actions 的名称

on:
  push:
    branches:
      - dev # 当推送到 dev 分支时触发工作流

如果想要在推送 tag 后触发构建则可以修改为

name: Build and Deploy # actions 的名称

on:
  push:
    tags:
      - 'v*' # 当有以 'v' 开头的 tag 被推送时触发

在 github actions 中打包应用

这一步需要做的操作

  1. 从仓库检出代码
  2. 设置 go 环境
  3. 安装 gf-tool 因为是 goframe 项目使用 gf 打包更方便
  4. 执行 gf build 构建应用
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest # 使用最新的 Ubuntu 运行器

    steps:
      # 第一步:检出代码
      - name: Checkout
        uses: actions/checkout@v4.1.7

      # 第二步:设置 Go 环境
      - name: Set up Go
        uses: actions/setup-go@v4
        with:
          go-version: '1.20' # 设置 Go 版本为 1.20

      # 第三步:安装 gf-tool 因为是 goframe 项目使用 gf 打包更方便
      - name: Install gf-tool
        run: |
          wget -O gf https://github.com/gogf/gf/releases/latest/download/gf_$(go env GOOS)_$(go env GOARCH)
          chmod +x gf 
          ./gf install -y
          rm ./gf

      # 第四步:构建 Go 应用程序
      - name: Build Go application
        run: gf build

这里需要注意下: 执行 build 成功后会输出产物所在的目录与本地有差异

GitHub actions 自动部署 goframe 项目到云服务器

GitHub actions 自动部署 goframe 项目到云服务器

将打包后的产物发送到需要部署的服务器

这里需要做的是

  1. 使用 ssh 连接云服务器
  2. 使用 scp 命令将文件发送到云服务器

在 github actions 中一般是使用 ssh 免密登录,那么就需要做一些配置

云服务器 ssh 登录免密配置

首先需要在本地生成 ssh 密钥 ssh-keygen -t rsa -b 4096

GitHub actions 自动部署 goframe 项目到云服务器

可以使用 -f 参数自定义生成的名称 ssh-keygen -t rsa -b 4096 -f ~/.ssh/my_custom_key

GitHub actions 自动部署 goframe 项目到云服务器

复制公钥 id_rsa.pub中的密钥到服务器上 ~/.ssh/authorized_keys 文件中。

也可以直接将本地生成的 id_rsa.pub 复制一份改成 authorized_keys 上传覆盖已有的 ~/.ssh/authorized_keys

执行 ssh root@12.120.50.125ssh 服务器用户名@服务器公网ip 如果可以正常连接即表示配置成功

GitHub actions 自动部署 goframe 项目到云服务器

gihub 增加 ssh 私钥

项目\settings\Secrets and variables\actions

密钥内容也就是上边生成的 id_rsa 文件中的内容

GitHub actions 自动部署 goframe 项目到云服务器

然后按照上边的方式顺便配置下 服务器地址:SERVER_HOST、服务器用户名:SERVER_USERNAME、服务器密码:SERVER_PASSWORD 变量后边需要使用

actiosn

# 第五步:设置 SSH 环境
- name: Setup SSH
  run: |
    mkdir -p ~/.ssh # 创建 .ssh 目录
    echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa # 写入 SSH 私钥
    chmod 600 ~/.ssh/id_rsa # 设置私钥权限

# 第六步:将产物上传到云服务器
- name: build upload
  run: |
    cd ./linux_amd64 # 进入构建输出目录 上边有说
    tar -czf main.tar.gz main # 压缩构建文件
    scp -o StrictHostKeyChecking=no -P 22 main.tar.gz ${{ secrets.SERVER_USERNAME }}@${{ secrets.SERVER_HOST }}:/usr/local/kk/kkdl/main.tar.gz # 上传到服务器

main.tar.gz 需要上传的文件 /usr/local/kk/kkdl/main.tar.gz 是上传到云服务器上的具体位置

连接部署服务器执行相关部署操作

# 第七步:部署到服务器
- name: Deploy to server
  uses: appleboy/ssh-action@master
  with:
    host: ${{ secrets.SERVER_HOST }} # 服务器地址
    username: ${{ secrets.SERVER_USERNAME }} # 服务器用户名
    password: ${{ secrets.SERVER_PASSWORD }} # 服务器密码
    port: 22 # SSH 端口
    script: |
      if [ -e /usr/local/kk/kkdl/main ]; then
        mv /usr/local/kk/kkdl/main /usr/local/kk/kkdl/oldman # 备份旧的可执行文件
      fi
      cd /usr/local/kk/kkdl/
      tar -xzf main.tar.gz # 解压新构建的文件
      sh run.sh # 运行部署脚本
      if [ -e /usr/local/kk/kkdl/oldman ]; then
        rm -rf oldman main.tar.gz # 删除旧文件和压缩包
      fi

run.sh 文件如下

#!/bin/bash

PORT=6001

# 停止指定端口上的进程
stop_process() {
  # 查找指定端口的进程
  PID=$(netstat -nlp | grep ":$PORT " | awk '{print $7}' | awk -F'[/]' '{print $1}')

  if [[ -z $PID ]]; then
    echo "端口 $PORT 上没有运行的进程"
  else
    echo "停止端口 $PORT 上的进程 $PID"
    kill $PID
  fi
}

# 更改文件权限
change_permission() {
  chmod 777 ./main
  echo "修改文件权限"
}

# 启动进程
start_process() {
  nohup ./main --gf.gcfg.file=config.pro.yaml >/dev/null 2>&1 &
  echo "部署完成"
}

# 停止进程
stop_process

# 更改文件权限
change_permission

# 启动进程
start_process

将 run.sh 部署脚本 和 config.pro.yaml 配置文件 上传到云服务器部署目录 /usr/local/kk/kkdl

手动执行 run.sh 效果如下停止旧的服务启动新的服务

GitHub actions 自动部署 goframe 项目到云服务器

完整 github actions

name: Build and Deploy # actions 的名称

on:
  push:
    branches:
      - dev

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4.1.7

      - name: Set up Go
        uses: actions/setup-go@v4
        with:
          go-version: '1.20' # 设置 Go 版本为 1.20

      - name: Install gf-tool
        run: |
          wget -O gf https://github.com/gogf/gf/releases/latest/download/gf_$(go env GOOS)_$(go env GOARCH)
          chmod +x gf 
          ./gf install -y
          rm ./gf

      - name: Build Go application
        run: gf build

      - name: Setup SSH
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa

      - name: build upload
        run: |
          cd ./linux_amd64
          tar -czf main.tar.gz main
          scp -o StrictHostKeyChecking=no -P 22 main.tar.gz ${{ secrets.SERVER_USERNAME }}@${{ secrets.SERVER_HOST }}:/usr/local/kk/kkdl/main.tar.gz

      - name: Deploy to server
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USERNAME }}
          password: ${{ secrets.SERVER_PASSWORD }}
          port: 22
          script: |
            if [ -e /usr/local/kk/kkdl/main ]; then
              mv /usr/local/kk/kkdl/main /usr/local/kk/kkdl/oldman
            fi
            cd /usr/local/kk/kkdl/
            tar -xzf main.tar.gz
            sh run.sh
            if [ -e /usr/local/kk/kkdl/oldman ]; then
              rm -rf oldman main.tar.gz
            fi

总结

本文实践了如何使用 GitHub Actions 自动构建和部署 GoFrame 项目到云服务器,整个流程通过 GitHub Actions 自动化,减少了手动操作的繁琐,提高了部署效率和准确性。

如果有更好的部署方法,请告知我!!!

往期文章

转载自:https://juejin.cn/post/7391704618180526080
评论
请登录