Compare commits
33
Commits
b08e891020
..
1.14
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f084ff97e5 | ||
|
|
d1020581cf | ||
|
|
f715c50306 | ||
|
|
7fc448d525 | ||
|
|
fcd8c2ede7 | ||
|
|
8f48e11738 | ||
|
|
9ae11b9b03 | ||
|
|
a44dcdb8f8 | ||
|
|
56f967c6e4 | ||
|
|
bb42713fb2 | ||
|
|
58312d489b | ||
|
|
3beebe16d3 | ||
|
|
6757eb342e | ||
|
|
5ace2129e1 | ||
|
|
e0a98bee0b | ||
|
|
c6f64b78aa | ||
|
|
967130e724 | ||
|
|
2bf2d79739 | ||
|
|
6cee984d7b | ||
|
|
664bbd858b | ||
|
|
2b826189e0 | ||
|
|
c36ff28a84 | ||
|
|
5c0d8430f6 | ||
|
|
0c24613dd3 | ||
|
|
3b74138e9c | ||
|
|
8bcd0f60c3 | ||
|
|
ccf49d79fc | ||
|
|
186c4b1e85 | ||
|
|
359e50704a | ||
|
|
98f46b5e13 | ||
|
|
783d234c84 | ||
|
|
9d9cb3761a | ||
|
|
bd109abb26 |
+27
-14
@@ -7,14 +7,14 @@ steps:
|
|||||||
- name: dotnet-build
|
- name: dotnet-build
|
||||||
image: mcr.microsoft.com/dotnet/sdk:10.0
|
image: mcr.microsoft.com/dotnet/sdk:10.0
|
||||||
commands:
|
commands:
|
||||||
- dotnet restore LiteCharms.slnx
|
- dotnet restore LiteCharmsShop.slnx
|
||||||
- dotnet build LiteCharms.slnx -c Release
|
- dotnet build LiteCharmsShop.slnx -c Release
|
||||||
|
|
||||||
- name: dotnet-test
|
- name: dotnet-test
|
||||||
image: mcr.microsoft.com/dotnet/sdk:10.0
|
image: mcr.microsoft.com/dotnet/sdk:10.0
|
||||||
commands:
|
commands:
|
||||||
- dotnet restore LiteCharms.slnx
|
- dotnet restore LiteCharmsShop.slnx
|
||||||
- dotnet test LiteCharms.slnx -c Release --no-restore
|
- dotnet test LiteCharmsShop.slnx -c Release --no-restore
|
||||||
|
|
||||||
trigger:
|
trigger:
|
||||||
event: [ pull_request ]
|
event: [ pull_request ]
|
||||||
@@ -29,24 +29,39 @@ steps:
|
|||||||
image: plugins/docker
|
image: plugins/docker
|
||||||
settings:
|
settings:
|
||||||
registry: nexus.khongisa.co.za
|
registry: nexus.khongisa.co.za
|
||||||
repo: nexus.khongisa.co.za/litecharms-leadgenerator
|
repo: nexus.khongisa.co.za/litecharms-shop
|
||||||
tags: [ latest, "1.${DRONE_BUILD_NUMBER}" ]
|
tags: [ latest, "1.${DRONE_BUILD_NUMBER}" ]
|
||||||
|
custom_labels:
|
||||||
|
- org.opencontainers.image.source=https://gitea.khongisa.co.za/litecharms/litecharms-shop
|
||||||
|
- org.opencontainers.image.version=1.${DRONE_BUILD_NUMBER}
|
||||||
|
- org.opencontainers.image.revision=${DRONE_COMMIT_SHA}
|
||||||
username: { from_secret: docker_username }
|
username: { from_secret: docker_username }
|
||||||
password: { from_secret: docker_password }
|
password: { from_secret: docker_password }
|
||||||
dockerfile: shop/Dockerfile
|
|
||||||
context: .
|
|
||||||
|
|
||||||
- name: gitea-tag
|
- name: gitea-tag-release
|
||||||
image: alpine/git
|
image: alpine/git
|
||||||
environment:
|
environment:
|
||||||
|
GITEA_TOKEN: { from_secret: git_token }
|
||||||
GITEA_USER: { from_secret: git_username }
|
GITEA_USER: { from_secret: git_username }
|
||||||
GITEA_PASS: { from_secret: git_password }
|
GITEA_PASS: { from_secret: git_password }
|
||||||
commands:
|
commands:
|
||||||
- git config --global user.email "drone@litecharms.co.za"
|
- echo "169.255.58.144 gitea.khongisa.co.za" >> /etc/hosts
|
||||||
- git config --global user.name "Drone CI"
|
- apk add --no-cache curl
|
||||||
- git remote set-url origin https://$${GITEA_USER}:$${GITEA_PASS}@gitea.khongisa.co.za/litecharms/leadgenerator.git
|
- git remote set-url origin https://$${GITEA_USER}:$${GITEA_PASS}@gitea.khongisa.co.za/litecharms/litecharmsshop.git
|
||||||
- git tag 1.${DRONE_BUILD_NUMBER}
|
- git tag 1.${DRONE_BUILD_NUMBER}
|
||||||
- git push origin 1.${DRONE_BUILD_NUMBER}
|
- git push origin 1.${DRONE_BUILD_NUMBER}
|
||||||
|
- |
|
||||||
|
curl -X POST "https://gitea.khongisa.co.za/api/v1/repos/litecharms/litecharmsshop/releases" \
|
||||||
|
-H "Authorization: token $${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{
|
||||||
|
\"tag_name\": \"1.${DRONE_BUILD_NUMBER}\",
|
||||||
|
\"target_commitish\": \"${DRONE_COMMIT_SHA}\",
|
||||||
|
\"name\": \"Release 1.${DRONE_BUILD_NUMBER}\",
|
||||||
|
\"body\": \"### Artifacts\n* **Docker Image:** nexus.khongisa.co.za/litecharms-shop:1.${DRONE_BUILD_NUMBER}\n* **NuGet:** [View on Nexus](https://nexus.khongisa.co.za/repository/nuget-group/)\",
|
||||||
|
\"draft\": false,
|
||||||
|
\"prerelease\": false
|
||||||
|
}"
|
||||||
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- build
|
- build
|
||||||
@@ -67,8 +82,7 @@ steps:
|
|||||||
commands:
|
commands:
|
||||||
- mkdir -p $HOME/.kube
|
- mkdir -p $HOME/.kube
|
||||||
- echo "$KUBE_CONFIG" > $HOME/.kube/config
|
- echo "$KUBE_CONFIG" > $HOME/.kube/config
|
||||||
- kubectl apply -f shop/litecharms-shop-uat.yml
|
- kubectl apply -f litecharms-shop-uat.yml
|
||||||
- kubectl rollout restart deployment/litecharms-leadgenerator -n litecharms-shop-uat
|
|
||||||
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- package
|
- package
|
||||||
@@ -90,7 +104,6 @@ steps:
|
|||||||
- mkdir -p $HOME/.kube
|
- mkdir -p $HOME/.kube
|
||||||
- echo "$KUBE_CONFIG" > $HOME/.kube/config
|
- echo "$KUBE_CONFIG" > $HOME/.kube/config
|
||||||
- kubectl apply -f litecharms-shop.yml
|
- kubectl apply -f litecharms-shop.yml
|
||||||
- kubectl rollout restart shop/deployment/litecharms-leadgenerator -n litecharms-shop
|
|
||||||
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- uat
|
- uat
|
||||||
|
|||||||
+248
@@ -0,0 +1,248 @@
|
|||||||
|
# Remove the line below if you want to inherit .editorconfig settings from higher directories
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# C# files
|
||||||
|
[*.cs]
|
||||||
|
|
||||||
|
#### Core EditorConfig Options ####
|
||||||
|
|
||||||
|
# Indentation and spacing
|
||||||
|
indent_size = 4
|
||||||
|
indent_style = space
|
||||||
|
tab_width = 4
|
||||||
|
|
||||||
|
# New line preferences
|
||||||
|
end_of_line = crlf
|
||||||
|
insert_final_newline = false
|
||||||
|
|
||||||
|
#### .NET Code Actions ####
|
||||||
|
|
||||||
|
# Type members
|
||||||
|
dotnet_hide_advanced_members = false
|
||||||
|
dotnet_member_insertion_location = with_other_members_of_the_same_kind
|
||||||
|
dotnet_property_generation_behavior = prefer_throwing_properties
|
||||||
|
|
||||||
|
# Symbol search
|
||||||
|
dotnet_search_reference_assemblies = true
|
||||||
|
|
||||||
|
#### .NET Coding Conventions ####
|
||||||
|
|
||||||
|
# Organize usings
|
||||||
|
dotnet_separate_import_directive_groups = false
|
||||||
|
dotnet_sort_system_directives_first = false
|
||||||
|
file_header_template = unset
|
||||||
|
|
||||||
|
# this. and Me. preferences
|
||||||
|
dotnet_style_qualification_for_event = false
|
||||||
|
dotnet_style_qualification_for_field = false
|
||||||
|
dotnet_style_qualification_for_method = false
|
||||||
|
dotnet_style_qualification_for_property = false
|
||||||
|
|
||||||
|
# Language keywords vs BCL types preferences
|
||||||
|
dotnet_style_predefined_type_for_locals_parameters_members = true
|
||||||
|
dotnet_style_predefined_type_for_member_access = true
|
||||||
|
|
||||||
|
# Parentheses preferences
|
||||||
|
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
|
||||||
|
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
|
||||||
|
dotnet_style_parentheses_in_other_operators = never_if_unnecessary
|
||||||
|
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
|
||||||
|
|
||||||
|
# Modifier preferences
|
||||||
|
dotnet_style_require_accessibility_modifiers = for_non_interface_members
|
||||||
|
|
||||||
|
# Expression-level preferences
|
||||||
|
dotnet_prefer_system_hash_code = true
|
||||||
|
dotnet_style_coalesce_expression = true
|
||||||
|
dotnet_style_collection_initializer = true
|
||||||
|
dotnet_style_explicit_tuple_names = true
|
||||||
|
dotnet_style_namespace_match_folder = true
|
||||||
|
dotnet_style_null_propagation = true
|
||||||
|
dotnet_style_object_initializer = true
|
||||||
|
dotnet_style_operator_placement_when_wrapping = beginning_of_line
|
||||||
|
dotnet_style_prefer_auto_properties = true
|
||||||
|
dotnet_style_prefer_collection_expression = when_types_loosely_match
|
||||||
|
dotnet_style_prefer_compound_assignment = true
|
||||||
|
dotnet_style_prefer_conditional_expression_over_assignment = true
|
||||||
|
dotnet_style_prefer_conditional_expression_over_return = true
|
||||||
|
dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed
|
||||||
|
dotnet_style_prefer_inferred_anonymous_type_member_names = true
|
||||||
|
dotnet_style_prefer_inferred_tuple_names = true
|
||||||
|
dotnet_style_prefer_is_null_check_over_reference_equality_method = true
|
||||||
|
dotnet_style_prefer_non_hidden_explicit_cast_in_source = true
|
||||||
|
dotnet_style_prefer_simplified_boolean_expressions = true
|
||||||
|
dotnet_style_prefer_simplified_interpolation = true
|
||||||
|
|
||||||
|
# Field preferences
|
||||||
|
dotnet_style_readonly_field = true
|
||||||
|
|
||||||
|
# Parameter preferences
|
||||||
|
dotnet_code_quality_unused_parameters = all
|
||||||
|
|
||||||
|
# Suppression preferences
|
||||||
|
dotnet_remove_unnecessary_suppression_exclusions = none
|
||||||
|
|
||||||
|
# New line preferences
|
||||||
|
dotnet_style_allow_multiple_blank_lines_experimental = true
|
||||||
|
dotnet_style_allow_statement_immediately_after_block_experimental = true
|
||||||
|
|
||||||
|
#### C# Coding Conventions ####
|
||||||
|
|
||||||
|
# var preferences
|
||||||
|
csharp_style_var_elsewhere = false
|
||||||
|
csharp_style_var_for_built_in_types = false
|
||||||
|
csharp_style_var_when_type_is_apparent = false
|
||||||
|
|
||||||
|
# Expression-bodied members
|
||||||
|
csharp_style_expression_bodied_accessors = true
|
||||||
|
csharp_style_expression_bodied_constructors = false
|
||||||
|
csharp_style_expression_bodied_indexers = true
|
||||||
|
csharp_style_expression_bodied_lambdas = true
|
||||||
|
csharp_style_expression_bodied_local_functions = true
|
||||||
|
csharp_style_expression_bodied_methods = false
|
||||||
|
csharp_style_expression_bodied_operators = false
|
||||||
|
csharp_style_expression_bodied_properties = true
|
||||||
|
|
||||||
|
# Pattern matching preferences
|
||||||
|
csharp_style_pattern_matching_over_as_with_null_check = true
|
||||||
|
csharp_style_pattern_matching_over_is_with_cast_check = true
|
||||||
|
csharp_style_prefer_extended_property_pattern = true
|
||||||
|
csharp_style_prefer_not_pattern = true
|
||||||
|
csharp_style_prefer_pattern_matching = true
|
||||||
|
csharp_style_prefer_switch_expression = true
|
||||||
|
|
||||||
|
# Null-checking preferences
|
||||||
|
csharp_style_conditional_delegate_call = true
|
||||||
|
|
||||||
|
# Modifier preferences
|
||||||
|
csharp_prefer_static_anonymous_function = true
|
||||||
|
csharp_prefer_static_local_function = true
|
||||||
|
csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async
|
||||||
|
csharp_style_prefer_readonly_struct = true
|
||||||
|
csharp_style_prefer_readonly_struct_member = true
|
||||||
|
|
||||||
|
# Code-block preferences
|
||||||
|
csharp_prefer_braces = true
|
||||||
|
csharp_prefer_simple_using_statement = true
|
||||||
|
csharp_prefer_system_threading_lock = true
|
||||||
|
csharp_style_namespace_declarations = block_scoped
|
||||||
|
csharp_style_prefer_method_group_conversion = true
|
||||||
|
csharp_style_prefer_primary_constructors = true
|
||||||
|
csharp_style_prefer_simple_property_accessors = true
|
||||||
|
csharp_style_prefer_top_level_statements = true
|
||||||
|
|
||||||
|
# Expression-level preferences
|
||||||
|
csharp_prefer_simple_default_expression = true
|
||||||
|
csharp_style_deconstructed_variable_declaration = true
|
||||||
|
csharp_style_implicit_object_creation_when_type_is_apparent = true
|
||||||
|
csharp_style_inlined_variable_declaration = true
|
||||||
|
csharp_style_prefer_implicitly_typed_lambda_expression = true
|
||||||
|
csharp_style_prefer_index_operator = true
|
||||||
|
csharp_style_prefer_local_over_anonymous_function = true
|
||||||
|
csharp_style_prefer_null_check_over_type_check = true
|
||||||
|
csharp_style_prefer_range_operator = true
|
||||||
|
csharp_style_prefer_tuple_swap = true
|
||||||
|
csharp_style_prefer_unbound_generic_type_in_nameof = true
|
||||||
|
csharp_style_prefer_utf8_string_literals = true
|
||||||
|
csharp_style_throw_expression = true
|
||||||
|
csharp_style_unused_value_assignment_preference = discard_variable
|
||||||
|
csharp_style_unused_value_expression_statement_preference = discard_variable
|
||||||
|
|
||||||
|
# 'using' directive preferences
|
||||||
|
csharp_using_directive_placement = outside_namespace
|
||||||
|
|
||||||
|
# New line preferences
|
||||||
|
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
|
||||||
|
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true
|
||||||
|
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true
|
||||||
|
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true
|
||||||
|
csharp_style_allow_embedded_statements_on_same_line_experimental = true
|
||||||
|
|
||||||
|
#### C# Formatting Rules ####
|
||||||
|
|
||||||
|
# New line preferences
|
||||||
|
csharp_new_line_before_catch = true
|
||||||
|
csharp_new_line_before_else = true
|
||||||
|
csharp_new_line_before_finally = true
|
||||||
|
csharp_new_line_before_members_in_anonymous_types = true
|
||||||
|
csharp_new_line_before_members_in_object_initializers = true
|
||||||
|
csharp_new_line_before_open_brace = all
|
||||||
|
csharp_new_line_between_query_expression_clauses = true
|
||||||
|
|
||||||
|
# Indentation preferences
|
||||||
|
csharp_indent_block_contents = true
|
||||||
|
csharp_indent_braces = false
|
||||||
|
csharp_indent_case_contents = true
|
||||||
|
csharp_indent_case_contents_when_block = true
|
||||||
|
csharp_indent_labels = one_less_than_current
|
||||||
|
csharp_indent_switch_labels = true
|
||||||
|
|
||||||
|
# Space preferences
|
||||||
|
csharp_space_after_cast = false
|
||||||
|
csharp_space_after_colon_in_inheritance_clause = true
|
||||||
|
csharp_space_after_comma = true
|
||||||
|
csharp_space_after_dot = false
|
||||||
|
csharp_space_after_keywords_in_control_flow_statements = true
|
||||||
|
csharp_space_after_semicolon_in_for_statement = true
|
||||||
|
csharp_space_around_binary_operators = before_and_after
|
||||||
|
csharp_space_around_declaration_statements = false
|
||||||
|
csharp_space_before_colon_in_inheritance_clause = true
|
||||||
|
csharp_space_before_comma = false
|
||||||
|
csharp_space_before_dot = false
|
||||||
|
csharp_space_before_open_square_brackets = false
|
||||||
|
csharp_space_before_semicolon_in_for_statement = false
|
||||||
|
csharp_space_between_empty_square_brackets = false
|
||||||
|
csharp_space_between_method_call_empty_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_method_call_name_and_opening_parenthesis = false
|
||||||
|
csharp_space_between_method_call_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_method_declaration_name_and_open_parenthesis = false
|
||||||
|
csharp_space_between_method_declaration_parameter_list_parentheses = false
|
||||||
|
csharp_space_between_parentheses = false
|
||||||
|
csharp_space_between_square_brackets = false
|
||||||
|
|
||||||
|
# Wrapping preferences
|
||||||
|
csharp_preserve_single_line_blocks = true
|
||||||
|
csharp_preserve_single_line_statements = true
|
||||||
|
|
||||||
|
#### Naming styles ####
|
||||||
|
|
||||||
|
# Naming rules
|
||||||
|
|
||||||
|
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
|
||||||
|
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
|
||||||
|
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
|
||||||
|
|
||||||
|
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
|
||||||
|
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
|
||||||
|
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
|
||||||
|
|
||||||
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
|
||||||
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
|
||||||
|
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
|
||||||
|
|
||||||
|
# Symbol specifications
|
||||||
|
|
||||||
|
dotnet_naming_symbols.interface.applicable_kinds = interface
|
||||||
|
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.interface.required_modifiers =
|
||||||
|
|
||||||
|
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
|
||||||
|
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.types.required_modifiers =
|
||||||
|
|
||||||
|
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
|
||||||
|
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||||
|
dotnet_naming_symbols.non_field_members.required_modifiers =
|
||||||
|
|
||||||
|
# Naming styles
|
||||||
|
|
||||||
|
dotnet_naming_style.pascal_case.required_prefix =
|
||||||
|
dotnet_naming_style.pascal_case.required_suffix =
|
||||||
|
dotnet_naming_style.pascal_case.word_separator =
|
||||||
|
dotnet_naming_style.pascal_case.capitalization = pascal_case
|
||||||
|
|
||||||
|
dotnet_naming_style.begins_with_i.required_prefix = I
|
||||||
|
dotnet_naming_style.begins_with_i.required_suffix =
|
||||||
|
dotnet_naming_style.begins_with_i.word_separator =
|
||||||
|
dotnet_naming_style.begins_with_i.capitalization = pascal_case
|
||||||
+5
-10
@@ -2,24 +2,19 @@
|
|||||||
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
|
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY ["../nuget.config", "./"]
|
COPY ["nuget.config", "./"]
|
||||||
COPY ["../LeadGenerator/LeadGenerator.csproj", "LeadGenerator/"]
|
COPY ["Shop/Shop.csproj", "Shop/"]
|
||||||
RUN dotnet restore "LeadGenerator/LeadGenerator.csproj" --configfile nuget.config
|
RUN dotnet restore "Shop/Shop.csproj" --configfile nuget.config
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN dotnet publish "../LeadGenerator/LeadGenerator.csproj" -c Release -o /app/publish /p:UseAppHost=false
|
RUN dotnet publish "Shop/Shop.csproj" -c Release -o /app/publish /p:UseAppHost=false
|
||||||
|
|
||||||
# Stage 2: Final Image
|
# Stage 2: Final Image
|
||||||
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final
|
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
RUN addgroup --system --gid 1000 appgroup && \
|
|
||||||
adduser --system --uid 1000 --ingroup appgroup appuser
|
|
||||||
|
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
EXPOSE 8081
|
EXPOSE 8081
|
||||||
|
|
||||||
COPY --from=build /app/publish .
|
COPY --from=build /app/publish .
|
||||||
|
|
||||||
RUN chown -R appuser:appgroup /app
|
ENTRYPOINT ["dotnet", "Shop.dll"]
|
||||||
USER appuser
|
|
||||||
|
|
||||||
ENTRYPOINT ["dotnet", "LeadGenerator.dll"]
|
|
||||||
@@ -1,3 +1,8 @@
|
|||||||
<Solution>
|
<Solution>
|
||||||
|
<Folder Name="/Solution Items/">
|
||||||
|
<File Path=".drone.yml" />
|
||||||
|
<File Path="Dockerfile" />
|
||||||
|
<File Path="litecharms-shop-uat.yml" />
|
||||||
|
</Folder>
|
||||||
<Project Path="Shop/Shop.csproj" Id="1a1797db-15c0-469d-bfcf-c0847dd0b5fc" />
|
<Project Path="Shop/Shop.csproj" Id="1a1797db-15c0-469d-bfcf-c0847dd0b5fc" />
|
||||||
</Solution>
|
</Solution>
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
# LiteCharmsShop
|
||||||
|
|
||||||
|
The primary customer-facing web application for the LiteCharms platform.
|
||||||
|
|
||||||
|
## 🏗 Architecture
|
||||||
|
* **Type:** Kubernetes Deployment
|
||||||
|
* **Scale:** Horizontal scaling enabled via `replicas`.
|
||||||
|
* **Ingress:** Managed via `IngressRouter` for external traffic routing.
|
||||||
|
|
||||||
|
## 🚀 CI/CD Workflow
|
||||||
|
* **Trigger:** Pull Request to `master`.
|
||||||
|
* **Build:** Compiles .NET 10.0 source.
|
||||||
|
* **Containerize:** Docker image pushed to Nexus as `litecharms-scheduler:1.${DRONE_BUILD_NUMBER}`.
|
||||||
|
* **Deploy:** * Updates UAT via `kubectl apply`.
|
||||||
|
* Production deployment is triggered via **Promotion** to the `production` target.
|
||||||
|
|
||||||
|
## 🌐 Endpoints
|
||||||
|
* **UAT:** `https://uat-shop.khongisa.co.za` (Internal/VPN)
|
||||||
|
* **Monitoring:** Aspire Dashboard enabled via `Monitoring__Address`.
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
using LiteCharms.Features.Utilities.Commands;
|
using LiteCharms.Features.Email.Events;
|
||||||
using LiteCharms.Models;
|
using LiteCharms.Features.Email.Models;
|
||||||
|
using LiteCharms.Features.ServiceBus.Abstractions;
|
||||||
|
using static LiteCharms.Features.ServiceBus.Constants;
|
||||||
|
|
||||||
namespace Shop.Components.Pages;
|
namespace Shop.Components.Pages;
|
||||||
|
|
||||||
public partial class Contact(ISender mediator, IToastService toastService) : IDisposable
|
public partial class Contact([FromKeyedServices(EmailServiceBus)] IEventBus emailBus, IToastService toastService) : IDisposable
|
||||||
{
|
{
|
||||||
public CancellationTokenSource TokenSource { get; set; } = new();
|
public CancellationTokenSource TokenSource { get; set; } = new();
|
||||||
|
|
||||||
@@ -13,10 +15,9 @@ public partial class Contact(ISender mediator, IToastService toastService) : IDi
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var request = SendEmailCommand.Create(Input.EmailAddress!, Input.FullName!, "shop@litecharms.co.za",
|
var notification = SendShopEmailEnquiryEvent.Create(Input.FullName!, Input.EmailAddress!, Input.EmailSubject!, Input.Message!);
|
||||||
"Khongisa Shop", Input.EmailSubject!, Input.Message!);
|
|
||||||
|
|
||||||
var result = await mediator.Send(request, TokenSource.Token);
|
var result = await emailBus.PublishAsync(notification, TokenSource.Token);
|
||||||
|
|
||||||
if (result.IsFailed)
|
if (result.IsFailed)
|
||||||
{
|
{
|
||||||
|
|||||||
+9
-6
@@ -1,6 +1,6 @@
|
|||||||
using LiteCharms.Extensions;
|
using LiteCharms.Features.Extensions;
|
||||||
using Shop.Components;
|
using Shop.Components;
|
||||||
using static LiteCharms.Abstractions.Constants;
|
using static LiteCharms.Features.Email.Extensions.Constants;
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
@@ -14,12 +14,15 @@ builder.Services.AddBlazoredToast();
|
|||||||
builder.Services.AddEndpointsApiExplorer();
|
builder.Services.AddEndpointsApiExplorer();
|
||||||
|
|
||||||
builder.Services.AddMediator();
|
builder.Services.AddMediator();
|
||||||
builder.Services.AddEmailServiceBus();
|
|
||||||
builder.Services.AddSalesServiceBus();
|
builder.Services.AddSalesServiceBus();
|
||||||
builder.Services.AddGeneralServiceBus();
|
builder.Services.AddGeneralServiceBus();
|
||||||
|
builder.Services.AddQuartzSchedulerClient(ShopSchedulerName, builder.Configuration);
|
||||||
|
|
||||||
builder.Services.AddEmailServices(builder.Configuration);
|
builder.Services.AddEmailServices(builder.Configuration);
|
||||||
builder.Services.AddLeadGeneratorDatabase(builder.Configuration);
|
builder.Services.AddEmailServiceBus();
|
||||||
builder.Services.AddQuartzSchedulerClient(LeadGeneratorSchedulerName, LeadGeneratorSchedulerInstanceId, builder.Configuration);
|
|
||||||
|
builder.Services.AddShopServices();
|
||||||
|
builder.Services.AddShopDatabase(builder.Configuration);
|
||||||
|
|
||||||
builder.Services.AddPostgresHealtchCheck();
|
builder.Services.AddPostgresHealtchCheck();
|
||||||
builder.Services.AddQuartzHealtchCheck();
|
builder.Services.AddQuartzHealtchCheck();
|
||||||
@@ -28,7 +31,7 @@ builder.Services.AddHealthChecksSupport(builder.Configuration);
|
|||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
var schedulerFactory = app.Services.GetRequiredService<ISchedulerFactory>();
|
var schedulerFactory = app.Services.GetRequiredService<ISchedulerFactory>();
|
||||||
var scheduler = await schedulerFactory.GetScheduler(LeadGeneratorSchedulerName);
|
var scheduler = await schedulerFactory.GetScheduler(ShopSchedulerName);
|
||||||
|
|
||||||
if (!scheduler!.IsStarted)
|
if (!scheduler!.IsStarted)
|
||||||
await scheduler.Start();
|
await scheduler.Start();
|
||||||
|
|||||||
+1
-3
@@ -17,9 +17,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="LiteCharms.Extensions" Version="1.11.0" />
|
<PackageReference Include="LiteCharms.Features" Version="1.25.0" />
|
||||||
<PackageReference Include="LiteCharms.Features" Version="1.11.0" />
|
|
||||||
<PackageReference Include="LiteCharms.Models" Version="1.11.0" />
|
|
||||||
<PackageReference Include="Polly" Version="8.6.6" />
|
<PackageReference Include="Polly" Version="8.6.6" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,8 @@
|
|||||||
"Logging": {
|
"Logging": {
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
"Default": "Information",
|
"Default": "Information",
|
||||||
"Microsoft.AspNetCore": "Warning"
|
"Microsoft.AspNetCore": "Warning",
|
||||||
|
"Microsoft.EntityFrameworkCore": "Error"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AllowedHosts": "*"
|
"AllowedHosts": "*"
|
||||||
|
|||||||
+15
-50
@@ -13,11 +13,7 @@ data:
|
|||||||
ASPNETCORE_ENVIRONMENT: "Development"
|
ASPNETCORE_ENVIRONMENT: "Development"
|
||||||
ASPNETCORE_URLS: "http://0.0.0.0:8080"
|
ASPNETCORE_URLS: "http://0.0.0.0:8080"
|
||||||
Monitoring__Address: "http://aspire-dashboard-service.aspire.svc.cluster.local:18889"
|
Monitoring__Address: "http://aspire-dashboard-service.aspire.svc.cluster.local:18889"
|
||||||
Monitoring__ServiceName: "LiteCharms.LeadGenerator.Uat"
|
Monitoring__ServiceName: "LiteCharms.Shop.Uat"
|
||||||
Email__Credentials__Username: "shop@litecharms.co.za"
|
|
||||||
Email__Host: "mail.litecharms.co.za"
|
|
||||||
Email__Port: "465"
|
|
||||||
Email__UseSsl: "true"
|
|
||||||
---
|
---
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Secret
|
kind: Secret
|
||||||
@@ -26,11 +22,9 @@ metadata:
|
|||||||
namespace: litecharms-shop-uat
|
namespace: litecharms-shop-uat
|
||||||
type: Opaque
|
type: Opaque
|
||||||
data:
|
data:
|
||||||
connection-string: SG9zdD0xOTIuMTY4LjEuMTcwO0RhdGFiYXNlPWxlYWRnZW5lcmF0b3ItZGV2O1VzZXJuYW1lPWxlYWRnZW5lcmF0b3I7UGFzc3dvcmQ9S2VLNDRsczRQWHBuYms7UGVyc2lzdCBTZWN1cml0eSBJbmZvPVRydWU=
|
connection-string: SG9zdD0xOTIuMTY4LjEuMTcwO0RhdGFiYXNlPXNob3AtZGV2O1VzZXJuYW1lPXNob3AtZGV2LXVzZXI7UGFzc3dvcmQ9a1ZWbW9XS0ozeHpnUVg7UGVyc2lzdCBTZWN1cml0eSBJbmZvPVRydWU=
|
||||||
discord-webhook: aHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGkvd2ViaG9va3MvMTUwMDIzMzEyOTYwNzAzNjk3MC9KYzc5endwMjlxYWpLbmoyYkR3cm5GR0RJci11ZGIyV2JIUDZTYjdpT0hCTWpQSUY3Vkw5eUVHTkJUSXpSOVVWVzI0bQ==
|
connection-string-quartz: SG9zdD0xOTIuMTY4LjEuMTcwO0RhdGFiYXNlPXNjaGVkdWxlci1kZXY7VXNlcm5hbWU9c2NoZWR1bGVyLWRldi11c2VyO1Bhc3N3b3JkPWtWVm1vV0tKM3h6Z1FYO1BlcnNpc3QgU2VjdXJpdHkgSW5mbz1UcnVl
|
||||||
aspire-apikey: bWMzRzYzSzJqNVpPRXNpMEFqTW9qTFRYbTFLRVpGY3R6SUlqU3dEaVRHdXQ4cUdTa1B1V3d4R1AxUmJzY0pVbw==
|
aspire-apikey: bWMzRzYzSzJqNVpPRXNpMEFqTW9qTFRYbTFLRVpGY3R6SUlqU3dEaVRHdXQ4cUdTa1B1V3d4R1AxUmJzY0pVbw==
|
||||||
email-password: JFpTLWVJQGlYbTVNUCRhfg==
|
|
||||||
quartz-store: SG9zdD0xOTIuMTY4LjEuMTcwO0RhdGFiYXNlPXNjaGVkdWxlci1kZXY7VXNlcm5hbWU9c2NoZWR1bGVyLWRldi11c2VyO1Bhc3N3b3JkPWtWVm1vV0tKM3h6Z1FYO1BlcnNpc3QgU2VjdXJpdHkgSW5mbz1UcnVl
|
|
||||||
---
|
---
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: PersistentVolumeClaim
|
kind: PersistentVolumeClaim
|
||||||
@@ -47,17 +41,17 @@ spec:
|
|||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: litecharms-leadgenerator
|
name: litecharms-shop
|
||||||
namespace: litecharms-shop-uat
|
namespace: litecharms-shop-uat
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 2
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: leadgenerator
|
app: shop
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: leadgenerator
|
app: shop
|
||||||
spec:
|
spec:
|
||||||
affinity:
|
affinity:
|
||||||
nodeAffinity:
|
nodeAffinity:
|
||||||
@@ -67,8 +61,9 @@ spec:
|
|||||||
- key: node-role.kubernetes.io/control-plane
|
- key: node-role.kubernetes.io/control-plane
|
||||||
operator: DoesNotExist
|
operator: DoesNotExist
|
||||||
containers:
|
containers:
|
||||||
- name: leadgenerator
|
- name: shop
|
||||||
image: nexus.khongisa.co.za/litecharms-leadgenerator:latest
|
image: nexus.khongisa.co.za/litecharms-shop:latest
|
||||||
|
imagePullPolicy: Always
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
memory: "512Mi"
|
memory: "512Mi"
|
||||||
@@ -82,46 +77,16 @@ spec:
|
|||||||
- configMapRef:
|
- configMapRef:
|
||||||
name: shop-config
|
name: shop-config
|
||||||
env:
|
env:
|
||||||
- name: Email__Credentials__Username
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: shop-config
|
|
||||||
key: Email__Credentials__Username
|
|
||||||
- name: Email__Credentials__Password
|
|
||||||
valueFrom:
|
|
||||||
secretKeyRef:
|
|
||||||
name: shop-secrets
|
|
||||||
key: email-password
|
|
||||||
- name: Email__Host
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: shop-config
|
|
||||||
key: Email__Host
|
|
||||||
- name: Email__Port
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: shop-config
|
|
||||||
key: Email__Port
|
|
||||||
- name: Email__UseSsl
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: shop-config
|
|
||||||
key: Email__UseSsl
|
|
||||||
- name: ConnectionStrings__PostgresScheduler
|
- name: ConnectionStrings__PostgresScheduler
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: shop-secrets
|
name: shop-secrets
|
||||||
key: quartz-store
|
key: connection-string-quartz
|
||||||
- name: ConnectionStrings__PostgresLeadGenerator
|
- name: ConnectionStrings__PostgresShop
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: shop-secrets
|
name: shop-secrets
|
||||||
key: connection-string
|
key: connection-string
|
||||||
- name: ConnectionStrings__DiscordLeadGenerator
|
|
||||||
valueFrom:
|
|
||||||
secretKeyRef:
|
|
||||||
name: shop-secrets
|
|
||||||
key: discord-webhook
|
|
||||||
- name: Monitoring__Address
|
- name: Monitoring__Address
|
||||||
valueFrom:
|
valueFrom:
|
||||||
configMapKeyRef:
|
configMapKeyRef:
|
||||||
@@ -161,12 +126,12 @@ spec:
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: leadgenerator-service
|
name: shop-service
|
||||||
namespace: litecharms-shop-uat
|
namespace: litecharms-shop-uat
|
||||||
spec:
|
spec:
|
||||||
type: ClusterIP
|
type: ClusterIP
|
||||||
selector:
|
selector:
|
||||||
app: leadgenerator
|
app: shop
|
||||||
ports:
|
ports:
|
||||||
- name: http
|
- name: http
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
@@ -185,7 +150,7 @@ spec:
|
|||||||
- match: Host(`shop.uat.khongisa.co.za`)
|
- match: Host(`shop.uat.khongisa.co.za`)
|
||||||
kind: Rule
|
kind: Rule
|
||||||
services:
|
services:
|
||||||
- name: leadgenerator-service
|
- name: shop-service
|
||||||
port: 80
|
port: 80
|
||||||
sticky:
|
sticky:
|
||||||
cookie:
|
cookie:
|
||||||
|
|||||||
Reference in New Issue
Block a user