GitLab CI/CD 流水线实战:3阶段部署 .NET 6 应用至云服务器(附 Runner 配置) GitLab CI/CD 实战构建高效 .NET 6 云部署流水线1. 环境准备与基础架构设计在开始构建自动化部署流水线前需要规划清晰的技术栈和基础设施。对于 .NET 6 应用部署我们推荐以下技术组合操作系统AlmaLinux 8 或 CentOS 7长期支持版本运行时环境.NET 6 SDK 和 Runtime版本控制GitLab CE/EE 15.0执行器GitLab Runner 15.0Shell 或 Docker 执行器部署目标云服务器如阿里云ECS、腾讯云CVM提示生产环境建议将 Runner 与 GitLab 服务器分离部署避免资源竞争基础架构拓扑示例GitLab Server (代码仓库) │ ├── GitLab Runner (构建节点) │ ├── 构建阶段dotnet build │ └── 测试阶段dotnet test │ └── 云服务器 (部署目标) ├── Nginx 反向代理 └── Kestrel 服务托管2. Runner 配置与优化2.1 安装 GitLab Runner在 AlmaLinux/CentOS 上安装 Runner# 添加官方仓库 curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash # 安装最新版本 sudo yum install gitlab-runner # 验证安装 gitlab-runner --version2.2 注册 Runner 到项目执行注册命令并配置关键参数sudo gitlab-runner register \ --non-interactive \ --url https://gitlab.example.com/ \ --registration-token PROJECT_REGISTRATION_TOKEN \ --executor shell \ --description almalinux8-dotnet-runner \ --tag-list dotnet,linux \ --run-untaggedfalse关键配置项说明参数推荐值说明executorshell/docker生产环境建议使用dockertag-listdotnet,linux用于流水线定向分配run-untaggedfalse避免随机任务分配2.3 性能优化配置编辑/etc/gitlab-runner/config.toml增加以下配置concurrent 4 check_interval 0 [session_server] session_timeout 1800 [[runners]] environment [DOTNET_CLI_TELEMETRY_OPTOUT1] output_limit 16384 pre_build_script ulimit -n 655363. 三阶段流水线设计3.1 构建阶段Build.gitlab-ci.yml构建阶段配置示例variables: DOTNET_VERSION: 6.0.x BUILD_CONFIGURATION: Release stages: - build - test - deploy build_job: stage: build tags: - dotnet script: - dotnet restore - dotnet build --no-restore --configuration $BUILD_CONFIGURATION artifacts: paths: - **/bin/$BUILD_CONFIGURATION/**/*.dll - **/bin/$BUILD_CONFIGURATION/**/*.pdb expire_in: 1 week构建优化技巧增量构建通过--no-restore避免重复还原并行构建大型解决方案可使用--parallel参数缓存配置添加 NuGet 包缓存加速构建cache: key: $CI_COMMIT_REF_SLUG paths: - .nuget/3.2 测试阶段Test自动化测试阶段配置test_job: stage: test tags: - dotnet script: - dotnet test --no-build --configuration $BUILD_CONFIGURATION --logger trx;LogFileNametestresults.trx artifacts: when: always reports: dotnet: **/*testresults.trx paths: - **/TestResults/**/*测试覆盖率收集示例script: - dotnet test --collect:XPlat Code Coverage --settings coverlet.runsettings3.3 部署阶段Deploy3.3.1 云服务器准备部署前确保目标服务器已配置安装 .NET 6 运行时配置 systemd 服务单元设置 Nginx 反向代理示例 systemd 服务配置 (/etc/systemd/system/kestrel-app.service)[Unit] Description.NET WebApp running on AlmaLinux [Service] WorkingDirectory/var/www/app ExecStart/usr/bin/dotnet /var/www/app/YourApp.dll Restartalways RestartSec10 SyslogIdentifierdotnet-app Userwww-data EnvironmentASPNETCORE_ENVIRONMENTProduction [Install] WantedBymulti-user.target3.3.2 部署脚本deploy_job: stage: deploy tags: - dotnet environment: production only: - main script: - echo Deploying to production server... - scp -r bin/$BUILD_CONFIGURATION/**/* userserver:/var/www/app/ - ssh userserver sudo systemctl restart kestrel-app安全增强方案使用 SSH 密钥认证替代密码通过 GitLab CI Variables 存储敏感信息添加部署前确认步骤when: manual allow_failure: false4. 高级配置与故障排查4.1 多环境部署策略通过环境变量区分不同部署目标.deploy_template: deploy_template stage: deploy script: - scp -r bin/$BUILD_CONFIGURATION/**/* $DEPLOY_USER$DEPLOY_SERVER:/var/www/$APP_NAME/ - ssh $DEPLOY_USER$DEPLOY_SERVER sudo systemctl restart $SERVICE_NAME deploy_staging: : *deploy_template environment: staging variables: DEPLOY_SERVER: staging.example.com APP_NAME: app-staging SERVICE_NAME: kestrel-staging deploy_production: : *deploy_template environment: production variables: DEPLOY_SERVER: prod.example.com APP_NAME: app-prod SERVICE_NAME: kestrel-prod when: manual4.2 常见问题解决方案问题1依赖项缺失错误# 解决方案在部署脚本中添加依赖安装 ssh userserver sudo yum install -y libunwind libicu问题2文件权限问题# 解决方案部署后修正权限 ssh userserver sudo chown -R www-data:www-data /var/www/app问题3端口冲突# 检查端口占用 ssh userserver sudo netstat -tulnp | grep :5000 # 修改应用监听端口 EnvironmentASPNETCORE_URLShttp://localhost:50014.3 监控与日志添加日志收集到部署流程script: - ssh userserver sudo journalctl -u kestrel-app --since 1 hour ago /tmp/app-logs.txt - scp userserver:/tmp/app-logs.txt . artifacts: paths: - app-logs.txt5. 安全加固实践最小权限原则为 Runner 创建专用部署用户限制 sudo 权限到必要命令敏感信息管理# 通过GitLab CI/CD Variables设置 DEPLOY_SSH_KEY: (base64编码的私钥) # 在before_script中还原 - echo $DEPLOY_SSH_KEY | base64 -d deploy_key - chmod 600 deploy_key网络隔离使用VPC内网通信配置安全组仅允许Runner IP访问审计日志# 在服务器上记录部署操作 echo $(date): Deployed by $GITLAB_USER_NAME /var/log/app-deploy.log