自托管GitHub Action部署.NET C#项目:解决无法运行及Action无法结束问题
自托管GitHub Action部署.NET项目的问题解决方案
一、解决Action一直运行不结束的问题
核心原因是直接启动.NET项目的命令(如dotnet run)会占用前台进程,导致Action无法退出。有两种可靠解决方式:
方式1:用nohup后台启动项目
在Action脚本中执行后台启动命令,脱离终端并屏蔽输出:
nohup dotnet YourProject.dll --urls=http://localhost:5000 > /dev/null 2>&1 &
nohup:保证程序在终端退出后仍能运行> /dev/null 2>&1:将标准输出和错误输出重定向到空设备,避免输出阻塞进程&:将进程放到后台执行
方式2:用systemd管理服务(生产环境推荐)
通过系统服务托管.NET项目,Action只需执行服务启停命令即可退出:
- 在EC2实例创建服务文件
/etc/systemd/system/your-project.service:[Unit] Description=你的.NET项目服务 After=network.target [Service] WorkingDirectory=/path/to/your/project ExecStart=/usr/bin/dotnet /path/to/your/project/YourProject.dll --urls=http://localhost:5000 Restart=always User=ubuntu # 替换为你的EC2实例用户名 Environment=ASPNETCORE_ENVIRONMENT=Production [Install] WantedBy=multi-user.target - 在Action脚本中执行服务管理命令:
sudo systemctl daemon-reload sudo systemctl stop your-project.service || true # 停止旧服务,不存在则忽略错误 sudo systemctl start your-project.service # 启动新服务
二、确保.NET项目在5000端口正常运行
1. 清理端口占用
启动前先杀掉占用5000端口的进程,避免启动失败:
sudo lsof -ti:5000 | xargs kill -9 2>/dev/null || true
2. 验证启动状态
加入端口监听检查,确保项目成功启动:
# 最多等待30秒,直到端口监听成功 timeout 30 bash -c 'until nc -z localhost 5000; do sleep 1; done' # 检查是否监听成功,失败则终止Action if ! nc -z localhost 5000; then echo "项目启动失败,5000端口未监听" exit 1 fi
3. 校验Nginx配置
确保Nginx反向代理指向正确端口,示例配置片段:
server { listen 80; server_name 你的域名或EC2公网IP; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
启动或重载Nginx:
sudo systemctl restart nginx
三、GitHub Action关键步骤示例
jobs: deploy: runs-on: self-hosted steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 配置.NET环境 uses: actions/setup-dotnet@v4 with: dotnet-version: '8.0.x' # 替换为你的项目.NET版本 - name: 还原依赖 run: dotnet restore - name: 编译项目 run: dotnet build --configuration Release --no-restore - name: 发布项目 run: dotnet publish --configuration Release --no-build --output ./publish - name: 停止现有服务 run: sudo systemctl stop your-project.service || true - name: 清理5000端口 run: sudo lsof -ti:5000 | xargs kill -9 2>/dev/null || true - name: 复制发布文件到部署目录 run: sudo cp -r ./publish/* /path/to/your/project - name: 启动.NET服务 run: sudo systemctl start your-project.service - name: 验证端口监听 run: | timeout 30 bash -c 'until nc -z localhost 5000; do sleep 1; done' if ! nc -z localhost 5000; then exit 1 fi - name: 重启Nginx run: sudo systemctl restart nginx
内容的提问来源于stack exchange,提问作者user17620934
相关产品推荐
相关产品推荐

