前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >dotnet 配合 Gitlab 做自动推 Tag 时打包 NuGet 包

dotnet 配合 Gitlab 做自动推 Tag 时打包 NuGet 包

作者头像
林德熙
发布于 2020-04-08 07:48:32
发布于 2020-04-08 07:48:32
1.8K00
代码可运行
举报
文章被收录于专栏:林德熙的博客林德熙的博客
运行总次数:0
代码可运行

我现在的团队内部用的是 Gitlab 工具,在此工具上提供了 Gitlab CI CD 用于做自动化测试和构建。对于 CBB 来说,发布就是打出 NuGet 包然后上传到内部 NuGet 服务器。此时遇到的问题是,如何在 Gitlab 上执行打包,打包的时候如何指定 NuGet 包的版本号。因为 CBB 的特殊性,我要求每个 NuGet 正式发布的包都应该有一个对应的 Tag 号,这样将 NuGet 库安装到项目里面,之后发现问题了还能找到对应版本的代码 本文告诉大家如何配合 Gitlab 做自动推 Tag 时打包 NuGet 包。也就是本地打一个 Tag 号,推送到 Gitlab 上,就会出发 Gitlab 的自动构建,自动构建里面将会获取 Tag 版本号,然后打出 NuGet 包推送到服务器

在阅读本文之前,期望大家了解什么是 Gitlab 的 Runner 以及如何开启,详细请看 dotnet 配置 Gitlab 的 Runner 做 CI 自动构建

本文以一个 WPF 的库为例子,其他的 dotnet 库也是相同的方法

在 dotnet 里面打包的方法可以通过以下命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet pack -c release

在 Gitlab 里面通过 Tag 出发构建命令可以在 .gitlab-ci.yml 添加下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tagpublish:
  stage: publish
  script:
    - "chcp 65001" # 这里的 chcp 65001 是支持中文 GBK 解决命令行输出

  only:
    - tags

通过 only 里面设置 tags 就可以在推送 Tag 到 Gitlab 上自动触发构建

现在的问题是如何让推送的 Tag 的版本号作为 NuGet 包的版本号

在 Gitlab 里面将会在执行构建的时候注入环境变量,使用 Tag 打包的时候将可以找到 CI_COMMIT_TAG 这个环境变量,这个变量的内容就是对应的 Tag 的内容。如我推送到 1.0.0 的 Tag 那么这个 CI_COMMIT_TAG 的值就是 1.0.0 可以通过这个原理拿到推送的内容

在编译里面的设置,可以在 csproj 或 targets 等文件里面通过 $(环境变量) 的方式拿到对应的环境变量,而设置输出的 NuGet 的版本号可以通过 Version 属性,也就是可以在 csproj 里面添加下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Version>$(CI_COMMIT_TAG)</Version>

此时将会从环境变量获取 CI_COMMIT_TAG 设置为 Version 属性,这样就能让打出来的 NuGet 包和对应的 Tag 相同

此时的 .gitlab-ci.yml 大概代码如下,请根据你的实际需求更改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stages:
  - publish

# 推Tag打包
tagpublish:
  stage: publish
  script:
    - "chcp 65001"
    - 'dotnet pack -c release'
    - 'nuget push bin\Release\*.nupkg'
  only:
    - tags

以上方法有缺陷是如果打的 Tag 是包含 v 开头的,如 v1.0.0 此时就不好玩了。另一个问题是如果想要本地打一个 NuGet 包,那才是糟心

于是我开源了一个工具 dotnetCampus.TagToVersion 这个工具能根据传入的值更改 Version.props 文件的内容,更改为传入的值的版本号

使用这个工具的步骤就相对多了一点了,我在内部做了一个 dotnet 模版,减少了这些步骤。因为是内部用的模版我也没有打算开源

通过三个步骤能使用 dotnetCampus.TagToVersion 这个工具,这个工具能解决在本地打出 NuGet 包的版本号问题,能解决带 v 的特殊的 Tag 的问题

步骤1是添加 Directory.Build.props 文件

什么是 Directory.Build.props 文件请看 Roslyn 使用 Directory.Build.props 文件定义编译

这个文件的大概作用就是定义此文件夹,以及此文件夹的子文件夹的编译步骤。在 Directory.Build.props 文件里面制定 Version.prop 文件的路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Project>
  <Import Project="build\Version.props" />
  <PropertyGroup>
    <PackageOutputPath>$(MSBuildThisFileDirectory)bin\$(Configuration)</PackageOutputPath>
    <Authors>dotnet-campus</Authors>
    <Company>dotnet-campus</Company>
    <LangVersion>latest</LangVersion>
    <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
    <Description>描述信息</Description>
    <Copyright>Copyright (c) 2020 dotnet-campus</Copyright>
    <PackageProjectUrl>https://github.com/dotnet-campus/dotnetCampus.SourceYard</PackageProjectUrl>
    <RepositoryUrl>https://github.com/dotnet-campus/dotnetCampus.SourceYard.git</RepositoryUrl>
    <RepositoryType>git</RepositoryType>
    <PackageTags>source;dotnet;nuget;msbuild</PackageTags>
    <PackageLicenseExpression>MIT</PackageLicenseExpression>
  </PropertyGroup>
