期望

git打标签之后自动构建上传nuget商店。

核心发版代码(webhook为打标签触发):

dotnet publish SageTools.Console/SageTools.Console.csproj -o pack -c Release
dotnet pack/SageTools.Console.dll -source="../SageTools/SageTools.csproj" -version="${CI_COMMIT_REF_NAME}"
dotnet build SageTools/SageTools.csproj -c Release
dotnet pack SageTools/SageTools.csproj -o pack
ls pack
dotnet nuget push pack/SageTools.${CI_COMMIT_REF_NAME}.nupkg -s https://api.nuget.org/v3/index.json -k apiKey

其中${CI_COMMIT_REF_NAME}为阿里云效构建的时候的环境变量,也就是要指定的版本号,如果是其他构建方式,可以替换为指定的版本号即可,即:-version=xxx

亦或者不使用 -version参数,改用-step参数,版本号将会在最后一个版本号上增加指定的数目,比如 -step=2,当前版本是 1.0.0 ,那处理后的版本则为 1.0.2

实现逻辑

  1. 编写版本号处理程序
  2. 用处理程序改变配置文件版本号
  3. 然后正常打包发布

处理程序代码

using System;
using System.IO;
using SageTools.Extension;
using System.Linq;
using System.Xml;

namespace SageTools.Console
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var help = args.Any(x => x.Contains("-h"));
            if (help)
            {
                System.Console.WriteLine($"-source= 文件相对路径 {Environment.NewLine}-step= 版本号步长值(整数){Environment.NewLine}-version= 直接指定版本,忽略-step");
                Environment.Exit(0);
            }
            System.Console.WriteLine("处理xml文件");
            var source = args.Where(x => x.Contains("-source=")).Select(x => x.Replace("-source=", "")).FirstOrDefault();
            var step = args.Where(x => x.Contains("-step=")).Select(x => x.Replace("-step=", "")).FirstOrDefault();
            var version =  args.Where(x => x.Contains("-version=")).Select(x => x.Replace("-version=", "")).FirstOrDefault();
            if (source.IsNullOrEmpty())
            {
                System.Console.WriteLine("执行错误:必须指定 -source");
                Environment.Exit(-1);
            }
            var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, source);
            if (!File.Exists(path))
            {
                System.Console.WriteLine($"执行错误:【{path}】文件不存在");
                Environment.Exit(-1);
            }
            var xmlDoc = new XmlDocument(); //新建XML文件
            xmlDoc.Load(path); //加载XML文件
            var versionNode = xmlDoc.DocumentElement?.SelectSingleNode("PropertyGroup")?.SelectSingleNode("Version");
            if (versionNode == null)
            {
                System.Console.WriteLine("执行错误:项目没有配置版本号");
                Environment.Exit(-1);
            }
            if (version.IsNullOrEmpty())
            {
                version = versionNode.InnerText;
                var lastNum = version.Substring(version.LastIndexOf(".", StringComparison.Ordinal) + 1);
                var newNum = lastNum.ToInt32() + step;
                var newVersion = version.Substring(0, version.LastIndexOf(".", StringComparison.Ordinal) + 1) + newNum;
                versionNode.InnerText = newVersion;
                System.Console.WriteLine($"当前版本{version},末尾版本号{lastNum},新版本号{newVersion}");
            }
            else
            {
                System.Console.WriteLine($"直接指定新版本号为 {version}");
                versionNode.InnerText = version;
            }
            xmlDoc.Save(path);
            System.Console.WriteLine("处理完毕!");
        }
    }
}

最终效果

  1. 写完新功能
  2. git 提交
  3. 打标签 1.0.8
  4. 推送
  5. 收到nuget已发布通知邮件
最后修改:2023 年 01 月 16 日
如果觉得我的文章对你有用,请随意赞赏