将GitHub PHP代码持续部署到GCP Compute Engine LAMP栈的最佳方案
实现GitHub PHP代码到GCP一键LAMP实例持续部署的方案
你使用的GCP Marketplace一键部署的LAMP实例默认已完成Apache、PHP、MySQL运行环境配置,默认Web根目录为/var/www/html,可以通过以下两种常用方案实现持续部署:
方案一:使用GitHub Actions实现持续部署(推荐,支持部署日志追溯、权限管控更安全)
- 提前配置实例的SSH权限:登录LAMP实例,执行
ssh-keygen -t ed25519 -C "github-deploy"生成专用部署密钥,一路回车无需设置密码,将生成的公钥追加到~/.ssh/authorized_keys文件中,复制私钥内容备用。 - 配置GitHub仓库密钥:进入对应PHP仓库的「Settings - Secrets and variables - Actions」页面,新增4个仓库密钥:
GCP_SSH_PRIVATE_KEY(刚才复制的私钥内容)、GCP_INSTANCE_IP(LAMP实例公网IP)、GCP_SSH_USER(创建实例时设置的SSH登录用户名)、WEB_ROOT(默认填/var/www/html,如果有自定义根目录对应修改即可)。 - 配置实例目录权限:执行
sudo chown -R $USER:$USER /var/www/html && sudo chmod -R 755 /var/www/html,如果有需要写入权限的目录(如缓存、上传文件目录),单独给Apache默认用户www-data赋权即可。 - 初始化实例Git关联:进入实例Web根目录执行
git init,执行git remote add origin 你GitHub仓库的SSH地址,首次手动执行git pull origin main拉取全量代码,确认权限正常。如果是私有仓库,需要将实例的SSH公钥添加到仓库的「Deploy Keys」列表中。 - 配置Actions工作流:在PHP仓库根目录创建
.github/workflows/deploy.yml文件,内容参考如下:
name: Deploy to GCP LAMP Instance on: push: branches: [ main ] # 可修改为你需要触发部署的分支 jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: 推送代码到GCP实例 uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.GCP_INSTANCE_IP }} username: ${{ secrets.GCP_SSH_USER }} key: ${{ secrets.GCP_SSH_PRIVATE_KEY }} script: | cd ${{ secrets.WEB_ROOT }} git pull origin main # 可按需添加后续部署逻辑,示例: # composer install --no-dev --optimize-autoloader (安装PHP依赖) # php artisan migrate --force (Laravel项目执行数据库迁移) # php artisan cache:clear (清理应用缓存)
配置完成后,后续只要有代码推送到对应分支,就会自动触发部署,你可以在仓库的「Actions」页面查看部署日志和报错信息。
方案二:使用Webhook触发服务端自动拉取(轻量,无需配置GitHub Secrets)
适合小项目轻量部署场景,配置更简单:
- 创建Webhook接收脚本:在实例Web根目录外新建脚本文件,比如
/var/www/webhook.php,内容参考如下:
<?php // 自定义秘钥,后续GitHub Webhook配置需要和此处一致 $secret = '你自己生成的随机字符串'; $payload = file_get_contents('php://input'); $signature = hash_hmac('sha256', $payload, $secret); $hubSignature = $_SERVER['HTTP_X_HUB_SIGNATURE_256'] ?? ''; // 签名验证,避免恶意请求触发部署 if (!hash_equals('sha256=' . $signature, $hubSignature)) { http_response_code(403); die('签名验证失败'); } // 仅处理目标分支的push事件 $event = $_SERVER['HTTP_X_GITHUB_EVENT'] ?? ''; if ($event !== 'push') { die('非push事件,忽略处理'); } $data = json_decode($payload, true); if ($data['ref'] !== 'refs/heads/main') { // 对应你的部署分支 die('非目标分支提交,忽略处理'); } // 执行代码拉取逻辑 exec('cd /var/www/html && git pull origin main 2>&1', $output, $return_var); if ($return_var === 0) { echo '部署成功'; } else { http_response_code(500); echo '部署失败,错误信息:' . implode("\n", $output); } ?>
- 配置Web访问路径:修改Apache配置,给该脚本配置公网可访问的路径,确保可以通过公网HTTP/HTTPS请求访问到该脚本。
- 配置GitHub Webhook:进入仓库「Settings - Webhooks」页面新建Webhook,Payload URL填你刚才配置的脚本公网访问地址,Content type选择
application/json,Secret填你脚本里设置的自定义随机字符串,触发事件选择「Just the push event」保存即可。
注意:两种方案都需要确保GCP实例的VPC防火墙规则开放了对应端口:方案一需要开放22端口(SSH访问),方案二需要开放80/443端口(Webhook回调访问)。
内容的提问来源于stack exchange,提问作者user3547213
相关产品推荐
相关产品推荐

