makit 0.0.98 → 0.0.111
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +41 -0
- data/exe/makit +5 -0
- data/lib/makit/apache.rb +7 -11
- data/lib/makit/cli/build_commands.rb +500 -0
- data/lib/makit/cli/generators/base_generator.rb +74 -0
- data/lib/makit/cli/generators/dotnet_generator.rb +50 -0
- data/lib/makit/cli/generators/generator_factory.rb +49 -0
- data/lib/makit/cli/generators/node_generator.rb +50 -0
- data/lib/makit/cli/generators/ruby_generator.rb +77 -0
- data/lib/makit/cli/generators/rust_generator.rb +50 -0
- data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -0
- data/lib/makit/cli/generators/templates/node_templates.rb +161 -0
- data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -0
- data/lib/makit/cli/generators/templates/ruby/gemspec.rb +40 -0
- data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -0
- data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -0
- data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -0
- data/lib/makit/cli/generators/templates/ruby/test.rb +39 -0
- data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -0
- data/lib/makit/cli/generators/templates/ruby/version.rb +29 -0
- data/lib/makit/cli/generators/templates/rust_templates.rb +128 -0
- data/lib/makit/cli/main.rb +48 -19
- data/lib/makit/cli/project_commands.rb +868 -0
- data/lib/makit/cli/repository_commands.rb +661 -0
- data/lib/makit/cli/utility_commands.rb +521 -0
- data/lib/makit/command_runner.rb +187 -128
- data/lib/makit/commands/compatibility.rb +365 -0
- data/lib/makit/commands/factory.rb +359 -0
- data/lib/makit/commands/middleware/base.rb +73 -0
- data/lib/makit/commands/middleware/cache.rb +248 -0
- data/lib/makit/commands/middleware/command_logger.rb +323 -0
- data/lib/makit/commands/middleware/unified_logger.rb +243 -0
- data/lib/makit/commands/middleware/validator.rb +269 -0
- data/lib/makit/commands/request.rb +254 -0
- data/lib/makit/commands/result.rb +323 -0
- data/lib/makit/commands/runner.rb +317 -0
- data/lib/makit/commands/strategies/base.rb +160 -0
- data/lib/makit/commands/strategies/synchronous.rb +134 -0
- data/lib/makit/commands.rb +24 -3
- data/lib/makit/configuration/gitlab_helper.rb +60 -0
- data/lib/makit/configuration/project.rb +127 -0
- data/lib/makit/configuration/rakefile_helper.rb +43 -0
- data/lib/makit/configuration/step.rb +34 -0
- data/lib/makit/configuration.rb +14 -0
- data/lib/makit/content/default_gitignore.rb +4 -2
- data/lib/makit/content/default_rakefile.rb +4 -2
- data/lib/makit/content/gem_rakefile.rb +4 -2
- data/lib/makit/context.rb +1 -0
- data/lib/makit/data.rb +9 -10
- data/lib/makit/directories.rb +48 -52
- data/lib/makit/directory.rb +38 -52
- data/lib/makit/docs/files.rb +5 -10
- data/lib/makit/docs/rake.rb +16 -20
- data/lib/makit/dotnet/cli.rb +65 -0
- data/lib/makit/dotnet/project.rb +153 -0
- data/lib/makit/dotnet/solution.rb +38 -0
- data/lib/makit/dotnet/solution_classlib.rb +239 -0
- data/lib/makit/dotnet/solution_console.rb +264 -0
- data/lib/makit/dotnet/solution_maui.rb +354 -0
- data/lib/makit/dotnet/solution_wasm.rb +275 -0
- data/lib/makit/dotnet/solution_wpf.rb +304 -0
- data/lib/makit/dotnet.rb +54 -171
- data/lib/makit/email.rb +46 -17
- data/lib/makit/environment.rb +22 -19
- data/lib/makit/examples/runner.rb +370 -0
- data/lib/makit/exceptions.rb +45 -0
- data/lib/makit/fileinfo.rb +3 -5
- data/lib/makit/files.rb +12 -16
- data/lib/makit/gems.rb +40 -39
- data/lib/makit/git/cli.rb +54 -0
- data/lib/makit/git/repository.rb +90 -0
- data/lib/makit/git.rb +44 -91
- data/lib/makit/gitlab_runner.rb +0 -1
- data/lib/makit/humanize.rb +31 -23
- data/lib/makit/indexer.rb +15 -24
- data/lib/makit/logging/configuration.rb +305 -0
- data/lib/makit/logging/format_registry.rb +84 -0
- data/lib/makit/logging/formatters/base.rb +39 -0
- data/lib/makit/logging/formatters/console_formatter.rb +127 -0
- data/lib/makit/logging/formatters/json_formatter.rb +65 -0
- data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -0
- data/lib/makit/logging/formatters/text_formatter.rb +64 -0
- data/lib/makit/logging/log_request.rb +115 -0
- data/lib/makit/logging/logger.rb +159 -0
- data/lib/makit/logging/sinks/base.rb +91 -0
- data/lib/makit/logging/sinks/console.rb +72 -0
- data/lib/makit/logging/sinks/file_sink.rb +92 -0
- data/lib/makit/logging/sinks/structured.rb +129 -0
- data/lib/makit/logging/sinks/unified_file_sink.rb +303 -0
- data/lib/makit/logging.rb +452 -37
- data/lib/makit/markdown.rb +18 -18
- data/lib/makit/mp/basic_object_mp.rb +5 -4
- data/lib/makit/mp/command_mp.rb +5 -5
- data/lib/makit/mp/command_request.mp.rb +3 -2
- data/lib/makit/mp/project_mp.rb +85 -96
- data/lib/makit/mp/string_mp.rb +245 -73
- data/lib/makit/nuget.rb +27 -25
- data/lib/makit/port.rb +25 -27
- data/lib/makit/process.rb +127 -29
- data/lib/makit/protoc.rb +27 -24
- data/lib/makit/rake/cli.rb +196 -0
- data/lib/makit/rake.rb +6 -6
- data/lib/makit/ruby/cli.rb +185 -0
- data/lib/makit/ruby.rb +25 -0
- data/lib/makit/secrets.rb +18 -18
- data/lib/makit/serializer.rb +29 -27
- data/lib/makit/services/builder.rb +186 -0
- data/lib/makit/services/error_handler.rb +226 -0
- data/lib/makit/services/repository_manager.rb +229 -0
- data/lib/makit/services/validator.rb +112 -0
- data/lib/makit/setup/classlib.rb +53 -0
- data/lib/makit/setup/gem.rb +250 -0
- data/lib/makit/setup/runner.rb +40 -0
- data/lib/makit/show.rb +16 -16
- data/lib/makit/storage.rb +32 -37
- data/lib/makit/symbols.rb +12 -0
- data/lib/makit/task_hooks.rb +125 -0
- data/lib/makit/task_info.rb +63 -21
- data/lib/makit/tasks/at_exit.rb +13 -0
- data/lib/makit/tasks/build.rb +18 -0
- data/lib/makit/tasks/clean.rb +11 -0
- data/lib/makit/tasks/hook_manager.rb +239 -0
- data/lib/makit/tasks/init.rb +47 -0
- data/lib/makit/tasks/integrate.rb +15 -0
- data/lib/makit/tasks/pull_incoming.rb +12 -0
- data/lib/makit/tasks/setup.rb +6 -0
- data/lib/makit/tasks/sync.rb +11 -0
- data/lib/makit/tasks/task_monkey_patch.rb +79 -0
- data/lib/makit/tasks.rb +5 -150
- data/lib/makit/test_cache.rb +239 -0
- data/lib/makit/v1/makit.v1_pb.rb +34 -35
- data/lib/makit/v1/makit.v1_services_pb.rb +2 -0
- data/lib/makit/version.rb +1 -60
- data/lib/makit/wix.rb +23 -23
- data/lib/makit/yaml.rb +18 -6
- data/lib/makit.rb +2 -261
- metadata +109 -145
- data/lib/makit/cli/clean.rb +0 -14
- data/lib/makit/cli/clone.rb +0 -59
- data/lib/makit/cli/init.rb +0 -38
- data/lib/makit/cli/make.rb +0 -54
- data/lib/makit/cli/new.rb +0 -37
- data/lib/makit/cli/nuget_cache.rb +0 -38
- data/lib/makit/cli/pull.rb +0 -31
- data/lib/makit/cli/setup.rb +0 -71
- data/lib/makit/cli/work.rb +0 -21
- data/lib/makit/content/default_gitignore.txt +0 -222
@@ -0,0 +1,153 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Makit
|
4
|
+
class DotNet
|
5
|
+
class Project
|
6
|
+
def self.is_installed?
|
7
|
+
File.exist?(Makit::Environment.which("dotnet"))
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.installed?
|
11
|
+
is_installed?
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.version
|
15
|
+
`dotnet --version`
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.project_short_name(project_path)
|
19
|
+
File.basename(project_path, ".csproj")
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.new_project(template, name, output, args = "")
|
23
|
+
if Dir.exist? output
|
24
|
+
Makit::Logging.default_logger.info("#{output}/#{name}.csproj")
|
25
|
+
#puts " .csproj ".colorize(:grey) + name.to_s.colorize(:green)
|
26
|
+
else
|
27
|
+
"dotnet new #{template} --name #{name} --output #{output} #{args}".run
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.set_project_target_framework(project_hint, target_framework)
|
32
|
+
project_path = find_project(project_hint)
|
33
|
+
project_content = File.read(project_path)
|
34
|
+
project_content.gsub!(%r{<TargetFramework>.*</TargetFramework>},
|
35
|
+
"<TargetFramework>#{target_framework}</TargetFramework>")
|
36
|
+
File.write(project_path, project_content)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.find_project(project_hint)
|
40
|
+
matches = []
|
41
|
+
Dir.glob("**/*.csproj").each do |project_path|
|
42
|
+
matches << project_path if project_path.include?(project_hint)
|
43
|
+
end
|
44
|
+
if matches.length == 1
|
45
|
+
return matches.first
|
46
|
+
elsif matches.length > 1
|
47
|
+
raise "Multiple projects found matching #{project_hint}".colorize(:red)
|
48
|
+
end
|
49
|
+
|
50
|
+
raise "No project found matching #{project_hint}".colorize(:red)
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.add_package(project_path, package_name)
|
54
|
+
unless File.exist?(project_path)
|
55
|
+
actual_project_path = Makit::DotNet::Project.find_project(project_path)
|
56
|
+
raise "Project #{project_path} does not exist".colorize(:red) unless File.exist?(actual_project_path)
|
57
|
+
|
58
|
+
project_path = actual_project_path
|
59
|
+
end
|
60
|
+
|
61
|
+
project_content = File.read(project_path)
|
62
|
+
if project_content.include?("\"#{package_name}\"")
|
63
|
+
puts " package ".colorize(:grey) + package_name.to_s.colorize(:green)
|
64
|
+
else
|
65
|
+
"dotnet add #{project_path} package #{package_name}".run
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.add_packages(project_path, packages)
|
70
|
+
packages.each do |package|
|
71
|
+
add_package(project_path, package)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.add_reference(project_path, reference_path)
|
76
|
+
unless File.exist?(project_path)
|
77
|
+
actual_project_path = Makit::DotNet::Project.find_project(project_path)
|
78
|
+
raise "Project #{project_path} does not exist".colorize(:red) unless File.exist?(actual_project_path)
|
79
|
+
|
80
|
+
project_path = actual_project_path
|
81
|
+
end
|
82
|
+
|
83
|
+
unless File.exist?(reference_path)
|
84
|
+
actual_reference_path = Makit::DotNet::Project.find_project(reference_path)
|
85
|
+
raise "Project #{reference_path} does not exist".colorize(:red) unless File.exist?(actual_reference_path)
|
86
|
+
|
87
|
+
reference_path = actual_reference_path
|
88
|
+
end
|
89
|
+
|
90
|
+
project_content = File.read(project_path)
|
91
|
+
if project_content.include?(File.basename(reference_path))
|
92
|
+
#puts " reference ".colorize(:grey) + reference_path.to_s.colorize(:green)
|
93
|
+
else
|
94
|
+
"dotnet add #{project_path} reference #{reference_path}".run
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.add_references(project_path, references)
|
99
|
+
references.each do |reference|
|
100
|
+
add_reference(project_path, reference)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.build(project_path, configuration = "Release", output = "artifacts")
|
105
|
+
project_dir = File.dirname(project_path)
|
106
|
+
newest_file = Makit::Directory.get_newest_file(project_dir)
|
107
|
+
command_request = Makit::RUNNER.parse_command_request("dotnet build #{project_path} --configuration #{configuration} --output #{output}")
|
108
|
+
newest_file_date = if newest_file.nil?
|
109
|
+
Time.now
|
110
|
+
else
|
111
|
+
File.mtime(newest_file)
|
112
|
+
end
|
113
|
+
RUNNER.cache_run(command_request, newest_file_date)
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.publish(project_path, configuration = "Release", output = "artifacts")
|
117
|
+
project_dir = File.dirname(project_path)
|
118
|
+
newest_file = Makit::Directory.get_newest_file(project_dir)
|
119
|
+
command_request = Makit::RUNNER.parse_command_request("dotnet publish #{project_path} --configuration #{configuration} --output #{output}")
|
120
|
+
newest_file_date = if newest_file.nil?
|
121
|
+
Time.now
|
122
|
+
else
|
123
|
+
File.mtime(newest_file)
|
124
|
+
end
|
125
|
+
RUNNER.cache_run(command_request, newest_file_date)
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.test(project_path, configuration = "Release", output = "artifacts")
|
129
|
+
project_dir = File.dirname(project_path)
|
130
|
+
newest_file = Makit::Directory.get_newest_file(project_dir)
|
131
|
+
command_request = Makit::RUNNER.parse_command_request("dotnet test #{project_path} --configuration #{configuration} --output #{output}")
|
132
|
+
newest_file_date = if newest_file.nil?
|
133
|
+
Time.now
|
134
|
+
else
|
135
|
+
File.mtime(newest_file)
|
136
|
+
end
|
137
|
+
RUNNER.cache_run(command_request, newest_file_date)
|
138
|
+
end
|
139
|
+
|
140
|
+
def self.format_project(project_path)
|
141
|
+
File.basename(project_path, ".csproj")
|
142
|
+
"dotnet tool update --global dotnet-format".run
|
143
|
+
"dotnet format #{project_path}".run
|
144
|
+
end
|
145
|
+
|
146
|
+
def self.upgrade_project(project_path)
|
147
|
+
File.basename(project_path, ".csproj")
|
148
|
+
"dotnet tool install --global dotnet-outdated-tool".run
|
149
|
+
"dotnet outdated #{project_path} --upgrade:Auto".run
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "solution_classlib"
|
4
|
+
require_relative "solution_console"
|
5
|
+
require_relative "solution_wasm"
|
6
|
+
require_relative "solution_maui"
|
7
|
+
require_relative "solution_wpf"
|
8
|
+
|
9
|
+
module Makit
|
10
|
+
class DotNet
|
11
|
+
class SolutionType
|
12
|
+
ClassLibrary = "classlib"
|
13
|
+
ConsoleApplication = "console"
|
14
|
+
Wasm = "wasm"
|
15
|
+
Maui = "maui"
|
16
|
+
Wpf = "wpf"
|
17
|
+
end
|
18
|
+
|
19
|
+
class Solution
|
20
|
+
def self.setup(solution_type, name)
|
21
|
+
case solution_type
|
22
|
+
when SolutionType::ClassLibrary
|
23
|
+
SolutionClassLib.setup(name)
|
24
|
+
when SolutionType::ConsoleApplication
|
25
|
+
SolutionConsole.setup(name)
|
26
|
+
when SolutionType::Wasm
|
27
|
+
SolutionWasm.setup(name)
|
28
|
+
when SolutionType::Maui
|
29
|
+
SolutionMaui.setup(name)
|
30
|
+
when SolutionType::Wpf
|
31
|
+
SolutionWpf.setup(name)
|
32
|
+
else
|
33
|
+
raise ArgumentError, "Unsupported solution type: #{solution_type}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,239 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Makit
|
4
|
+
class DotNet
|
5
|
+
class SolutionClassLib
|
6
|
+
def self.setup(name)
|
7
|
+
Makit::DotNet::Project.new_project("razorclasslib", name, "source/#{name}", "--framework net8.0")
|
8
|
+
Makit::DotNet::Project.new_project("TUnit", "#{name}.Tests", "tests/#{name}")
|
9
|
+
Makit::DotNet::Project.add_reference("tests/#{name}/#{name}.Tests.csproj", "source/#{name}/#{name}.csproj")
|
10
|
+
|
11
|
+
# Generate additional project files
|
12
|
+
generate_rakefile(name)
|
13
|
+
generate_gitlab_ci(name)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.generate_rakefile(project_name)
|
17
|
+
rakefile_content = <<~RUBY
|
18
|
+
# frozen_string_literal: true
|
19
|
+
|
20
|
+
require "makit"
|
21
|
+
|
22
|
+
#
|
23
|
+
# #{project_name} Class Library Project Rakefile
|
24
|
+
#
|
25
|
+
desc "default task - builds and tests the class library"
|
26
|
+
task :default => [:build, :test]
|
27
|
+
|
28
|
+
desc "build the #{project_name} class library"
|
29
|
+
task :build do
|
30
|
+
puts "Building #{project_name} class library..."
|
31
|
+
project_path = "source/#{project_name}/#{project_name}.csproj"
|
32
|
+
#{" "}
|
33
|
+
if File.exist?(project_path)
|
34
|
+
sh "dotnet build \#{project_path} --configuration Release"
|
35
|
+
puts "Class library build completed successfully!"
|
36
|
+
else
|
37
|
+
puts "Error: Project file not found at \#{project_path}"
|
38
|
+
exit 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "test the #{project_name} class library"
|
43
|
+
task :test do
|
44
|
+
puts "Testing #{project_name} class library..."
|
45
|
+
project_path = "source/#{project_name}/#{project_name}.csproj"
|
46
|
+
#{" "}
|
47
|
+
if File.exist?(project_path)
|
48
|
+
sh "dotnet test \#{project_path} --configuration Release --verbosity normal"
|
49
|
+
puts "Class library tests completed successfully!"
|
50
|
+
else
|
51
|
+
puts "Error: Project file not found at \#{project_path}"
|
52
|
+
exit 1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
desc "clean build artifacts"
|
57
|
+
task :clean do
|
58
|
+
puts "Cleaning class library build artifacts..."
|
59
|
+
sh "dotnet clean source/#{project_name}/#{project_name}.csproj"
|
60
|
+
puts "Clean completed successfully!"
|
61
|
+
end
|
62
|
+
|
63
|
+
desc "restore packages"
|
64
|
+
task :restore do
|
65
|
+
puts "Restoring class library packages..."
|
66
|
+
sh "dotnet restore source/#{project_name}/#{project_name}.csproj"
|
67
|
+
puts "Restore completed successfully!"
|
68
|
+
end
|
69
|
+
|
70
|
+
desc "pack the class library as NuGet package"
|
71
|
+
task :pack do
|
72
|
+
puts "Packing #{project_name} class library..."
|
73
|
+
output_dir = "artifacts/packages"
|
74
|
+
FileUtils.mkdir_p(output_dir)
|
75
|
+
sh "dotnet pack source/#{project_name}/#{project_name}.csproj --configuration Release --output \#{output_dir}"
|
76
|
+
puts "Pack completed successfully! Package: \#{output_dir}/#{project_name}.*.nupkg"
|
77
|
+
end
|
78
|
+
|
79
|
+
desc "publish the class library package"
|
80
|
+
task :publish => [:pack] do
|
81
|
+
puts "Publishing #{project_name} class library package..."
|
82
|
+
package_files = Dir.glob("artifacts/packages/#{project_name}.*.nupkg")
|
83
|
+
if package_files.any?
|
84
|
+
package_files.each do |package|
|
85
|
+
sh "dotnet nuget push \#{package} --api-key ${NUGET_API_KEY} --source ${NUGET_SOURCE:-https://api.nuget.org/v3/index.json}"
|
86
|
+
end
|
87
|
+
puts "Publish completed successfully!"
|
88
|
+
else
|
89
|
+
puts "Error: No package files found to publish"
|
90
|
+
exit 1
|
91
|
+
end
|
92
|
+
end
|
93
|
+
RUBY
|
94
|
+
|
95
|
+
File.write("Rakefile", rakefile_content)
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.generate_gitlab_ci(project_name)
|
99
|
+
gitlab_ci_content = <<~YAML
|
100
|
+
# #{project_name} Class Library Project GitLab CI/CD Pipeline
|
101
|
+
# frozen_string_literal: true
|
102
|
+
|
103
|
+
stages:
|
104
|
+
- build
|
105
|
+
- test
|
106
|
+
- pack
|
107
|
+
- publish
|
108
|
+
|
109
|
+
variables:
|
110
|
+
DOTNET_VERSION: "8.0.x"
|
111
|
+
PROJECT_PATH: "source/#{project_name}/#{project_name}.csproj"
|
112
|
+
BUILD_CONFIGURATION: "Release"
|
113
|
+
TEST_RESULTS_DIR: "test-results"
|
114
|
+
COVERAGE_DIR: "coverage"
|
115
|
+
PACKAGE_DIR: "artifacts/packages"
|
116
|
+
|
117
|
+
# Cache NuGet packages between jobs
|
118
|
+
cache:
|
119
|
+
paths:
|
120
|
+
- "**/bin/"
|
121
|
+
- "**/obj/"
|
122
|
+
- "**/packages/"
|
123
|
+
- "~/.nuget/packages/"
|
124
|
+
|
125
|
+
# Build job
|
126
|
+
build:
|
127
|
+
stage: build
|
128
|
+
image: mcr.microsoft.com/dotnet/sdk:8.0
|
129
|
+
script:
|
130
|
+
- echo "Building #{project_name} class library..."
|
131
|
+
- dotnet --version
|
132
|
+
- dotnet restore $PROJECT_PATH
|
133
|
+
- dotnet build $PROJECT_PATH --configuration $BUILD_CONFIGURATION --no-restore
|
134
|
+
- echo "Class library build completed successfully!"
|
135
|
+
artifacts:
|
136
|
+
paths:
|
137
|
+
- "**/bin/"
|
138
|
+
- "**/obj/"
|
139
|
+
expire_in: 1 week
|
140
|
+
when: on_success
|
141
|
+
rules:
|
142
|
+
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
143
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
144
|
+
- if: $CI_COMMIT_TAG
|
145
|
+
|
146
|
+
# Test job
|
147
|
+
test:
|
148
|
+
stage: test
|
149
|
+
image: mcr.microsoft.com/dotnet/sdk:8.0
|
150
|
+
dependencies:
|
151
|
+
- build
|
152
|
+
script:
|
153
|
+
- echo "Testing #{project_name} class library..."
|
154
|
+
- dotnet test $PROJECT_PATH --configuration $BUILD_CONFIGURATION --no-build --verbosity normal
|
155
|
+
- echo "Class library tests completed successfully!"
|
156
|
+
artifacts:
|
157
|
+
paths:
|
158
|
+
- $TEST_RESULTS_DIR/
|
159
|
+
- $COVERAGE_DIR/
|
160
|
+
reports:
|
161
|
+
junit: $TEST_RESULTS_DIR/*.xml
|
162
|
+
expire_in: 1 week
|
163
|
+
when: always
|
164
|
+
rules:
|
165
|
+
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
166
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
167
|
+
- if: $CI_COMMIT_TAG
|
168
|
+
|
169
|
+
# Pack job
|
170
|
+
pack:
|
171
|
+
stage: pack
|
172
|
+
image: mcr.microsoft.com/dotnet/sdk:8.0
|
173
|
+
dependencies:
|
174
|
+
- test
|
175
|
+
script:
|
176
|
+
- echo "Packing #{project_name} class library..."
|
177
|
+
- mkdir -p $PACKAGE_DIR
|
178
|
+
- dotnet pack $PROJECT_PATH --configuration $BUILD_CONFIGURATION --output $PACKAGE_DIR
|
179
|
+
- echo "Pack completed successfully!"
|
180
|
+
artifacts:
|
181
|
+
paths:
|
182
|
+
- $PACKAGE_DIR/
|
183
|
+
expire_in: 1 month
|
184
|
+
when: on_success
|
185
|
+
rules:
|
186
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
187
|
+
- if: $CI_COMMIT_TAG
|
188
|
+
|
189
|
+
# Publish job (only on tags)
|
190
|
+
publish:
|
191
|
+
stage: publish
|
192
|
+
image: mcr.microsoft.com/dotnet/sdk:8.0
|
193
|
+
dependencies:
|
194
|
+
- pack
|
195
|
+
script:
|
196
|
+
- echo "Publishing #{project_name} class library package..."
|
197
|
+
- dotnet nuget push $PACKAGE_DIR/*.nupkg --api-key $NUGET_API_KEY --source $NUGET_SOURCE
|
198
|
+
- echo "Publish completed successfully!"
|
199
|
+
rules:
|
200
|
+
- if: $CI_COMMIT_TAG
|
201
|
+
|
202
|
+
# Code quality job (optional)
|
203
|
+
code_quality:
|
204
|
+
stage: test
|
205
|
+
image: mcr.microsoft.com/dotnet/sdk:8.0
|
206
|
+
dependencies:
|
207
|
+
- build
|
208
|
+
script:
|
209
|
+
- echo "Running code quality checks..."
|
210
|
+
- dotnet tool install --global dotnet-format
|
211
|
+
- dotnet format --verify-no-changes $PROJECT_PATH
|
212
|
+
- echo "Code quality checks completed!"
|
213
|
+
allow_failure: true
|
214
|
+
rules:
|
215
|
+
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
216
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
217
|
+
|
218
|
+
# Security scan job (optional)
|
219
|
+
security_scan:
|
220
|
+
stage: test
|
221
|
+
image: mcr.microsoft.com/dotnet/sdk:8.0
|
222
|
+
dependencies:
|
223
|
+
- build
|
224
|
+
script:
|
225
|
+
- echo "Running security scan..."
|
226
|
+
- dotnet tool install --global dotnet-outdated-tool
|
227
|
+
- dotnet outdated $PROJECT_PATH
|
228
|
+
- echo "Security scan completed!"
|
229
|
+
allow_failure: true
|
230
|
+
rules:
|
231
|
+
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
232
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
233
|
+
YAML
|
234
|
+
|
235
|
+
File.write(".gitlab-ci.yml", gitlab_ci_content)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
@@ -0,0 +1,264 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Makit
|
4
|
+
class DotNet
|
5
|
+
class SolutionConsole
|
6
|
+
def self.setup(name)
|
7
|
+
Makit::DotNet::Project.new_project("console", name, "source/#{name}", "--framework net8.0")
|
8
|
+
Makit::DotNet::Project.new_project("TUnit", "#{name}.Tests", "tests/#{name}")
|
9
|
+
Makit::DotNet::Project.add_reference("tests/#{name}/#{name}.Tests.csproj", "source/#{name}/#{name}.csproj")
|
10
|
+
|
11
|
+
# Generate additional project files
|
12
|
+
generate_rakefile(name)
|
13
|
+
generate_gitlab_ci(name)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.generate_rakefile(project_name)
|
17
|
+
rakefile_content = <<~RUBY
|
18
|
+
# frozen_string_literal: true
|
19
|
+
|
20
|
+
require "makit"
|
21
|
+
|
22
|
+
#
|
23
|
+
# #{project_name} Console Application Project Rakefile
|
24
|
+
#
|
25
|
+
desc "default task - builds and tests the console application"
|
26
|
+
task :default => [:build, :test]
|
27
|
+
|
28
|
+
desc "build the #{project_name} console application"
|
29
|
+
task :build do
|
30
|
+
puts "Building #{project_name} console application..."
|
31
|
+
project_path = "source/#{project_name}/#{project_name}.csproj"
|
32
|
+
#{" "}
|
33
|
+
if File.exist?(project_path)
|
34
|
+
sh "dotnet build \#{project_path} --configuration Release"
|
35
|
+
puts "Console application build completed successfully!"
|
36
|
+
else
|
37
|
+
puts "Error: Project file not found at \#{project_path}"
|
38
|
+
exit 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "test the #{project_name} console application"
|
43
|
+
task :test do
|
44
|
+
puts "Testing #{project_name} console application..."
|
45
|
+
project_path = "source/#{project_name}/#{project_name}.csproj"
|
46
|
+
#{" "}
|
47
|
+
if File.exist?(project_path)
|
48
|
+
sh "dotnet test \#{project_path} --configuration Release --verbosity normal"
|
49
|
+
puts "Console application tests completed successfully!"
|
50
|
+
else
|
51
|
+
puts "Error: Project file not found at \#{project_path}"
|
52
|
+
exit 1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
desc "run the #{project_name} console application"
|
57
|
+
task :run => [:build] do
|
58
|
+
puts "Running #{project_name} console application..."
|
59
|
+
project_path = "source/#{project_name}/#{project_name}.csproj"
|
60
|
+
#{" "}
|
61
|
+
if File.exist?(project_path)
|
62
|
+
sh "dotnet run --project \#{project_path} --configuration Release"
|
63
|
+
else
|
64
|
+
puts "Error: Project file not found at \#{project_path}"
|
65
|
+
exit 1
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
desc "clean build artifacts"
|
70
|
+
task :clean do
|
71
|
+
puts "Cleaning console application build artifacts..."
|
72
|
+
sh "dotnet clean source/#{project_name}/#{project_name}.csproj"
|
73
|
+
puts "Clean completed successfully!"
|
74
|
+
end
|
75
|
+
|
76
|
+
desc "restore packages"
|
77
|
+
task :restore do
|
78
|
+
puts "Restoring console application packages..."
|
79
|
+
sh "dotnet restore source/#{project_name}/#{project_name}.csproj"
|
80
|
+
puts "Restore completed successfully!"
|
81
|
+
end
|
82
|
+
|
83
|
+
desc "publish the console application"
|
84
|
+
task :publish do
|
85
|
+
puts "Publishing #{project_name} console application..."
|
86
|
+
output_dir = "artifacts/publish/#{project_name}"
|
87
|
+
FileUtils.mkdir_p(output_dir)
|
88
|
+
sh "dotnet publish source/#{project_name}/#{project_name}.csproj --configuration Release --output \#{output_dir}"
|
89
|
+
puts "Publish completed successfully! Output: \#{output_dir}"
|
90
|
+
end
|
91
|
+
|
92
|
+
desc "create self-contained deployment"
|
93
|
+
task :publish_self_contained do
|
94
|
+
puts "Creating self-contained deployment for #{project_name}..."
|
95
|
+
output_dir = "artifacts/publish/#{project_name}-self-contained"
|
96
|
+
FileUtils.mkdir_p(output_dir)
|
97
|
+
#{" "}
|
98
|
+
# Publish for multiple runtimes
|
99
|
+
runtimes = ["linux-x64", "osx-x64", "win-x64"]
|
100
|
+
runtimes.each do |runtime|
|
101
|
+
runtime_output = "\#{output_dir}/\#{runtime}"
|
102
|
+
puts "Publishing for \#{runtime}..."
|
103
|
+
sh "dotnet publish source/#{project_name}/#{project_name}.csproj --configuration Release --runtime \#{runtime} --self-contained true --output \#{runtime_output}"
|
104
|
+
end
|
105
|
+
#{" "}
|
106
|
+
puts "Self-contained deployment completed successfully! Output: \#{output_dir}"
|
107
|
+
end
|
108
|
+
RUBY
|
109
|
+
|
110
|
+
File.write("Rakefile", rakefile_content)
|
111
|
+
end
|
112
|
+
|
113
|
+
def self.generate_gitlab_ci(project_name)
|
114
|
+
gitlab_ci_content = <<~YAML
|
115
|
+
# #{project_name} Console Application Project GitLab CI/CD Pipeline
|
116
|
+
# frozen_string_literal: true
|
117
|
+
|
118
|
+
stages:
|
119
|
+
- build
|
120
|
+
- test
|
121
|
+
- publish
|
122
|
+
|
123
|
+
variables:
|
124
|
+
DOTNET_VERSION: "8.0.x"
|
125
|
+
PROJECT_PATH: "source/#{project_name}/#{project_name}.csproj"
|
126
|
+
BUILD_CONFIGURATION: "Release"
|
127
|
+
TEST_RESULTS_DIR: "test-results"
|
128
|
+
COVERAGE_DIR: "coverage"
|
129
|
+
PUBLISH_DIR: "artifacts/publish"
|
130
|
+
|
131
|
+
# Cache NuGet packages between jobs
|
132
|
+
cache:
|
133
|
+
paths:
|
134
|
+
- "**/bin/"
|
135
|
+
- "**/obj/"
|
136
|
+
- "**/packages/"
|
137
|
+
- "~/.nuget/packages/"
|
138
|
+
|
139
|
+
# Build job
|
140
|
+
build:
|
141
|
+
stage: build
|
142
|
+
image: mcr.microsoft.com/dotnet/sdk:8.0
|
143
|
+
script:
|
144
|
+
- echo "Building #{project_name} console application..."
|
145
|
+
- dotnet --version
|
146
|
+
- dotnet restore $PROJECT_PATH
|
147
|
+
- dotnet build $PROJECT_PATH --configuration $BUILD_CONFIGURATION --no-restore
|
148
|
+
- echo "Console application build completed successfully!"
|
149
|
+
artifacts:
|
150
|
+
paths:
|
151
|
+
- "**/bin/"
|
152
|
+
- "**/obj/"
|
153
|
+
expire_in: 1 week
|
154
|
+
when: on_success
|
155
|
+
rules:
|
156
|
+
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
157
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
158
|
+
- if: $CI_COMMIT_TAG
|
159
|
+
|
160
|
+
# Test job
|
161
|
+
test:
|
162
|
+
stage: test
|
163
|
+
image: mcr.microsoft.com/dotnet/sdk:8.0
|
164
|
+
dependencies:
|
165
|
+
- build
|
166
|
+
script:
|
167
|
+
- echo "Testing #{project_name} console application..."
|
168
|
+
- dotnet test $PROJECT_PATH --configuration $BUILD_CONFIGURATION --no-build --verbosity normal
|
169
|
+
- echo "Console application tests completed successfully!"
|
170
|
+
artifacts:
|
171
|
+
paths:
|
172
|
+
- $TEST_RESULTS_DIR/
|
173
|
+
- $COVERAGE_DIR/
|
174
|
+
reports:
|
175
|
+
junit: $TEST_RESULTS_DIR/*.xml
|
176
|
+
expire_in: 1 week
|
177
|
+
when: always
|
178
|
+
rules:
|
179
|
+
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
180
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
181
|
+
- if: $CI_COMMIT_TAG
|
182
|
+
|
183
|
+
# Publish job
|
184
|
+
publish:
|
185
|
+
stage: publish
|
186
|
+
image: mcr.microsoft.com/dotnet/sdk:8.0
|
187
|
+
dependencies:
|
188
|
+
- test
|
189
|
+
script:
|
190
|
+
- echo "Publishing #{project_name} console application..."
|
191
|
+
- mkdir -p $PUBLISH_DIR
|
192
|
+
- dotnet publish $PROJECT_PATH --configuration $BUILD_CONFIGURATION --output $PUBLISH_DIR/#{project_name}
|
193
|
+
- echo "Publish completed successfully!"
|
194
|
+
artifacts:
|
195
|
+
paths:
|
196
|
+
- $PUBLISH_DIR/
|
197
|
+
expire_in: 1 month
|
198
|
+
when: on_success
|
199
|
+
rules:
|
200
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
201
|
+
- if: $CI_COMMIT_TAG
|
202
|
+
|
203
|
+
# Multi-platform publish job (only on tags)
|
204
|
+
publish_multi_platform:
|
205
|
+
stage: publish
|
206
|
+
image: mcr.microsoft.com/dotnet/sdk:8.0
|
207
|
+
dependencies:
|
208
|
+
- test
|
209
|
+
script:
|
210
|
+
- echo "Creating multi-platform deployment for #{project_name}..."
|
211
|
+
- mkdir -p $PUBLISH_DIR
|
212
|
+
- |
|
213
|
+
runtimes=("linux-x64" "osx-x64" "win-x64")
|
214
|
+
for runtime in "${runtimes[@]}"; do
|
215
|
+
echo "Publishing for $runtime..."
|
216
|
+
dotnet publish $PROJECT_PATH --configuration $BUILD_CONFIGURATION --runtime $runtime --self-contained true --output $PUBLISH_DIR/#{project_name}-$runtime
|
217
|
+
done
|
218
|
+
- echo "Multi-platform deployment completed successfully!"
|
219
|
+
artifacts:
|
220
|
+
paths:
|
221
|
+
- $PUBLISH_DIR/
|
222
|
+
expire_in: 1 month
|
223
|
+
when: on_success
|
224
|
+
rules:
|
225
|
+
- if: $CI_COMMIT_TAG
|
226
|
+
|
227
|
+
# Code quality job (optional)
|
228
|
+
code_quality:
|
229
|
+
stage: test
|
230
|
+
image: mcr.microsoft.com/dotnet/sdk:8.0
|
231
|
+
dependencies:
|
232
|
+
- build
|
233
|
+
script:
|
234
|
+
- echo "Running code quality checks..."
|
235
|
+
- dotnet tool install --global dotnet-format
|
236
|
+
- dotnet format --verify-no-changes $PROJECT_PATH
|
237
|
+
- echo "Code quality checks completed!"
|
238
|
+
allow_failure: true
|
239
|
+
rules:
|
240
|
+
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
241
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
242
|
+
|
243
|
+
# Security scan job (optional)
|
244
|
+
security_scan:
|
245
|
+
stage: test
|
246
|
+
image: mcr.microsoft.com/dotnet/sdk:8.0
|
247
|
+
dependencies:
|
248
|
+
- build
|
249
|
+
script:
|
250
|
+
- echo "Running security scan..."
|
251
|
+
- dotnet tool install --global dotnet-outdated-tool
|
252
|
+
- dotnet outdated $PROJECT_PATH
|
253
|
+
- echo "Security scan completed!"
|
254
|
+
allow_failure: true
|
255
|
+
rules:
|
256
|
+
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
257
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
258
|
+
YAML
|
259
|
+
|
260
|
+
File.write(".gitlab-ci.yml", gitlab_ci_content)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
end
|