【问题标题】:display build version on web page在网页上显示构建版本
【发布时间】:2016-09-21 01:49:30
【问题描述】:

我正在使用 asp.net core 开发一个网站。
我用Visual Studio 或/和VSTS 发布它。

我想在网页上显示一些关于它是哪个版本的信息。
(类似于rev 2016.9.20.4002

我该怎么做?

【问题讨论】:

  • 谢谢,但我只需要发布的版本号,而不是构建。而app.UseRuntimeInfoPage() 只适合开发时间。
  • “rev 2016.9.20.4002”是 VSTS 生成的内部版本号吗?
  • 是的,我只需要一个字符串就可以告诉我代码版本。它可能由 VSTS 生成。内部版本号或 git commit hash 都可以。

标签: continuous-integration asp.net-core azure-devops


【解决方案1】:

您可以使用内部版本号对其进行跟踪。

  1. 转到您的 VSTS 站点并创建构建定义
  2. 选择常规选项卡,指定内部版本号格式,例如:$(date:yyyyMMdd)$(rev:.r)
  3. (可选)选择触发器选项卡,选中持续集成 (CI) 并配置过滤器,如果您希望为每次签入建立队列。
  4. 配置其他设置(例如,构建选项卡中的步骤/任务) 构建完成后,转到该构建定义的摘要(单击构建定义标题超链接转到摘要页面),结果将如下所示:

向您的网站显示内部版本号的步骤:

  1. 为您的 VSTS 安装 Replace Tokens 扩展
  2. 编辑您的构建定义以添加替换令牌任务
  3. 指定目标文件和根目录(对于asp.net core app,可以指定**\appsettings.json)
  4. 选择变量选项卡并添加一个新变量。保存构建定义
  5. 编辑您的 asp.net 项目的 appsettings.json 文件。示例代码:
 {
      "ConnectionStrings": {
        "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-WebApplication1-ab933d83-8f4b-4024-9f3c-1aef5339a8f3;Trusted_Connection=True;MultipleActiveResultSets=true"
      },
      "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
          "Default": "Debug",
          "System": "Information",
          "Microsoft": "Information"
        }
      },
      "CodeVersion": {
        "Num": "#{MyBuildNumber}#"
      }
    }
  1. 将逻辑添加到您的 asp.net 项目以读取 appsettings.json 以获取特定值并显示在页面中。
  2. 签入您的代码和队列构建。

【讨论】:

  • 但它如何显示在我的网站上?
  • @qin 我更新了我的答案,你可以参考我的步骤来达到你的要求。
  • 看起来不错,我稍后会尝试Replace Tokens extension
  • @qin 你用我的步骤成功向你的网站显示版本号了吗?
【解决方案2】:

经过一天的研究,终于找到/创建了比使用 Marketplace 中的任何随机应用(替换令牌)更好的选择。

我所说的选项已经在 VSTS、Azure CLI 任务中可用。

以下是步骤:

  1. 在 appsettings.json 中添加初始值为 1.0 的设置 BUILD_NUMBER
  2. 在您的应用程序中读取 appsettings.json 并显示它。我相信你们都足够聪明,知道如何使用 appsettings 在您的 WebApplication 上显示 Build Number。
  3. 在 Azure 门户中,类似地在应用服务下的 Azure 应用程序设置部分为您的应用创建一个名为 BUILD_NUMBER 的应用设置,初始值为 1.0。
  4. 在 VSTS 中,在发布定义中,添加任务 Azure CLI。
  5. 使用以下 CLI 命令填充必填字段,例如 Azure 订阅、使用内联脚本的脚本位置以及最后但最重要的内联脚本

az webapp config appsettings set -n iCoreTestApi -g ArchitectsSandbox -s Dev --settings BUILD_NUMBER=$(Build.BuildNumber)

