使用gitlab action部署gin项目到服务器

gitlab action 部署到服务器

1. 准备ssh登录密钥

生成ssh密钥对

ssh-keygen -m PEM -t rsa -b 4096

注意生成密钥对的时候Passphrase要为空

2. 在github的setting中配置secrets

settings => security => Secrets and variables => New repository secret 在这里创建名为SSH_PRIVATE_KEY的secret,值为第一步生成的~/.ssh/id_rsa的值

  • name: SSH_PRIVATE_KEY

  • value: | -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY-----

3. 服务器安装PM2

PM2用于程序进程管理器,进程后台启动,多进程服务

  • 首先安装nodejs,安装npm
  • 使用npm全局安装pm2
npm install -g pm2

pm2常用命令参考↗ (opens in a new tab)

# 查看list
pm2 list
 
# 启动
pm2 start go -- run main.go
 
# 停止
pm2 stop go
 
# 重启
pm2 restart go
 
# 删除
pm2 delete go
 
# 日志
pm2 logs go --lines 100

4. 编写gitlab workflows yml文件

在项目中创建.github/workflows/ci.yml文件,不一定叫ci.yml,只要是.yml后缀就行

这里用到的是easingthemes/ssh-deploy↗ (opens in a new tab)工具部署

# 名称
name: Deploy to aliyun
# 监控哪些分支
on:
  push:
    branches:
      - "feat/deploy"
# 执行的任务
jobs:
  deploy:
    # 运行环境
    runs-on: ubuntu-latest
    # 步骤
    steps:
      # 固定的checkout
      - name: Checkout
        uses: actions/checkout@v3

      # 复制项目代码到目标服务器
      - name: Copy project
        uses: easingthemes/ssh-deploy@main
        with:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          ARGS: "-rlgoDzvc -i --delete"
          SOURCE: ""
          REMOTE_HOST: '47.250.51.76'
          REMOTE_USER: 'root'
          TARGET: '/root/test/deploy/llm-chat'

      # 使用pm2启动服务
      - name: Start server
        uses: easingthemes/ssh-deploy@main
        with:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          ARGS: "-rlgoDzvc -i --delete"
          SOURCE: ".gitignore"
          REMOTE_HOST: '47.250.51.76'
          REMOTE_USER: 'root'
          TARGET: '/root/test/deploy/llm-chat/gitignore'
          SCRIPT_BEFORE: |
            cd /root/test/deploy/llm-chat
            pm2 stop go
            pm2 delete go
            pm2 start /usr/local/go/bin/go -- run main.go

错误处理

Permission denied (publickey).

cd ~/.ssh && cat id_rsa.pub >> authorized_keys

可以看这个issue↗ (opens in a new tab)

Script not found: /usr/local/go/bin/go

原因是在执行go文件时该用户没有这个环境变量,所以要指定go所在的目录/usr/local/go/bin/go

查找go所在的目录

which go
右侧菜单栏