GitHub自托管Runner无法拉取分支最新代码,构建重启失败求助
问题分析与解决方案
核心问题
- 步骤间工作目录不持久:每个
run命令都是独立的Shell会话,cd /home/ubuntu/...仅在当前步骤生效,后续的git pull、npm ci等命令都会回到GitHub Runner默认的工作目录,而非你的项目部署目录,导致所有操作都没作用在目标路径上。 - 冗余的checkout步骤:你已经打算直接在部署目录执行
git pull,前面的actions/checkout@v4会将代码拉取到Runner的临时工作目录,和你的部署目录无关,属于多余操作。 - 环境变量写入路径错误:
echo ... >> .env是在Runner工作目录创建/修改.env文件,而非部署目录下的.env,对实际运行的服务无效。
修正后的配置示例
name: Node.js CI on: push: branches: [ "dev" ] jobs: build: runs-on: self-hosted strategy: matrix: node-version: [22.x] steps: - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'npm' # 缓存指定到项目部署目录,提升依赖安装速度 cache-dependency-path: /home/ubuntu/<project-name>-dev/<projec-name>-backend/package-lock.json - name: Pull latest code working-directory: /home/ubuntu/<project-name>-dev/<projec-name>-backend run: git pull origin dev - name: Update environment variables working-directory: /home/ubuntu/<project-name>-dev/<projec-name>-backend run: | echo "PORT=4000" >> .env echo "SOCKET_PORT=4002" >> .env - name: Verify environment variables working-directory: /home/ubuntu/<project-name>-dev/<projec-name>-backend run: cat .env - name: Install dependencies working-directory: /home/ubuntu/<project-name>-dev/<projec-name>-backend run: npm ci - name: Build project working-directory: /home/ubuntu/<project-name>-dev/<projec-name>-backend run: CI='' && npm run build - name: Restart service run: sudo systemctl restart <project-name>.service
额外注意事项
- 确保GitHub Runner用户对部署目录有读写权限,否则
git pull、依赖安装等操作会静默失败。 - 如果
git pull需要身份验证,可在服务器上配置SSH密钥或HTTPS凭据,让Runner能免密拉取代码。 - 复用Runner时,若多个Action的工作目录冲突,可给每个Job指定独立的工作区,或在步骤中明确指定路径避免干扰。
内容的提问来源于stack exchange,提问作者Ammar Khalid
相关产品推荐
相关产品推荐

