GitHub Action SSH多命令链部署问题及简洁方案求助
修复GitHub Action部署到Hetzner的SSH命令问题
问题根源
- SSH_OPTS配置错误:你在Secrets里给SSH_OPTS加了多余的双引号,并且把两个
-o选项合并成一个,导致ssh命令解析时把ServerAliveInterval=600 StrictHostKeyChecking=no当成单个选项的参数,触发serveraliveinterval extra arguments错误。 - 远程命令执行逻辑错误:原来的写法中,
ssh命令仅建立远程连接,之后的cd、git pull等命令都是在GitHub Runner的本地Ubuntu环境执行,根本没在Hetzner服务器上运行——这是最关键的逻辑错误。
简洁修复步骤
1. 修正SSH_OPTS Secrets
把SSH_OPTS的内容改成:
-o ServerAliveInterval=600 -o StrictHostKeyChecking=no
去掉原来的包裹双引号,并且给每个选项单独加-o。
2. 修正GitHub Action的部署步骤
用Here Document语法把所有远程执行的命令传递给ssh,既简洁又避免转义问题:
- name: (Finally) Deploy to Hetzner run: | ssh -v ${{ secrets.SSH_OPTS }} ${{ secrets.HETZNER_USER }} << 'EOF' cd myproject git pull npm ci npm run build npm run start caddy run EOF
<< 'EOF'表示后续内容直到EOF都是要传递给远程shell的命令,单引号包裹EOF可以防止本地变量被替换,确保命令完全在远程执行。- 若偏好一行式写法(适合短命令场景),可改用:
但Here Document可读性更强,后续维护更方便。run: ssh -v ${{ secrets.SSH_OPTS }} ${{ secrets.HETZNER_USER }} "cd myproject && git pull && npm ci && npm run build && npm run start && caddy run"
最终完整配置
name: Deploy to Hetzner on: push: branches: - main jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Set up SSH uses: webfactory/ssh-agent@v0.9.0 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY}} - name: (Finally) Deploy to Hetzner run: | ssh -v ${{ secrets.SSH_OPTS }} ${{ secrets.HETZNER_USER }} << 'EOF' cd myproject git pull npm ci npm run build npm run start caddy run EOF
内容的提问来源于stack exchange,提问作者The Dude
相关产品推荐
相关产品推荐