</Project>

请根据你的实际项目添加更改上面代码

核心的代码是设置 Version.props 的路径,放在build文件夹里面

在 Version.props 文件添加下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Project>
  <PropertyGroup>
    <Version>1.0.0</Version>
  </PropertyGroup>
</Project>

此时的版本号可以自由填写,这样就能解决本地打 NuGet 包指定版本号的问题。同时解决了非配置管理员的其他开发者也需要了解学习什么是 CI_COMMIT_TAG 的问题

对于其他开发者,只有看到这个 Version.props 文件,同时这个文件里面没有其他需要学习的知识,只是知道在这里更改版本号就可以。这个方式对于配置管理员来说很重要,甚至能决定这项技术能否推进。对于大部分开发者是不需要关心,也不愿意了解这部分技术,更多的是想要提升开发的效率,而太多的杂项的配置知识将会降低开发的效率

我用一个例子说明上面的问题,我在 csproj 里面放下面这段代码。然后我告诉你,每次新建文件的时候都需要向 NafojaneKakoweebi 添加一个 o 不然新建的文件没有作用。假设你在我的团队里面,你要不要打我

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<NafojaneKakoweebi>WhaljeahalqaboBembibocaooo</NafojaneKakoweebi>

当然,这个例子大家看看就好,虽然我真的写了这样的逻辑。通过仔细看还是能了解下面代码的含义,但是对于开发者的效率降低也确实存在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <PropertyGroup>
    <Build>$([System.DateTime]::op_Subtraction($([System.DateTime]::get_Now().get_Date()),$([System.DateTime]::new(2000,1,1))).get_TotalDays())</Build>
    <Revision>$([MSBuild]::Divide($([System.DateTime]::get_Now().get_TimeOfDay().get_TotalSeconds()), 2).ToString('F0'))</Revision>
    <Version>1.0.0.$(Revision)</Version>
  </PropertyGroup>

通过本文的第二个方法,可以让开发者在开发的时候不会碰到配置管理的代码,开发者只是看到 Version.props 文件,这个文件有版本号。而开发者最多也就是改版本号做本地打包

那么对于配置管理来说,如何在推送 Tag 打包的时候自动设置版本号?通过 dotnetCampus.TagToVersion 这个工具根据 CI_COMMIT_TAG 更改 Version 文件的内容就可以做到

修改 .gitlab-ci.yml 为下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stages:
  - publish

# 推Tag打包
tagpublish:
  stage: publish
  script:
    - "chcp 65001"
    - "dotnet new tool-manifest"
    - "dotnet tool install dotnetCampus.TagToVersion"
    - "dotnet tool run dotnet-TagToVersion -t $CI_COMMIT_TAG"
    - 'dotnet pack -c release'
    - 'nuget push bin\Release\*.nupkg'
  only:
    - tags

对比开始的 .gitlab-ci.yml 文件可以看到添加了下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    - "dotnet new tool-manifest"
    - "dotnet tool install dotnetCampus.TagToVersion"
    - "dotnet tool run dotnet-TagToVersion -t $CI_COMMIT_TAG"

这三句话就是创建一个 dotnet tool 清单,安装 dotnet tool 工具,然后运行工具而已。如果提前在 gitlab runner 的设备上安装了 dotnetCampus.TagToVersion 那么可以将上面代码压缩为一句代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    - "dotnet TagToVersion -t $CI_COMMIT_TAG"

执行上面代码将会自动根据传入的参数修改 Version.props 的值,这样就能做到推送 Tag 打包对应版本号

用推 Tag 打包的好处是解决回滚代码的时候,需要用到某个 NuGet 包进行调试,可以找到对应版本的代码。同时解决了手动叫开发者打 NuGet 包的时候需要记得添加 Tag 号

