使用GitLab CI实现.NET项目自动化打包与NuGet发布
概述
本文介绍如何配置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的类库项目:
- 打开Visual Studio 2022
- 选择"创建新项目"
- 选择"类库(.NET Framework)"模板
- 设置目标框架为.NET 8.0
- 命名项目为"NugetAutoBuilder"
创建GitLab仓库
在GitLab中创建新项目用于托管代码:
- 登录GitLab控制台
- 点击"New project"
- 填写项目名称和描述
- 选择"Private"或"Public"可见性
- 创建项目后,获取仓库地址,例如:
https://gitlab.example.com/development/nuget-auto-builder.git
提交代码到GitLab
使用Visual Studio 2022将项目推送到GitLab:
- 在Visual Studio中打开"团队资源管理器"
- 连接到GitLab仓库
- 提交项目代码
- 推送到远程仓库
创建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,确保每次构建都有唯一的版本号。