UpgradeHostedService.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using Microsoft.Extensions.Hosting;
  2. using Microsoft.Extensions.Logging;
  3. using System;
  4. using System.Linq;
  5. using System.Net.Http;
  6. using System.Net.Http.Json;
  7. using System.Reflection;
  8. using System.Text;
  9. using System.Text.Json.Serialization;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. namespace FastGithub.Upgrade
  13. {
  14. /// <summary>
  15. /// 升级检查后台服务
  16. /// </summary>
  17. sealed class UpgradeHostedService : IHostedService
  18. {
  19. private readonly ILogger<UpgradeHostedService> logger;
  20. private const string DownloadPage = "https://gitee.com/jiulang/fast-github/releases";
  21. private const string ReleasesUri = "https://gitee.com/api/v5/repos/jiulang/fast-github/releases?page=1&per_page=1&direction=desc";
  22. public UpgradeHostedService(ILogger<UpgradeHostedService> logger)
  23. {
  24. this.logger = logger;
  25. }
  26. /// <summary>
  27. /// 检测版本
  28. /// </summary>
  29. /// <param name="cancellationToken"></param>
  30. /// <returns></returns>
  31. public async Task StartAsync(CancellationToken cancellationToken)
  32. {
  33. try
  34. {
  35. var currentVersion = GetCurrentVersion();
  36. if (currentVersion == null)
  37. {
  38. return;
  39. }
  40. var lastRelease = await GetLastedReleaseAsync(cancellationToken);
  41. if (lastRelease == null)
  42. {
  43. return;
  44. }
  45. var lastedVersion = ProductionVersion.Parse(lastRelease.TagName);
  46. if (lastedVersion.CompareTo(currentVersion) > 0)
  47. {
  48. this.logger.LogInformation($"您正在使用{currentVersion}版本{Environment.NewLine}请前往{DownloadPage}下载新版本");
  49. this.logger.LogInformation(lastRelease.ToString());
  50. }
  51. }
  52. catch (Exception ex)
  53. {
  54. this.logger.LogWarning($"检测升级信息失败:{ex.Message}");
  55. }
  56. }
  57. public Task StopAsync(CancellationToken cancellationToken)
  58. {
  59. return Task.CompletedTask;
  60. }
  61. /// <summary>
  62. /// 获取当前版本
  63. /// </summary>
  64. /// <returns></returns>
  65. private static ProductionVersion? GetCurrentVersion()
  66. {
  67. var version = Assembly
  68. .GetEntryAssembly()?
  69. .GetCustomAttribute<AssemblyInformationalVersionAttribute>()?
  70. .InformationalVersion;
  71. return version == null ? null : ProductionVersion.Parse(version);
  72. }
  73. /// <summary>
  74. /// 获取最新发布
  75. /// </summary>
  76. /// <returns></returns>
  77. private static async Task<Release?> GetLastedReleaseAsync(CancellationToken cancellationToken)
  78. {
  79. using var httpClient = new HttpClient();
  80. var releases = await httpClient.GetFromJsonAsync<Release[]>(ReleasesUri, cancellationToken);
  81. return releases?.FirstOrDefault();
  82. }
  83. /// <summary>
  84. /// 发行记录
  85. /// </summary>
  86. private class Release
  87. {
  88. [JsonPropertyName("tag_name")]
  89. public string TagName { get; set; } = string.Empty;
  90. [JsonPropertyName("body")]
  91. public string Body { get; set; } = string.Empty;
  92. [JsonPropertyName("created_at")]
  93. public DateTime CreatedAt { get; set; }
  94. public override string ToString()
  95. {
  96. return new StringBuilder()
  97. .Append("最新版本:").AppendLine(this.TagName)
  98. .Append("发布时间:").AppendLine(this.CreatedAt.ToString())
  99. .AppendLine("更新内容:").AppendLine(this.Body)
  100. .ToString();
  101. }
  102. }
  103. }
  104. }