You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自托管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只需执行服务启停命令即可退出:

  1. 在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
    
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:15:28