GitHub actions 自动部署 goframe 项目到云服务器
万万没想到一个 goframe 项目部署居然会让我来来回回折腾三次然后也就有了三篇文章
还有现在看到的 GitHub actions 自动部署 goframe 项目到云服务器
可以看出来三篇文章对应我三次不同场景的部署需求🫠
第一篇文章是刚开始使用 goframe 开发完成后打包丢到服务器部署了
第二篇是因为每次部署都需要手动操作,然后就经过一番折腾实现了GitHub actions + docker 自动部署 goframe 项目
这一篇呢是因为最近国内访问 docker hub 受限,大部分的代理网站也被 dns 污染拉取镜像的时候总失败也就没法成功部署😐
聪明的我当然想到了使用阿里云的镜像加速服务事实上我也这么干了但前几天收到了一份来自阿里云的邮件
我的理解是在 github actions 中不能使用阿里云镜像加速拉取镜像而且也不能拉取全部镜像
那咋办? 不用了呗!
本文实现目标
在代码推送到 github 时触发 github actions 打包应用,然后将打包后的产物发送到服务器部署
如果您已经了解相关知识,请直接滑到底部有完整 github actios 配置
步骤
由上边描述可以将过程拆解为
- 代码推送触发构建
- 在 github actions 中打包应用
- 将打包后的产物发送到需要部署的服务器
- 连接部署服务器执行相关部署操作
代码推送触发构建
在项目的根目录下新建 .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 中打包应用
这一步需要做的操作
- 从仓库检出代码
- 设置 go 环境
- 安装 gf-tool 因为是 goframe 项目使用 gf 打包更方便
- 执行
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 成功后会输出产物所在的目录与本地有差异
将打包后的产物发送到需要部署的服务器
这里需要做的是
- 使用 ssh 连接云服务器
- 使用 scp 命令将文件发送到云服务器
在 github actions 中一般是使用 ssh 免密登录,那么就需要做一些配置
云服务器 ssh 登录免密配置
首先需要在本地生成 ssh 密钥 ssh-keygen -t rsa -b 4096
可以使用 -f 参数自定义生成的名称 ssh-keygen -t rsa -b 4096 -f ~/.ssh/my_custom_key
复制公钥 id_rsa.pub
中的密钥到服务器上 ~/.ssh/authorized_keys
文件中。
也可以直接将本地生成的 id_rsa.pub
复制一份改成 authorized_keys
上传覆盖已有的 ~/.ssh/authorized_keys
执行 ssh root@12.120.50.125
将 ssh 服务器用户名@服务器公网ip
如果可以正常连接即表示配置成功
gihub 增加 ssh 私钥
项目\settings\Secrets and variables\actions
密钥内容也就是上边生成的 id_rsa
文件中的内容
然后按照上边的方式顺便配置下 服务器地址: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
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