EC2服务器GitHub Actions CI/CD代码不更新问题排查
问题描述
我在EC2服务器上配置了GitHub Actions实现CI/CD流程,多数功能正常,但修改现有接口或代码后,服务器端未同步更新。提交记录显示绿色对勾,代码已推送至服务器,但更改不生效;手动执行pm2 restart index.js后恢复正常,新增路由则能正常同步。怀疑Workflow文件存在问题,但无法定位原因。
当前Workflow配置:
name: Ci/Cd Pipeline on: push: branches: [ "staging" ] pull_request: branches: [ "staging" ] jobs: build: runs-on: self-hosted strategy: matrix: node-version: [18.x] steps: - name: cleanup #https://github.com/actions/checkout/issues/21 run: | sudo chown -R $USER:$USER $GITHUB_WORKSPACE - uses: actions/checkout@v3 - run: sudo npm i - run: sudo pm2 kill -a - run: sudo pm2 start index.js
问题分析与解决
核心原因
修改旧代码不生效的本质是工作目录的旧代码缓存未被彻底清理,pm2启动时读取的还是残留的旧文件。新增路由能生效是因为新文件不存在缓存,而修改旧文件时,拉取代码的步骤没做到完全覆盖旧内容,导致pm2加载的不是最新版本。
修复方案
强制拉取最新代码,清理缓存
给actions/checkout添加参数,确保拉取完整仓库并清空工作目录的未追踪文件:- uses: actions/checkout@v3 with: fetch-depth: 0 # 拉取完整提交历史,避免浅克隆导致的代码不一致 clean: true # 清理工作目录,删除所有不在版本控制中的文件移除sudo,避免权限混乱
使用sudo执行npm和pm2会改变文件所有者,可能导致pm2无法读取更新后的文件。直接用当前用户执行命令:- run: npm i - run: pm2 restart index.js || pm2 start index.js若必须使用sudo,需确保pm2启动时的用户能正常访问工作目录的文件。
验证代码是否拉取成功
在拉取代码后添加步骤打印当前提交哈希,与GitHub上的提交哈希对比,确认代码为最新版本:- run: git rev-parse HEAD若哈希不一致,说明runner未拉取到最新代码,需检查runner的网络连接或权限设置。
用pm2 restart替代kill+start
直接kill所有pm2进程再启动易引发问题,改用restart命令会重新加载代码;若进程不存在则自动启动:- run: pm2 restart index.js || pm2 start index.js
修复后的完整Workflow示例
name: Ci/Cd Pipeline on: push: branches: [ "staging" ] pull_request: branches: [ "staging" ] jobs: build: runs-on: self-hosted strategy: matrix: node-version: [18.x] steps: - name: 修复工作目录权限 run: | chown -R $USER:$USER $GITHUB_WORKSPACE - name: 拉取最新代码 uses: actions/checkout@v3 with: fetch-depth: 0 clean: true - name: 安装依赖 run: npm i - name: 重启PM2服务 run: pm2 restart index.js || pm2 start index.js
内容的提问来源于stack exchange,提问作者rameez khan
相关产品推荐
相关产品推荐

