From bbf2eb28ad60ec9a7bc0330400423990bd002d9a Mon Sep 17 00:00:00 2001 From: xljiulang <366193849@qq.com> Date: Tue, 20 Jul 2021 22:13:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8github=E5=8F=96=E4=BB=A3gitee?= =?UTF-8?q?=E5=81=9A=E5=8D=87=E7=BA=A7=E5=8C=85=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{GiteeRelease.cs => GithubRelease.cs} | 16 ++++++- FastGithub.Upgrade/UpgradeHostedService.cs | 44 +++++++++---------- FastGithub.Upgrade/UpgradeService.cs | 17 ++++--- .../UpgradeServiceCollectionExtensions.cs | 2 +- FastGithub/Program.cs | 2 +- 5 files changed, 49 insertions(+), 32 deletions(-) rename FastGithub.Upgrade/{GiteeRelease.cs => GithubRelease.cs} (75%) diff --git a/FastGithub.Upgrade/GiteeRelease.cs b/FastGithub.Upgrade/GithubRelease.cs similarity index 75% rename from FastGithub.Upgrade/GiteeRelease.cs rename to FastGithub.Upgrade/GithubRelease.cs index 897a0cc..6eef851 100644 --- a/FastGithub.Upgrade/GiteeRelease.cs +++ b/FastGithub.Upgrade/GithubRelease.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; using System.Text; using System.Text.Json.Serialization; @@ -7,7 +8,7 @@ namespace FastGithub.Upgrade /// /// 发行记录 /// - sealed class GiteeRelease + sealed class GithubRelease { /// /// 标签名 @@ -15,6 +16,12 @@ namespace FastGithub.Upgrade [JsonPropertyName("tag_name")] public string TagName { get; set; } = string.Empty; + /// + /// 是否预览版本 + /// + [JsonPropertyName("prerelease")] + public bool Prerelease { get; set; } + /// /// 发行说明 /// @@ -28,6 +35,13 @@ namespace FastGithub.Upgrade [JsonPropertyName("created_at")] public DateTime CreatedAt { get; set; } + /// + /// 下载页面 + /// + [AllowNull] + [JsonPropertyName("html_url")] + public Uri HtmlUrl { get; set; } + /// /// 获取产品版本 diff --git a/FastGithub.Upgrade/UpgradeHostedService.cs b/FastGithub.Upgrade/UpgradeHostedService.cs index eb52f0f..8c9e1ce 100644 --- a/FastGithub.Upgrade/UpgradeHostedService.cs +++ b/FastGithub.Upgrade/UpgradeHostedService.cs @@ -1,5 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Threading; @@ -10,46 +9,47 @@ namespace FastGithub.Upgrade /// /// 升级后台服务 /// - sealed class UpgradeHostedService : IHostedService + sealed class UpgradeHostedService : BackgroundService { - private readonly IServiceScopeFactory serviceScopeFactory; + private readonly UpgradeService upgradeService; private readonly ILogger logger; /// /// 升级后台服务 /// - /// /// public UpgradeHostedService( - IServiceScopeFactory serviceScopeFactory, + UpgradeService upgradeService, ILogger logger) { - this.serviceScopeFactory = serviceScopeFactory; + this.upgradeService = upgradeService; this.logger = logger; } /// /// 检测版本 /// - /// + /// /// - public async Task StartAsync(CancellationToken cancellationToken) + protected override async Task ExecuteAsync(CancellationToken stoppingToken) { - try + var maxTryCount = 3; + for (var i = 1; i <= maxTryCount; i++) { - using var scope = this.serviceScopeFactory.CreateScope(); - var upgradeService = scope.ServiceProvider.GetRequiredService(); - await upgradeService.UpgradeAsync(cancellationToken); + try + { + await Task.Delay(TimeSpan.FromSeconds(2d), stoppingToken); + await this.upgradeService.UpgradeAsync(stoppingToken); + break; + } + catch (Exception ex) + { + if (i == maxTryCount) + { + this.logger.LogWarning($"升级失败:{ex.Message}"); + } + } } - catch (Exception ex) - { - this.logger.LogWarning($"升级失败:{ex.Message}"); - } - } - - public Task StopAsync(CancellationToken cancellationToken) - { - return Task.CompletedTask; } } } diff --git a/FastGithub.Upgrade/UpgradeService.cs b/FastGithub.Upgrade/UpgradeService.cs index df02fed..07a507d 100644 --- a/FastGithub.Upgrade/UpgradeService.cs +++ b/FastGithub.Upgrade/UpgradeService.cs @@ -2,6 +2,7 @@ using System; using System.Linq; using System.Net.Http; +using System.Net.Http.Headers; using System.Net.Http.Json; using System.Threading; using System.Threading.Tasks; @@ -14,8 +15,7 @@ namespace FastGithub.Upgrade sealed class UpgradeService { private readonly ILogger logger; - private const string DownloadPage = "https://gitee.com/jiulang/fast-github/releases"; - private const string ReleasesUri = "https://gitee.com/api/v5/repos/jiulang/fast-github/releases?page=1&per_page=1&direction=desc"; + private const string ReleasesUri = "https://api.github.com/repos/xljiulang/fastgithub/releases"; /// /// 升级服务 @@ -48,7 +48,7 @@ namespace FastGithub.Upgrade var lastedVersion = lastRelease.GetProductionVersion(); if (lastedVersion.CompareTo(currentVersion) > 0) { - this.logger.LogInformation($"您正在使用{currentVersion}版本{Environment.NewLine}请前往{DownloadPage}下载新版本"); + this.logger.LogInformation($"您正在使用{currentVersion}版本{Environment.NewLine}请前往{lastRelease.HtmlUrl}下载新版本"); this.logger.LogInformation(lastRelease.ToString()); } } @@ -57,11 +57,14 @@ namespace FastGithub.Upgrade /// 获取最新发布 /// /// - public async Task GetLastedReleaseAsync(CancellationToken cancellationToken) + public async Task GetLastedReleaseAsync(CancellationToken cancellationToken) { - using var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(5d) }; - var releases = await httpClient.GetFromJsonAsync(ReleasesUri, cancellationToken); - return releases?.FirstOrDefault(); + using var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(30d) }; + httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*")); + httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(nameof(FastGithub), "1.0")); + + var releases = await httpClient.GetFromJsonAsync(ReleasesUri, cancellationToken); + return releases?.FirstOrDefault(item => item.Prerelease == false); } } } diff --git a/FastGithub.Upgrade/UpgradeServiceCollectionExtensions.cs b/FastGithub.Upgrade/UpgradeServiceCollectionExtensions.cs index 6d846ad..a3fd0ec 100644 --- a/FastGithub.Upgrade/UpgradeServiceCollectionExtensions.cs +++ b/FastGithub.Upgrade/UpgradeServiceCollectionExtensions.cs @@ -16,7 +16,7 @@ namespace FastGithub public static IServiceCollection AddAppUpgrade(this IServiceCollection services) { return services - .AddTransient() + .AddSingleton() .AddHostedService(); } } diff --git a/FastGithub/Program.cs b/FastGithub/Program.cs index 44ed162..22e9b1a 100644 --- a/FastGithub/Program.cs +++ b/FastGithub/Program.cs @@ -32,10 +32,10 @@ namespace FastGithub }) .ConfigureServices((ctx, services) => { - services.AddAppUpgrade(); services.AddDnsServer(); services.AddReverseProxy(); services.AddDnscryptProxy(); + services.AddAppUpgrade(); services.AddSingleton(); services.Configure(ctx.Configuration.GetSection(nameof(FastGithub))); })