在调试对应版本的 NuGet 的代码的时候,我推荐使用以下方法

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
How to generate NuGet package with Git Tag version using GitHub Action
We can trigger the GitHub Action by Git tag pushed and we can read the Git tag name as the version. And then we can generate the NuGet package with this version.
林德熙
2022/08/12
3940
How to generate NuGet package with Git Tag version using GitHub Action
dotnet 配置 Gitlab 的 Runner 做 CI 自动构建
今天在少珺小伙伴的协助下,使用了 gitlab 的 runner 给全组的项目做自动的构建。为什么需要使用 Gitlab 的 Runner 做自动构建,原因是之前是用的是 Jenkins 而新建一个底层库项目想要接入自动构建等,需要来回在 Gitlab 和 Jenkins 上配置,大概步骤差不多有 20 步,同时还有一堆 Jenkins 的坑。另外服务器是共有的,有其他组的小伙伴安装了诡异的工具让我的打包不断炸掉。于是我就和头像大人商量使用虚拟机环境的方法,我在空闲的服务器上安装了 VirtualBox 虚拟机,然后在虚拟机部署 Runner 接着在项目接入,这样就可以确定打包的环境,同时迁移服务器也比较方便
林德熙
2020/02/17
2.4K0
dotnet 配合 GitHub 的 Action 做自动推 Tag 时打包 NuGet 包
被微软收购的 GitHub 越来越好用,拥有大量免费的工具资源和构建服务器资源,再加上私有项目的无限制使用,我有大量的项目都在向 GitHub 迁移。通过 GitHub 的 Action 的自动构建,可以用上微软土豪的服务器资源,进行自动化测试和构建。对于 CBB 来说,发布就是打出 NuGet 包然后上传到内部 NuGet 服务器。此时遇到的问题是,如何在 GitHub 上执行打包,打包的时候如何指定 NuGet 包的版本号。因为 CBB 的特殊性,我要求每个 NuGet 正式发布的包都应该有一个对应的 Tag 号,这样将 NuGet 库安装到项目里面,之后发现问题了还能找到对应版本的代码
林德熙
2021/04/28
1K0
dotnet 配合 GitHub 的 Action 做自动推 Tag 时打包 NuGet 包
dotnet 将自动代码格式化机器人带入团队 GitLab 平台
给团队带入一个 代码格式化机器人 能提升团队的幸福度,让团队的成员安心写代码,不用关注代码格式化问题。也可以减少在代码审查里撕格式化问题 本文来告诉大家如何给团队的 GitLab 平台带入一个自动代码格式化机器人
林德熙
2021/12/03
9510
dotnet 将自动代码格式化机器人带入团队 GitLab 平台
dotnet 打包 NuGet 的配置属性大全整理
本文整理 dotnet 打包 CBB 组件为 NuGet 包时可以使用的配置的各个属性
林德熙
2023/04/07
1.6K0
Roslyn 通过 nuget 统一管理信息
在日常的开发中,如果需要发布多个库,多个库之间的版权和作者等信息都是相同的。如果需要每次更改信息都打开项目进行编辑,这个效率是很低的。本文提供一个方式,通过安装一个 nuget 包就可以自动填写信息。
林德熙
2018/09/19
6300
Roslyn 通过 nuget 统一管理信息
帮助官方 NuGet 解掉 Bug,制作绝对不会传递依赖的 NuGet 包
如果你希望做一个 NuGet 工具包,那么这个包一定不能作为依赖传递给下一个包。典型的例子,做一个生成版本号的工具 NuGet 包,或者做一个代码分析器。
walterlv
2020/02/10
1.1K0
GitLab CICD与Kubernetes实践·部署Flask Web服务
上篇?Gitlab CICD 与Kubernetes实践·部署GitLab Runner文章内通过Kubernetes已经完成Gitlab Runner的部署的,现在我通过一个实际的案例来测试和使用G
公众号: 云原生生态圈
2020/11/02
2K0
GitLab CICD与Kubernetes实践·部署Flask Web服务
dotnet tool 创建 GitLab 合并请求 Merge Requests 工具
本文来告诉大家如何使用 dotnetCampus.GitLabMergeRequestCreator 工具,命令行创建 GitLab 合并请求 Merge Requests 的方法
林德熙
2021/12/02
1.6K0
dotnet tool 创建 GitLab 合并请求 Merge Requests 工具
dotnet 手工打一个 dotnet tool 包
现在依靠 dotnet 平台,可以方便分发工具,利用 NuGet 服务进行分发和使用工具。打一个 dotnet tool 包,可以将这个包上传到 NuGet 上,小伙伴通过和安装 NuGet 相同方式就可以将工具安装在本机上。本文将告诉大家如何手工打一个 dotnet tool 包,方便小伙伴自己写工具用来创建代码
林德熙
2022/08/12
5200
前端微服务架构下CI/CD构建单镜像落地方案
之前在团队中分享了qiankun微服务的单镜像的部署方案, 详细解析了单镜像部署的好处,但由于单镜像部署在构建时比较复杂,如果在上线时人工地去构建镜像,将是一个非常复杂,且容易出错的事情。所以本篇文章会介绍一种使用GitLab CI/CD来构建一个微服务单镜像的流水线,并应用于生产, 我称之为 aio 方案 all in one 。五个应用构建到一个docker镜像中。 ​
拿我格子衫来
2022/01/24
7480
前端微服务架构下CI/CD构建单镜像落地方案
制作一个能构建 dotnet AOT 的 gitlab ruuner 的 Debian docker 镜像
我的需求是需要有一个能够构建出 dotnet 的 AOT 包的环境,要求这个环境能解决 glibc 兼容依赖的问题,能打出来 x64 和 arm64 的 AOT 的包,且能够运行 gitlab runner 对接自动构建
林德熙
2024/04/29
2010
制作一个能构建 dotnet AOT 的 gitlab ruuner 的 Debian docker 镜像
GitLab CI/CD 自动化构建与发布实践
CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。这篇文章中,我将会介绍基于 GitLab CI/CD 的自动化构建与发布实践。如下图所示,整个流程将分为几个部分:
Se7en258
2021/11/30
4.9K1
GitLab CI/CD 自动化构建与发布实践
dotnet 开发的单代码仓库和多代码仓库的优劣
在很多大团队开发的时候,将需要用到很多项目的组合开发一个软件,一个软件需要用到的项目有很多个,很少会用到一个项目就能做到。但多个项目一起开发,在配置管理和团队管理有不同的策略,一个就是让项目拆分为多个代码仓库,另一个就是将这些项目合在一个代码仓库。两个策略不能说哪个更好,本文和大家分享我所在的团队和我参与的其他团队的策略
林德熙
2020/10/09
7750
Roslyn 通过 Nuget 管理公司配置
本文来告诉大家如何用 Roslyn 管理配置,在开一个新的项目的时候经常需要添加公司,版权等,但是这些信息不想每次都添加于是我就想用 Nuget 管理所有配置,安装一个 nuget 就自动配置
林德熙
2019/03/13
6810
Roslyn 通过 Nuget 管理公司配置
使用一个文件集中管理你的 Nuget 依赖版本号
在 .net 7 以前,项目对于 nuget 依赖项的版本依赖散落与解决方案的各个角落。这导致升级维护和查看的时候都比较麻烦。在 .net 7 中,你可以使用一个文件来集中管理你的 Nuget 依赖版本号。本篇文章将介绍如何使用这个功能。
newbe36524
2023/02/24
7080
使用一个文件集中管理你的 Nuget 依赖版本号
dotnet 使用 SourceLink 将 NuGet 链接源代码到 GitHub 等仓库
在发布 CBB 作为 NuGet 包的时候,我期望开发者在使用我的库进行调试,可以自动链接代码到对应打包的 GitHub 上的代码,可以从本地拿到对应的源代码进行调试。这样的调试方式对于开源项目来说,将会很方便
林德熙
2020/08/04
1.5K0
dotnet 用 NuGet 将自己的工具作为 dotnet tool 分发
我写了一个有趣的工具,我如何将这个工具给到小伙伴予力众生呢?只需要设定这个工具是 dotnet tool 工具就可以通过 NuGet 分发出去啦。几乎所有的 dotnet 开发者都能用上 NuGet 服务,也就是此工具可以被几乎所有的 dotnet 开发者下载使用。那么制作难度有多大呢?基本上有一个现成的项目前提下,只需两句代码,一句命令行,就能完成制作
林德熙
2020/03/12
1.1K0
Roslyn 使用 Directory.Build.props 管理多个项目配置
在一些大项目需要很多独立的仓库来做,每个仓库之间都会有很多相同的配置,本文告诉大家如何通过 Directory.Build.props 管理多个项目配置
林德熙
2019/03/13
6320
Roslyn 使用 Directory.Build.props 管理多个项目配置
dotnet 在 GitHub 的 Action 上部署自动代码编码规范机器人
我们的项目中会包含有很多文件,但是可能我们没有注意到的,我们的文件的编码不一定是 UTF-8 编码,这就可能让构建出来的应用程序在别人电脑运行时出现乱码,或者别人拉下来代码,却发现代码里面的中文都是乱码。为了解决文件编码的问题,咱需要一个编码规范工具,本文将告诉大家在 GitHub 上仓库,可以利用 GitHub 的 Action 部署自动代码文件编码规范的机器人,这个机器人可以自动协助咱规范文件的编码规范。可以设置为每次上传代码的时候,自动帮忙设置文件编码为 UTF-8 编码。或者在每次代码合并到主分支之后,机器人将会尝试修复文件的编码,如存在文件需要修复的,那机器人将会创建一个代码审查
林德熙
2020/10/29
7160
推荐阅读
相关推荐
How to generate NuGet package with Git Tag version using GitHub Action
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验