Service Fabric deployment in the cloud - c#

We are switching to an actor based architecture for a subsystem in our product (We use C#), and we are considering either Akka.NET or Service Fabric actors. We have experience with Akka and Akka Clusters (in Scala), but the Service Fabric actors suits our purpose perfectly. It is, however, really difficult to find any material about deployment.
Is it possible at all to deploy on Azure at the moment (or can you join any preview programmes)? I can't find any indications of when a preview will be available, if it is not possible already.

Azure deployment is not available yet. It will be launched as a preview later this year.
Update: Service Fabric is now available in public preview.

Update: Microsoft now provides Service Fabric Continuous Integration documentation
I have continuous delivery running w/the development SDK (all nodes on one VM) like this:
push to github.com
github.com tells Visual Studio Online to trigger a build.
A custom build definition with a custom ‪#PowerShell‬ script step who 7z’s the build artifacts and curl’s the file to the Windows Server 2012 R2 Azure VM instance
IIS is loaded on the VM to host basic auth over TLS, & the WebDav module simply for this upload (easier to configure than FTP or WebRM on Azure, for sure)
I wrote custom open-source code who monitors for a trigger file (https://github.com/corlib/trigger) and invokes a command, configured to invoke a custom deployment script. (very early, but functional for this purpose)
The deployment script decompresses the archive, loads the ServiceFabric application manifest to obtain the application type version. This version is used to deploy the application package to a unique location in the cluster, register it, and then start a monitored application upgrade (w/rollback to previous version on failure)

Related

Trying to deploy or release a WPF application in Azure Pipelines

How would I go about releasing or deploying (do those mean the same thing?) my WPF application (.Net Framework 4.7.2) through Azure Pipelines?
I'm a little confused on what to use. There's all these terminologies like artifacts, release, publish, staging. I'm not sure what task I need to use.
Let's go over a typical scenario so you best understand the terminology. This, of course, is just an example.
You have multiple git repositories in Azure DevOps Repos. One of those git repositories is a common library which is shared across multiple projects in your company. Another one is the companies flagship application, written in WPF, and used internally by 100 employees. Lastly, there is a web portal for external clients to submit orders. Each of these git repositories has branch policies in place to prevent checking in directly to the master branch (a pull request is required).
Development Team A works on the core functionality of your technology team, they update the common libraries. As part of the build pipeline, the library is compiled and a NuGet package is generated. The pipeline then publishes the package to your private Azure DevOps Artifacts feed, so that the other development teams can use the package.
Development Team B works on the flagship WPF application. As part of the build pipeline, the pipeline compiles the application. It creates a build artifact of the bin directory. Another stage in the pipeline takes uses the artifact and publishes it to the test environment, and sets a flag on the database that the current test version is the version that was just published. When the development team launches the test application, it is automatically updated because the version was incremented in the database.
Development Team C works on the web application. As part of the build pipeline, the pipeline compiles the application. It deploys the web application to the test web server. The test web application is available immediately for the development team to test.
At a later time, when the iteration cycle is completed, there is a code freeze. The code freeze involves the DevOps team manually running the build pipelines. Because the pipelines were manually run, the first pipeline will deploy the WPF application to the staging environment, and the version number is incremented in the database. The second pipeline deploys the web application to a green-blue server.
The development teams do a final round of testing to ensure there are no bugs which cause a stoppage. Once they are good to go, the WPF application is released from the staging environment by having it pushed out to all of the employee desktops. The release process for the web application involves flipping a switch so that the green server (updated web application) goes live, the network switch points to the green server, then the blue server (older web application) goes down.
If any major issues arise, things can be rolled back by flipping the network switch from the green server back to the blue, and deploying the older version of the WPF application to the employee desktops, etc.
This is just an example, it is not the only way to do this of course.

Depoyment of pre-built Azure Web Service via PowerShell

I am completely new to Azure and PowerShell but have been tasked with setting up a build and deploy solution for several app services.
We currently have a build server (Azure VM) that is running CruiseControl.NET to build and test some C# .NET solutions that should be deployed in Azure.
This build server currently handles the following tasks:
Pulling code from source control when commits happen
Building the projects
Running some unit test cases
Copying output/binaries to an output location
However, as it exists now, developers of each of our app services need to 'Publish' their services manually from their development machines by clicking the button in Visual Studio once they have verified that the build and test cases have passed in the test environment on the server.
As I am hoping for a completely automated solution, I expect I need to use something like PowerShell or the Azure Cross Platform CLI (npm) to do this?
I'm extremely confused with the Azure Service Management vs Azure Resource Management versions with the new Azure Powershell 1.0. All of our services appear to be the newer Resource Management versions, not 'classic'.
The eventual goal is to have the build server do the following
Pulling code from source control when commits happen
Building the projects
Running some unit test cases
Copying output/binaries to an output location
If the build and test cases are successful, update the service in azure to the latest build
I am hoping there is a way to set up these projects, or take the existing binaries that result from the builds, and have them be deployed into Web Apps using the new Azure Resource Management Powershell features.
Any advice or resources for more information about how this can be done?
Hopefully this makes some sense. Please let me know if I am going about this completely the wrong way or direct me to a more correct forum.
Thanks!
have you consider to use Azure App Service? where you can get those build infrastructure for free. e.g https://azure.microsoft.com/en-us/documentation/articles/web-sites-publish-source-control/
Once you setup continues deployment, you will get below three when there is push event (if you are using git)
Pulling code from source control when commits happen
Building the projects
Copying output/binaries to an output location
and to "Running some unit test cases", you can create your own batch or powershell script with post deployment hook https://github.com/projectkudu/kudu/wiki/Post-Deployment-Action-Hooks

Deploying a web site to azure as a package

I'm starting an ASP.net web project that will be hosted on Azure, but I'm not certain whether to develop the project as a regular ASP.net application and deploy it as a Web Site on Azure, or to develop it as a Cloud Application with a Web Role.
The project's nature is that of a web site (simple database back-end), but the question is one of deployment. We aim to build versions of the application and then deploy to staging and production environments, meaning the output of a build should result in a single package (similar to what's described in msdn).
There's plenty of information on how to create a service package to publish a cloud service, but articles on publishing a web site to azure follow a 'web deployment' scenario, where deployment is done via Visual Studio (subscription file from Azure etc).
Is there a way to deploy a web site to azure as a package? Or are tools like Visual Studio needed for a web deploy? If so, then is composing the project as a Cloud service with only a web role the correct choice?
I posted a comment under the question, regarding differences between Cloud Service & Web Site, but to answer your question about packaging: Cloud Services & Web Sites take two different approaches to deployment, and there's not really "works for both" packaging:
Web Sites are designed to accept your code deployment from either a source code repository. The idea is that you have a labeled version of your code, and push it out from TFS, git, Bitbucket, etc. You can also push your code up with ftp, or drop it into a dropbox folder. Because Web Sites run in IIS, and because you don't have any control over the VM farm running your Web Sites, you cannot push up startup scripts as you can with Cloud Services; you cannot install registry updates, COM objects, msi's...
Cloud Services are designed around a stateless VM model. Every time you scale out (add instances), a baseline Windows Server VM is spun up, and the contents of your deployment package is copied to the new VM instance and executed. This includes startup scripts, installers, etc. Since you have admin-level access to each VM, you can configure it as you need to, from your startup scripts / OnStart(). Definitions for each role are combined into a single deployment package. To update one or more roles, you need to redeploy the package.
Web Sites have no tooling pre-requisites, while Cloud Services require Visual Studio or Eclipse to help you manage the deployment package. You can also use PowerShell and Visual Studio command line tools to build the package, as #Ben Robinson mentioned in the comments above. You can also use PowerShell to create and administer Web Sites. Both Cloud Services and Web Sites provide Staging and Production slots.
You can't push a deployment package to Web Sites.
David's answer does a great job covering the Cloud Services option. However, I believe the Azure Website option is well-suited to your needs. You don't have to deploy using Visual Studio. Instead, you can create a publish profile in Visual Studio that creates a Web Deploy Package which is simply a ZIP file that can be published at a later time using command-line tools, no Visual Studio required. It also generates a .deploy.cmd file that you can run to deploy to a remote server, and a SetParameters.xml file with parameters such as connection string that you can modify for your target deployment environment. The .deploy.cmd file calls msdeploy.exe which does the actual deployment.
See this for more details on Web Deploy command-line deployment. There's also a ton of information on MSDeploy and its package system on Sayed Ibrahim Hashimi's blog.
If you want to be able to change files directly in the web application then it is best to use an Azure Web App, because you can access those through FTP.
However an Azure Cloud Service does not provide FTP Access, at least not a useful one that would allow you to use an FTP Client to upload files. A Cloud Service is where you do not want to be bothered too much with much of the details of hosting a web application. While an Azure Web App does much of the same thing, it also allows you to have FTP access and direct access to the files post-deployment.

Socket Server in Amazon Elastic Beanstalk

Currently, I have a socket server, that listens to incoming connections on two ports (e.g. 7777 and 7778) and replies to them. The data is stored in an RDS environment, part of a bigger Elastic Beanstalk environment that accesses the same data. The socket server is implemented as a Windows service. So far, so good. It works.
However, I am asking myself, whether it's possible to have the socket server also within the same (or possibly another) Elastic Beanstalk environment, but so far, I haven't found any way to do that.
My goals are
to have a far simpler deployment procedure, as in the productive environment, I need the socket servers to be behind a load balancer and don't want to deploy a windows service on each instance.
to have only one environment to deploy to, so that I won't have to deploy (manually or automatically) each time I have a change in the DAL.
The socket server does not need to be implemented as a Windows service, it just is now.
Everything is implemented in C#. Any help is appreciated.
I think, I got this covered. However, I couldn't deploy the Windows Service without errors stand-alone, but only as part of a Web application. Not a real problem in my scenario, though.
I have two projects for this scenario; a Web Application and a Windows Service application.
On the build server, I create a ZIP file of the Windows Service
executables (using zip.exe)
On the build server, I upload the ZIP file to an S3 bucket (using s3.exe)
On the project of the web application, I create a .ebextensions directory
In the .ebextensions directory, I have a whatever.config file that
Takes the ZIP file from S3 and unpacks it onto the C-Drive in my preferred directory
Calls a batch file (part of the ZIP file) that uninstalls and reinstalls the Windows Service with the InstallUtil.exe utility (part of the .Net framework)
In my nightly builds (of the complete solution), I deploy the web application to Elastic Beanstalk using awsdeploy.exe.
Therefore, I point to a configuration.txt file in a builds directory of my web application.
You can generate such a build file with a manual Elastic Beanstalk deployment from Visual Studio; but they are quite easy after a while.
What happens now, is that in my Nightly Builds the Web application is deployed to the Elastic Beanstalk environment; the deployment will recognize that there is a configuration and will execute the steps mentioned below step 4 above. As the Nightly Build created and uploaded the ZIP file of the Windows Service before that, I am sure that I will install the most recent Windows Service.
My only problem now is that the Windows Service does not always install itself because of the infamous marked for deletion error. But that's another story.
I hope this helps somebody. If anyone has a suggestion to simplify this, he's welcome to add a comment.

.NET build & deploy

To deploy my app on a clean server takes several steps: Start MSSQL service, install .NET4, deploy code, install DB schema, add SSL certificate to IIS7...
Thereafter I follow a more boring task of: Zip up my app files, transfer them to the server, load them into the web app folder etc.
The deployment is done on a semi-frequent basis as my product sells to enterprise customers. Thereafter it's the boring build and deploy task.
Is there a recommended .NET tool that can help automate the above tasks? BTW, I use VS2010 with IIS7 and .NET4.
Web Deploy
Web Deploy (Web Deployment Tool)
simplifies the migration, management
and deployment of IIS Web servers, Web
applications and Web sites.
Administrators can use command-line
scripting with Web Deploy to
synchronize IIS 6.0 and IIS 7.0
servers or to migrate an IIS 6.0
server to IIS 7.0. Web Deploy Tool
also enables administrators and
delegated users to use IIS Manager to
deploy ASP.NET and PHP applications to
an IIS 7.0 server.
Web Deploy enables you to package
configuration and content of your
installed Web applications, including
databases, and use the packages for
storage or redeployment. These
packages can be deployed using IIS
Manager without requiring
administrative privileges. The tool
integrates with Visual Studio 2010 to
help developers streamline the
deployment of Web applications to the
Web server. The tool also integrates
with the Web Platform Installer to
allow you to simply and easily install
community web applications. You can
submit your own application to the Web
Application Gallery
Features
Seamless integration with IIS 7.0
Manager and Visual Studio 2010
interface for creating packages and
deploying them onto a machine, both
locally and remotely. Seamless
integration with the Web Platform
Installer to install community web
applications simply and easily. Web
application packaging: Ability to
package a Web application or an entire
site, including the associated
databases. Ability to package ACLs,
COM, GAC and registry settings.
Supports both live servers and zipped
packages as a source or destination.
Web application deployment:
Administrative privileges are not
required in order to deploy Web
applications. Ability to add powerful
parameters to change text in files
when they are deployed (such as
prompting to replace a connection
string when deploying from QA to
staging environments). Integration
with the IIS 7.0 Web Management
Service (WMSVC) for remote deployment
by non-administrators. Server
administrators have granular control
over the operations that can be
performed and can delegate tasks to
non-administrators. Web server
migration and synchronization: Ability
to synchronize or migrate the entire
Web server, a Web site or application.
Synchronizes only the data that has
changed. Ability to detect missing
dependencies during synchronization.
Automatically gathers content, IIS
configuration, SSL certificates and
ASP.NET configuration when you sync a
Web site. In addition to the IIS
Manager and Visual Studio 10, tasks
can be performed using the
command-line or public APIs.
Yes, Powershell can do all this for you. Pretty much anything a .NET program can do, Powershell can do it since you can import .NET assemblies and use it in powershell.
I use powershell in my project to:
1) Setup the registry
2) Unzip the dropped code
3) Build the web folders and move files
4) Deploy SQL stored procedures
5) Restart IIS
For an in-depth review of using Powershell for deploying see this
article
Have you considered creating an MSI to install using Windows Installer?
You can do this using InstallShield or Wix and can get much of the functionality you describe for "free" (e.g. installing .net, starting/stopping services, deploying code, etc.).

Categories