ci: 🎡 版本发布脚本 (#110)

This commit is contained in:
nsnail 2024-04-29 18:14:10 +08:00 committed by GitHub
parent a330495624
commit 55594b72c2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 109 additions and 195 deletions

View File

@ -1,7 +1,7 @@
# This workflow will build a .NET project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
name: CI
name: nightly-build
on:
push:

58
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,58 @@
# This workflow will build a .NET project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
name: nightly-build
on:
push:
tags:
- v*
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [ 20.x ]
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
filter: tree:0
- uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
# https://docs.github.com/zh/actions/using-workflows/caching-dependencies-to-speed-up-workflows#matching-a-cache-key
- uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('./src/frontend/admin/package.json') }}
restore-keys: ${{ runner.os }}-npm
- working-directory: ./src/frontend/admin
run:
npm install && npm run build
- uses: actions/setup-dotnet@v3
with:
dotnet-version: 9.0.x
- uses: actions/cache@v3
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
restore-keys: ${{ runner.os }}-nuget
- working-directory: ./src/backend/NetAdmin.AdmServer.Host
run: dotnet publish NetAdmin.AdmServer.Host.csproj -c Release
- uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: false
prerelease: false
- id: get_version
run: echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/v}
- run: docker build -t nsnail/netadmin:${{steps.get_version.outputs.VERSION}} .
- uses: docker/login-action@v3
with:
username: "nsnail"
password: "${{secrets.DOCKER_PASSWORD}}"
- run: docker push nsnail/netadmin:${{steps.get_version.outputs.VERSION}}

View File

