节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
3.66 KiB
Stardust
using Microsoft.AspNetCore.Mvc;
using NewLife;
using NewLife.Cube;
using NewLife.Cube.Extensions;
using NewLife.Cube.ViewModels;
using NewLife.Web;
using Stardust.Data.Deployment;
using Stardust.Web.Services;
using XCode.Membership;

namespace Stardust.Web.Areas.Deployment.Controllers;

/// <summary>编译节点。应用部署集和编译节点的关系,一个应用可有多个部署集如arm和x64,在目标节点上发布该部署集对应的应用zip包</summary>
[Menu(20, true, Icon = "fa-table")]
[DeploymentArea]
public class AppBuildNodeController : DeploymentEntityController<AppBuildNode>
{
    static AppBuildNodeController()
    {
        LogOnChange = true;

        AddFormFields.RemoveCreateField();
        ListFields.RemoveCreateField().RemoveRemarkField();

        ListFields.TraceUrl("TraceId");

        {
            var df = ListFields.GetField("DeployName") as ListField;
            df.Url = "/Deployment/AppDeploy?deployId={DeployId}";
        }
        {
            var df = ListFields.AddListField("BuildUpload", null, "Enable");
            df.DisplayName = "编译上传";
            df.Description = "拉代码及编译";
            df.Url = "/Deployment/AppBuildNode/Operate?Id={Id}&act=Build-Upload";
            df.DataAction = "action";
        }
        {
            var df = ListFields.AddListField("PackageUpload", null, "Enable");
            df.DisplayName = "打包上传";
            df.Description = "不拉代码不编译,直接打包输出目录";
            df.Url = "/Deployment/AppBuildNode/Operate?Id={Id}&act=Package-Upload";
            df.DataAction = "action";
        }
    }

    private readonly DeployService _deployService;
    public AppBuildNodeController(DeployService deployService)
    {
        _deployService = deployService;
    }

    /// <summary>高级搜索。列表页查询、导出Excel、导出Json、分享页等使用</summary>
    /// <param name="p">分页器。包含分页排序参数,以及Http请求参数</param>
    /// <returns></returns>
    /// <summary>高级搜索。按条件分页查询</summary>
    /// <param name="p">分页参数</param>
    /// <returns>实体列表</returns>
    protected override IEnumerable<AppBuildNode> Search(Pager p)
    {
        var deployId = p["deployId"].ToInt(-1);
        var nodeId = p["nodeId"].ToInt(-1);
        var pullCode = p["pullCode"]?.ToBoolean();
        var buildProject = p["buildProject"]?.ToBoolean();
        var packageOutput = p["packageOutput"]?.ToBoolean();
        var uploadPackage = p["uploadPackage"]?.ToBoolean();
        var enable = p["enable"]?.ToBoolean();

        var start = p["dtStart"].ToDateTime();
        var end = p["dtEnd"].ToDateTime();

        return AppBuildNode.Search(deployId, nodeId, pullCode, buildProject, packageOutput, uploadPackage, enable, start, end, p["Q"], p);
    }

    /// <summary>执行操作</summary>
    /// <param name="act">操作。Build-Upload/Package-Upload</param>
    /// <param name="id">编译节点编号</param>
    /// <returns></returns>
    [EntityAuthorize(PermissionFlags.Update)]
    public async Task<ActionResult> Operate(String act, Int32 id)
    {
        var bn = AppBuildNode.FindById(id);
        if (bn == null || bn.Node == null) return Json(500, $"编译节点[{id}]不存在");

        var app = bn.Deploy;
        if (app == null) return Json(500, $"编译节点[{id}]未关联应用部署集");

        var deployName = bn.DeployName;
        if (deployName.IsNullOrEmpty()) deployName = app.Name;

        await _deployService.Compile(app, bn, act, UserHost, HttpContext.RequestAborted);

        return JsonRefresh($"在节点[{bn.NodeName}]上对应用[{deployName}]执行[{act}]操作", 1);
    }
}