当前位置:首页 > 技术 > 正文内容

使用GitLab CI实现.NET项目自动化打包与NuGet发布

访客 技术 2026年6月21日 1

概述

本文介绍如何配置GitLab CI流程,在代码提交后自动执行以下操作:

  • 使用dotnet build构建.NET项目
  • 通过dotnet pack生成nupkg包
  • 利用dotnet push将包发布到NuGet服务器

准备工作

需要完成以下准备工作:

  • 部署GitLab服务器环境
  • 安装并配置GitLab Runner
  • 将Runner注册到GitLab,并选择包含.NET 8.0的镜像
  • 使用Visual Studio 2022创建基于.NET 8.0的类库项目

GitLab Runner配置

当前GitLab Runner的配置环境由注册时自动生成,以下为配置文件内容供参考:

concurrent = 1
check_interval = 0
shutdown_timeout = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "自动化构建器"
  url = "https://gitlab.example.com"
  id = 5
  token = "glrt-abc-def123xyz"
  token_obtained_at = 2024-03-15T08:20:30Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = "docker"
  [runners.cache]
    MaxUploadedArchiveSize = 0
  [runners.docker]
    tls_verify = false
    image = "registry.example.com/dotnet-builder/dotnet8:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0
    network_mtu = 0

创建.NET项目

使用Visual Studio 2022创建一个基于.NET 8.0的类库项目:

  1. 打开Visual Studio 2022
  2. 选择"创建新项目"
  3. 选择"类库(.NET Framework)"模板
  4. 设置目标框架为.NET 8.0
  5. 命名项目为"NugetAutoBuilder"

创建GitLab仓库

在GitLab中创建新项目用于托管代码:

  1. 登录GitLab控制台
  2. 点击"New project"
  3. 填写项目名称和描述
  4. 选择"Private"或"Public"可见性
  5. 创建项目后,获取仓库地址,例如:
https://gitlab.example.com/development/nuget-auto-builder.git

提交代码到GitLab

使用Visual Studio 2022将项目推送到GitLab:

  1. 在Visual Studio中打开"团队资源管理器"
  2. 连接到GitLab仓库
  3. 提交项目代码
  4. 推送到远程仓库

创建CI/CD配置文件

在项目根目录创建".gitlab-ci.yml"文件,内容如下:

# 定义CI/CD流水线阶段
stages:
  - build
  - package
  - deploy

# 全局变量定义
variables:
  PACKAGE_VERSION: "1.0.$CI_PIPELINE_IID"
  PACKAGE_OUTPUT_PATH: "$CI_PROJECT_DIR/packages"
  NUGET_SOURCE_URL: "https://nuget.example.com/v3/index.json"
  NUGET_API_KEY: "$NUGET_PUSH_TOKEN"

# 构建阶段
build_stage:
  stage: build
  script:
    - "echo '开始构建项目...'"
    - "dotnet restore NugetAutoBuilder/NugetAutoBuilder.csproj"
    - "dotnet build NugetAutoBuilder/NugetAutoBuilder.csproj --configuration Release -p:Version=$PACKAGE_VERSION"
  artifacts:
    paths:
      - "NugetAutoBuilder/bin/Release/"

# 打包阶段
package_stage:
  stage: package
  dependencies:
    - build_stage
  script:
    - "echo '正在打包项目...'"
    - "mkdir -p $PACKAGE_OUTPUT_PATH"
    - "dotnet pack NugetAutoBuilder/NugetAutoBuilder.csproj --configuration Release --no-build --output $PACKAGE_OUTPUT_PATH --p:PackageVersion=$PACKAGE_VERSION"
  artifacts:
    paths:
      - "$PACKAGE_OUTPUT_PATH"

# 发布阶段
deploy_stage:
  stage: deploy
  dependencies:
    - package_stage
  script:
    - "echo '准备发布到NuGet仓库...'"
    - "cd $PACKAGE_OUTPUT_PATH"
    - "dotnet nuget push *.nupkg --api-key $NUGET_API_KEY --source $NUGET_SOURCE_URL"
    - "echo '成功发布到NuGet仓库'"

配置GitLab Runner

在首次运行CI流水线时可能会遇到以下问题:

问题1:Docker套接字访问权限

错误信息显示Runner无法访问Docker守护进程。

解决方案:修改docker-compose.yml文件,添加Docker套接字映射:

version: '3'
services:
  runner:
    image: 'gitlab/gitlab-runner:latest'
    restart: always
    volumes:
      - './config:/etc/gitlab-runner'
      - '/var/run/docker.sock:/var/run/docker.sock'  # 添加此行

重启GitLab Runner服务:

docker-compose restart

问题2:镜像拉取认证失败

错误信息表明需要先登录到私有镜像仓库。

解决方案:修改Runner配置文件,添加认证信息:

[[runners]]
  # ... 其他配置保持不变 ...
  [runners.docker]
    tls_verify = false
    image = "registry.example.com/dotnet-builder/dotnet8:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0
    network_mtu = 0
    [runners.docker.services]
      registry.example.com = "username:password"

重启GitLab Runner服务后,再次触发CI流水线,构建过程应该能够成功执行。

验证发布结果

构建成功后,可以访问NuGet服务器查看已发布的包。包的版本号格式为"1.0.x",其中x是CI流水线ID,确保每次构建都有唯一的版本号。

标签: GitLab CI

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。