@ -54,7 +54,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{1129
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{3C6F049E-3EE8-4D66-9AFF-E8A369032487}"
ProjectSection(SolutionItems) = preProject
ci.yml = .github/workflows/ci.yml
nightly-build.yml = .github/workflows/nightly-build.yml
release.yml = .github/workflows/release.yml
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{8E4C93BA-9493-4892-80C4-5E174C504829}"
@ -72,7 +73,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.AdmServer.Applicat
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.AdmServer.Host", "src\backend\NetAdmin.AdmServer.Host\NetAdmin.AdmServer.Host.csproj", "{CE895E44-EEC3-4ECE-A56A-8A82E7D863E3}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03.HostedServers", "03.HostedServers", "{12AE5B4B-CB1A-498E-83B8-04E201E31D86}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03.hosted-servers", "03.hosted-servers", "{12AE5B4B-CB1A-498E-83B8-04E201E31D86}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Domain", "src\backend\NetAdmin.Domain\NetAdmin.Domain.csproj", "{58509C57-09FA-4E3C-BC07-78E786A2A326}"
EndProject
@ -90,15 +91,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.SysComponent.Cache
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.SysComponent.Application", "src\backend\NetAdmin.SysComponent.Application\NetAdmin.SysComponent.Application.csproj", "{34650E82-D257-46DA-BD6B-DE307113347B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "02.Components", "02.Components", "{3F23258D-8299-4992-9F51-2EE9B52CF9D2}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "02.components", "02.components", "{3F23258D-8299-4992-9F51-2EE9B52CF9D2}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "04.BackgroundServices", "04.BackgroundServices", "{CBFBF29B-27E8-4DB1-ADD6-4B750897ACD3}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "01.frameworks", "01.frameworks", "{D9C3EF66-2757-473D-A26B-54FD08DA203F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "01.Frameworks", "01.Frameworks", "{D9C3EF66-2757-473D-A26B-54FD08DA203F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.ScheduledService", "src\backend\NetAdmin.ScheduledService\NetAdmin.ScheduledService.csproj", "{96668960-310F-4682-B3F9-1E8F1EED8C90}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "06.Tests", "06.Tests", "{89260294-80FC-49F1-8D73-AECD39AFF2B7}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "04.tests", "04.tests", "{89260294-80FC-49F1-8D73-AECD39AFF2B7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.AdmServer.Tests", "src\backend\NetAdmin.AdmServer.Tests\NetAdmin.AdmServer.Tests.csproj", "{C7F27698-DA05-4ACD-B0D7-4791B3972002}"
EndProject
@ -157,10 +154,6 @@ Global
{34650E82-D257-46DA-BD6B-DE307113347B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{34650E82-D257-46DA-BD6B-DE307113347B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{34650E82-D257-46DA-BD6B-DE307113347B}.Release|Any CPU.Build.0 = Release|Any CPU
{96668960-310F-4682-B3F9-1E8F1EED8C90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{96668960-310F-4682-B3F9-1E8F1EED8C90}.Debug|Any CPU.Build.0 = Debug|Any CPU
{96668960-310F-4682-B3F9-1E8F1EED8C90}.Release|Any CPU.ActiveCfg = Release|Any CPU
{96668960-310F-4682-B3F9-1E8F1EED8C90}.Release|Any CPU.Build.0 = Release|Any CPU
{C7F27698-DA05-4ACD-B0D7-4791B3972002}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C7F27698-DA05-4ACD-B0D7-4791B3972002}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C7F27698-DA05-4ACD-B0D7-4791B3972002}.Release|Any CPU.ActiveCfg = Release|Any CPU
@ -174,14 +167,12 @@ Global
{4DAF9366-855F-46BB-AE4C-660C92FA0697} = {C84EB5A0-37AD-4B17-A51E-E36888C4441E}
{12AE5B4B-CB1A-498E-83B8-04E201E31D86} = {4DAF9366-855F-46BB-AE4C-660C92FA0697}
{3F23258D-8299-4992-9F51-2EE9B52CF9D2} = {4DAF9366-855F-46BB-AE4C-660C92FA0697}
{CBFBF29B-27E8-4DB1-ADD6-4B750897ACD3} = {4DAF9366-855F-46BB-AE4C-660C92FA0697}
{D9C3EF66-2757-473D-A26B-54FD08DA203F} = {4DAF9366-855F-46BB-AE4C-660C92FA0697}
{70C54E1B-2083-4196-AB68-34CAF0075D82} = {D9C3EF66-2757-473D-A26B-54FD08DA203F}
{91452C22-4B57-4F16-9AF6-42C7BF830504} = {D9C3EF66-2757-473D-A26B-54FD08DA203F}
{58509C57-09FA-4E3C-BC07-78E786A2A326} = {D9C3EF66-2757-473D-A26B-54FD08DA203F}
{91839A15-D08F-4848-A301-F793412BC688} = {D9C3EF66-2757-473D-A26B-54FD08DA203F}
{1E62C322-EE42-4699-A6F1-791C53EFA62D} = {D9C3EF66-2757-473D-A26B-54FD08DA203F}
{96668960-310F-4682-B3F9-1E8F1EED8C90} = {CBFBF29B-27E8-4DB1-ADD6-4B750897ACD3}
{E38B2EB4-D7A5-4777-9236-3B348919DF23} = {12AE5B4B-CB1A-498E-83B8-04E201E31D86}
{7CB632D3-3635-4F8D-AFE7-F496D37D422B} = {12AE5B4B-CB1A-498E-83B8-04E201E31D86}
{CE895E44-EEC3-4ECE-A56A-8A82E7D863E3} = {12AE5B4B-CB1A-498E-83B8-04E201E31D86}

View File

@ -1,4 +1,4 @@
<wpf:ResourceDictionary xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xml:space="preserve">
<wpf:ResourceDictionary xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xml:space="preserve">
<!-- CodeEditing-->
<s:Boolean x:Key="/Default/CodeEditing/TypingAssist/SkipClosingBracesOnTabInStringLiterals/@EntryValue">True</s:Boolean>
<s:String x:Key="/Default/CodeEditing/GenerateMemberBody/DocumentationGenerationKind/@EntryValue">Inherit</s:String>

View File

@ -1,6 +1,6 @@
# NetAdmin
通用后台权限管理系统、快速开发框架基于C#12/.NET9~~~~、Vue3/Vite、Element Plus等现代技术构建具有十分整洁、优雅的编码规范
通用后台权限管理系统、快速开发框架基于C#12/.NET9、Vue3/Vite、Element Plus等现代技术构建具有十分整洁、优雅的编码规范
[![.NET](https://github.com/nsnail/NetAdmin/actions/workflows/ci.yml/badge.svg)](https://github.com/nsnail/NetAdmin/actions/workflows/ci.yml)
[![MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/nsnail/NetAdmin/blob/main/LICENSE)

View File

@ -9,7 +9,7 @@
"packages": [
{
"packageName": "Furion.Pure.NS",
"version": "4.9.2.19-ns3"
"version": "4.9.2.31-ns3"
}
]
}

View File

@ -9,9 +9,9 @@
<PackageReference Include="Cronos" Version="0.8.4"/>
<PackageReference Include="FreeSql.DbContext.NS" Version="3.2.821-ns1"/>
<PackageReference Include="FreeSql.Provider.Sqlite.NS" Version="3.2.821-ns1"/>
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.2.19"/>
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster.NS" Version="4.9.2.19-ns3"/>
<PackageReference Include="Furion.Pure.NS" Version="4.9.2.19-ns3"/>
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.2.31"/>
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster.NS" Version="4.9.2.31-ns1"/>
<PackageReference Include="Furion.Pure.NS" Version="4.9.2.31-ns1"/>
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.0.0-preview.3.24172.13"/>
<PackageReference Include="Minio" Version="6.0.2"/>
<PackageReference Include="NSExt" Version="2.1.0"/>

View File

@ -1,21 +0,0 @@
using Furion.Schedule;
using NetAdmin.ScheduledService.Jobs;
namespace NetAdmin.ScheduledService.Extensions;
/// <summary>
/// ServiceCollection 扩展方法
/// </summary>
[SuppressSniffer]
public static class ServiceCollectionExtensions
{
/// <summary>
/// 添加定时任务
/// </summary>
public static IServiceCollection AddSchedules(this IServiceCollection me)
{
return me.AddSchedule( //
builder => builder //
.AddJob<ExampleJob>(false, Triggers.Minutely().SetRunOnStart(true)));
}
}

View File

@ -1,33 +0,0 @@
using Furion.Schedule;
namespace NetAdmin.ScheduledService.Jobs;
/// <summary>
/// 示例Job
/// </summary>
public sealed class ExampleJob : WorkBase<ExampleJob>, IJob
{
/// <summary>
/// Initializes a new instance of the <see cref="ExampleJob" /> class.
/// </summary>
public ExampleJob() { }
/// <summary>
/// 具体处理逻辑
/// </summary>
/// <param name="context">作业执行前上下文</param>
/// <param name="stoppingToken">取消任务 Token</param>
/// <exception cref="NetAdminGetLockerException">加锁失败异常</exception>
public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
{
await WorkflowAsync(stoppingToken).ConfigureAwait(false);
}
/// <summary>
/// 通用工作流
/// </summary>
protected override ValueTask WorkflowAsync(CancellationToken cancelToken)
{
return ValueTask.CompletedTask;
}
}

View File

@ -1,12 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Import Project="$(SolutionDir)/build/code.quality.props"/>
<ItemGroup>
<ProjectReference Include="../NetAdmin.Host/NetAdmin.Host.csproj"/>
<ProjectReference Include="../NetAdmin.AdmServer.Cache/NetAdmin.AdmServer.Cache.csproj"/>
</ItemGroup>
<ItemGroup>
<None Update="*.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@ -1 +0,0 @@
global using NetAdmin.Host.BackgroundRunning;

View File

@ -1,14 +0,0 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"NetAdmin.ScheduledService": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchUrl": "http://localhost:65080",
"applicationUrl": "http://[::]:65080",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@ -1,70 +0,0 @@
using NetAdmin.Host.Extensions;
using NetAdmin.Host.Middlewares;
using NetAdmin.ScheduledService.Extensions;
#if !DEBUG
using Prometheus;
#endif
namespace NetAdmin.ScheduledService;
/// <summary>
/// 启动类
/// </summary>
public sealed class Startup : Host.Startup
{
/// <summary>
/// 程序入口
/// </summary>
public static void Main(string[] args)
{
ShowBanner();
_ = Serve.Run(RunOptions.Default.WithArgs(args));
}
/// <summary>
/// 配置应用程序中间件
/// </summary>
public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifeTime)
{
_ = app //
.UseMiddleware<SafetyShopHostMiddleware>() // 安全停机中间件
.EnableBuffering() // 启用请求体缓冲,允许多次读取请求体
.UseMiddleware<RequestAuditMiddleware>() // 使用RequestAuditMiddleware中间件执行请求审计
#if DEBUG
.UseOpenApiSkin() // 使用OpenApiSkin中间件仅在调试模式下提供Swagger UI皮肤
#else
.UseHttpMetrics() // 使用HttpMetrics中间件启用HTTP性能监控
#endif
.UseInject(string.Empty) // 使用Inject中间件Furion脚手架的依赖注入支持
.UseUnifyResultStatusCodes() // 使用UnifyResultStatusCodes中间件用于统一处理结果状态码
.UseCorsAccessor() // 使用CorsAccessor中间件启用跨域资源共享CORS支持
.UseRouting() // 使用Routing中间件配置路由映射
.UseMiddleware<RemoveNullNodeMiddleware>() // 使用RemoveNullNodeMiddleware中间件删除JSON中的空节点
.UseEndpoints(); // 配置端点以处理请求
_ = lifeTime.ApplicationStopping.Register(SafetyShopHostMiddleware.OnStopping);
}
/// <summary>
/// 配置服务容器
/// </summary>
public void ConfigureServices(IServiceCollection services)
{
_ = services //
.AddConsoleFormatter() // 添加控制台日志格式化器
.AddAllOptions() // 添加所有的配置选项
.AddSnowflake() // 添加雪花算法生成器
.AddEventBus() // 添加事件总线
.AddFreeSql() // 添加FreeSql数据库访问
.AddCorsAccessor() // 添加跨域资源共享CORS访问支持
.AddRedisCache() // 添加 Redis 缓存支持
.AddContextUser() // 添加上下文用户支持
.AddSchedules() // 添加计划任务
.AddRemoteRequest() // 添加远程请求支持
// IMvcBuilder
.AddControllers() // 添加控制器
.AddJsonSerializer() // 添加JSON序列化器
.AddDefaultApiResultHandler() // 添加默认的API结果处理程序
;
}
}

View File

@ -1,16 +0,0 @@
{
"$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
"SpecificationDocumentSettings": {
"GroupOpenApiInfos": [
{
"Group": "Default",
"Title": "计划任务服务",
"Description": "NetAdmin - 计划任务服务",
},
{
"Group": "Health",
"Visible": false
}
]
}
}

View File

@ -3,9 +3,9 @@
<ProjectReference Include="../NetAdmin.Host/NetAdmin.Host.csproj"/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="xunit" Version="2.7.1"/>
<PackageReference Include="xunit" Version="2.8.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.0-preview.3.24172.13"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.8">
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>

View File

@ -0,0 +1,30 @@
<template>
<p>{{ ip ?? '-' }}</p>
<p style="overflow: hidden">{{ region ?? '-' }}</p>
</template>
<script>
import http from '@/utils/request'
export default {
emits: [],
props: ['ip'],
data() {
return {
region: null,
}
},
mounted() {},
created() {
if (this.ip) {
this.region = '...'
http.get(`http://ip.yaopy.com/?ip=${this.ip}`).then((x) => {
this.region = x.region
})
}
},
components: {},
computed: {},
methods: {},
}
</script>
<style scoped></style>

View File

@ -1,3 +1,5 @@
// noinspection ES6UnusedImports
import * as elIcons from '@element-plus/icons-vue'
import * as scIcons from '@/assets/icons'
import api from '@/api'
@ -31,6 +33,7 @@ import scForm from '@/components/scForm'
import scFormTable from '@/components/scFormTable'
import scPageHeader from '@/components/scPageHeader'
import scSelect from '@/components/scSelect'
import scSelectFilter from '@/components/scSelectFilter'
import scStatusIndicator from '@/components/scMini/scStatusIndicator'
import scTable from '@/components/scTable'
import scTableColumn from '@/components/scTable/column.js'
@ -40,7 +43,6 @@ import scUpload from '@/components/scUpload'
import scUploadFile from '@/components/scUpload/file'
import scUploadMultiple from '@/components/scUpload/multiple'
import scWaterMark from '@/components/scWaterMark'
import scSelectFilter from '@/components/scSelectFilter'
// net-admin组件
import naArea from '@/components/naArea/index.vue'
@ -55,6 +57,7 @@ import naColUser from '@/components/naColUser/index.vue'
import naDept from '@/components/naDept/index.vue'
import naDicCatalog from '@/components/naDicCatalog/index.vue'
import naFormEmail from '@/components/naFormEmail/index.vue'
import naIp from '@/components/naIp/index.vue'
import naSearch from '@/components/naSearch'
import naUserSelect from '@/components/naUserSelect/index.vue'
@ -94,6 +97,7 @@ export default {
app.component('naDept', naDept)
app.component('naDicCatalog', naDicCatalog)
app.component('naFormEmail', naFormEmail)
app.component('naIp', naIp)
app.component('naSearch', naSearch)
app.component('naUserSelect', naUserSelect)
@ -105,6 +109,7 @@ export default {
app.component('scFormTable', scFormTable)
app.component('scPageHeader', scPageHeader)
app.component('scSelect', scSelect)
app.component('scSelectFilter', scSelectFilter)
app.component('scStatusIndicator', scStatusIndicator)
app.component('scTable', scTable)
app.component('scTableColumn', scTableColumn)
@ -114,7 +119,6 @@ export default {
app.component('scUploadFile', scUploadFile)
app.component('scUploadMultiple', scUploadMultiple)
app.component('scWaterMark', scWaterMark)
app.component('scSelectFilter', scSelectFilter)
//注册全局指令
app.directive('auth', auth)