Merge branch 'dev' into patch-1
@ -28,7 +28,7 @@ cli-linux
|
||||
**/obj/
|
||||
**/node_modules/
|
||||
**/bower_components/
|
||||
**/wwwroot/lib/
|
||||
**/wwwroot/lib/*
|
||||
global.json
|
||||
**/appsettings.localhost.json
|
||||
src/Web/WebSPA/wwwroot/
|
9
.gitignore
vendored
@ -25,8 +25,14 @@ bld/
|
||||
|
||||
# Visual Studio 2015 cache/options directory
|
||||
.vs/
|
||||
|
||||
# .js files created on build:
|
||||
src/Web/WebMVC/wwwroot/js/site*
|
||||
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
**/wwwroot/lib/
|
||||
!/wwwroot/lib/signalr
|
||||
!/wwwroot/lib/toastr
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
@ -261,3 +267,6 @@ pub/
|
||||
/src/Web/WebMVC/wwwroot/css/site.min.css
|
||||
**/.kube/**
|
||||
.mfractor
|
||||
|
||||
# Ignore HealthCheckdb
|
||||
*healthchecksdb*
|
67
CONTRIBUTING.md
Normal file
@ -0,0 +1,67 @@
|
||||
# How to contribute to eShopOnContainers
|
||||
|
||||
This repo is a reference and learning resource and everyone is invited to contribute, however not all PRs will be accepted into the main branch (**`dev`**).
|
||||
|
||||
There's a general development strategy that's driven by @CESARDELATORRE, who chooses, or defines criteria for choosing, the issues to include in the codebase, given a bunch of constraints and other guidelines.
|
||||
|
||||
However you can always get in touch with him, if you want to implement some general-interest feature in your repo and have it referenced from the [documentation](https://docs.microsoft.com/dotnet/standard/microservices-architecture/) or the [Microservices eBook](https://aka.ms/microservicesebook/).
|
||||
|
||||
## Coding Standards
|
||||
|
||||
There are no explicit coding standards so pay attention to the general coding style, that's (mostly) used everywhere.
|
||||
|
||||
However, there's only one **REALLY** important rule: **use spaces for indenting** 😉.
|
||||
|
||||
## Development Process
|
||||
|
||||
In order to help manage community contributions and avoid conflicts, there's a [Development project](https://github.com/dotnet-architecture/eShopOnContainers/projects/3) in this repo, to track assignments to any significant development effort.
|
||||
|
||||
Great but... **what's "significant"**?
|
||||
|
||||
That's not too easy to define and there are no clear criteria right now but, probably, changing "a couple" lines of code in one file would not qualify while changing "a bunch" of files would.
|
||||
|
||||
We'll all be learning in the process so we'll figure it out somehow.
|
||||
|
||||
### General Steps
|
||||
|
||||
1. Issues are managed as usual with the regular issues list, just like any other repo.
|
||||
|
||||
2. Once an issue is marked as a bug, enhancement, new feature or whatever needs development work, it will be labeled as a **backlog-item** and included as the last item in the Backlog project column.
|
||||
|
||||
3. Community members can propose themselves to code an issue.
|
||||
|
||||
4. @CESARDELATORRE/collaborators will prioritize the backlog items and arrange them in the **Backlog** column, so that the items in the top of the list are implemented first.
|
||||
|
||||
5. @CESARDELATORRE/collaborators will review the issues and select the ones approved to begin development with, and move them to the **Approved** column.
|
||||
|
||||
6. Issues in the **Approved** column can be assigned to a **collaborator** or to a **community member** who would then begin working on the issue and submit a PR as usual.
|
||||
|
||||
## Tests
|
||||
|
||||
There's not a tests policy in the project at this moment, but it'll be greatly appreciated if you include them within the [updated test structure](./test/readme.md).
|
||||
|
||||
## Forks and Branches
|
||||
|
||||
All contributions must be submitted as a [Pull Request (PR)](https://help.github.com/articles/about-pull-requests/) so you need to [fork this repo](https://help.github.com/articles/fork-a-repo/) on your GitHub account.
|
||||
|
||||
The main branches are **`dev`** and **`master`**:
|
||||
|
||||
- **`dev`**: Contains the latest code **and it is the branch actively developed**.
|
||||
**All PRs must be against `dev` branch to be considered**. This branch is developed using .NET Core 2.x
|
||||
|
||||
- **`master`**: Synced from time to time from **`dev`**. It contains "stable" code.
|
||||
(**Keep in mind "stable" does not mean PRODUCTION-READY!**)
|
||||
|
||||
- Any other branch is considered temporary and could be deleted at any time. Do not submit any PR to them!
|
||||
|
||||
## DISCLAIMER - This is not a PRODUCTION-READY TEMPLATE for microservices
|
||||
eShopOnContainers is a reference application to **showcase architectural patterns** for developing microservices applications on .NET Core. **IT IS NOT A PRODUCTION-READY TEMPLATE** to start real-world application. In fact, the application is in a **permanent beta state**, as it’s also used to test new potentially interesting technologies as they show up.
|
||||
|
||||
Since this is a learning resource, some design decisions have favored simplicity to convey a pattern, over production-grade robustness.
|
||||
|
||||
## Suggestions
|
||||
|
||||
We hope this helps us all to work better and avoid some of the problems/frustrations of working in such a large community.
|
||||
|
||||
We'd also appreciate any comments or ideas to improve this.
|
||||
|
@ -4,6 +4,9 @@
|
||||
<add key="repositoryPath" value="packages" />
|
||||
</config>
|
||||
<packageSources>
|
||||
<add key="Preview-aspnetcore-tools" value="https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json"/>
|
||||
<add key="Preview-aspnetcore-dev" value="https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json"/>
|
||||
<add key="Preview-aspnetcore" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json"/>
|
||||
<add key="AspNetCore" value="https://dotnet.myget.org/F/aspnet-feb2017-patch/api/v3/index.json" />
|
||||
<add key="NuGet" value="https://api.nuget.org/v3/index.json" />
|
||||
</packageSources>
|
||||
|
107
README.md
@ -1,35 +1,96 @@
|
||||
# eShopOnContainers - Microservices Architecture and Containers based Reference Application (**BETA state** - Visual Studio 2017 and CLI environments compatible)
|
||||
Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers.
|
||||
|
||||
## IMPORTANT NOTES!
|
||||
**Since April 5 2018, Visual Studio 2017 15.7 Preview 2.0 or later is needed to run the solution from the *[DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev)* (current evolving code) which now includes API Gateways features**. Due to the configuration used in `docker-compose.yml` file, VS 15.7 (currently in Preview 2) is needed to run the solution at [DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev) or you can also run eShopOnContainers with Docker CLI with **"docker-compose up"** or deploying to **Kubernetes/AKS**.
|
||||
Trying to run the solution from [DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev) in VS 15.6 (current RTM of Visual Studio 2017) will generate errors (complaining about invalid values in docker-compose file).
|
||||
## Linux Build Status for 'dev' branch
|
||||
|
||||
If you want/need to run eShopOnContainers in **Visual Studio 2017 15.6 RTM** or previous, you'll need to use the code at the **[MASTER branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/master)** which is the previous stable version of eShopOnContainers.
|
||||
Dev branch contains the latest "stable" code, and their images are tagged with `:dev` in our [Docker Hub](https://cloud.docker.com/u/eshop/repository/list):
|
||||
|
||||
Api Gateways base image
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=201&branchName=dev)
|
||||
|
||||
Basket API
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=199&branchName=dev)
|
||||
|
||||
Catalog API
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=197&branchName=dev)
|
||||
|
||||
Identity API
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=200&branchName=dev)
|
||||
|
||||
Location API
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=202&branchName=dev)
|
||||
|
||||
Marketing API
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=203&branchName=dev)
|
||||
|
||||
Ordering API
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=198&branchName=dev)
|
||||
|
||||
Payment API
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=205&branchName=dev)
|
||||
|
||||
Webhooks API
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=207&branchName=dev)
|
||||
|
||||
Web Shopping Aggregator
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=206&branchName=dev)
|
||||
|
||||
Mobile Shopping Aggregator
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=204&branchName=dev)
|
||||
|
||||
Webbhooks demo client
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=208&branchName=dev)
|
||||
|
||||
WebMVC Client
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=209&branchName=dev)
|
||||
|
||||
WebSPA Client
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=210&branchName=dev)
|
||||
|
||||
Web Status
|
||||
|
||||
[](https://msftdevtools.visualstudio.com/eShopOnContainers/_build/latest?definitionId=211&branchName=dev)
|
||||
|
||||
|
||||
## IMPORTANT NOTES!
|
||||
**You can use either the latest version of Visual Studio or simply Docker CLI and .NET CLI for Windows, Mac and Linux**.
|
||||
|
||||
**Note for Pull Requests (PRs)**: We accept pull request from the community. When doing it, please do it onto the **DEV branch** which is the consolidated work-in-progress branch. Do not request it onto Master branch, if possible.
|
||||
|
||||
**NEWS / ANNOUNCEMENTS**
|
||||
Do you want to be up-to-date on .NET Architecture guidance and reference apps like eShopOnContainers? --> Subscribe by "WATCHING" this new GitHub repo: https://github.com/dotnet-architecture/News
|
||||
|
||||
## Updated for .NET Core 2.0 "wave" of technologies
|
||||
eShopOnContainers is updated to .NET Core 2.0 "wave". Not just compilation but also new recommended code in EF Core 2.0, ASP.NET Core 2.0, and other new related versions.
|
||||
## Updated for .NET Core 2.2 "wave" of technologies
|
||||
eShopOnContainers is updated to .NET Core 2.x (currently updated to 2.2) "wave" of technologies. Not just compilation but also new recommended code in EF Core, ASP.NET Core, and other new related versions.
|
||||
|
||||
The **dockerfiles** in the solution have also been updated and now support [**Docker Multi-Stage**](https://blogs.msdn.microsoft.com/stevelasker/2017/09/11/net-and-multistage-dockerfiles/) since mid-December 2017.
|
||||
|
||||
For a list on the new .NET Core 2.0 related implemented features, see this [blog post](https://blogs.msdn.microsoft.com/dotnet/2017/08/02/microservices-and-docker-containers-architecture-patterns-and-development-guidance/).
|
||||
|
||||
>**PLEASE** Read our [branch guide](./branch-guide.md) to know about our branching policy
|
||||
|
||||
> ### DISCLAIMER
|
||||
> **IMPORTANT:** The current state of this sample application is **BETA**, because we are constantly evolving towards new released technologies. Therefore, many areas could be improved and change significantly while refactoring current code and implementing new features. Feedback with improvements and pull requests from the community will be highly appreciated and accepted.
|
||||
> **IMPORTANT:** The current state of this sample application is **BETA**, because we are constantly evolving towards newly released technologies. Therefore, many areas could be improved and change significantly while refactoring the current code and implementing new features. Feedback with improvements and pull requests from the community will be highly appreciated and accepted.
|
||||
>
|
||||
> This reference application proposes a simplified microservice oriented architecture implementation to introduce technologies like .NET Core with Docker containers through a comprehensive application. The chosen domain is an eShop/eCommerce but simply because it is a well-know domain by most people/developers.
|
||||
However, this sample application should not be considered as an "eCommerce reference model", at all. The implemented business domain might not be ideal from an eCommerce business point of view. It is neither trying to solve all the problems in a large, scalable and mission-critical distributed system. It is just a bootstrap for developers to easily get started in the world of Docker containers and microservices with .NET Core.
|
||||
> This reference application proposes a simplified microservice oriented architecture implementation to introduce technologies like .NET Core with Docker containers through a comprehensive application. The chosen domain is eShop/eCommerce but simply because it is a well-known domain by most people/developers.
|
||||
However, this sample application should not be considered as an "eCommerce reference model" at all. The implemented business domain might not be ideal from an eCommerce business point of view. It is neither trying to solve all the problems in a large, scalable and mission-critical distributed system. It is just a bootstrap for developers to easily get started in the world of Docker containers and microservices with .NET Core.
|
||||
> <p>For example, the next step after running the solution in the local dev PC and understanding Docker containers and microservices development with .NET Core, is to select a microservice cluster/orchestrator like Kubernetes in Azure (AKS) or Azure Service Fabric, both environments tested and supported by this solution.
|
||||
> Additional steps would be to move your databases to HA cloud services (like Azure SQL Database), or switch your EventBus to use Azure Service Bus (instead of bare-bone RabbitMQ) or any other production ready Service Bus in the market.
|
||||
> <p>
|
||||
> <img src="img/exploring-to-production-ready.png">
|
||||
> Additional steps would be to move your databases to HA cloud services (like Azure SQL Database) or switch your EventBus to use Azure Service Bus (instead of bare-bone RabbitMQ) or any other production-ready Service Bus in the market.
|
||||
|
||||

|
||||
|
||||
> Read the planned <a href='https://github.com/dotnet/eShopOnContainers/wiki/01.-Roadmap-and-Milestones-for-future-releases'>Roadmap and Milestones for future releases of eShopOnContainers</a> within the Wiki for further info about possible new implementations and provide feedback at the <a href='https://github.com/dotnet/eShopOnContainers/issues'>ISSUES section</a> if you'd like to see any specific scenario implemented or improved. Also, feel free to discuss on any current issue.
|
||||
|
||||
### Architecture overview
|
||||
@ -43,7 +104,7 @@ The architecture proposes a microservice oriented architecture implementation wi
|
||||
> ### Important Note on API Gateways and published APIs
|
||||
> Since April 2018, we have introduced the implementation of the [API Gateway pattern](http://microservices.io/patterns/apigateway.html) and [Backend-For-Front-End (BFF) pattern](https://samnewman.io/patterns/architectural/bff/) in eShopOnContainers architecture, so you can filter and publish simplified APIs and URIs and apply additional security in that tier while hiding/securing the internal microservices to the client apps or outside consumers. These sample API Gateways in eShopOnContainers are based on [Ocelot](https://github.com/ThreeMammals/Ocelot), an OSS lightweight API Gateway solution explained [here](http://threemammals.com/ocelot). The deployed API Gateways are autonomous and can be deployed as your own custom microservices/containers, as it is currently done in eShopOnContainers, so you can test it even in a simple development environment with just Docker engine or deploy it into orchestrators like Kubernetes in AKS or Service Fabric.
|
||||
|
||||
> For your production-ready architecture you can either keep using [Ocelot](https://github.com/ThreeMammals/Ocelot) which is simple and easy to use and used in production by significant companies or if you need further functionality and a much richer set of features suittable for commercial APIs, you can also substitute those API Gateways and use [Azure API Management](https://azure.microsoft.com/en-us/services/api-management/) or any other commercial API Gateway, as shown in the following image.
|
||||
> For your production-ready architecture you can either keep using [Ocelot](https://github.com/ThreeMammals/Ocelot) which is simple and easy to use and used in production by significant companies or if you need further functionality and a much richer set of features suitable for commercial APIs, you can also substitute those API Gateways and use [Azure API Management](https://azure.microsoft.com/en-us/services/api-management/) or any other commercial API Gateway, as shown in the following image.
|
||||
|
||||
<p>
|
||||
<img src="img/eShopOnContainers-Architecture-With-Azure-API-Management.png">
|
||||
@ -60,9 +121,15 @@ The architecture proposes a microservice oriented architecture implementation wi
|
||||
<p>
|
||||
|
||||
> ### Important Note on Database Servers/Containers
|
||||
> In this solution's current configuration for a development environment, the SQL databases are automatically deployed with sample data into a single SQL Server container (a single shared Docker container for SQL databases) so the whole solution can be up and running without any dependency to any cloud or specific server. Each database could also be deployed as a single Docker container, but then you'd need more than 8GB of RAM assigned to Docker in your development machine in order to be able to run 3 SQL Server Docker containers in your Docker Linux host in "Docker for Windows" or "Docker for Mac" development environments.
|
||||
> In this solution's current configuration for a development environment, the SQL databases are automatically deployed with sample data into a single SQL Server container (a single shared Docker container for SQL databases) so the whole solution can be up and running without any dependency to any cloud or a specific server. Each database could also be deployed as a single Docker container, but then you'd need more than 8GB of RAM assigned to Docker in your development machine in order to be able to run 3 SQL Server Docker containers in your Docker Linux host in "Docker for Windows" or "Docker for Mac" development environments.
|
||||
> <p> A similar case is defined in regard to Redis cache running as a container for the development environment. Or a No-SQL database (MongoDB) running as a container.
|
||||
> <p> However, in a real production environment it is recommended to have your databases (SQL Server, Redis, and the NO-SQL database, in this case) in HA (High Available) services like Azure SQL Database, Redis as a service and Azure CosmosDB instead the MongoDB container (as both systems share the same access protocol). If you want to change to a production configuration, you'll just need to change the connection strings once you have set up the servers in a HA cloud or on-premises.
|
||||
> <p> However, in a real production environment it is recommended to have your databases (SQL Server, Redis, and the NO-SQL database, in this case) in HA (High Available) services like Azure SQL Database, Redis as a service and Azure CosmosDB instead the MongoDB container (as both systems share the same access protocol). If you want to change to a production configuration, you'll just need to change the connection strings once you have set up the servers in an HA cloud or on-premises.
|
||||
|
||||
> ### Important Note on EventBus
|
||||
> In this solution's current EventBus is a simplified implementation, mainly used for learning purposes (development and testing), so it doesn't handle all production scenarios, most notably on error handling. <p>
|
||||
> The following forks provide production environment level implementation examples with eShopOnContainers :
|
||||
> * Implementation with [CAP](https://github.com/dotnetcore/CAP) : https://github.com/yang-xiaodong/eShopOnContainers
|
||||
> * Implementation with [NServiceBus](https://github.com/Particular/NServiceBus) : https://github.com/Particular/eShopOnContainers
|
||||
|
||||
## Related documentation and guidance
|
||||
While developing this reference application, we've been creating a reference <b>Guide/eBook</b> focusing on <b>architecting and developing containerized and microservice based .NET Applications</b> (download link available below) which explains in detail how to develop this kind of architectural style (microservices, Docker containers, Domain-Driven Design for certain microservices) plus other simpler architectural styles, like monolithic apps that can also live as Docker containers.
|
||||
@ -74,18 +141,18 @@ You can download them and start reviewing these Guides/eBooks here:
|
||||
| Architecting & Developing | Containers Lifecycle & CI/CD | App patterns with Xamarin.Forms |
|
||||
| ------------ | ------------| ------------|
|
||||
| <a href='https://aka.ms/microservicesebook'><img src="img/ebook_arch_dev_microservices_containers_cover.png"> </a> | <a href='https://aka.ms/dockerlifecycleebook'> <img src="img/ebook_containers_lifecycle.png"> </a> | <a href='https://aka.ms/xamarinpatternsebook'> <img src="img/xamarin-enterprise-patterns-ebook-cover-small.png"> </a> |
|
||||
| <sup> <a href='https://aka.ms/microservicesebook'>**Download .PDF** (2nd Edition)</a> </sup> | <sup> <a href='https://aka.ms/dockerlifecycleebook'>**Download** </a> </sup> | <sup> <a href='https://aka.ms/xamarinpatternsebook'>**Download** </a> </sup> |
|
||||
| <sup> <a href='https://aka.ms/microservicesebook'>**Download .PDF** (v2.2 Edition)</a> </sup> | <sup> <a href='https://aka.ms/dockerlifecycleebook'>**Download** </a> </sup> | <sup> <a href='https://aka.ms/xamarinpatternsebook'>**Download** </a> </sup> |
|
||||
|
||||
Download in other formats (**eReaders** like **MOBI**, **EPUB**) and other eBooks at the [.NET Architecture center](http://dot.net/architecture).
|
||||
|
||||
Send feedback to [dotnet-architecture-ebooks-feedback@service.microsoft.com](dotnet-architecture-ebooks-feedback@service.microsoft.com)
|
||||
|
||||
However, we encourage to download and review the [Architecting and Developing Microservices eBook](https://aka.ms/microservicesebook) because the architectural styles and architectural patterns and technologies explained in the guidance are using this reference application when explaining many pattern implementations, so you'll understand much better the context, design and decisions taken in the current architecture and internal designs.
|
||||
However, we encourage you to download and review the [Architecting and Developing Microservices eBook](https://aka.ms/microservicesebook) because the architectural styles and architectural patterns and technologies explained in the guide are using this reference application when explaining many pattern implementations, so you'll understand the context, design and decisions taken in the current architecture and internal designs much better.
|
||||
|
||||
## Overview of the application code
|
||||
In this repo you can find a sample reference application that will help you to understand how to implement a microservice architecture based application using <b>.NET Core</b> and <b>Docker</b>.
|
||||
|
||||
The example business domain or scenario is based on an eShop or eCommerce which is implemented as a multi-container application. Each container is a microservice deployment (like the basket-microservice, catalog-microservice, ordering-microservice and the identity-microservice) which are developed using ASP.NET Core running on .NET Core so they can run either on Linux Containers and Windows Containers.
|
||||
The example business domain or scenario is based on an eShop or eCommerce which is implemented as a multi-container application. Each container is a microservice deployment (like the basket-microservice, catalog-microservice, ordering-microservice and the identity-microservice) which is developed using ASP.NET Core running on .NET Core so they can run either on Linux Containers and Windows Containers.
|
||||
The screenshot below shows the VS Solution structure for those microservices/containers and client apps.
|
||||
|
||||
- (*Recommended when getting started*) Open <b>eShopOnContainers-ServicesAndWebApps.sln</b> for a solution containing just the server-side projects related to the microservices and web applications.
|
||||
|
37
build/acr-build/queue-all.ps1
Normal file
@ -0,0 +1,37 @@
|
||||
Param(
|
||||
[parameter(Mandatory=$false)][string]$acrName,
|
||||
[parameter(Mandatory=$false)][string]$gitUser,
|
||||
[parameter(Mandatory=$false)][string]$repoName="eShopOnContainers",
|
||||
[parameter(Mandatory=$false)][string]$gitBranch="dev",
|
||||
[parameter(Mandatory=$true)][string]$patToken
|
||||
)
|
||||
|
||||
$gitContext = "https://github.com/$gitUser/$repoName"
|
||||
|
||||
$services = @(
|
||||
@{ Name="eshopbasket"; Image="eshop/basket.api"; File="src/Services/Basket/Basket.API/Dockerfile" },
|
||||
@{ Name="eshopcatalog"; Image="eshop/catalog.api"; File="src/Services/Catalog/Catalog.API/Dockerfile" },
|
||||
@{ Name="eshopidentity"; Image="eshop/identity.api"; File="src/Services/Identity/Identity.API/Dockerfile" },
|
||||
@{ Name="eshopordering"; Image="eshop/ordering.api"; File="src/Services/Ordering/Ordering.API/Dockerfile" },
|
||||
@{ Name="eshoporderingbg"; Image="eshop/ordering.backgroundtasks"; File="src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile" },
|
||||
@{ Name="eshopmarketing"; Image="eshop/marketing.api"; File="src/Services/Marketing/Marketing.API/Dockerfile" },
|
||||
@{ Name="eshopwebspa"; Image="eshop/webspa"; File="src/Web/WebSPA/Dockerfile" },
|
||||
@{ Name="eshopwebmvc"; Image="eshop/webmvc"; File="src/Web/WebMVC/Dockerfile" },
|
||||
@{ Name="eshopwebstatus"; Image="eshop/webstatus"; File="src/Web/WebStatus/Dockerfile" },
|
||||
@{ Name="eshoppayment"; Image="eshop/payment.api"; File="src/Services/Payment/Payment.API/Dockerfile" },
|
||||
@{ Name="eshoplocations"; Image="eshop/locations.api"; File="src/Services/Location/Locations.API/Dockerfile" },
|
||||
@{ Name="eshopocelotapigw"; Image="eshop/ocelotapigw"; File="src/ApiGateways/ApiGw-Base/Dockerfile" },
|
||||
@{ Name="eshopmobileshoppingagg"; Image="eshop/mobileshoppingagg"; File="src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile" },
|
||||
@{ Name="eshopwebshoppingagg"; Image="eshop/webshoppingagg"; File="src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile" },
|
||||
@{ Name="eshoporderingsignalrhub"; Image="eshop/ordering.signalrhub"; File="src/Services/Ordering/Ordering.SignalrHub/Dockerfile" }
|
||||
)
|
||||
|
||||
$services |% {
|
||||
$bname = $_.Name
|
||||
$bimg = $_.Image
|
||||
$bfile = $_.File
|
||||
Write-Host "Setting ACR build $bname ($bimg)"
|
||||
az acr build-task create --registry $acrName --name $bname --image ${bimg}:$gitBranch --context $gitContext --branch $gitBranch --git-access-token $patToken --file $bfile
|
||||
}
|
||||
|
||||
# Basket.API
|
50
build/azure-devops/apigws/azure-pipelines.yml
Normal file
@ -0,0 +1,50 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/ApiGateways/*
|
||||
- k8s/helm/apigwmm/*
|
||||
- k8s/helm/apigwms/*
|
||||
- k8s/helm/apigwwm/*
|
||||
- k8s/helm/apigwws/*
|
||||
exclude:
|
||||
- src/ApiGateways/Mobile.Bff.Shopping/aggregator/*
|
||||
- src/ApiGateways/Web.Bff.Shopping/aggregator/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build apigws
|
||||
inputs:
|
||||
dockerComposeCommand: 'build mobileshoppingapigw mobilemarketingapigw webshoppingapigw webmarketingapigw'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push apigws
|
||||
inputs:
|
||||
dockerComposeCommand: 'push mobileshoppingapigw mobilemarketingapigw webshoppingapigw webmarketingapigw'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
45
build/azure-devops/basket-api/azure-pipelines.yml
Normal file
@ -0,0 +1,45 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/BuildingBlocks/*
|
||||
- src/Services/Basket/*
|
||||
- k8s/helm/basket-api/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build basket
|
||||
inputs:
|
||||
dockerComposeCommand: 'build basket.api'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push basket
|
||||
inputs:
|
||||
dockerComposeCommand: 'push basket.api'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
45
build/azure-devops/catalog-api/azure-pipelines.yml
Normal file
@ -0,0 +1,45 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/BuildingBlocks/*
|
||||
- src/Services/Catalog/*
|
||||
- k8s/helm/catalog-api/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build catalog
|
||||
inputs:
|
||||
dockerComposeCommand: 'build catalog.api'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push catalog
|
||||
inputs:
|
||||
dockerComposeCommand: 'push catalog.api'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
45
build/azure-devops/identity-api/azure-pipelines.yml
Normal file
@ -0,0 +1,45 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/BuildingBlocks/*
|
||||
- src/Services/Identity/*
|
||||
- k8s/helm/identity-api/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build identity
|
||||
inputs:
|
||||
dockerComposeCommand: 'build identity.api'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push identity
|
||||
inputs:
|
||||
dockerComposeCommand: 'push identity.api'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
25
build/azure-devops/infrastructure/azure-pipelines.yml
Normal file
@ -0,0 +1,25 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- k8s/helm/basket-data/*
|
||||
- k8s/helm/keystore-data/*
|
||||
- k8s/helm/nosql-data/*
|
||||
- k8s/helm/rabbitmq/*
|
||||
- k8s/helm/sql-data/*
|
||||
steps:
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
45
build/azure-devops/location-api/azure-pipelines.yml
Normal file
@ -0,0 +1,45 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/BuildingBlocks/*
|
||||
- src/Services/Location/*
|
||||
- k8s/helm/locations-api/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build locations
|
||||
inputs:
|
||||
dockerComposeCommand: 'build locations.api'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push locations
|
||||
inputs:
|
||||
dockerComposeCommand: 'push locations.api'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
45
build/azure-devops/marketing-api/azure-pipelines.yml
Normal file
@ -0,0 +1,45 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/BuildingBlocks/*
|
||||
- src/Services/Marketing/*
|
||||
- k8s/helm/marketing-api/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build marketing
|
||||
inputs:
|
||||
dockerComposeCommand: 'build marketing.api'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push marketing
|
||||
inputs:
|
||||
dockerComposeCommand: 'push marketing.api'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
44
build/azure-devops/mobile-shopping-agg/azure-pipelines.yml
Normal file
@ -0,0 +1,44 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/ApiGateways/Mobile.Bff.Shopping/aggregator/*
|
||||
- k8s/helm/mobileshoppingagg/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build mobileshoppingagg
|
||||
inputs:
|
||||
dockerComposeCommand: 'build mobileshoppingagg'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push mobileshoppingagg
|
||||
inputs:
|
||||
dockerComposeCommand: 'push mobileshoppingagg'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
47
build/azure-devops/ordering-api/azure-pipelines.yml
Normal file
@ -0,0 +1,47 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/BuildingBlocks/*
|
||||
- src/Services/Ordering/*
|
||||
- k8s/helm/ordering-api/*
|
||||
- k8s/helm/ordering-backgroundtasks/*
|
||||
- k8s/helm/ordering-signalrhub/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build ordering
|
||||
inputs:
|
||||
dockerComposeCommand: 'build ordering.api ordering.backgroundtasks ordering.signalrhub'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push ordering
|
||||
inputs:
|
||||
dockerComposeCommand: 'push ordering.api ordering.backgroundtasks ordering.signalrhub'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
45
build/azure-devops/payment-api/azure-pipelines.yml
Normal file
@ -0,0 +1,45 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/BuildingBlocks/*
|
||||
- src/Services/Payment/*
|
||||
- k8s/helm/payment-api/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build payment
|
||||
inputs:
|
||||
dockerComposeCommand: 'build payment.api'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push payment
|
||||
inputs:
|
||||
dockerComposeCommand: 'push payment.api'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
5
build/azure-devops/readme.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Azure Devops build definitions
|
||||
|
||||
This folder contains the Azure Devops build definitions in YAML format. Each folder contains one `azure-pipelines.yml` that contains the build definition for one microservice (usually a Docker image, but some microservices generates more than one Docker image).
|
||||
|
||||
For more information about YAML builds read the [Azure DevOps documentation](https://docs.microsoft.com/en-us/azure/devops/pipelines/get-started-yaml?view=azure-devops).
|
44
build/azure-devops/web-shopping-agg/azure-pipelines.yml
Normal file
@ -0,0 +1,44 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/ApiGateways/Web.Bff.Shopping/aggregator/*
|
||||
- k8s/helm/webshoppingagg/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build webshoppingagg
|
||||
inputs:
|
||||
dockerComposeCommand: 'build webshoppingagg'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push webshoppingagg
|
||||
inputs:
|
||||
dockerComposeCommand: 'push webshoppingagg'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
45
build/azure-devops/webhooks-api/azure-pipelines.yml
Normal file
@ -0,0 +1,45 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/BuildingBlocks/*
|
||||
- src/Services/Webhooks/*
|
||||
- k8s/helm/webhooks-api/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build webhooks
|
||||
inputs:
|
||||
dockerComposeCommand: 'build webhooks.api'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push webhooks
|
||||
inputs:
|
||||
dockerComposeCommand: 'push webhooks.api'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
45
build/azure-devops/webhooks-client/azure-pipelines.yml
Normal file
@ -0,0 +1,45 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/BuildingBlocks/*
|
||||
- src/Web/WebhookClient/*
|
||||
- k8s/helm/webhooks-web/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build webhooks.client
|
||||
inputs:
|
||||
dockerComposeCommand: 'build webhooks.client'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push webhooks.client
|
||||
inputs:
|
||||
dockerComposeCommand: 'push webhooks.client'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
45
build/azure-devops/webmvc/azure-pipelines.yml
Normal file
@ -0,0 +1,45 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/BuildingBlocks/*
|
||||
- src/Web/WebMVC/*
|
||||
- k8s/helm/webmvc/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build webmvc
|
||||
inputs:
|
||||
dockerComposeCommand: 'build webmvc'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push webmvc
|
||||
inputs:
|
||||
dockerComposeCommand: 'push webmvc'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
45
build/azure-devops/webspa/azure-pipelines.yml
Normal file
@ -0,0 +1,45 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/BuildingBlocks/*
|
||||
- src/Web/WebSPA/*
|
||||
- k8s/helm/webspa/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build webspa
|
||||
inputs:
|
||||
dockerComposeCommand: 'build webspa'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push webspa
|
||||
inputs:
|
||||
dockerComposeCommand: 'push webspa'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
45
build/azure-devops/webstatus/azure-pipelines.yml
Normal file
@ -0,0 +1,45 @@
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
variables:
|
||||
registryEndpoint: eshop-registry
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- dev
|
||||
paths:
|
||||
include:
|
||||
- src/BuildingBlocks/*
|
||||
- src/Web/WebStatus/*
|
||||
- k8s/helm/webstatus/*
|
||||
steps:
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose build webstatus
|
||||
inputs:
|
||||
dockerComposeCommand: 'build webstatus'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: DockerCompose@0
|
||||
displayName: Compose push webstatus
|
||||
inputs:
|
||||
dockerComposeCommand: 'push webstatus'
|
||||
containerregistrytype: Container Registry
|
||||
dockerRegistryEndpoint: $(registryEndpoint)
|
||||
dockerComposeFile: docker-compose.yml
|
||||
qualifyImageNames: true
|
||||
projectName: ""
|
||||
dockerComposeFileArgs: |
|
||||
TAG=$(Build.SourceBranchName)
|
||||
- task: CopyFiles@2
|
||||
inputs:
|
||||
sourceFolder: $(Build.SourcesDirectory)/k8s/helm
|
||||
targetFolder: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
pathtoPublish: $(Build.ArtifactStagingDirectory)/k8s/helm
|
||||
artifactName: helm
|
@ -8,4 +8,4 @@ if ([string]::IsNullOrEmpty($imageTag)) {
|
||||
|
||||
Write-Host "Building images with tag $imageTag" -ForegroundColor Yellow
|
||||
$env:TAG=$imageTag
|
||||
docker-compose -f "$scriptPath\..\docker-compose.yml" build
|
||||
docker-compose -f "$scriptPath\..\docker-compose.yml" -f "$scriptPath\..\docker-compose.windows.yml" build
|
@ -23,10 +23,11 @@ if ($buildBits) {
|
||||
$env:ESHOP_EXTERNAL_DNS_NAME_OR_IP = "10.0.75.1"
|
||||
$env:ESHOP_AZURE_STORAGE_CATALOG_URL ="http://10.0.75.1:5101/api/v1/catalog/items/[0]/pic/"
|
||||
$env:ESHOP_AZURE_STORAGE_MARKETING_URL ="http://10.0.75.1:5110/api/v1/campaigns/[0]/pic/"
|
||||
$env:ESHOP_OCELOT_VOLUME_SPEC ="C:\app\configuration"
|
||||
|
||||
if (-Not $customEventBusLoginPassword) {
|
||||
docker-compose -f "$rootPath\docker-compose-windows.yml" -f "$rootPath\docker-compose.override.yml" -f "$rootPath\docker-compose.override.windows.yml" up
|
||||
docker-compose -f "$rootPath\docker-compose.yml" -f "$rootPath\docker-compose.override.yml" -f "$rootPath\docker-compose.windows.yml" -f "$rootPath\docker-compose.override.windows.yml" up
|
||||
}
|
||||
else {
|
||||
docker-compose -f "$rootPath\docker-compose-windows.yml" -f "$rootPath\docker-compose.override.yml" up
|
||||
docker-compose -f "$rootPath\docker-compose.yml" -f "$rootPath\docker-compose.override.yml" -f "$rootPath\docker-compose.windows.yml" up
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ The ARM template `sbusdeploy.json` and its parameter file (`sbusdeploy.parameter
|
||||
|
||||
## Editing sbusdeploy.parameters.json file
|
||||
|
||||
You can edit the `sbusdeploy.parameters.parameters.json` file to set your values, but is not needed. The only parameter than can
|
||||
You can edit the `sbusdeploy.parameters.json` file to set your values, but is not needed. The only parameter than can
|
||||
be set is:
|
||||
|
||||
1. `namespaceprefix` is a string that is used to create the namespace. ARM script creates unique values by appending a unique string to this parameter value, so you can leave the default value.
|
||||
@ -21,4 +21,4 @@ i. e. if you are in windows, to deploy servicebus in a new resourcegroup located
|
||||
|
||||
```
|
||||
create-resources.cmd servicebus\sbusdeploy newResourceGroup -c westus
|
||||
```
|
||||
```
|
||||
|
247
docker-compose-tests.override.yml
Normal file
@ -0,0 +1,247 @@
|
||||
version: '3.4'
|
||||
|
||||
services:
|
||||
rabbitmq-test:
|
||||
ports:
|
||||
- "15672:15672"
|
||||
- "5672:5672"
|
||||
|
||||
sql-data-test:
|
||||
environment:
|
||||
- SA_PASSWORD=Pass@word
|
||||
- ACCEPT_EULA=Y
|
||||
ports:
|
||||
- "5433:1433"
|
||||
|
||||
nosql-data-test:
|
||||
ports:
|
||||
- "27017:27017"
|
||||
|
||||
basket-data-test:
|
||||
ports:
|
||||
- "6379:6379"
|
||||
|
||||
identity-api-test:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- SpaClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5104
|
||||
- XamarinCallback=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105/xamarincallback
|
||||
- ConnectionString=${ESHOP_AZURE_IDENTITY_DB:-Server=sql-data-test;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word}
|
||||
- MvcClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5100
|
||||
- LocationApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5109
|
||||
- MarketingApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5110
|
||||
- BasketApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5103
|
||||
- OrderingApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5102
|
||||
- MobileShoppingAggClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5120
|
||||
- WebShoppingAggClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5121
|
||||
- UseCustomizationData=True
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
ports:
|
||||
- "5105:80"
|
||||
|
||||
basket-api-test:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- ConnectionString=${ESHOP_AZURE_REDIS_BASKET_DB:-basket-data-test}
|
||||
- identityUrl=http://identity-api
|
||||
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
|
||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq-test}
|
||||
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||
- AzureServiceBusEnabled=False
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
- UseLoadTest=${USE_LOADTEST:-False}
|
||||
ports:
|
||||
- "5103:80"
|
||||
entrypoint:
|
||||
- dotnet
|
||||
- test
|
||||
- --logger
|
||||
- trx;LogFileName=/tests/basket-test-results.xml
|
||||
|
||||
basket-api-unit-test:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- ConnectionString=${ESHOP_AZURE_REDIS_BASKET_DB:-basket-data-test}
|
||||
- identityUrl=http://identity-api
|
||||
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
|
||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq-test}
|
||||
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||
- AzureServiceBusEnabled=False
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
- UseLoadTest=${USE_LOADTEST:-False}
|
||||
ports:
|
||||
- "5113:80"
|
||||
entrypoint:
|
||||
- dotnet
|
||||
- test
|
||||
- --logger
|
||||
- trx;LogFileName=/tests/basket-unit-test-results.xml
|
||||
|
||||
catalog-api-test:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- ConnectionString=${ESHOP_AZURE_CATALOG_DB:-Server=sql-data-test;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word}
|
||||
- PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG_URL:-http://localhost:5202/api/v1/c/catalog/items/[0]/pic/}
|
||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq-test}
|
||||
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||
- AzureStorageAccountName=${ESHOP_AZURE_STORAGE_CATALOG_NAME}
|
||||
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_CATALOG_KEY}
|
||||
- UseCustomizationData=True
|
||||
- AzureServiceBusEnabled=False
|
||||
- AzureStorageEnabled=False
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
ports:
|
||||
- "5101:80"
|
||||
entrypoint:
|
||||
- dotnet
|
||||
- test
|
||||
- --logger
|
||||
- trx;LogFileName=/tests/catalog-test-results.xml
|
||||
|
||||
catalog-api-unit-test:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- ConnectionString=${ESHOP_AZURE_CATALOG_DB:-Server=sql-data-test;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word}
|
||||
- PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG_URL:-http://localhost:5202/api/v1/c/catalog/items/[0]/pic/}
|
||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq-test}
|
||||
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||
- AzureStorageAccountName=${ESHOP_AZURE_STORAGE_CATALOG_NAME}
|
||||
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_CATALOG_KEY}
|
||||
- UseCustomizationData=True
|
||||
- AzureServiceBusEnabled=False
|
||||
- AzureStorageEnabled=False
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
ports:
|
||||
- "5191:80"
|
||||
entrypoint:
|
||||
- dotnet
|
||||
- test
|
||||
- --logger
|
||||
- trx;LogFileName=/tests/catalog-unit-test-results.xml
|
||||
|
||||
ordering-api-test:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql-data-test;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word}
|
||||
- identityUrl=http://identity-api
|
||||
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
|
||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq-test}
|
||||
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||
- UseCustomizationData=True
|
||||
- AzureServiceBusEnabled=False
|
||||
- CheckUpdateTime=30000
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
- UseLoadTest=${USE_LOADTEST:-False}
|
||||
ports:
|
||||
- "5102:80"
|
||||
entrypoint:
|
||||
- dotnet
|
||||
- test
|
||||
- --logger
|
||||
- trx;LogFileName=/tests/ordering-test-results.xml
|
||||
|
||||
ordering-api-unit-test:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql-data-test;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word}
|
||||
- identityUrl=http://identity-api
|
||||
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
|
||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq-test}
|
||||
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||
- UseCustomizationData=True
|
||||
- AzureServiceBusEnabled=False
|
||||
- CheckUpdateTime=30000
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
- UseLoadTest=${USE_LOADTEST:-False}
|
||||
ports:
|
||||
- "5112:80"
|
||||
entrypoint:
|
||||
- dotnet
|
||||
- test
|
||||
- --logger
|
||||
- trx;LogFileName=/tests/ordering-unit-test-results.xml
|
||||
|
||||
marketing-api-test:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- ConnectionString=${ESHOP_AZURE_MARKETING_DB:-Server=sql-data-test;Database=Microsoft.eShopOnContainers.Services.MarketingDb;User Id=sa;Password=Pass@word}
|
||||
- MongoConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql-data-test}
|
||||
- MongoDatabase=MarketingDb
|
||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq-test}
|
||||
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||
- identityUrl=http://identity-api
|
||||
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
|
||||
- CampaignDetailFunctionUri=${ESHOP_AZUREFUNC_CAMPAIGN_DETAILS_URI}
|
||||
- PicBaseUrl=${ESHOP_AZURE_STORAGE_MARKETING_URL:-http://localhost:5110/api/v1/campaigns/[0]/pic/}
|
||||
- AzureStorageAccountName=${ESHOP_AZURE_STORAGE_MARKETING_NAME}
|
||||
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_MARKETING_KEY}
|
||||
- AzureServiceBusEnabled=False
|
||||
- AzureStorageEnabled=False
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
- UseLoadTest=${USE_LOADTEST:-False}
|
||||
ports:
|
||||
- "5110:80"
|
||||
entrypoint:
|
||||
- dotnet
|
||||
- test
|
||||
- --logger
|
||||
- trx;LogFileName=/tests/marketing-test-results.xml
|
||||
|
||||
payment-api-test:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq-test}
|
||||
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||
- AzureServiceBusEnabled=False
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
ports:
|
||||
- "5108:80"
|
||||
|
||||
locations-api-test:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- ConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql-data-test}
|
||||
- Database=LocationsDb
|
||||
- identityUrl=http://identity-api
|
||||
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
|
||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq-test}
|
||||
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||
- AzureServiceBusEnabled=False
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
- UseLoadTest=${USE_LOADTEST:-False}
|
||||
ports:
|
||||
- "5109:80"
|
||||
entrypoint:
|
||||
- dotnet
|
||||
- test
|
||||
- --logger
|
||||
- trx;LogFileName=/tests/locations-test-results.xml
|
130
docker-compose-tests.yml
Normal file
@ -0,0 +1,130 @@
|
||||
version: '3.4'
|
||||
|
||||
services:
|
||||
rabbitmq-test:
|
||||
image: rabbitmq:3-management-alpine
|
||||
|
||||
basket-data-test:
|
||||
image: redis:alpine
|
||||
|
||||
sql-data-test:
|
||||
image: microsoft/mssql-server-linux:2017-latest
|
||||
|
||||
nosql-data-test:
|
||||
image: mongo
|
||||
|
||||
identity-api-test:
|
||||
image: ${REGISTRY:-eshop}/identity-api-test:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Identity/Identity.API/Dockerfile
|
||||
depends_on:
|
||||
- sql-data-test
|
||||
|
||||
basket-api-test:
|
||||
image: ${REGISTRY:-eshop}/basket-api-test:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Basket/Basket.API/Dockerfile
|
||||
target: functionaltest
|
||||
depends_on:
|
||||
- basket-data-test
|
||||
- identity-api-test
|
||||
- rabbitmq-test
|
||||
volumes:
|
||||
- ${BUILD_ARTIFACTSTAGINGDIRECTORY:-./tests-results/}:/tests
|
||||
|
||||
basket-api-unit-test:
|
||||
image: ${REGISTRY:-eshop}/basket-api-test:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Basket/Basket.API/Dockerfile
|
||||
target: unittest
|
||||
depends_on:
|
||||
- basket-data-test
|
||||
- identity-api-test
|
||||
- rabbitmq-test
|
||||
volumes:
|
||||
- ${BUILD_ARTIFACTSTAGINGDIRECTORY:-./tests-results/}:/tests
|
||||
|
||||
catalog-api-test:
|
||||
image: ${REGISTRY:-eshop}/catalog-api-test:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Catalog/Catalog.API/Dockerfile
|
||||
target: functionaltest
|
||||
depends_on:
|
||||
- sql-data-test
|
||||
- rabbitmq-test
|
||||
volumes:
|
||||
- ${BUILD_ARTIFACTSTAGINGDIRECTORY:-./tests-results/}:/tests
|
||||
|
||||
catalog-api-unit-test:
|
||||
image: ${REGISTRY:-eshop}/catalog-api-test:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Catalog/Catalog.API/Dockerfile
|
||||
target: unittest
|
||||
depends_on:
|
||||
- sql-data-test
|
||||
- rabbitmq-test
|
||||
volumes:
|
||||
- ${BUILD_ARTIFACTSTAGINGDIRECTORY:-./tests-results/}:/tests
|
||||
|
||||
ordering-api-test:
|
||||
image: ${REGISTRY:-eshop}/ordering-api-test:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Ordering/Ordering.API/Dockerfile
|
||||
target: functionaltest
|
||||
depends_on:
|
||||
- sql-data-test
|
||||
- rabbitmq-test
|
||||
volumes:
|
||||
- ${BUILD_ARTIFACTSTAGINGDIRECTORY:-./tests-results/}:/tests
|
||||
|
||||
ordering-api-unit-test:
|
||||
image: ${REGISTRY:-eshop}/ordering-api-test:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Ordering/Ordering.API/Dockerfile
|
||||
target: unittest
|
||||
depends_on:
|
||||
- sql-data-test
|
||||
- rabbitmq-test
|
||||
volumes:
|
||||
- ${BUILD_ARTIFACTSTAGINGDIRECTORY:-./tests-results/}:/tests
|
||||
|
||||
marketing-api-test:
|
||||
image: ${REGISTRY:-eshop}/marketing-api-test:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Marketing/Marketing.API/Dockerfile
|
||||
target: functionaltest
|
||||
depends_on:
|
||||
- sql-data-test
|
||||
- nosql-data-test
|
||||
- identity-api-test
|
||||
- rabbitmq-test
|
||||
volumes:
|
||||
- ${BUILD_ARTIFACTSTAGINGDIRECTORY:-./tests-results/}:/tests
|
||||
|
||||
payment-api-test:
|
||||
image: ${REGISTRY:-eshop}/payment-api-test:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Payment/Payment.API/Dockerfile
|
||||
depends_on:
|
||||
- rabbitmq-test
|
||||
|
||||
locations-api-test:
|
||||
image: ${REGISTRY:-eshop}/locations-api-test:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Location/Locations.API/Dockerfile
|
||||
target: functionaltest
|
||||
depends_on:
|
||||
- nosql-data-test
|
||||
- rabbitmq-test
|
||||
volumes:
|
||||
- ${BUILD_ARTIFACTSTAGINGDIRECTORY:-./tests-results/}:/tests
|
@ -1,128 +0,0 @@
|
||||
version: '3.4'
|
||||
|
||||
services:
|
||||
basket.api:
|
||||
image: eshop/basket.api-win:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Basket/Basket.API/Dockerfile
|
||||
depends_on:
|
||||
- basket.data
|
||||
- identity.api
|
||||
- rabbitmq
|
||||
|
||||
catalog.api:
|
||||
image: eshop/catalog.api-win:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Catalog/Catalog.API/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
- rabbitmq
|
||||
|
||||
identity.api:
|
||||
image: eshop/identity.api-win:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Identity/Identity.API/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
|
||||
ordering.api:
|
||||
image: eshop/ordering.api-win:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Ordering/Ordering.API/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
- rabbitmq
|
||||
|
||||
ordering.backgroundtasks:
|
||||
image: eshop/ordering.backgroundtasks-win:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
- rabbitmq
|
||||
|
||||
marketing.api:
|
||||
image: eshop/marketing.api-win:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Marketing/Marketing.API/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
- nosql.data
|
||||
- identity.api
|
||||
- rabbitmq
|
||||
|
||||
webspa:
|
||||
image: eshop/webspa-win:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Web/WebSPA/Dockerfile
|
||||
depends_on:
|
||||
- catalog.api
|
||||
- ordering.api
|
||||
- identity.api
|
||||
- basket.api
|
||||
- marketing.api
|
||||
|
||||
webmvc:
|
||||
image: eshop/webmvc-win:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Web/WebMVC/Dockerfile
|
||||
depends_on:
|
||||
- catalog.api
|
||||
- ordering.api
|
||||
- identity.api
|
||||
- basket.api
|
||||
- marketing.api
|
||||
|
||||
webstatus:
|
||||
image: eshop/webstatus-win:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Web/WebStatus/Dockerfile
|
||||
|
||||
payment.api:
|
||||
image: eshop/payment.api-win:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Payment/Payment.API/Dockerfile
|
||||
depends_on:
|
||||
- rabbitmq
|
||||
|
||||
locations.api:
|
||||
image: eshop/locations.api-win:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Location/Locations.API/Dockerfile
|
||||
depends_on:
|
||||
- nosql.data
|
||||
- rabbitmq
|
||||
|
||||
sql.data:
|
||||
image: microsoft/mssql-server-windows-developer
|
||||
|
||||
nosql.data:
|
||||
image: mongo:windowsservercore
|
||||
|
||||
basket.data:
|
||||
image: redis:nanoserver
|
||||
ports:
|
||||
- "6379:6379"
|
||||
|
||||
rabbitmq:
|
||||
image: spring2/rabbitmq
|
||||
ports:
|
||||
- "15672:15672"
|
||||
- "5672:5672"
|
||||
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: nat
|
||||
|
@ -1,19 +0,0 @@
|
||||
version: '3.4'
|
||||
|
||||
services:
|
||||
ci-build:
|
||||
image: microsoft/aspnetcore-build:2.0.2 #Depending on the bug below, you can also try this other SDK image: microsoft/aspnetcore-build:1.0-2.0-2017-10 or microsoft/aspnetcore-build:1.0-2.0
|
||||
volumes:
|
||||
- .:/src
|
||||
- ./cli-linux:/cli-linux
|
||||
working_dir: /src
|
||||
|
||||
|
||||
# Next line is using the .sln file to compile all the projects.
|
||||
# Sometime there is an issue in msbuild exits the process before finishing building the bits: (https://github.com/Microsoft/msbuild/issues/2153)
|
||||
# Random error: error MSB4017: The build stopped unexpectedly be cause of an unexpected logger failure.
|
||||
command: /bin/bash -c "pushd ./src/Web/WebSPA && npm rebuild node-sass && popd && dotnet publish ./eShopOnContainers-ServicesAndWebApps.sln -c Release -o ./obj/Docker/publish"
|
||||
|
||||
# NOTE: Using build-bits-linux.sh from Linux build container exits before ending.
|
||||
#command: /bin/bash -c "pushd ./src/Web/WebSPA && npm rebuild node-sass && popd && pushd /cli-linux && ./build-bits-linux.sh /src"
|
||||
|
@ -11,7 +11,6 @@
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<None Include=".dockerignore" />
|
||||
<None Include="docker-compose.ci.build.yml" />
|
||||
<None Include="docker-compose.override.yml">
|
||||
<DependentUpon>docker-compose.yml</DependentUpon>
|
||||
</None>
|
||||
|
37
docker-compose.elk.yml
Normal file
@ -0,0 +1,37 @@
|
||||
version: '3.4'
|
||||
|
||||
services:
|
||||
|
||||
elasticsearch:
|
||||
build:
|
||||
context: elk/elasticsearch/
|
||||
volumes:
|
||||
- ./elk/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
|
||||
ports:
|
||||
- "9200:9200"
|
||||
- "9300:9300"
|
||||
environment:
|
||||
ES_JAVA_OPTS: "-Xmx256m -Xms256m"
|
||||
|
||||
logstash:
|
||||
build:
|
||||
context: elk/logstash/
|
||||
volumes:
|
||||
- ./elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro
|
||||
- ./elk/logstash/pipeline:/usr/share/logstash/pipeline:ro
|
||||
ports:
|
||||
- "8080:8080"
|
||||
environment:
|
||||
LS_JAVA_OPTS: "-Xmx256m -Xms256m"
|
||||
depends_on:
|
||||
- elasticsearch
|
||||
|
||||
kibana:
|
||||
build:
|
||||
context: elk/kibana/
|
||||
volumes:
|
||||
- ./elk/kibana/config/:/usr/share/kibana/config:ro
|
||||
ports:
|
||||
- "5601:5601"
|
||||
depends_on:
|
||||
- elasticsearch
|
@ -37,11 +37,6 @@ services:
|
||||
- EventBusUserName=admin
|
||||
- EventBusPassword=password
|
||||
|
||||
ordering.api:
|
||||
environment:
|
||||
- EventBusUserName=admin
|
||||
- EventBusPassword=password
|
||||
|
||||
ordering.backgroundtasks:
|
||||
environment:
|
||||
- EventBusUserName=admin
|
||||
@ -55,4 +50,9 @@ services:
|
||||
locations.api:
|
||||
environment:
|
||||
- EventBusUserName=admin
|
||||
- EventBusPassword=password
|
||||
- EventBusPassword=password
|
||||
|
||||
ordering.signalrhub:
|
||||
environment:
|
||||
- EventBusUserName=admin
|
||||
- EventBusPassword=password
|
||||
|
@ -7,7 +7,54 @@ version: '3.4'
|
||||
# An external IP or DNS name has to be used (instead localhost and the 10.0.75.1 IP) when testing the Web apps and the Xamarin apps from remote machines/devices using the same WiFi, for instance.
|
||||
|
||||
services:
|
||||
|
||||
seq:
|
||||
environment:
|
||||
- ACCEPT_EULA=Y
|
||||
ports:
|
||||
- "5340:80"
|
||||
|
||||
sql.data:
|
||||
environment:
|
||||
- SA_PASSWORD=Pass@word
|
||||
- ACCEPT_EULA=Y
|
||||
ports:
|
||||
- "5433:1433" # Important: In a production environment your should remove the external port
|
||||
|
||||
nosql.data:
|
||||
ports:
|
||||
- "27017:27017" # Important: In a production environment your should remove the external port
|
||||
|
||||
basket.data:
|
||||
ports:
|
||||
- "6379:6379" # Important: In a production environment your should remove the external port
|
||||
|
||||
rabbitmq:
|
||||
ports:
|
||||
- "15672:15672" # Important: In a production environment your should remove the external port
|
||||
- "5672:5672" # Important: In a production environment your should remove the external port
|
||||
|
||||
identity.api:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- SpaClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5104
|
||||
- XamarinCallback=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105/xamarincallback #localhost do not work for UWP login, so we have to use "external" IP always
|
||||
- ConnectionString=${ESHOP_AZURE_IDENTITY_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word}
|
||||
- MvcClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5100 #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||
- LocationApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5109
|
||||
- MarketingApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5110
|
||||
- BasketApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5103
|
||||
- OrderingApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5102
|
||||
- MobileShoppingAggClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5120
|
||||
- WebShoppingAggClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5121
|
||||
- WebhooksApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5113
|
||||
- WebhooksWebClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5114
|
||||
- UseCustomizationData=True
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
ports:
|
||||
- "5105:80"
|
||||
|
||||
basket.api:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
@ -47,26 +94,6 @@ services:
|
||||
- "5101:80" # Important: In a production environment your should remove the external port (5101) kept here for microservice debugging purposes.
|
||||
# The API Gateway redirects and access through the internal port (80).
|
||||
|
||||
identity.api:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- SpaClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5104
|
||||
- XamarinCallback=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105/xamarincallback #localhost do not work for UWP login, so we have to use "external" IP always
|
||||
- ConnectionString=${ESHOP_AZURE_IDENTITY_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word}
|
||||
- MvcClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5100 #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||
- LocationApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5109
|
||||
- MarketingApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5110
|
||||
- BasketApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5103
|
||||
- OrderingApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5102
|
||||
- MobileShoppingAggClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5120
|
||||
- WebShoppingAggClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5121
|
||||
- UseCustomizationData=True
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
ports:
|
||||
- "5105:80"
|
||||
|
||||
ordering.api:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
@ -80,7 +107,6 @@ services:
|
||||
- UseCustomizationData=True
|
||||
- AzureServiceBusEnabled=False
|
||||
- CheckUpdateTime=30000
|
||||
- GracePeriodTime=1
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
- UseLoadTest=${USE_LOADTEST:-False}
|
||||
@ -88,6 +114,25 @@ services:
|
||||
- "5102:80" # Important: In a production environment your should remove the external port (5102) kept here for microservice debugging purposes.
|
||||
# The API Gateway redirects and access through the internal port (80).
|
||||
|
||||
|
||||
ordering.backgroundtasks:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word}
|
||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
||||
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||
- UseCustomizationData=True
|
||||
- AzureServiceBusEnabled=False
|
||||
- CheckUpdateTime=30000
|
||||
- GracePeriodTime=1
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
- UseLoadTest=${USE_LOADTEST:-False}
|
||||
ports:
|
||||
- "5111:80"
|
||||
|
||||
marketing.api:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
@ -113,63 +158,6 @@ services:
|
||||
- "5110:80" # Important: In a production environment your should remove the external port (5110) kept here for microservice debugging purposes.
|
||||
# The API Gateway redirects and access through the internal port (80).
|
||||
|
||||
webspa:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- IdentityUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
|
||||
- PurchaseUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5202
|
||||
- MarketingUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5203
|
||||
- CatalogUrlHC=http://catalog.api/hc
|
||||
- OrderingUrlHC=http://ordering.api/hc
|
||||
- IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser.
|
||||
- BasketUrlHC=http://basket.api/hc
|
||||
- MarketingUrlHC=http://marketing.api/hc
|
||||
- PaymentUrlHC=http://payment.api/hc
|
||||
- UseCustomizationData=True
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
ports:
|
||||
- "5104:80"
|
||||
|
||||
webmvc:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- PurchaseUrl=http://webshoppingapigw
|
||||
- IdentityUrl=http://10.0.75.1:5105 # Local Mac: Use http://docker.for.mac.localhost:5105 || Local Windows: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. || #Remote access: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser.
|
||||
- MarketingUrl=http://webmarketingapigw
|
||||
- CatalogUrlHC=http://catalog.api/hc
|
||||
- OrderingUrlHC=http://ordering.api/hc
|
||||
- IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser.
|
||||
- BasketUrlHC=http://basket.api/hc
|
||||
- MarketingUrlHC=http://marketing.api/hc
|
||||
- PaymentUrlHC=http://payment.api/hc
|
||||
- UseCustomizationData=True
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
- UseLoadTest=${USE_LOADTEST:-False}
|
||||
ports:
|
||||
- "5100:80"
|
||||
|
||||
webstatus:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- CatalogUrl=http://catalog.api/hc
|
||||
- OrderingUrl=http://ordering.api/hc
|
||||
- BasketUrl=http://basket.api/hc
|
||||
- IdentityUrl=http://identity.api/hc
|
||||
- LocationsUrl=http://locations.api/hc
|
||||
- MarketingUrl=http://marketing.api/hc
|
||||
- PaymentUrl=http://payment.api/hc
|
||||
- mvc=http://webmvc/hc
|
||||
- spa=http://webspa/hc
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
ports:
|
||||
- "5107:80"
|
||||
|
||||
payment.api:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
@ -202,62 +190,87 @@ services:
|
||||
ports:
|
||||
- "5109:80" # Important: In a production environment your should remove the external port (5109) kept here for microservice debugging purposes.
|
||||
# The API Gateway redirects and access through the internal port (80).
|
||||
|
||||
sql.data:
|
||||
webhooks.api:
|
||||
environment:
|
||||
- SA_PASSWORD=Pass@word
|
||||
- ACCEPT_EULA=Y
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- ConnectionString=${ESHOP_AZURE_WEBHOOKS_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.WebhooksDb;User Id=sa;Password=Pass@word}
|
||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
||||
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||
- IdentityUrl=http://identity.api
|
||||
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
|
||||
ports:
|
||||
- "5433:1433" # Important: In a production environment your should remove the external port
|
||||
|
||||
nosql.data:
|
||||
ports:
|
||||
- "27017:27017" # Important: In a production environment your should remove the external port
|
||||
|
||||
basket.data:
|
||||
ports:
|
||||
- "6379:6379" # Important: In a production environment your should remove the external port
|
||||
|
||||
rabbitmq:
|
||||
ports:
|
||||
- "15672:15672" # Important: In a production environment your should remove the external port
|
||||
- "5672:5672" # Important: In a production environment your should remove the external port
|
||||
- "5113:80" # Important: In a production environment your should remove the external port (5109) kept here for microservice debugging purposes.
|
||||
# The API Gateway redirects and access through the internal port (80).
|
||||
|
||||
mobileshoppingapigw:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||
- urls__basket=http://basket.api
|
||||
- urls__catalog=http://catalog.api
|
||||
- urls__orders=http://ordering.api
|
||||
- urls__identity=http://identity.api
|
||||
- CatalogUrlHC=http://catalog.api/hc
|
||||
- OrderingUrlHC=http://ordering.api/hc
|
||||
- IdentityUrlHC=http://identity.api/hc
|
||||
- BasketUrlHC=http://basket.api/hc
|
||||
- MarketingUrlHC=http://marketing.api/hc
|
||||
- PaymentUrlHC=http://payment.api/hc
|
||||
- LocationUrlHC=http://locations.api/hc
|
||||
ports:
|
||||
- "5200:80"
|
||||
volumes:
|
||||
- ./src/ApiGateways/Mobile.Bff.Shopping/apigw:/app/configuration
|
||||
|
||||
- ./src/ApiGateways/Mobile.Bff.Shopping/apigw:${ESHOP_OCELOT_VOLUME_SPEC:-/app/configuration}
|
||||
|
||||
mobilemarketingapigw:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||
- CatalogUrlHC=http://catalog.api/hc
|
||||
- OrderingUrlHC=http://ordering.api/hc
|
||||
- IdentityUrlHC=http://identity.api/hc
|
||||
- BasketUrlHC=http://basket.api/hc
|
||||
- MarketingUrlHC=http://marketing.api/hc
|
||||
- PaymentUrlHC=http://payment.api/hc
|
||||
- LocationUrlHC=http://locations.api/hc
|
||||
ports:
|
||||
- "5201:80"
|
||||
volumes:
|
||||
- ./src/ApiGateways/Mobile.Bff.Marketing/apigw:/app/configuration
|
||||
- ./src/ApiGateways/Mobile.Bff.Marketing/apigw:${ESHOP_OCELOT_VOLUME_SPEC:-/app/configuration}
|
||||
|
||||
webshoppingapigw:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||
- CatalogUrlHC=http://catalog.api/hc
|
||||
- OrderingUrlHC=http://ordering.api/hc
|
||||
- IdentityUrlHC=http://identity.api/hc
|
||||
- BasketUrlHC=http://basket.api/hc
|
||||
- MarketingUrlHC=http://marketing.api/hc
|
||||
- PaymentUrlHC=http://payment.api/hc
|
||||
- LocationUrlHC=http://locations.api/hc
|
||||
ports:
|
||||
- "5202:80"
|
||||
volumes:
|
||||
- ./src/ApiGateways/Web.Bff.Shopping/apigw:/app/configuration
|
||||
- ./src/ApiGateways/Web.Bff.Shopping/apigw:${ESHOP_OCELOT_VOLUME_SPEC:-/app/configuration}
|
||||
|
||||
webmarketingapigw:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||
- CatalogUrlHC=http://catalog.api/hc
|
||||
- OrderingUrlHC=http://ordering.api/hc
|
||||
- IdentityUrlHC=http://identity.api/hc
|
||||
- BasketUrlHC=http://basket.api/hc
|
||||
- MarketingUrlHC=http://marketing.api/hc
|
||||
- PaymentUrlHC=http://payment.api/hc
|
||||
- LocationUrlHC=http://locations.api/hc
|
||||
ports:
|
||||
- "5203:80"
|
||||
volumes:
|
||||
- ./src/ApiGateways/Web.Bff.Marketing/apigw:/app/configuration
|
||||
- ./src/ApiGateways/Web.Bff.Marketing/apigw:${ESHOP_OCELOT_VOLUME_SPEC:-/app/configuration}
|
||||
|
||||
mobileshoppingagg:
|
||||
environment:
|
||||
@ -266,6 +279,13 @@ services:
|
||||
- urls__catalog=http://catalog.api
|
||||
- urls__orders=http://ordering.api
|
||||
- urls__identity=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||
- CatalogUrlHC=http://catalog.api/hc
|
||||
- OrderingUrlHC=http://ordering.api/hc
|
||||
- IdentityUrlHC=http://identity.api/hc
|
||||
- BasketUrlHC=http://basket.api/hc
|
||||
- MarketingUrlHC=http://marketing.api/hc
|
||||
- PaymentUrlHC=http://payment.api/hc
|
||||
- LocationUrlHC=http://locations.api/hc
|
||||
ports:
|
||||
- "5120:80" # Important: In a production environment your should remove the external port (5120) kept here for microservice debugging purposes.
|
||||
# The API Gateway redirects and access through the internal port (80).
|
||||
@ -277,6 +297,117 @@ services:
|
||||
- urls__catalog=http://catalog.api
|
||||
- urls__orders=http://ordering.api
|
||||
- urls__identity=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||
- CatalogUrlHC=http://catalog.api/hc
|
||||
- OrderingUrlHC=http://ordering.api/hc
|
||||
- IdentityUrlHC=http://identity.api/hc
|
||||
- BasketUrlHC=http://basket.api/hc
|
||||
- MarketingUrlHC=http://marketing.api/hc
|
||||
- PaymentUrlHC=http://payment.api/hc
|
||||
- LocationUrlHC=http://locations.api/hc
|
||||
ports:
|
||||
- "5121:80" # Important: In a production environment your should remove the external port (5121) kept here for microservice debugging purposes.
|
||||
# The API Gateway redirects and access through the internal port (80).
|
||||
# The API Gateway redirects and access through the internal port (80).
|
||||
|
||||
ordering.signalrhub:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
||||
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||
- AzureServiceBusEnabled=False
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
|
||||
ports:
|
||||
- "5112:80"
|
||||
|
||||
webstatus:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Production
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- HealthChecks-UI__HealthChecks__1__Name=WebMVC HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__1__Uri=http://webmvc/hc
|
||||
- HealthChecks-UI__HealthChecks__2__Name=WebSPA HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__2__Uri=http://webspa/hc
|
||||
- HealthChecks-UI__HealthChecks__3__Name=Web Shopping Aggregator GW HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__3__Uri=http://webshoppingagg/hc
|
||||
- HealthChecks-UI__HealthChecks__4__Name=Mobile Shopping Aggregator HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__4__Uri=http://mobileshoppingagg/hc
|
||||
- HealthChecks-UI__HealthChecks__5__Name=Mobile Shopping API GW HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__5__Uri=http://mobileshoppingapigw/hc
|
||||
- HealthChecks-UI__HealthChecks__6__Name=Mobile Marketing API GW HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__6__Uri=http://mobilemarketingapigw/hc
|
||||
- HealthChecks-UI__HealthChecks__7__Name=Web Shopping API GW HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__7__Uri=http://webshoppingapigw/hc
|
||||
- HealthChecks-UI__HealthChecks__8__Name=Web Marketing API GW HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__8__Uri=http://webmarketingapigw/hc
|
||||
- HealthChecks-UI__HealthChecks__9__Name=Ordering HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__9__Uri=http://ordering.api/hc
|
||||
- HealthChecks-UI__HealthChecks__10__Name=Ordering HTTP Background Check
|
||||
- HealthChecks-UI__HealthChecks__10__Uri=http://ordering.backgroundtasks/hc
|
||||
- HealthChecks-UI__HealthChecks__11__Name=Basket HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__11__Uri=http://basket.api/hc
|
||||
- HealthChecks-UI__HealthChecks__12__Name=Catalog HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__12__Uri=http://catalog.api/hc
|
||||
- HealthChecks-UI__HealthChecks__13__Name=Identity HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__13__Uri=http://identity.api/hc
|
||||
- HealthChecks-UI__HealthChecks__14__Name=Marketing HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__14__Uri=http://marketing.api/hc
|
||||
- HealthChecks-UI__HealthChecks__15__Name=Locations HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__15__Uri=http://locations.api/hc
|
||||
- HealthChecks-UI__HealthChecks__16__Name=Payments HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__16__Uri=http://payment.api/hc
|
||||
- HealthChecks-UI__HealthChecks__17__Name=Ordering SignalRHub HTTP Check
|
||||
- HealthChecks-UI__HealthChecks__17__Uri=http://ordering.signalrhub/hc
|
||||
- OrderingBackgroundTasksUrl=http://ordering.backgroundtasks/hc
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
ports:
|
||||
- "5107:80"
|
||||
|
||||
webspa:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- IdentityUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
|
||||
- PurchaseUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5202
|
||||
- MarketingUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5203
|
||||
- PurchaseUrlHC=http://webshoppingapigw/hc
|
||||
- MarketingUrlHC=http://webmarketingapigw/hc
|
||||
- IdentityUrlHC=http://identity.api/hc
|
||||
- UseCustomizationData=True
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
- SignalrHubUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5202
|
||||
ports:
|
||||
- "5104:80"
|
||||
|
||||
webmvc:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- PurchaseUrl=http://webshoppingapigw
|
||||
- IdentityUrl=http://10.0.75.1:5105 # Local Mac: Use http://docker.for.mac.localhost:5105 || Local Windows: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. || #Remote access: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser.
|
||||
- MarketingUrl=http://webmarketingapigw
|
||||
- SignalrHubUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5202
|
||||
- IdentityUrlHC=http://identity.api/hc
|
||||
- PurchaseUrlHC=http://webshoppingapigw/hc
|
||||
- MarketingUrlHC=http://webmarketingapigw/hc
|
||||
- UseCustomizationData=True
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
- UseLoadTest=${USE_LOADTEST:-False}
|
||||
ports:
|
||||
- "5100:80"
|
||||
|
||||
webhooks.client:
|
||||
environment:
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- Token=6168DB8D-DC58-4094-AF24-483278923590 # Webhooks are registered with this token (any value is valid) but the client won't check it
|
||||
- IdentityUrl=http://10.0.75.1:5105
|
||||
- CallBackUrl=http://localhost:5114
|
||||
- WebhooksUrl=http://webhooks.api
|
||||
- SelfUrl=http://webhooks.client/
|
||||
ports:
|
||||
- "5114:80"
|
@ -85,13 +85,31 @@ services:
|
||||
- UseCustomizationData=True
|
||||
- AzureServiceBusEnabled=False
|
||||
- CheckUpdateTime=30000
|
||||
- GracePeriodTime=1
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
- UseLoadTest=${USE_LOADTEST:-False}
|
||||
ports:
|
||||
- "80" # The API Gateway redirects and access through the internal port (80).
|
||||
|
||||
|
||||
ordering.backgroundtasks:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word}
|
||||
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
|
||||
- EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
|
||||
- EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
|
||||
- UseCustomizationData=True
|
||||
- AzureServiceBusEnabled=False
|
||||
- CheckUpdateTime=30000
|
||||
- GracePeriodTime=1
|
||||
- ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
|
||||
- OrchestratorType=${ORCHESTRATOR_TYPE}
|
||||
- UseLoadTest=${USE_LOADTEST:-False}
|
||||
ports:
|
||||
- "5111:80"
|
||||
|
||||
marketing.api:
|
||||
environment:
|
||||
- ASPNETCORE_ENVIRONMENT=Development
|
||||
@ -161,6 +179,7 @@ services:
|
||||
- ASPNETCORE_URLS=http://0.0.0.0:80
|
||||
- CatalogUrl=http://catalog.api/hc
|
||||
- OrderingUrl=http://ordering.api/hc
|
||||
- OrderingBackgroundTasksUrl=http://ordering.backgroundtasks/hc
|
||||
- BasketUrl=http://basket.api/hc
|
||||
- IdentityUrl=http://identity.api/hc
|
||||
- LocationsUrl=http://locations.api/hc
|
||||
|
39
docker-compose.windows.yml
Normal file
@ -0,0 +1,39 @@
|
||||
# This file contains specific services build and images for Windows Containers.
|
||||
#
|
||||
# MUST be used alongside "docker-compose.yml" in all windows container commands
|
||||
|
||||
version: '3.4'
|
||||
|
||||
services:
|
||||
sql.data:
|
||||
image: microsoft/mssql-server-windows-developer
|
||||
|
||||
nosql.data:
|
||||
image: mongo:windowsservercore
|
||||
|
||||
basket.data:
|
||||
image: redis:nanoserver
|
||||
|
||||
rabbitmq:
|
||||
image: spring2/rabbitmq
|
||||
|
||||
identity.api:
|
||||
build:
|
||||
args:
|
||||
NODE_IMAGE: stefanscherer/node-windows:8.11
|
||||
|
||||
webspa:
|
||||
build:
|
||||
args:
|
||||
NODE_IMAGE: stefanscherer/node-windows:8.11
|
||||
|
||||
webmvc:
|
||||
build:
|
||||
args:
|
||||
NODE_IMAGE: stefanscherer/node-windows:8.11
|
||||
|
||||
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: nat
|
@ -2,99 +2,8 @@ version: '3.4'
|
||||
|
||||
services:
|
||||
|
||||
basket.api:
|
||||
image: eshop/basket.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Basket/Basket.API/Dockerfile
|
||||
depends_on:
|
||||
- basket.data
|
||||
- identity.api
|
||||
- rabbitmq
|
||||
|
||||
catalog.api:
|
||||
image: eshop/catalog.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Catalog/Catalog.API/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
- rabbitmq
|
||||
|
||||
identity.api:
|
||||
image: eshop/identity.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Identity/Identity.API/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
|
||||
ordering.api:
|
||||
image: eshop/ordering.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Ordering/Ordering.API/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
- rabbitmq
|
||||
|
||||
marketing.api:
|
||||
image: eshop/marketing.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Marketing/Marketing.API/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
- nosql.data
|
||||
- identity.api
|
||||
- rabbitmq
|
||||
|
||||
webspa:
|
||||
image: eshop/webspa:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Web/WebSPA/Dockerfile
|
||||
depends_on:
|
||||
- catalog.api
|
||||
- ordering.api
|
||||
- identity.api
|
||||
- basket.api
|
||||
- marketing.api
|
||||
|
||||
webmvc:
|
||||
image: eshop/webmvc:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Web/WebMVC/Dockerfile
|
||||
depends_on:
|
||||
- catalog.api
|
||||
- ordering.api
|
||||
- identity.api
|
||||
- basket.api
|
||||
- marketing.api
|
||||
|
||||
webstatus:
|
||||
image: eshop/webstatus:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Web/WebStatus/Dockerfile
|
||||
|
||||
payment.api:
|
||||
image: eshop/payment.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Payment/Payment.API/Dockerfile
|
||||
depends_on:
|
||||
- rabbitmq
|
||||
|
||||
locations.api:
|
||||
image: eshop/locations.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Location/Locations.API/Dockerfile
|
||||
depends_on:
|
||||
- nosql.data
|
||||
- rabbitmq
|
||||
seq:
|
||||
image: datalust/seq:latest
|
||||
|
||||
sql.data:
|
||||
image: microsoft/mssql-server-linux:2017-latest
|
||||
@ -104,43 +13,226 @@ services:
|
||||
|
||||
basket.data:
|
||||
image: redis:alpine
|
||||
|
||||
|
||||
rabbitmq:
|
||||
image: rabbitmq:3-management-alpine
|
||||
|
||||
identity.api:
|
||||
image: ${REGISTRY:-eshop}/identity.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Identity/Identity.API/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
|
||||
basket.api:
|
||||
image: ${REGISTRY:-eshop}/basket.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Basket/Basket.API/Dockerfile
|
||||
depends_on:
|
||||
- basket.data
|
||||
- identity.api
|
||||
- rabbitmq
|
||||
|
||||
catalog.api:
|
||||
image: ${REGISTRY:-eshop}/catalog.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Catalog/Catalog.API/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
- rabbitmq
|
||||
|
||||
ordering.api:
|
||||
image: ${REGISTRY:-eshop}/ordering.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Ordering/Ordering.API/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
- rabbitmq
|
||||
|
||||
ordering.backgroundtasks:
|
||||
image: ${REGISTRY:-eshop}/ordering.backgroundtasks:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
- rabbitmq
|
||||
|
||||
marketing.api:
|
||||
image: ${REGISTRY:-eshop}/marketing.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Marketing/Marketing.API/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
- nosql.data
|
||||
- identity.api
|
||||
- rabbitmq
|
||||
|
||||
payment.api:
|
||||
image: ${REGISTRY:-eshop}/payment.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Payment/Payment.API/Dockerfile
|
||||
depends_on:
|
||||
- rabbitmq
|
||||
|
||||
locations.api:
|
||||
image: ${REGISTRY:-eshop}/locations.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Location/Locations.API/Dockerfile
|
||||
depends_on:
|
||||
- nosql.data
|
||||
- rabbitmq
|
||||
|
||||
webhooks.api:
|
||||
image: ${REGISTRY:-eshop}/webhooks.api:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Webhooks/Webhooks.API/Dockerfile
|
||||
depends_on:
|
||||
- sql.data
|
||||
|
||||
mobileshoppingapigw:
|
||||
image: eshop/ocelotapigw:${TAG:-latest}
|
||||
image: ${REGISTRY:-eshop}/ocelotapigw:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile
|
||||
|
||||
depends_on:
|
||||
- nosql.data
|
||||
- sql.data
|
||||
- identity.api
|
||||
- rabbitmq
|
||||
- ordering.api
|
||||
- marketing.api
|
||||
- catalog.api
|
||||
- basket.api
|
||||
|
||||
mobilemarketingapigw:
|
||||
image: eshop/ocelotapigw:${TAG:-latest}
|
||||
image: ${REGISTRY:-eshop}/ocelotapigw:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile
|
||||
|
||||
depends_on:
|
||||
- nosql.data
|
||||
- sql.data
|
||||
- identity.api
|
||||
- rabbitmq
|
||||
- ordering.api
|
||||
- marketing.api
|
||||
- catalog.api
|
||||
- basket.api
|
||||
|
||||
webshoppingapigw:
|
||||
image: eshop/ocelotapigw:${TAG:-latest}
|
||||
image: ${REGISTRY:-eshop}/ocelotapigw:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile
|
||||
depends_on:
|
||||
- nosql.data
|
||||
- sql.data
|
||||
- identity.api
|
||||
- rabbitmq
|
||||
- ordering.api
|
||||
- marketing.api
|
||||
- catalog.api
|
||||
- basket.api
|
||||
|
||||
webmarketingapigw:
|
||||
image: eshop/ocelotapigw:${TAG:-latest}
|
||||
image: ${REGISTRY:-eshop}/ocelotapigw:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile
|
||||
depends_on:
|
||||
- nosql.data
|
||||
- sql.data
|
||||
- identity.api
|
||||
- rabbitmq
|
||||
- ordering.api
|
||||
- marketing.api
|
||||
- catalog.api
|
||||
- basket.api
|
||||
|
||||
mobileshoppingagg:
|
||||
image: eshop/mobileshoppingagg:${TAG:-latest}
|
||||
image: ${REGISTRY:-eshop}/mobileshoppingagg:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile
|
||||
depends_on:
|
||||
- nosql.data
|
||||
- sql.data
|
||||
- identity.api
|
||||
- rabbitmq
|
||||
- ordering.api
|
||||
- marketing.api
|
||||
- catalog.api
|
||||
- basket.api
|
||||
|
||||
webshoppingagg:
|
||||
image: eshop/webshoppingagg:${TAG:-latest}
|
||||
image: ${REGISTRY:-eshop}/webshoppingagg:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile
|
||||
depends_on:
|
||||
- nosql.data
|
||||
- sql.data
|
||||
- identity.api
|
||||
- rabbitmq
|
||||
- ordering.api
|
||||
- marketing.api
|
||||
- catalog.api
|
||||
- basket.api
|
||||
|
||||
ordering.signalrhub:
|
||||
image: ${REGISTRY:-eshop}/ordering.signalrhub:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Services/Ordering/Ordering.SignalrHub/Dockerfile
|
||||
depends_on:
|
||||
- nosql.data
|
||||
- sql.data
|
||||
- identity.api
|
||||
- rabbitmq
|
||||
- ordering.api
|
||||
- marketing.api
|
||||
- catalog.api
|
||||
- basket.api
|
||||
|
||||
webstatus:
|
||||
image: ${REGISTRY:-eshop}/webstatus:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Web/WebStatus/Dockerfile
|
||||
|
||||
webspa:
|
||||
image: ${REGISTRY:-eshop}/webspa:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Web/WebSPA/Dockerfile
|
||||
# depends_on:
|
||||
# - webshoppingagg
|
||||
# - webshoppingapigw
|
||||
# - webmarketingapigw
|
||||
|
||||
webmvc:
|
||||
image: ${REGISTRY:-eshop}/webmvc:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Web/WebMVC/Dockerfile
|
||||
depends_on:
|
||||
- webshoppingagg
|
||||
- webshoppingapigw
|
||||
- webmarketingapigw
|
||||
|
||||
webhooks.client:
|
||||
image: ${REGISTRY:-eshop}/webhooks.client:${TAG:-latest}
|
||||
build:
|
||||
context: .
|
||||
dockerfile: src/Web/WebhookClient/Dockerfile
|
||||
depends_on:
|
||||
- webhooks.api
|
8
docker-scripts/linux/install-node.sh
Normal file
@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
export NODE_DOWNLOAD_SHA 0e20787e2eda4cc31336d8327556ebc7417e8ee0a6ba0de96a09b0ec2b841f60
|
||||
curl -SL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz" --output nodejs.tar.gz \
|
||||
&& echo "$NODE_DOWNLOAD_SHA nodejs.tar.gz" | sha256sum -c - \
|
||||
&& tar -xzf "nodejs.tar.gz" -C /usr/local --strip-components=1 \
|
||||
&& rm nodejs.tar.gz \
|
||||
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs
|
4
docker-scripts/win/install-node.cmd
Normal file
@ -0,0 +1,4 @@
|
||||
set NODE_VERSION=8.11.1
|
||||
curl -SL "https://nodejs.org/dist/v%NODE_VERSION%/node-v%NODE_VERSION%-win-x64.zip" --output nodejs.zip
|
||||
tar -xf nodejs.zip -C c:\
|
||||
setx PATH "%PATH%;c:\node-v%NODE_VERSION%-win-x64"
|
6
docs-kb/README.md
Normal file
@ -0,0 +1,6 @@
|
||||
eShopOnContainers Knowledge Base
|
||||
================================
|
||||
|
||||
This folder contains a set of posts created mostly from [issues on the repo](https://github.com/dotnet-architecture/eShopOnContainers/issues), in order to offer a brief introduction as well as links to deepen the knowledge on a given subject related to the application.
|
||||
|
||||
[Simplified CQRS and DDD](simplified-cqrs-ddd/post.md)
|
BIN
docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-00-24.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-13-35.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-22-23.png
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-40-25.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-48-36.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_18-52-58.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
docs-kb/simplified-cqrs-ddd/devenv_2018-05-22_19-11-30.png
Normal file
After Width: | Height: | Size: 13 KiB |
93
docs-kb/simplified-cqrs-ddd/post.md
Normal file
@ -0,0 +1,93 @@
|
||||
Simplified CQRS and DDD
|
||||
=======================
|
||||
|
||||
CQRS, for Command and Query Responsibility Segregation, is an architectural pattern that, in very simple terms, has two different ways to handle the application model.
|
||||
|
||||
**Commands** are responsible for **changing** the application state, i.e. creating, updating and deleting entities (data).
|
||||
|
||||
**Queries** are responsible for **reading** the application state, e.g. to display information to the user.
|
||||
|
||||
**Commands** are made thinking about the Domain rules, restrictions and transaction boundaries.
|
||||
|
||||
**Queries** are made thinking about the presentation layer, the client UI.
|
||||
|
||||
When handling **commands**, the application model is usually represented by DDD constructs, e.g. Root aggregates, entities, value objects, etc., and there are usually some sort of rules that restrict the allowed state changes, e.g. An order has to be paid before dispatching.
|
||||
|
||||
When handling **queries**, the application model is usually represented by entities and relations and can be read much like SQL queries to display information.
|
||||
|
||||
Queries don't change state, so they can be run as much as required and will always return the same values (as long as the application state hasn't changed), i.e. queries are "idempotent".
|
||||
|
||||
Why the separation? because the rules for **changing** the model can impose unnecessary constraints for **reading** the model, e.g. you might allow to change order items only before dispatching so the order is like the gate-keeper (root aggregate) to access the order items, but you might also want to view all orders for some catalog item, so you have to be able to access the order items first (in a read only way).
|
||||
|
||||
In this simplified CQRS approach both the DDD model and the query model use the same database.
|
||||
|
||||
**Commands** and **Queries** are located in the Application layer, because:
|
||||
|
||||
1. It's where the composition of domain root aggregates occur (commands) and
|
||||
2. It's close to the UI requirements and has access to the whole database of the microservice (queries).
|
||||
|
||||
Ideally, root aggregates are ignorant of each other and it's the Application layer's responsibility to compose coordinated actions by means of domain events, because it knows about all root aggregates.
|
||||
|
||||
Regarding **queries**, in a similar analysis, the Application layer knows about all entities and relationships in the database, beyond the restrictions of the root aggregates.
|
||||
|
||||
Code
|
||||
----
|
||||
|
||||
### CQRS
|
||||
The CQRS pattern can be checked in the Ordering service:
|
||||
|
||||
Commands and queries are clearly separated in the application layer (Ordering.API).
|
||||
|
||||
**Solution Explorer [Ordering.API]:**
|
||||

|
||||
|
||||
Commands are basically read only Data Transfer Objects (DTO) that contain all data that's required to execute the operation.
|
||||
|
||||
**CreateOrderCommand:**
|
||||

|
||||
|
||||
Each command has a specific command handler that's responsible for executing the operations intended for the command.
|
||||
|
||||
**CreateOrderCommandHandler:**
|
||||

|
||||
|
||||
In this case:
|
||||
|
||||
1. Creates an Order object (root aggregate)
|
||||
2. Adds the order items using the root aggregate method
|
||||
3. Adds the order through the repository
|
||||
4. Saves the order
|
||||
|
||||
Queries, on the other hand, just return whatever the UI needs, could be a domain object or collections of specific DTOs.
|
||||
|
||||
**IOrderQueries:**
|
||||

|
||||
|
||||
And they are implemented as plain SQL queries, in this case using [Dapper](http://dapper-tutorial.net/ as the ORM.
|
||||
|
||||
**OrderQueries:**
|
||||

|
||||
|
||||
There can even be specific ViewModels or DTOs just to get the query results.
|
||||
|
||||
**OrderViewModel:**
|
||||

|
||||
|
||||
### DDD
|
||||
The DDD pattern can be checked in the domain layer (Ordering.Domain)
|
||||
|
||||
**Solution Explorer [Ordering.Domain + Ordering.Infrastructure]:**
|
||||

|
||||
|
||||
There you can see the Buyer aggregate and the Order aggregate, as well as the repository implementations in Ordering.Infrastructure.
|
||||
|
||||
Command handlers from the application layer use the root aggregates from the Domain layer and the repository implementations from the Infrastructure layer, the latter through Dependency Injection.
|
||||
|
||||
Further reading
|
||||
---------------
|
||||
|
||||
* **Issue #592 - [Question] Ordering Queries** <br/> https://github.com/dotnet-architecture/eShopOnContainers/issues/592
|
||||
|
||||
* **Applying simplified CQRS and DDD patterns in a microservice** <br/>
|
||||
https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/apply-simplified-microservice-cqrs-ddd-patterns
|
||||
|
BIN
docs/Decks/BRK3175_CesarDeIaTorre.pptx
Normal file
BIN
docs/Decks/eShopOnContainers-Architecture-v2.1.pptx
Normal file
BIN
docs/NET-Microservices-Architecture-for-Containerized-NET-Applications-(Microsoft-for-Kindle).mobi
Normal file → Executable file
BIN
docs/NET-Microservices-Architecture-for-Containerized-NET-Applications-(Microsoft-for-eReader).epub
Normal file → Executable file
88
elk/Readme.md
Normal file
@ -0,0 +1,88 @@
|
||||
This article contains a brief introduction to centralized structured logging with [Serilog](https://serilog.net/) and event viewing with [ELK](https://www.elastic.co/elk-stack) in eShopOnContainers. ELK is an acronym of ElasticSearch, LogStash and Kibana. This is one of the most used tools in the industry standards.
|
||||
|
||||

|
||||
|
||||
## Wiring eshopOnContainers with ELK in Localhost
|
||||
|
||||
eshopOnContainers is ready for work with ELK, you only need to setup the configuration parameter **LogstashUrl**, in **Serilog** Section, for achieve this, you can do it modifing this parameter in every appsettings.json of every service, or via Environment Variable **Serilog:LogstashUrl**.
|
||||
|
||||
There is another option, a zero-configuration environment for testing the integration launching via ```docker-compose``` command, on the root directory of eshopOnContainers:
|
||||
|
||||
```sh
|
||||
docker-compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.elk.yml build
|
||||
|
||||
docker-compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.elk.yml up
|
||||
```
|
||||
|
||||
### Configuring Logstash index on Kibana
|
||||
|
||||
Once time you have started and configured your application, you only need to configure the logstash index on kibana.
|
||||
You can address to Kibana, with docker-compose setup is at [http://localhost:5601](http://localhost:5601)
|
||||
|
||||
If you have accessed to kibana too early, you can see this error. It's normal, depending of your machine the kibana stack needs a bit of time to startup.
|
||||

|
||||
|
||||
You can wait a bit and refresh the page, the first time you enter, you need to configure and index pattern, in the ```docker-compose``` configuration, the index pattern name is **eshops-\***.
|
||||

|
||||
|
||||
With the index pattern configured, you can enter in the discover section and start viewing how the tool is recollecting the logging information.
|
||||
|
||||

|
||||
|
||||
## Configuring ELK on Azure VM
|
||||
Another option is to use a preconfigured virtual machine with Logstash, ElasticSearch and Kibana and point the configuration parameter **LogstashUrl**. For doing this you can address to Microsoft Azure, and start searching a Certified ELK Virtual Machine
|
||||
|
||||

|
||||
|
||||
This options it have a certified preconfigured options (Network, VirtualMachine type, OS, RAM, Disks) for having a good starting point of ELK with good performance.
|
||||
|
||||

|
||||
|
||||
When you have configured the main aspects of your virtual machine, you will have a "review & create" last step like this:
|
||||

|
||||
|
||||
### Configuring the bitnami environment
|
||||
|
||||
This virtual machine has a lot of configuration pipeing done. If you want to change something of the default configuration you can address this documentation:
|
||||
[https://docs.bitnami.com/virtual-machine/apps/elk/get-started/](https://docs.bitnami.com/virtual-machine/apps/elk/get-started/)
|
||||
|
||||
The only thing you have to change is the logstash configuration inside the machine. This configuration is at the file ```/opt/bitnami/logstash/conf/logstash.conf```
|
||||
You must edit the file and overwrite with this configuration:
|
||||
```conf
|
||||
input {
|
||||
http {
|
||||
#default host 0.0.0.0:8080
|
||||
codec => json
|
||||
}
|
||||
}
|
||||
|
||||
## Add your filters / logstash plugins configuration here
|
||||
filter {
|
||||
split {
|
||||
field => "events"
|
||||
target => "e"
|
||||
remove_field => "events"
|
||||
}
|
||||
}
|
||||
|
||||
output {
|
||||
elasticsearch {
|
||||
hosts => "elasticsearch:9200"
|
||||
index=>"eshops-%{+xxxx.ww}"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
For doing this you can connect via ssh to the vm and edit the file using the vi editor for example.
|
||||
When the file will be edited, check there are Inbound Port Rules created for the logstash service. You can do it going to Networking Menu on your ELK Virtual Machine Resource in Azure.
|
||||
|
||||

|
||||
|
||||
The only thing that remains is to connect to your vm vía browser. And check the bitnami splash page is showing.
|
||||
|
||||

|
||||
|
||||
You can get the password for accessing going to your virtual machine in azure and check the boot diagnostics, theres a message that shows to you which is your password.
|
||||
|
||||
When you have the user and password you can access to the kibana tool, and create the ```eshops-*``` index pattern that is well documented at the beggining of this documentation and then start to discover.
|
||||

|
5
elk/elasticsearch/Dockerfile
Normal file
@ -0,0 +1,5 @@
|
||||
# https://github.com/elastic/elasticsearch-docker
|
||||
FROM docker.elastic.co/elasticsearch/elasticsearch-oss:6.0.0
|
||||
|
||||
# Add your elasticsearch plugins setup here
|
||||
# Example: RUN elasticsearch-plugin install analysis-icu
|
16
elk/elasticsearch/config/elasticsearch.yml
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
## Default Elasticsearch configuration from elasticsearch-docker.
|
||||
## from https://github.com/elastic/elasticsearch-docker/blob/master/build/elasticsearch/elasticsearch.yml
|
||||
#
|
||||
cluster.name: "docker-cluster"
|
||||
network.host: 0.0.0.0
|
||||
|
||||
# minimum_master_nodes need to be explicitly set when bound on a public IP
|
||||
# set to 1 to allow single node clusters
|
||||
# Details: https://github.com/elastic/elasticsearch/pull/17288
|
||||
discovery.zen.minimum_master_nodes: 1
|
||||
|
||||
## Use single node discovery in order to disable production mode and avoid bootstrap checks
|
||||
## see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
|
||||
#
|
||||
discovery.type: single-node
|
5
elk/kibana/Dockerfile
Normal file
@ -0,0 +1,5 @@
|
||||
# https://github.com/elastic/kibana-docker
|
||||
FROM docker.elastic.co/kibana/kibana-oss:6.0.0
|
||||
|
||||
# Add your kibana plugins setup here
|
||||
# Example: RUN kibana-plugin install <name|url>
|
7
elk/kibana/config/kibana.yml
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
## Default Kibana configuration from kibana-docker.
|
||||
## from https://github.com/elastic/kibana-docker/blob/master/build/kibana/config/kibana.yml
|
||||
#
|
||||
server.name: kibana
|
||||
server.host: "0"
|
||||
elasticsearch.url: http://elasticsearch:9200
|
6
elk/logstash/Dockerfile
Normal file
@ -0,0 +1,6 @@
|
||||
# https://github.com/elastic/logstash-docker
|
||||
FROM docker.elastic.co/logstash/logstash-oss:6.0.0
|
||||
|
||||
# Add your logstash plugins setup here
|
||||
# Example: RUN logstash-plugin install logstash-filter-json
|
||||
RUN logstash-plugin install logstash-input-http
|
6
elk/logstash/config/logstash.yml
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
## Default Logstash configuration from logstash-docker.
|
||||
## from https://github.com/elastic/logstash-docker/blob/master/build/logstash/config/logstash-oss.yml
|
||||
#
|
||||
http.host: "0.0.0.0"
|
||||
path.config: /usr/share/logstash/pipeline
|
22
elk/logstash/pipeline/logstash.conf
Normal file
@ -0,0 +1,22 @@
|
||||
input {
|
||||
http {
|
||||
#default host 0.0.0.0:8080
|
||||
codec => json
|
||||
}
|
||||
}
|
||||
|
||||
## Add your filters / logstash plugins configuration here
|
||||
filter {
|
||||
split {
|
||||
field => "events"
|
||||
target => "e"
|
||||
remove_field => "events"
|
||||
}
|
||||
}
|
||||
|
||||
output {
|
||||
elasticsearch {
|
||||
hosts => "elasticsearch:9200"
|
||||
index=>"eshops-%{+xxxx.ww}"
|
||||
}
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
{
|
||||
"sdk": {
|
||||
"version": "2.1.4"
|
||||
}
|
||||
}
|
23
hosts
@ -1,23 +0,0 @@
|
||||
# Copyright (c) 1993-2009 Microsoft Corp.
|
||||
#
|
||||
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
|
||||
#
|
||||
# This file contains the mappings of IP addresses to host names. Each
|
||||
# entry should be kept on an individual line. The IP address should
|
||||
# be placed in the first column followed by the corresponding host name.
|
||||
# The IP address and the host name should be separated by at least one
|
||||
# space.
|
||||
#
|
||||
# Additionally, comments (such as these) may be inserted on individual
|
||||
# lines or following the machine name denoted by a '#' symbol.
|
||||
#
|
||||
# For example:
|
||||
#
|
||||
# 102.54.94.97 rhino.acme.com # source server
|
||||
# 38.25.63.10 x.acme.com # x client host
|
||||
|
||||
# localhost name resolution is handled within DNS itself.
|
||||
# 127.0.0.1 localhost
|
||||
# ::1 localhost
|
||||
|
||||
10.0.75.1 identity.service
|
BIN
img/ebook_arch_dev_microservices_containers_cover-v2.0.png
Normal file
After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 45 KiB |
BIN
img/elk/azure-nsg-inboundportsConfig.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
img/elk/bitnami_splash.png
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
img/elk/create-vm-elk-azure-last-step.png
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
img/elk/create-vm-elk-azure-summary.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
img/elk/create-vm-elk-azure.png
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
img/elk/discover-kibana.png
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
img/elk/kibana_eshops_index.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
img/elk/kibana_result.png
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
img/elk/kibana_startup.png
Normal file
After Width: | Height: | Size: 57 KiB |
BIN
img/elk/kibana_working.png
Normal file
After Width: | Height: | Size: 78 KiB |
@ -4,14 +4,21 @@ The k8s directory contains Kubernetes configuration for the eShopOnContainers ap
|
||||
## Prerequisites
|
||||
* A Kubernetes cluster. Follow Azure Container Service's [walkthrough](https://docs.microsoft.com/en-us/azure/container-service/container-service-kubernetes-walkthrough) to create one.
|
||||
* A private Docker registry. Follow Azure Container Registry's [guide](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal) to create one.
|
||||
* Optionally, previous steps can be skipped if you run gen-k8s-env.ps1 (or gen-k8s-env-aks.ps1 if you would like to use AKS instead of ACS) script to automatically create the azure environment needed for kubernetes deployment. Azure cli 2.0 must be previously installed [installation guide](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli). For example:
|
||||
* Optionally, previous steps can be skipped if you run the **gen-k8s-env-aks.ps1** script to create an AKS cluster environment or gen-k8s-env.ps1 script to create an ACS for Kuberentes cluster environment including the creation of additional Azure environment needed like an Azure Resource Manager and ACR registry.
|
||||
|
||||
Azure cli 2.0 must be previously installed [installation guide](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli). For example:
|
||||
|
||||
**Important**: Note the parameter "-createAcr true". If you are creating the K8s cluster but you want to re-use and existing ACR, say "-createAcr false".
|
||||
|
||||
|
||||
For AKS:
|
||||
|
||||
>```
|
||||
>./gen-k8s-env -resourceGroupName k8sGroup -location westeurope -registryName k8sregistry -createAcr true -orchestratorName k8s-cluster -dnsName k8s-dns
|
||||
>./gen-k8s-env-aks -resourceGroupName YoureShopAksResgroup -location centralus -serviceName YoureShopAksCluster -dnsNamePrefix youreshopaks -registryName YoureShopAcrRegistry -createAcr true -nodeCount 3 -nodeVMSize Standard_D2_v2
|
||||
>```
|
||||
or using AKS instead of ACS
|
||||
|
||||
For ACS:
|
||||
|
||||
>```
|
||||
>./gen-k8s-env-aks -resourceGroupName k8sGroup -location westeurope -registryName k8sregistry -serviceName k8s-cluster -createAcr true -nodeCount 3 -nodeVMSize Standard_D2_v2
|
||||
>```
|
||||
|
72
k8s/build-push-images.ps1
Normal file
@ -0,0 +1,72 @@
|
||||
Param(
|
||||
[parameter(Mandatory=$false)][string]$registry,
|
||||
[parameter(Mandatory=$false)][string]$dockerUser,
|
||||
[parameter(Mandatory=$false)][string]$dockerPassword,
|
||||
[parameter(Mandatory=$false)][string]$imageTag,
|
||||
[parameter(Mandatory=$false)][bool]$buildImages=$true,
|
||||
[parameter(Mandatory=$false)][bool]$pushImages=$true,
|
||||
[parameter(Mandatory=$false)][string]$dockerOrg="eshop"
|
||||
)
|
||||
|
||||
# Initialization
|
||||
|
||||
$useDockerHub = [string]::IsNullOrEmpty($registry)
|
||||
|
||||
# Check required commands (only if not in CI environment)
|
||||
|
||||
$requiredCommands = ("docker", "docker-compose")
|
||||
foreach ($command in $requiredCommands) {
|
||||
if ((Get-Command $command -ErrorAction SilentlyContinue) -eq $null) {
|
||||
Write-Host "$command must be on path" -ForegroundColor Red
|
||||
exit
|
||||
}
|
||||
}
|
||||
|
||||
# Get tag to use from current branch if no tag is passed
|
||||
if ([string]::IsNullOrEmpty($imageTag)) {
|
||||
$imageTag = $(git rev-parse --abbrev-ref HEAD)
|
||||
}
|
||||
Write-Host "Docker image Tag: $imageTag" -ForegroundColor Yellow
|
||||
|
||||
# Build docker images if needed
|
||||
if ($buildImages) {
|
||||
Write-Host "Building Docker images tagged with '$imageTag'" -ForegroundColor Yellow
|
||||
$env:TAG=$imageTag
|
||||
docker-compose -p .. -f ../docker-compose.yml build
|
||||
}
|
||||
|
||||
# Login to Docker registry
|
||||
if (-not [string]::IsNullOrEmpty($dockerUser)) {
|
||||
$registryFDQN = if (-not $useDockerHub) {$registry} else {"index.docker.io/v1/"}
|
||||
|
||||
Write-Host "Logging in to $registryFDQN as user $dockerUser" -ForegroundColor Yellow
|
||||
if ($useDockerHub) {
|
||||
docker login -u $dockerUser -p $dockerPassword
|
||||
}
|
||||
else {
|
||||
docker login -u $dockerUser -p $dockerPassword $registryFDQN
|
||||
}
|
||||
|
||||
if (-not $LastExitCode -eq 0) {
|
||||
Write-Host "Login failed" -ForegroundColor Red
|
||||
exit
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
# Push images to Docker registry
|
||||
if ($pushImages) {
|
||||
Write-Host "Pushing images to $registry/$dockerOrg..." -ForegroundColor Yellow
|
||||
$services = ("basket.api", "catalog.api", "identity.api", "ordering.api", "ordering.backgroundtasks", "marketing.api","payment.api","locations.api", "webmvc", "webspa", "webstatus", "ocelotapigw", "mobileshoppingagg", "webshoppingagg", "ordering.signalrhub")
|
||||
|
||||
foreach ($service in $services) {
|
||||
$imageFqdn = if ($useDockerHub) {"$dockerOrg/${service}"} else {"$registry/$dockerOrg/${service}"}
|
||||
docker tag eshop/${service}:$imageTag ${imageFqdn}:$imageTag
|
||||
docker push ${imageFqdn}:$imageTag
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,3 +1 @@
|
||||
kubectl patch deployment -n ingress-nginx nginx-ingress-controller --type=json --patch="$(cat nginx-ingress\publish-service-patch.yaml)"
|
||||
kubectl apply -f nginx-ingress\azure\service.yaml
|
||||
kubectl apply -f nginx-ingress\patch-service-without-rbac.yaml
|
||||
kubectl apply -f nginx-ingress\cloud-generic.yaml
|
2
k8s/deploy-ingress-dockerlocal.ps1
Normal file
@ -0,0 +1,2 @@
|
||||
kubectl apply -f nginx-ingress\cm.yaml
|
||||
kubectl apply -f nginx-ingress\cloud-generic.yaml
|
@ -1,12 +1,5 @@
|
||||
kubectl apply -f ingress.yaml
|
||||
|
||||
# Deploy nginx-ingress core files
|
||||
kubectl apply -f nginx-ingress\namespace.yaml
|
||||
kubectl apply -f nginx-ingress\default-backend.yaml
|
||||
kubectl apply -f nginx-ingress\configmap.yaml
|
||||
kubectl apply -f nginx-ingress\tcp-services-configmap.yaml
|
||||
kubectl apply -f nginx-ingress\udp-services-configmap.yaml
|
||||
kubectl apply -f nginx-ingress\without-rbac.yaml
|
||||
kubectl apply -f nginx-ingress\mandatory.yaml
|
||||
|
||||
|
||||
|
||||
|
@ -8,6 +8,7 @@ Param(
|
||||
[parameter(Mandatory=$false)][string]$imageTag,
|
||||
[parameter(Mandatory=$false)][bool]$deployCI=$false,
|
||||
[parameter(Mandatory=$false)][bool]$buildImages=$true,
|
||||
[parameter(Mandatory=$false)][bool]$pushImages=$true,
|
||||
[parameter(Mandatory=$false)][bool]$deployInfrastructure=$true,
|
||||
[parameter(Mandatory=$false)][string]$dockerOrg="eshop"
|
||||
)
|
||||
@ -63,9 +64,11 @@ if ($buildImages) {
|
||||
Write-Host "Building Docker images tagged with '$imageTag'" -ForegroundColor Yellow
|
||||
$env:TAG=$imageTag
|
||||
docker-compose -p .. -f ../docker-compose.yml build
|
||||
}
|
||||
|
||||
if ($pushImages) {
|
||||
Write-Host "Pushing images to $registry/$dockerOrg..." -ForegroundColor Yellow
|
||||
$services = ("basket.api", "catalog.api", "identity.api", "ordering.api", "marketing.api","payment.api","locations.api", "webmvc", "webspa", "webstatus", "ocelotapigw", "mobileshoppingagg", "webshoppingagg")
|
||||
$services = ("basket.api", "catalog.api", "identity.api", "ordering.api", "ordering.backgroundtasks", "marketing.api","payment.api","locations.api", "webmvc", "webspa", "webstatus", "ocelotapigw", "mobileshoppingagg", "webshoppingagg", "ordering.signalrhub")
|
||||
|
||||
foreach ($service in $services) {
|
||||
$imageFqdn = if ($useDockerHub) {"$dockerOrg/${service}"} else {"$registry/$dockerOrg/${service}"}
|
||||
@ -91,7 +94,10 @@ if (-not [string]::IsNullOrEmpty($dockerUser)) {
|
||||
exit
|
||||
}
|
||||
|
||||
# create registry key secret
|
||||
# Try to delete the Docker registry key secret
|
||||
ExecKube -cmd 'delete secret docker-registry registry-key'
|
||||
|
||||
# Create the Docker registry key secret
|
||||
ExecKube -cmd 'create secret docker-registry registry-key `
|
||||
--docker-server=$registryFDQN `
|
||||
--docker-username=$dockerUser `
|
||||
@ -107,6 +113,7 @@ ExecKube -cmd 'delete configmap internalurls'
|
||||
ExecKube -cmd 'delete configmap urls'
|
||||
ExecKube -cmd 'delete configmap externalcfg'
|
||||
ExecKube -cmd 'delete configmap ocelot'
|
||||
ExecKube -cmd 'delete -f ingress.yaml'
|
||||
|
||||
# start sql, rabbitmq, frontend deployments
|
||||
if ($deployInfrastructure) {
|
||||
@ -161,12 +168,14 @@ ExecKube -cmd 'set image deployments/basket basket=${registryPath}${dockerOrg}/b
|
||||
ExecKube -cmd 'set image deployments/catalog catalog=${registryPath}${dockerOrg}/catalog.api:$imageTag'
|
||||
ExecKube -cmd 'set image deployments/identity identity=${registryPath}${dockerOrg}/identity.api:$imageTag'
|
||||
ExecKube -cmd 'set image deployments/ordering ordering=${registryPath}${dockerOrg}/ordering.api:$imageTag'
|
||||
ExecKube -cmd 'set image deployments/ordering-backgroundtasks ordering-backgroundtasks=${registryPath}${dockerOrg}/ordering.backgroundtasks:$imageTag'
|
||||
ExecKube -cmd 'set image deployments/marketing marketing=${registryPath}${dockerOrg}/marketing.api:$imageTag'
|
||||
ExecKube -cmd 'set image deployments/locations locations=${registryPath}${dockerOrg}/locations.api:$imageTag'
|
||||
ExecKube -cmd 'set image deployments/payment payment=${registryPath}${dockerOrg}/payment.api:$imageTag'
|
||||
ExecKube -cmd 'set image deployments/webmvc webmvc=${registryPath}${dockerOrg}/webmvc:$imageTag'
|
||||
ExecKube -cmd 'set image deployments/webstatus webstatus=${registryPath}${dockerOrg}/webstatus:$imageTag'
|
||||
ExecKube -cmd 'set image deployments/webspa webspa=${registryPath}${dockerOrg}/webspa:$imageTag'
|
||||
ExecKube -cmd 'set image deployments/ordering-signalrhub ordering-signalrhub=${registryPath}${dockerOrg}/ordering.signalrhub:$imageTag'
|
||||
|
||||
ExecKube -cmd 'set image deployments/mobileshoppingagg mobileshoppingagg=${registryPath}${dockerOrg}/mobileshoppingagg:$imageTag'
|
||||
ExecKube -cmd 'set image deployments/webshoppingagg webshoppingagg=${registryPath}${dockerOrg}/webshoppingagg:$imageTag'
|
||||
@ -181,6 +190,7 @@ ExecKube -cmd 'rollout resume deployments/basket'
|
||||
ExecKube -cmd 'rollout resume deployments/catalog'
|
||||
ExecKube -cmd 'rollout resume deployments/identity'
|
||||
ExecKube -cmd 'rollout resume deployments/ordering'
|
||||
ExecKube -cmd 'rollout resume deployments/ordering-backgroundtasks'
|
||||
ExecKube -cmd 'rollout resume deployments/marketing'
|
||||
ExecKube -cmd 'rollout resume deployments/locations'
|
||||
ExecKube -cmd 'rollout resume deployments/payment'
|
||||
@ -193,6 +203,10 @@ ExecKube -cmd 'rollout resume deployments/apigwmm'
|
||||
ExecKube -cmd 'rollout resume deployments/apigwms'
|
||||
ExecKube -cmd 'rollout resume deployments/apigwwm'
|
||||
ExecKube -cmd 'rollout resume deployments/apigwws'
|
||||
ExecKube -cmd 'rollout resume deployments/ordering-signalrhub'
|
||||
|
||||
Write-Host "Adding/Updating ingress resource..." -ForegroundColor Yellow
|
||||
ExecKube -cmd 'apply -f ingress.yaml'
|
||||
|
||||
Write-Host "WebSPA is exposed at http://$externalDns, WebMVC at http://$externalDns/webmvc, WebStatus at http://$externalDns/webstatus" -ForegroundColor Yellow
|
||||
|
||||
|