@ -0,0 +1,16 @@ | |||||
FROM microsoft/dotnet:2.1-sdk | |||||
ENV ASPNETCORE_ENVIRONMENT=Development | |||||
ENV DOTNET_USE_POLLING_FILE_WATCHER=true | |||||
EXPOSE 80 | |||||
WORKDIR /src | |||||
COPY ["eShopOnContainers-ServicesAndWebApps.sln", "./"] | |||||
COPY ["src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj", "src/ApiGateways/Mobile.Bff.Shopping/aggregator/"] | |||||
RUN dotnet restore -nowarn:msb3202,nu1503 | |||||
COPY . . | |||||
WORKDIR "/src/src/ApiGateways/Mobile.Bff.Shopping/aggregator" | |||||
RUN dotnet build "Mobile.Shopping.HttpAggregator.csproj" | |||||
CMD ["dotnet", "run", "--no-restore", "--no-build", "--no-launch-profile"] |
@ -0,0 +1,36 @@ | |||||
kind: helm-release | |||||
apiVersion: 1.0 | |||||
build: | |||||
context: ..\..\..\.. | |||||
dockerfile: Dockerfile | |||||
install: | |||||
chart: charts/aggregator | |||||
values: | |||||
- values.dev.yaml? | |||||
- secrets.dev.yaml? | |||||
set: | |||||
image: | |||||
tag: $(tag) | |||||
pullPolicy: Never | |||||
disableProbes: true | |||||
ingress: | |||||
hosts: | |||||
# This expands to [space.s.]aggregator.<guid>.<region>.aksapp.io | |||||
- $(spacePrefix)aggregator$(hostSuffix) | |||||
configurations: | |||||
develop: | |||||
build: | |||||
dockerfile: Dockerfile.develop | |||||
useGitIgnore: true | |||||
container: | |||||
syncTarget: /src | |||||
sync: | |||||
- "**/Pages/**" | |||||
- "**/Views/**" | |||||
- "**/wwwroot/**" | |||||
- "!**/*.{sln,csproj}" | |||||
command: [dotnet, run, --no-restore, --no-build, --no-launch-profile, -c, "${Configuration:-Debug}"] | |||||
iterate: | |||||
processesToKill: [dotnet, vsdbg] | |||||
buildCommands: | |||||
- [dotnet, build, --no-restore, -c, "${Configuration:-Debug}"] |
@ -0,0 +1,25 @@ | |||||
FROM microsoft/dotnet:2.1-sdk | |||||
ENV ASPNETCORE_ENVIRONMENT=Development | |||||
ENV DOTNET_USE_POLLING_FILE_WATCHER=true | |||||
EXPOSE 80 | |||||
WORKDIR /src | |||||
COPY ["eShopOnContainers-ServicesAndWebApps.sln", "./"] | |||||
COPY ["src/BuildingBlocks/EventBus/EventBus/EventBus.csproj", "src/BuildingBlocks/EventBus/EventBus/"] | |||||
COPY ["src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj", "src/BuildingBlocks/EventBus/EventBusRabbitMQ/"] | |||||
COPY ["src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj", "src/BuildingBlocks/EventBus/EventBusServiceBus/"] | |||||
COPY ["src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj", "src/BuildingBlocks/EventBus/IntegrationEventLogEF/"] | |||||
COPY ["src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks/Microsoft.AspNetCore.HealthChecks.csproj", "src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks/"] | |||||
COPY ["src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.AzureStorage/Microsoft.Extensions.HealthChecks.AzureStorage.csproj", "src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.AzureStorage/"] | |||||
COPY ["src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.SqlServer/Microsoft.Extensions.HealthChecks.SqlServer.csproj", "src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.SqlServer/"] | |||||
COPY ["src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj", "src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/"] | |||||
COPY ["src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj", "src/BuildingBlocks/WebHostCustomization/WebHost.Customization/"] | |||||
COPY ["src/Services/Catalog/Catalog.API/Catalog.API.csproj", "src/Services/Catalog/Catalog.API/"] | |||||
RUN dotnet restore -nowarn:msb3202,nu1503 | |||||
COPY . . | |||||
WORKDIR "/src/src/Services/Catalog/Catalog.API" | |||||
RUN dotnet build "Catalog.API.csproj" | |||||
CMD ["dotnet", "run", "--no-restore", "--no-build", "--no-launch-profile"] |
@ -0,0 +1,36 @@ | |||||
kind: helm-release | |||||
apiVersion: 1.0 | |||||
build: | |||||
context: ..\..\..\.. | |||||
dockerfile: Dockerfile | |||||
install: | |||||
chart: charts/catalogapi | |||||
values: | |||||
- values.dev.yaml? | |||||
- secrets.dev.yaml? | |||||
set: | |||||
image: | |||||
tag: $(tag) | |||||
pullPolicy: Never | |||||
disableProbes: true | |||||
ingress: | |||||
hosts: | |||||
# This expands to [space.s.]catalogapi.<guid>.<region>.aksapp.io | |||||
- $(spacePrefix)catalogapi$(hostSuffix) | |||||
configurations: | |||||
develop: | |||||
build: | |||||
dockerfile: Dockerfile.develop | |||||
useGitIgnore: true | |||||
container: | |||||
syncTarget: /src | |||||
sync: | |||||
- "**/Pages/**" | |||||
- "**/Views/**" | |||||
- "**/wwwroot/**" | |||||
- "!**/*.{sln,csproj}" | |||||
command: [dotnet, run, --no-restore, --no-build, --no-launch-profile, -c, "${Configuration:-Debug}"] | |||||
iterate: | |||||
processesToKill: [dotnet, vsdbg] | |||||
buildCommands: | |||||
- [dotnet, build, --no-restore, -c, "${Configuration:-Debug}"] |
@ -0,0 +1,21 @@ | |||||
# Patterns to ignore when building packages. | |||||
# This supports shell glob matching, relative path matching, and | |||||
# negation (prefixed with !). Only one pattern per line. | |||||
.DS_Store | |||||
# Common VCS dirs | |||||
.git/ | |||||
.gitignore | |||||
.bzr/ | |||||
.bzrignore | |||||
.hg/ | |||||
.hgignore | |||||
.svn/ | |||||
# Common backup files | |||||
*.swp | |||||
*.bak | |||||
*.tmp | |||||
*~ | |||||
# Various IDEs | |||||
.project | |||||
.idea/ | |||||
*.tmproj |
@ -0,0 +1,5 @@ | |||||
apiVersion: v1 | |||||
appVersion: "1.0" | |||||
description: A Helm chart for Kubernetes | |||||
name: catalogapi | |||||
version: 0.1.0 |
@ -0,0 +1,19 @@ | |||||
1. Get the application URL by running these commands: | |||||
{{- if .Values.ingress.enabled }} | |||||
{{- range .Values.ingress.hosts }} | |||||
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ . }}{{ $.Values.ingress.path }} | |||||
{{- end }} | |||||
{{- else if contains "NodePort" .Values.service.type }} | |||||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "catalogapi.fullname" . }}) | |||||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") | |||||
echo http://$NODE_IP:$NODE_PORT | |||||
{{- else if contains "LoadBalancer" .Values.service.type }} | |||||
NOTE: It may take a few minutes for the LoadBalancer IP to be available. | |||||
You can watch the status of by running 'kubectl get svc -w {{ template "catalogapi.fullname" . }}' | |||||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "catalogapi.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') | |||||
echo http://$SERVICE_IP:{{ .Values.service.port }} | |||||
{{- else if contains "ClusterIP" .Values.service.type }} | |||||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "catalogapi.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") | |||||
echo "Visit http://127.0.0.1:8080 to use your application" | |||||
kubectl port-forward $POD_NAME 8080:80 | |||||
{{- end }} |
@ -0,0 +1,32 @@ | |||||
{{/* vim: set filetype=mustache: */}} | |||||
{{/* | |||||
Expand the name of the chart. | |||||
*/}} | |||||
{{- define "catalogapi.name" -}} | |||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} | |||||
{{- end -}} | |||||
{{/* | |||||
Create a default fully qualified app name. | |||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). | |||||
If release name contains chart name it will be used as a full name. | |||||
*/}} | |||||
{{- define "catalogapi.fullname" -}} | |||||
{{- if .Values.fullnameOverride -}} | |||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} | |||||
{{- else -}} | |||||
{{- $name := default .Chart.Name .Values.nameOverride -}} | |||||
{{- if contains $name .Release.Name -}} | |||||
{{- .Release.Name | trunc 63 | trimSuffix "-" -}} | |||||
{{- else -}} | |||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} | |||||
{{- end -}} | |||||
{{- end -}} | |||||
{{- end -}} | |||||
{{/* | |||||
Create chart name and version as used by the chart label. | |||||
*/}} | |||||
{{- define "catalogapi.chart" -}} | |||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} | |||||
{{- end -}} |
@ -0,0 +1,72 @@ | |||||
apiVersion: apps/v1beta2 | |||||
kind: Deployment | |||||
metadata: | |||||
name: {{ template "catalogapi.fullname" . }} | |||||
labels: | |||||
app: {{ template "catalogapi.name" . }} | |||||
chart: {{ template "catalogapi.chart" . }} | |||||
draft: {{ default "draft-app" .Values.draft }} | |||||
release: {{ .Release.Name }} | |||||
heritage: {{ .Release.Service }} | |||||
spec: | |||||
replicas: {{ .Values.replicaCount }} | |||||
selector: | |||||
matchLabels: | |||||
app: {{ template "catalogapi.name" . }} | |||||
release: {{ .Release.Name }} | |||||
template: | |||||
metadata: | |||||
labels: | |||||
app: {{ template "catalogapi.name" . }} | |||||
draft: {{ default "draft-app" .Values.draft }} | |||||
release: {{ .Release.Name }} | |||||
annotations: | |||||
buildID: {{ .Values.buildID }} | |||||
spec: | |||||
containers: | |||||
- name: {{ .Chart.Name }} | |||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" | |||||
imagePullPolicy: {{ .Values.image.pullPolicy }} | |||||
ports: | |||||
- name: http | |||||
containerPort: 80 | |||||
protocol: TCP | |||||
{{- if not .Values.disableProbes }} | |||||
livenessProbe: | |||||
httpGet: | |||||
path: / | |||||
port: http | |||||
readinessProbe: | |||||
httpGet: | |||||
path: / | |||||
port: http | |||||
{{- end }} | |||||
env: | |||||
{{- $root := . }} | |||||
{{- range $ref, $values := .Values.secrets }} | |||||
{{- range $key, $value := $values }} | |||||
- name: {{ $ref }}_{{ $key }} | |||||
valueFrom: | |||||
secretKeyRef: | |||||
name: {{ template "catalogapi.fullname" $root }}-{{ $ref | lower }} | |||||
key: {{ $key }} | |||||
{{- end }} | |||||
{{- end }} | |||||
resources: | |||||
{{ toYaml .Values.resources | indent 12 }} | |||||
{{- with .Values.imagePullSecrets }} | |||||
imagePullSecrets: | |||||
{{ toYaml . | indent 8 }} | |||||
{{- end }} | |||||
{{- with .Values.nodeSelector }} | |||||
nodeSelector: | |||||
{{ toYaml . | indent 8 }} | |||||
{{- end }} | |||||
{{- with .Values.affinity }} | |||||
affinity: | |||||
{{ toYaml . | indent 8 }} | |||||
{{- end }} | |||||
{{- with .Values.tolerations }} | |||||
tolerations: | |||||
{{ toYaml . | indent 8 }} | |||||
{{- end }} |
@ -0,0 +1,39 @@ | |||||
{{- if .Values.ingress.enabled -}} | |||||
{{- $fullName := include "catalogapi.fullname" . -}} | |||||
{{- $servicePort := .Values.service.port -}} | |||||
{{- $ingressPath := .Values.ingress.path -}} | |||||
apiVersion: extensions/v1beta1 | |||||
kind: Ingress | |||||
metadata: | |||||
name: {{ $fullName }} | |||||
labels: | |||||
app: {{ template "catalogapi.name" . }} | |||||
chart: {{ template "catalogapi.chart" . }} | |||||
release: {{ .Release.Name }} | |||||
heritage: {{ .Release.Service }} | |||||
{{- with .Values.ingress.annotations }} | |||||
annotations: | |||||
{{ toYaml . | indent 4 }} | |||||
{{- end }} | |||||
spec: | |||||
{{- if .Values.ingress.tls }} | |||||
tls: | |||||
{{- range .Values.ingress.tls }} | |||||
- hosts: | |||||
{{- range .hosts }} | |||||
- {{ . }} | |||||
{{- end }} | |||||
secretName: {{ .secretName }} | |||||
{{- end }} | |||||
{{- end }} | |||||
rules: | |||||
{{- range .Values.ingress.hosts }} | |||||
- host: {{ . }} | |||||
http: | |||||
paths: | |||||
- path: {{ $ingressPath }} | |||||
backend: | |||||
serviceName: {{ $fullName }} | |||||
servicePort: http | |||||
{{- end }} | |||||
{{- end }} |
@ -0,0 +1,12 @@ | |||||
{{- $root := . }} | |||||
{{- range $name, $values := .Values.secrets }} | |||||
apiVersion: v1 | |||||
kind: Secret | |||||
metadata: | |||||
name: {{ template "catalogapi.fullname" $root }}-{{ $name | lower }} | |||||
data: | |||||
{{- range $key, $value := $values }} | |||||
{{ $key }}: {{ $value | b64enc }} | |||||
{{- end }} | |||||
--- | |||||
{{- end }} |
@ -0,0 +1,19 @@ | |||||
apiVersion: v1 | |||||
kind: Service | |||||
metadata: | |||||
name: {{ template "catalogapi.fullname" . }} | |||||
labels: | |||||
app: {{ template "catalogapi.name" . }} | |||||
chart: {{ template "catalogapi.chart" . }} | |||||
release: {{ .Release.Name }} | |||||
heritage: {{ .Release.Service }} | |||||
spec: | |||||
type: {{ .Values.service.type }} | |||||
ports: | |||||
- port: {{ .Values.service.port }} | |||||
targetPort: http | |||||
protocol: TCP | |||||
name: http | |||||
selector: | |||||
app: {{ template "catalogapi.name" . }} | |||||
release: {{ .Release.Name }} |
@ -0,0 +1,60 @@ | |||||
# Default values for catalogapi. | |||||
# This is a YAML-formatted file. | |||||
# Declare variables to be passed into your templates. | |||||
fullnameOverride: catalogapi | |||||
replicaCount: 1 | |||||
image: | |||||
repository: catalogapi | |||||
tag: stable | |||||
pullPolicy: IfNotPresent | |||||
imagePullSecrets: [] | |||||
# Optionally specify an array of imagePullSecrets. | |||||
# Secrets must be manually created in the namespace. | |||||
# ref: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod | |||||
# | |||||
# This uses credentials from secret "myRegistryKeySecretName". | |||||
# - name: myRegistryKeySecretName | |||||
service: | |||||
type: ClusterIP | |||||
port: 80 | |||||
ingress: | |||||
enabled: false | |||||
annotations: | |||||
kubernetes.io/ingress.class: addon-http-application-routing | |||||
# kubernetes.io/tls-acme: "true" | |||||
path: / | |||||
# hosts: | |||||
# - chart-example.local | |||||
tls: [] | |||||
# - secretName: chart-example-tls | |||||
# hosts: | |||||
# - chart-example.local | |||||
secrets: {} | |||||
# Optionally specify a set of secret objects whose values | |||||
# will be injected as environment variables by default. | |||||
# You should add this section to a file like secrets.yaml | |||||
# that is explicitly NOT committed to source code control | |||||
# and then include it as part of your helm install step. | |||||
# ref: https://kubernetes.io/docs/concepts/configuration/secret/ | |||||
# | |||||
# This creates a secret "mysecret" and injects "mypassword" | |||||
# as the environment variable mysecret_mypassword=password. | |||||
# mysecret: | |||||
# mypassword: password | |||||
resources: {} | |||||
# We usually recommend not to specify default resources and to leave this as a conscious | |||||
# choice for the user. This also increases chances charts run on environments with little | |||||
# resources, such as Minikube. If you do want to specify resources, uncomment the following | |||||
# lines, adjust them as necessary, and remove the curly braces after 'resources:'. | |||||
# limits: | |||||
# cpu: 100m | |||||
# memory: 128Mi | |||||
# requests: | |||||
# cpu: 100m | |||||
# memory: 128Mi | |||||
nodeSelector: {} | |||||
tolerations: [] | |||||
affinity: {} |