如何通过GitHub Actions正确部署.NET Core应用至Ubuntu VPS?
解决方案
一、修复rsync权限拒绝问题
你遇到的权限错误,本质是部署用户对服务器上/var/www/meal_prep目录及文件无写入、删除权限,可通过两种方式解决:
1. 调整服务器目录所有权
在Ubuntu服务器执行以下命令,将目标目录的所有权转移给部署用户:
sudo chown -R [你的部署用户名]:[你的部署用户组] /var/www/meal_prep
替换括号内的实际用户名和用户组(通常用户名和组名一致),之后再用原工作流部署,rsync即可正常操作文件。
2. 借助临时目录绕过权限限制
如果不想修改目录所有权,可先将文件同步到部署用户有权限的临时目录,再用sudo同步到目标路径:
- name: Sync to server temp folder uses: burnett01/rsync-deployments@7.0.1 with: switches: -avzr --delete path: ./publish/ remote_path: /tmp/meal_prep_temp/ remote_host: ${{ secrets.HOST }} remote_user: ${{ secrets.USERNAME }} remote_key: ${{ secrets.SSH_PRIVATE_KEY }} - name: Sync temp folder to target with sudo uses: appleboy/ssh-action@master with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | echo "${{ secrets.SUDO_PASSWORD }}" | sudo -S rsync -avzr --delete /tmp/meal_prep_temp/ /var/www/meal_prep/ sudo rm -rf /tmp/meal_prep_temp/
二、修复后续部署无更新问题
你用appleboy/ssh-action的脚本存在逻辑错误:$publishFolder是在远程服务器解析的,而GitHub Actions runner的publish目录不在远程服务器上,导致rsync没有实际同步文件。
推荐使用专门的rsync部署action(如burnett01/rsync-deployments),它会直接从runner推送文件到远程,无需在远程执行复杂脚本。
三、推荐的完整工作流
结合权限处理与正确同步逻辑,最终配置如下:
steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up .NET uses: actions/setup-dotnet@v4 with: dotnet-version: '8.0.x' - name: Restore dependencies run: dotnet restore - name: Build run: dotnet build --configuration Release --no-restore - name: Publish run: dotnet publish --configuration Release --no-build --output ./publish - name: Deploy to Server using rsync uses: burnett01/rsync-deployments@7.0.1 with: switches: -avzr --delete path: ./publish/ remote_path: /var/www/meal_prep/ remote_host: ${{ secrets.HOST }} remote_user: ${{ secrets.USERNAME }} remote_key: ${{ secrets.SSH_PRIVATE_KEY }} - name: Restart Service uses: appleboy/ssh-action@master with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | echo "${{ secrets.SUDO_PASSWORD }}" | sudo -S systemctl restart meal_prep
注意:rsync路径末尾的斜杠表示同步目录内的内容,而非目录本身,避免目标目录下多出一层publish文件夹。
内容的提问来源于stack exchange,提问作者Rasik
相关产品推荐
相关产品推荐

