如何通过GitHub Actions使用SSH连接Ubuntu服务器并借助另一组SSH密钥拉取私有GitHub仓库
如何通过GitHub Actions使用SSH连接Ubuntu服务器并借助另一组SSH密钥拉取私有GitHub仓库
嘿,我来帮你搞定这个自动部署的问题!结合你的Ubuntu 22.04.1 LEMP环境(还有那个不得不留的PHP 5.6),咱们一步步来实现push到main分支就自动部署的流程:
第一步:给Ubuntu服务器生成拉取私有GitHub仓库的专属SSH密钥
首先登录到你的Ubuntu服务器,咱们生成一对专门用来拉取代码的SSH密钥:
- 执行命令:
ssh-keygen -t ed25519 -C "server-deploy@your-domain.com"(一路按回车就行,别设密码,不然自动部署时会卡住) - 查看生成的公钥:
cat ~/.ssh/id_ed25519.pub,把这个内容复制下来 - 打开你的私有GitHub仓库,进入「Settings」→「Deploy keys」→「Add deploy key」,粘贴刚才的公钥,勾选「Allow write access」(虽然你现在只需要拉取,但勾上以后如果要推送也方便),然后保存。
第二步:配置GitHub Actions需要的服务器登录密钥
接下来要给你的GitHub仓库(就是存放代码的那个私有仓库)配置Actions需要的服务器登录信息:
- 进入仓库的「Settings」→「Secrets and variables」→「Actions」→「New repository secret」
- 依次添加这三个Secret:
SSH_HOST:你的Ubuntu服务器的IP地址或者域名SSH_USER:服务器上用来登录的用户名(比如root或者你的普通运维用户)SSH_PRIVATE_KEY:你平时用来登录服务器的那个私有密钥(注意不是刚才生成的拉取代码的密钥!)
第三步:编写正确的GitHub Actions Workflow文件
在你的代码仓库根目录创建(或修改).github/workflows/deploy.yml文件,替换成下面的内容:
name: Deploy to Ubuntu Server # 只在main分支有push时触发部署 on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: # 可选:拉取当前仓库的代码(如果需要在Actions里做一些校验可以保留,否则可以跳过) - name: Checkout code uses: actions/checkout@v4 # 配置SSH代理,管理服务器登录密钥 - name: Setup SSH connection to server uses: webfactory/ssh-agent@v0.8.0 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} # 连接服务器并执行拉取代码的操作 - name: Pull code to server run: | # 关闭主机密钥检查,避免第一次连接时需要手动确认 ssh -o StrictHostKeyChecking=no ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'EOF' # 切换到你的项目根目录,比如/var/www/your-legacy-app cd /var/www/your-legacy-app # 拉取main分支的最新代码 git pull origin main # 可选:根据你的环境添加需要的操作,比如重启PHP或Nginx # sudo systemctl reload php5.6-fpm # sudo systemctl reload nginx EOF
关键注意事项
- 提前初始化服务器上的仓库:第一次部署前,要手动在服务器上执行
git clone git@github.com:你的用户名/私有仓库名.git /var/www/your-legacy-app,确保用服务器上生成的SSH密钥能成功拉取代码(这一步是为了让服务器把GitHub的主机密钥加到信任列表里) - 权限问题:确保服务器上的
SSH_USER对项目目录有读写权限,比如可以执行sudo chown -R 你的用户名:www-data /var/www/your-legacy-app - PHP版本适配:如果你需要清理PHP 5.6的op缓存,记得在脚本里加上
sudo systemctl reload php5.6-fpm,避免旧代码残留
这样配置好之后,下次你push代码到main分支,GitHub Actions就会自动连接到你的Ubuntu服务器,拉取最新的私有仓库代码啦!
备注:内容来源于stack exchange,提问作者user1780720




