期望
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
。
实现逻辑
- 编写版本号处理程序
- 用处理程序改变配置文件版本号
- 然后正常打包发布
处理程序代码
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("处理完毕!");
}
}
}
最终效果
- 写完新功能
- git 提交
- 打标签 1.0.8
- 推送
- 收到nuget已发布通知邮件