diff --git a/src/CodeRelease/CodeRelease/.config/dotnet-tools.json b/src/CodeRelease/CodeRelease/.config/dotnet-tools.json new file mode 100644 index 0000000..4f257cf --- /dev/null +++ b/src/CodeRelease/CodeRelease/.config/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "8.0.6", + "commands": [ + "dotnet-ef" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/src/CodeRelease/CodeRelease/CodeRelease.csproj b/src/CodeRelease/CodeRelease/CodeRelease.csproj index 9daa180..c5ef2c8 100644 --- a/src/CodeRelease/CodeRelease/CodeRelease.csproj +++ b/src/CodeRelease/CodeRelease/CodeRelease.csproj @@ -7,7 +7,9 @@ + + diff --git a/src/CodeRelease/CodeRelease/Controllers/PublishController.cs b/src/CodeRelease/CodeRelease/Controllers/PublishController.cs index 3e2e070..40f1004 100644 --- a/src/CodeRelease/CodeRelease/Controllers/PublishController.cs +++ b/src/CodeRelease/CodeRelease/Controllers/PublishController.cs @@ -1,8 +1,18 @@ using CodeRelease.BLL; +using CodeRelease.Model; +using CodeRelease.Utile; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; + +using System; + + + namespace CodeRelease.Controllers { @@ -16,11 +26,68 @@ namespace CodeRelease.Controllers /// 测试 /// /// - public async Task Test() + public async Task Test([FromBody] object data) { + var jsonStr = data.ToString(); + var jObject = JsonConvert.DeserializeObject(jsonStr); LinuxExecuteCommand linuxExecuteCommand = new LinuxExecuteCommand(); var obj = await linuxExecuteCommand.ExecuteCommand("make test -f /disk/CodeRelease/test/makefile"); return obj; } + + [HttpPost] + /// + /// 发布 + /// + /// + /// + public async Task ReleaseAction([FromBody] object data, [FromServices] GiteaWebhookConfigModel giteaWebhookConfig) + { + JsonSerializerSettings settings = new JsonSerializerSettings + { + //MaxDepth = 64 // 设置一个足够大的值,默认值是 32 + ContractResolver = new DefaultContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy() + } + }; + var jsonStr = data.ToString() ?? ""; + var releaseAction = JsonConvert.DeserializeObject(jsonStr, settings); + + if (releaseAction != null) + { + if (releaseAction.Action == "published") + { + if (releaseAction.Release.Assets?.Count > 0) + { + var url = releaseAction.Release.Assets[0].BrowserDownloadUrl; + if (!string.IsNullOrEmpty(url)) + { + var version = releaseAction.Release.TagName; + var fileName = Path.GetFileName(url); + var download = giteaWebhookConfig.BrowserDownloadFileUrl + version + "/"; + if (!Directory.Exists(download)) + { + Directory.CreateDirectory(download); + } + FileDownloader fileDownloader = new FileDownloader(); + //giteaWebhookConfig.BrowserDownloadFileUrl.Replace("{version}", version); + await fileDownloader.DownloadFileAsync(url, download + fileName); + ZipExtractor extractor = new ZipExtractor(); + var temp = fileName.Substring(0, fileName.LastIndexOf(".")); + extractor.ExtractZipFile(download + fileName, download + "/" + temp); + var mingling = giteaWebhookConfig.MakeFile.Replace("{version}", version).Replace("{dir_file_path}", download + "/" + temp + "/"); + LinuxExecuteCommand linuxExecuteCommand = new LinuxExecuteCommand(); + //make public version=0.0.1 dir_file_path=/ + var obj = await linuxExecuteCommand.ExecuteCommand(mingling); + return obj; + } + } + + } + } + + return ""; + } } } diff --git a/src/CodeRelease/CodeRelease/Model/GiteaWebhook.cs b/src/CodeRelease/CodeRelease/Model/GiteaWebhook.cs new file mode 100644 index 0000000..38ff44a --- /dev/null +++ b/src/CodeRelease/CodeRelease/Model/GiteaWebhook.cs @@ -0,0 +1,970 @@ +using Newtonsoft.Json; + +using System; +using System.Collections.Generic; +using System.Text.Json.Serialization; +namespace CodeRelease.Model +{ + /// + /// 发布动作类 + /// + public class PublishAction + { + /// + /// 发布的动作 + /// + [JsonProperty("action")] + public string Action { get; set; } + + /// + /// 发布信息 + /// + [JsonProperty("release")] + public Release Release { get; set; } + + /// + /// 仓库信息 + /// + [JsonProperty("repository")] + public Repository Repository { get; set; } + + /// + /// 发送者信息 + /// + [JsonProperty("sender")] + public Sender Sender { get; set; } + } + + /// + /// 发布信息类 + /// + public class Release + { + /// + /// 发布ID + /// + [JsonProperty("id")] + public int Id { get; set; } + + /// + /// 标签名称 + /// + [JsonProperty("tag_name")] + public string TagName { get; set; } + + /// + /// 目标分支 + /// + [JsonProperty("target_commitish")] + public string TargetCommitish { get; set; } + + /// + /// 发布名称 + /// + [JsonProperty("name")] + public string Name { get; set; } + + /// + /// 发布描述 + /// + [JsonProperty("body")] + public string Body { get; set; } + + /// + /// 发布URL + /// + [JsonProperty("url")] + public string Url { get; set; } + + /// + /// 发布HTML URL + /// + [JsonProperty("html_url")] + public string HtmlUrl { get; set; } + + /// + /// tarball文件URL + /// + [JsonProperty("tarball_url")] + public string TarballUrl { get; set; } + + /// + /// zipball文件URL + /// + [JsonProperty("zipball_url")] + public string ZipballUrl { get; set; } + + /// + /// 上传URL + /// + [JsonProperty("upload_url")] + public string UploadUrl { get; set; } + + /// + /// 是否为草稿 + /// + [JsonProperty("draft")] + public bool Draft { get; set; } + + /// + /// 是否为预发布 + /// + [JsonProperty("prerelease")] + public bool Prerelease { get; set; } + + /// + /// 创建时间 + /// + [JsonProperty("created_at")] + public DateTime CreatedAt { get; set; } + + /// + /// 发布时间 + /// + [JsonProperty("published_at")] + public DateTime PublishedAt { get; set; } + + /// + /// 作者信息 + /// + [JsonProperty("author")] + public Author Author { get; set; } + + /// + /// 资产列表 + /// + [JsonProperty("assets")] + public List Assets { get; set; } + } + + /// + /// 作者信息类 + /// + public class Author + { + /// + /// 作者ID + /// + [JsonProperty("id")] + public int Id { get; set; } + + /// + /// 登录名 + /// + [JsonProperty("login")] + public string Login { get; set; } + + /// + /// 登录名称 + /// + [JsonProperty("login_name")] + public string LoginName { get; set; } + + /// + /// 来源ID + /// + [JsonProperty("source_id")] + public int SourceId { get; set; } + + /// + /// 全名 + /// + [JsonProperty("full_name")] + public string FullName { get; set; } + + /// + /// 邮箱 + /// + [JsonProperty("email")] + public string Email { get; set; } + + /// + /// 头像URL + /// + [JsonProperty("avatar_url")] + public string AvatarUrl { get; set; } + + /// + /// HTML URL + /// + [JsonProperty("html_url")] + public string HtmlUrl { get; set; } + + /// + /// 语言 + /// + [JsonProperty("language")] + public string Language { get; set; } + + /// + /// 是否为管理员 + /// + [JsonProperty("is_admin")] + public bool IsAdmin { get; set; } + + /// + /// 最后登录时间 + /// + [JsonProperty("last_login")] + public DateTime LastLogin { get; set; } + + /// + /// 创建时间 + /// + [JsonProperty("created")] + public DateTime Created { get; set; } + + /// + /// 是否受限 + /// + [JsonProperty("restricted")] + public bool Restricted { get; set; } + + /// + /// 是否活跃 + /// + [JsonProperty("active")] + public bool Active { get; set; } + + /// + /// 是否禁止登录 + /// + [JsonProperty("prohibit_login")] + public bool ProhibitLogin { get; set; } + + /// + /// 位置 + /// + [JsonProperty("location")] + public string Location { get; set; } + + /// + /// 个人网站 + /// + [JsonProperty("website")] + public string Website { get; set; } + + /// + /// 描述 + /// + [JsonProperty("description")] + public string Description { get; set; } + + /// + /// 可见性 + /// + [JsonProperty("visibility")] + public string Visibility { get; set; } + + /// + /// 关注者数量 + /// + [JsonProperty("followers_count")] + public int FollowersCount { get; set; } + + /// + /// 关注数量 + /// + [JsonProperty("following_count")] + public int FollowingCount { get; set; } + + /// + /// 收藏的仓库数量 + /// + [JsonProperty("starred_repos_count")] + public int StarredReposCount { get; set; } + + /// + /// 用户名 + /// + [JsonProperty("username")] + public string Username { get; set; } + } + + /// + /// 资产信息类 + /// + public class Asset + { + /// + /// 资产ID + /// + [JsonProperty("id")] + public int Id { get; set; } + + /// + /// 资产名称 + /// + [JsonProperty("name")] + public string Name { get; set; } + + /// + /// 资产大小 + /// + [JsonProperty("size")] + public long Size { get; set; } + + /// + /// 下载次数 + /// + [JsonProperty("download_count")] + public int DownloadCount { get; set; } + + /// + /// 创建时间 + /// + [JsonProperty("created_at")] + public DateTime CreatedAt { get; set; } + + /// + /// 资产UUID + /// + [JsonProperty("uuid")] + public string Uuid { get; set; } + + /// + /// 浏览器下载URL + /// + [JsonProperty("browser_download_url")] + public string BrowserDownloadUrl { get; set; } + } + + /// + /// 仓库信息类 + /// + public class Repository + { + /// + /// 仓库ID + /// + [JsonProperty("id")] + public int Id { get; set; } + + /// + /// 拥有者信息 + /// + [JsonProperty("owner")] + public Owner Owner { get; set; } + + /// + /// 仓库名称 + /// + [JsonProperty("name")] + public string Name { get; set; } + + /// + /// 仓库全名 + /// + [JsonProperty("full_name")] + public string FullName { get; set; } + + /// + /// 仓库描述 + /// + [JsonProperty("description")] + public string Description { get; set; } + + /// + /// 仓库是否为空 + /// + [JsonProperty("empty")] + public bool Empty { get; set; } + + /// + /// 是否为私有仓库 + /// + [JsonProperty("private")] + public bool Private { get; set; } + + /// + /// 是否为派生仓库 + /// + [JsonProperty("fork")] + public bool Fork { get; set; } + + /// + /// 是否为模板仓库 + /// + [JsonProperty("template")] + public bool Template { get; set; } + + /// + /// 父仓库 + /// + [JsonProperty("parent")] + public object Parent { get; set; } + + /// + /// 是否为镜像仓库 + /// + [JsonProperty("mirror")] + public bool Mirror { get; set; } + + /// + /// 仓库大小 + /// + [JsonProperty("size")] + public long Size { get; set; } + + /// + /// 仓库语言 + /// + [JsonProperty("language")] + public string Language { get; set; } + + /// + /// 仓库语言URL + /// + [JsonProperty("languages_url")] + public string LanguagesUrl { get; set; } + + /// + /// 仓库HTML URL + /// + [JsonProperty("html_url")] + public string HtmlUrl { get; set; } + + /// + /// 仓库API URL + /// + [JsonProperty("url")] + public string Url { get; set; } + + /// + /// 仓库链接 + /// + [JsonProperty("link")] + public string Link { get; set; } + + /// + /// 仓库SSH URL + /// + [JsonProperty("ssh_url")] + public string SshUrl { get; set; } + + /// + /// 仓库克隆 URL + /// + [JsonProperty("clone_url")] + public string CloneUrl { get; set; } + + /// + /// 原始 URL + /// + [JsonProperty("original_url")] + public string OriginalUrl { get; set; } + + /// + /// 仓库网站 + /// + [JsonProperty("website")] + public string Website { get; set; } + + /// + /// 星标数量 + /// + [JsonProperty("stars_count")] + public int StarsCount { get; set; } + + /// + /// 派生数量 + /// + [JsonProperty("forks_count")] + public int ForksCount { get; set; } + + /// + /// 关注者数量 + /// + [JsonProperty("watchers_count")] + public int WatchersCount { get; set; } + + /// + /// 开放问题数量 + /// + [JsonProperty("open_issues_count")] + public int OpenIssuesCount { get; set; } + + /// + /// 开放PR数量 + /// + [JsonProperty("open_pr_counter")] + public int OpenPrCounter { get; set; } + + /// + /// 发布数量 + /// + [JsonProperty("release_counter")] + public int ReleaseCounter { get; set; } + + /// + /// 默认分支 + /// + [JsonProperty("default_branch")] + public string DefaultBranch { get; set; } + + /// + /// 是否存档 + /// + [JsonProperty("archived")] + public bool Archived { get; set; } + + /// + /// 创建时间 + /// + [JsonProperty("created_at")] + public DateTime CreatedAt { get; set; } + + /// + /// 更新时间 + /// + [JsonProperty("updated_at")] + public DateTime UpdatedAt { get; set; } + + /// + /// 存档时间 + /// + [JsonProperty("archived_at")] + public DateTime ArchivedAt { get; set; } + + /// + /// 权限信息 + /// + [JsonProperty("permissions")] + public Permissions Permissions { get; set; } + + /// + /// 是否有问题跟踪 + /// + [JsonProperty("has_issues")] + public bool HasIssues { get; set; } + + /// + /// 内部问题跟踪器 + /// + [JsonProperty("internal_tracker")] + public InternalTracker InternalTracker { get; set; } + + /// + /// 是否有Wiki + /// + [JsonProperty("has_wiki")] + public bool HasWiki { get; set; } + + /// + /// 是否有PR + /// + [JsonProperty("has_pull_requests")] + public bool HasPullRequests { get; set; } + + /// + /// 是否有项目 + /// + [JsonProperty("has_projects")] + public bool HasProjects { get; set; } + + /// + /// 项目模式 + /// + [JsonProperty("projects_mode")] + public string ProjectsMode { get; set; } + + /// + /// 是否有发布 + /// + [JsonProperty("has_releases")] + public bool HasReleases { get; set; } + + /// + /// 是否有包 + /// + [JsonProperty("has_packages")] + public bool HasPackages { get; set; } + + /// + /// 是否有动作 + /// + [JsonProperty("has_actions")] + public bool HasActions { get; set; } + + /// + /// 是否忽略空白冲突 + /// + [JsonProperty("ignore_whitespace_conflicts")] + public bool IgnoreWhitespaceConflicts { get; set; } + + /// + /// 是否允许合并提交 + /// + [JsonProperty("allow_merge_commits")] + public bool AllowMergeCommits { get; set; } + + /// + /// 是否允许变基 + /// + [JsonProperty("allow_rebase")] + public bool AllowRebase { get; set; } + + /// + /// 是否允许显式变基 + /// + [JsonProperty("allow_rebase_explicit")] + public bool AllowRebaseExplicit { get; set; } + + /// + /// 是否允许快速前进合并 + /// + [JsonProperty("allow_squash_merge")] + public bool AllowSquashMerge { get; set; } + + /// + /// 是否仅允许快速前进合并 + /// + [JsonProperty("allow_fast_forward_only_merge")] + public bool AllowFastForwardOnlyMerge { get; set; } + + /// + /// 是否允许变基更新 + /// + [JsonProperty("allow_rebase_update")] + public bool AllowRebaseUpdate { get; set; } + + /// + /// 是否在合并后默认删除分支 + /// + [JsonProperty("default_delete_branch_after_merge")] + public bool DefaultDeleteBranchAfterMerge { get; set; } + + /// + /// 默认合并样式 + /// + [JsonProperty("default_merge_style")] + public string DefaultMergeStyle { get; set; } + + /// + /// 是否默认允许维护者编辑 + /// + [JsonProperty("default_allow_maintainer_edit")] + public bool DefaultAllowMaintainerEdit { get; set; } + + /// + /// 头像URL + /// + [JsonProperty("avatar_url")] + public string AvatarUrl { get; set; } + + /// + /// 是否为内部仓库 + /// + [JsonProperty("internal")] + public bool Internal { get; set; } + + /// + /// 镜像间隔 + /// + [JsonProperty("mirror_interval")] + public string MirrorInterval { get; set; } + + /// + /// 对象格式名称 + /// + [JsonProperty("object_format_name")] + public string ObjectFormatName { get; set; } + + /// + /// 镜像更新时间 + /// + [JsonProperty("mirror_updated")] + public DateTime MirrorUpdated { get; set; } + + /// + /// 仓库转移 + /// + [JsonProperty("repo_transfer")] + public object RepoTransfer { get; set; } + } + /// + /// 仓库所有者 + /// + public class Owner + { + /// + /// 所有者ID + /// + public int Id { get; set; } + + /// + /// 登录名 + /// + public string Login { get; set; } + + /// + /// 登录名称 + /// + public string LoginName { get; set; } + + /// + /// 来源ID + /// + public int SourceId { get; set; } + + /// + /// 全名 + /// + public string FullName { get; set; } + + /// + /// 邮箱 + /// + public string Email { get; set; } + + /// + /// 头像 URL + /// + public string AvatarUrl { get; set; } + + /// + /// HTML URL + /// + public string HtmlUrl { get; set; } + + /// + /// 语言 + /// + public string Language { get; set; } + + /// + /// 是否为管理员 + /// + public bool IsAdmin { get; set; } + + /// + /// 最后登录时间 + /// + public DateTime LastLogin { get; set; } + + /// + /// 创建时间 + /// + public DateTime Created { get; set; } + + /// + /// 是否受限 + /// + public bool Restricted { get; set; } + + /// + /// 是否活跃 + /// + public bool Active { get; set; } + + /// + /// 是否禁止登录 + /// + public bool ProhibitLogin { get; set; } + + /// + /// 位置 + /// + public string Location { get; set; } + + /// + /// 网站 + /// + public string Website { get; set; } + + /// + /// 描述 + /// + public string Description { get; set; } + + /// + /// 可见性 + /// + public string Visibility { get; set; } + + /// + /// 粉丝数量 + /// + public int FollowersCount { get; set; } + + /// + /// 关注数量 + /// + public int FollowingCount { get; set; } + + /// + /// 星标仓库数量 + /// + public int StarredReposCount { get; set; } + + /// + /// 用户名 + /// + public string Username { get; set; } + } + + /// + /// 权限 + /// + public class Permissions + { + /// + /// 是否为管理员 + /// + public bool Admin { get; set; } + + /// + /// 是否允许推送 + /// + public bool Push { get; set; } + + /// + /// 是否允许拉取 + /// + public bool Pull { get; set; } + } + + /// + /// 内部跟踪器 + /// + public class InternalTracker + { + /// + /// 是否启用时间跟踪 + /// + public bool EnableTimeTracker { get; set; } + + /// + /// 是否仅允许贡献者跟踪时间 + /// + public bool AllowOnlyContributorsToTrackTime { get; set; } + + /// + /// 是否启用问题依赖 + /// + public bool EnableIssueDependencies { get; set; } + } + + /// + /// 触发发布的用户 + /// + public class Sender + { + /// + /// 用户ID + /// + public int Id { get; set; } + + /// + /// 登录名 + /// + public string Login { get; set; } + + /// + /// 登录名称 + /// + public string LoginName { get; set; } + + /// + /// 来源ID + /// + public int SourceId { get; set; } + + /// + /// 全名 + /// + public string FullName { get; set; } + + /// + /// 邮箱 + /// + public string Email { get; set; } + + /// + /// 头像 URL + /// + public string AvatarUrl { get; set; } + + /// + /// HTML URL + /// + public string HtmlUrl { get; set; } + + /// + /// 语言 + /// + public string Language { get; set; } + + /// + /// 是否为管理员 + /// + public bool IsAdmin { get; set; } + + /// + /// 最后登录时间 + /// + public DateTime LastLogin { get; set; } + + /// + /// 创建时间 + /// + public DateTime Created { get; set; } + + /// + /// 是否受限 + /// + public bool Restricted { get; set; } + + /// + /// 是否活跃 + /// + public bool Active { get; set; } + + /// + /// 是否禁止登录 + /// + public bool ProhibitLogin { get; set; } + + /// + /// 位置 + /// + public string Location { get; set; } + + /// + /// 网站 + /// + public string Website { get; set; } + + /// + /// 描述 + /// + public string Description { get; set; } + + /// + /// 可见性 + /// + public string Visibility { get; set; } + + /// + /// 粉丝数量 + /// + public int FollowersCount { get; set; } + + /// + /// 关注数量 + /// + public int FollowingCount { get; set; } + + /// + /// 星标仓库数量 + /// + public int StarredReposCount { get; set; } + + /// + /// 用户名 + /// + public string Username { get; set; } + } +} + + diff --git a/src/CodeRelease/CodeRelease/Model/GiteaWebhookConfigModel.cs b/src/CodeRelease/CodeRelease/Model/GiteaWebhookConfigModel.cs new file mode 100644 index 0000000..6d2f4e1 --- /dev/null +++ b/src/CodeRelease/CodeRelease/Model/GiteaWebhookConfigModel.cs @@ -0,0 +1,21 @@ +namespace CodeRelease.Model +{ + public class GiteaWebhookConfigModel + { + /// + /// 名字 + /// + public string Name { get; set; } + /// + /// make命令 + /// + public string MakeFile { get; set; } + /// + /// 下载后地址 + /// + public string BrowserDownloadFileUrl { get; set; } + } + + + +} diff --git a/src/CodeRelease/CodeRelease/Program.cs b/src/CodeRelease/CodeRelease/Program.cs index 56ea37a..6f26f9d 100644 --- a/src/CodeRelease/CodeRelease/Program.cs +++ b/src/CodeRelease/CodeRelease/Program.cs @@ -1,7 +1,14 @@ +using CodeRelease.Model; +using CodeRelease.Utile; + +using Microsoft.Extensions.Configuration; + var builder = WebApplication.CreateBuilder(args); // Add services to the container. - +var giteaWebhookConfigModelList = builder.Configuration.GetSection("GiteaWebhookConfig").Get>() ?? new List(); +builder.Services.AddSingleton(giteaWebhookConfigModelList); +builder.Services.AddScoped(); builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); @@ -19,6 +26,7 @@ if (app.Environment.IsDevelopment()) app.UseAuthorization(); app.MapControllers(); +app.UseMiddleware(); app.MapGet("/", () => { return "ɹ"; diff --git a/src/CodeRelease/CodeRelease/Utile/FileDownloader.cs b/src/CodeRelease/CodeRelease/Utile/FileDownloader.cs new file mode 100644 index 0000000..ef7c682 --- /dev/null +++ b/src/CodeRelease/CodeRelease/Utile/FileDownloader.cs @@ -0,0 +1,51 @@ +namespace CodeRelease.Utile +{ + /// + /// 下载文件 + /// + public class FileDownloader + { + + + public FileDownloader() + { + + } + + /// + /// 下载文件并将其保存到指定路径。 + /// + /// 要下载的文件的 URL。 + /// 保存文件的路径。 + /// 异步任务。 + public async Task DownloadFileAsync(string fileUrl, string destinationFilePath) + { + try + { + using (HttpClient _client = new HttpClient()) + { + // 发送 HTTP GET 请求 + HttpResponseMessage response = await _client.GetAsync(fileUrl); + + // 确认响应状态是成功 + response.EnsureSuccessStatusCode(); + + // 读取响应内容为字节数组 + byte[] fileBytes = await response.Content.ReadAsByteArrayAsync(); + + // 将字节数组写入文件 + await File.WriteAllBytesAsync(destinationFilePath, fileBytes); + } + return true; + //Console.WriteLine("文件下载成功!"); + } + catch (Exception ex) + { + //Console.WriteLine($"文件下载失败: {ex.Message}"); + return false; + } + + } + } + +} diff --git a/src/CodeRelease/CodeRelease/Utile/GiteaWebhookConfigMiddleware.cs b/src/CodeRelease/CodeRelease/Utile/GiteaWebhookConfigMiddleware.cs new file mode 100644 index 0000000..3c4fc7c --- /dev/null +++ b/src/CodeRelease/CodeRelease/Utile/GiteaWebhookConfigMiddleware.cs @@ -0,0 +1,50 @@ +using CodeRelease.Model; + +using Newtonsoft.Json; + +using static System.Net.Mime.MediaTypeNames; + +namespace CodeRelease.Utile +{ + /// + /// + /// + public class GiteaWebhookConfigMiddleware + { + private readonly RequestDelegate _next; + + + public GiteaWebhookConfigMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task Invoke(HttpContext context, + List giteaWebhookConfigModels, + GiteaWebhookConfigModel giteaWebhookConfig) + { + context.Request.Headers.TryGetValue("Authorization", out var authorization); + var key = authorization.ToString(); + if (!string.IsNullOrEmpty(key)) + { + var tempgiteaWebhookConfig = giteaWebhookConfigModels.FirstOrDefault(it => it.Name == key); + if (tempgiteaWebhookConfig == null) + { + if (giteaWebhookConfigModels.Count > 0) + { + tempgiteaWebhookConfig = giteaWebhookConfigModels[0]; + } + else + { + tempgiteaWebhookConfig = new GiteaWebhookConfigModel(); + } + } + giteaWebhookConfig.BrowserDownloadFileUrl = tempgiteaWebhookConfig.BrowserDownloadFileUrl; + giteaWebhookConfig.Name = tempgiteaWebhookConfig.Name; + giteaWebhookConfig.MakeFile = tempgiteaWebhookConfig.MakeFile; + } + await _next(context); + } + } +} + diff --git a/src/CodeRelease/CodeRelease/Utile/ZipExtractor.cs b/src/CodeRelease/CodeRelease/Utile/ZipExtractor.cs new file mode 100644 index 0000000..bd9eb85 --- /dev/null +++ b/src/CodeRelease/CodeRelease/Utile/ZipExtractor.cs @@ -0,0 +1,37 @@ +using System; +using System.IO; +using System.IO.Compression; +namespace CodeRelease.Utile +{ + /// + /// 解压文件 + /// + public class ZipExtractor + { + /// + /// 解压ZIP文件到指定目录。 + /// + /// ZIP 文件路径。 + /// 解压目标目录。 + public void ExtractZipFile(string zipFilePath, string extractPath) + { + try + { + // 确保目标目录存在 + if (!Directory.Exists(extractPath)) + { + Directory.CreateDirectory(extractPath); + } + + // 解压缩文件 + ZipFile.ExtractToDirectory(zipFilePath, extractPath); + + //Console.WriteLine("文件解压成功!"); + } + catch (Exception ex) + { + //Console.WriteLine($"文件解压失败: {ex.Message}"); + } + } + } +} diff --git a/src/CodeRelease/CodeRelease/appsettings.json b/src/CodeRelease/CodeRelease/appsettings.json index 852425e..d87899f 100644 --- a/src/CodeRelease/CodeRelease/appsettings.json +++ b/src/CodeRelease/CodeRelease/appsettings.json @@ -11,8 +11,26 @@ "Http": { "Url": "http://*:5240" } - } - - } + }, + //web 钩子配置 + "GiteaWebhookConfig": [ + { + "Name": "coderelease", + //make 文件位置 + "MakeFile": "make public version={version} dir_file_path={dir_file_path} -f /disk/CodeRelease/test/makefile", + //发布文件下载位置 + "BrowserDownloadFileUrl": "I:/Gitea/test/disk/aiweb/" + // + }, + { + "Name": "aiweb", + //make 文件位置 + "MakeFile": "make public version={version} dir_file_path={dir_file_path} -f /disk/CodeRelease/test/makefile", + //发布文件下载位置 + "BrowserDownloadFileUrl": "I:/Gitea/test/disk/aiweb/" + // + } + + ] } diff --git a/test/makefile b/test/makefile index 9bb9c4c..9c6d1a7 100644 --- a/test/makefile +++ b/test/makefile @@ -1,6 +1,21 @@ SHELL=/usr/bin/env bash date_dir_name = $(shell date +"%Y%m%d-%H%M%S") +dir_file_path=/disk +backups_dir_path=/disk/web/backups +version=0.0.1 +server_dir_path=/var/www/web/ test: @echo $(date_dir_name) + @echo $(dir_file) - \ No newline at end of file + +public: + # make public version=0.0.1 dir_file_path=/ + #make var dir_file_path=aaa + @echo $(date_dir_name) + # 创建备份文件夹 + mkdir -p $(backups_dir_path)/$(version)/$(date_dir_name) + # 从服务器同步到本地,备份 + rsync -avz ubuntu@101.43.19.200:$(server_dir_path) $(backups_dir_path)/$(version)/$(date_dir_name) + # 从本地同步到服务器 + rsync -avz $(dir_file_path) ubuntu@101.43.19.200:$(server_dir_path)