命令说明:

  • iCoreTestApi 应替换为您在 Azure 中的真实 WebApp 或 Api 名称
  • ArchitectsSandbox 应替换为 Azure 中的资源组
  • Dev 是插槽名称,您可能有也可能没有。
  • 命令的其余部分保持不变。

一旦您将新构建排队,在成功完成部署后,您可以看到 Azure 上的应用设置部分已更新为新的 BUILD_NUMBER。

如果您还有任何问题,请告诉我。

【讨论】:

    【解决方案3】:

    你的意思是这样的:

    在 project.json 中:

    {
      "title": "Your Application name",
      "version": "2016.9.20.4002",
      "copyright": "Your Company 2016",
      "description": "Awesome ASP.Net Core Application",
      "dependencies": {
    //rest of project.json
    

    然后您可以在您的视图模型或模型中创建一个属性,例如:

        public static string Version
        {
            get
            {
                var assembly = Assembly.GetExecutingAssembly();
                var fileVersion = GetCustomAttribute<AssemblyFileVersionAttribute>(assembly);
    
                return fileVersion?.Version;
            }
        }
    

    在你看来:

    @model Namespace.CustomViewModel
    <!--Other HTML Code-->
    
        <span id="applicationVersion">@CustomViewModel.Version</span>
    

    【讨论】:

    • 这是个好主意,但我必须更改版本。我希望它可以自动完成。
    【解决方案4】:

    看起来ApplicationEnvironment 类是你需要的:

    var appEnv = new Microsoft.Extensions.PlatformAbstractions.ApplicationEnvironment();
    string version = appEnv.ApplicationVersion;
    

    还有 How can I auto-increment an MVC 6 version number? 可能对您来说也很有趣,但请记住,IApplicationEnvironment 已被删除。

    【讨论】:

    • 获取的不是构建版本,而是应用版本。前者在每次构建时自动递增,后者是静态的并输入应用程序属性/程序集信息中。
    【解决方案5】:

    作为替代选项,您可以读取程序集的创建时间并以版本格式显示。每次重新构建程序集时,该值都会更改为它的创建时间。

    (改编自 .Net Core 的 this answer

    public static class AppInfo
    {
        private static Lazy<string> buildVersion =
            new Lazy<string>(() => GetBuildVersion(Assembly.GetEntryAssembly()));
    
        public static string BuildVersion { get; } = buildVersion.Value;
    
        private static string GetBuildVersion(Assembly assembly)
        {
            var filePath = assembly.Location;
            const int c_PeHeaderOffset = 60;
            const int c_LinkerTimestampOffset = 8;
    
            var buffer = new byte[2048];
    
            using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                stream.Read(buffer, 0, 2048);
    
            var offset = BitConverter.ToInt32(buffer, c_PeHeaderOffset);
            var secondsSince1970 = BitConverter.ToInt32(buffer, offset + c_LinkerTimestampOffset);
            var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    
            var linkTimeUtc = epoch.AddSeconds(secondsSince1970);
    
            var localTime = TimeZoneInfo.ConvertTime(linkTimeUtc, TimeZoneInfo.Local);
            var minutesFromMidnight = localTime.Minute + localTime.Hour * 60;
    
            return localTime.ToString("yyyy.M.dd.") + minutesFromMidnight;
        }
    }
    

    然后在 Razor 中将其引用为:

    @AppInfo.BuildVersion
    

    【讨论】:

      【解决方案6】:

      这可能不完全符合我的要求,但在我的情况下非常有效。如果 docker 用于构建和部署 Web 应用程序,请考虑将此步骤添加到您的 CI 构建脚本中 docker build 命令 (bash) 之前:

      echo ENV BUILD_NUMBER=$(Build.BuildNumber) >> Dockerfile
      

      在应用代码中只需使用BUILD_NUMBER 环境变量。

      这种方法的优点是内部版本号值就像标签一样成为 docker 映像的元数据,但您也可以从应用内部访问它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-23
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        • 2010-10-13
        相关资源
        最近更新 更多