Tuesday, 31 May 2016

Damo's Podcast Highlights 2016 #21

I subscribe to many podcasts, you can see the list as it was in 2015 here: Developer podcasts v2 but I thought I would start to keep a weekly log of the episodes that I found interesting or useful in some way.

[This Agile Life 109] Fallacies of Software Developers - http://www.thisagilelife.com/109/
[On Books] Episode 15 - How to Learn Anything Fast - http://castig.org/the-first-20-hours-by-josh-kaufman/
[On Books] Episode 18 - Growth Mindset vs fixed mindset - http://castig.org/growth-mindset-vs-fixed-mindset/
[RunAs Radio 473] Hacking a Country with Troy Hunt - http://runasradio.com/Shows/Show/473
[Scrum Master Toolbox Podcast] The role of retrospectives on the path to success - http://www.scrum-master-toolbox.com/2016/05/podcast/allison-pollard-on-the-role-of-retrospectives-to-get-us-on-the-path-to-success/
[Continuous Discussions 41] Creating an Internal Dev/Test Cloud - https://electric-cloud.com/blog/2016/05/key-takeaways-continuous-discussions-c9d9-episode-41-creating-internal-devtest-cloud/
[Freakonomics Radio] How to Be Tim Ferriss - http://freakonomics.com/podcast/tim-ferriss/
[Software Engineering Radio 23] The role of software architecture Pt1. - http://www.se-radio.net/2006/07/episode-23-architecture-pt-1/

Tuesday, 24 May 2016

Damo's Podcast Highlights 2016 #20

I subscribe to many podcasts, you can see the list as it was in 2015 here: Developer podcasts v2 but I thought I would start to keep a weekly log of the episodes that I found interesting or useful in some way.

[Agile Weekly Crew] Episode #57 – Performance Reviews and one on one feedback
http://integrumtech.com/2012/04/episode-57-performance-reviews-with-kane-mar/

[On books] Thinking fast and slow book review https://www.acast.com/onbooks/episode-11-thinking-fast-and-slow-by-daniel-kahneman-chat-with-alex-miles-younger- and https://www.acast.com/onbooks/episode-12-thinking-fast-and-slow-part-2-on-happiness

[Enterprise devops initiatives] The Importance of Systems Thinking for Cloud Migration (focus more on AWS but still good) http://mikekavis.sys-con.com/node/3386867

[Enterprise devops initiatives] How to Succeed with DevOps? Make Room for Experimentation!
http://www.cloudtp.com/2015/08/27/how-to-succeed-with-devops-make-room-for-experimentation/

[The azure podcast] Azure functions http://azpodcast.azurewebsites.net/post/Episode-128-Azure-Functions

Sunday, 15 May 2016

Damo's Podcast Highlights 2016 #19

I subscribe to many podcasts, you can see the list as it was in 2015 here: Developer podcasts v2 but I thought I would start to keep a weekly log of the episodes that I found interesting or useful in some way.

Lets see if i can keep going every week shall we :-)


[Hanselminutes] An overview of containers http://www.hanselminutes.com/527/practical-containers-for-developers-with-aja-hammerly
[devchat tv] Motivation, Impact, professionalism https://devchat.tv/ruby-rogues/244-rr-program-like-you-give-a-damn-with-ara-t-howard-at-rails-remote-conf-2015
[London school of economics] Brexit, should we stay or should we go http://www.lse.ac.uk/publicEvents/events/2016/05/20160510t1830vOT.aspx
[Hello tech pros] Productivity, Motivation, Habits http://hellotechpros.com/joe-zack-productivity/

Sunday, 8 May 2016

Damo's Podcast Highlights 2016 #18

I subscribe to many podcasts, you can see the list as it was in 2015 here: Developer podcasts v2 but I thought I would start to keep a weekly log of the episodes that I found interesting or useful in some way.

Lets see if i can keep going every week shall we :-)

[Software engineering radio] Unit Tests  http://www.se-radio.net/2016/05/se-radio-episode-256-jay-fields-on-working-effectively-with-unit-tests/
[Hanselminutes] Management and motivation http://www.hanselminutes.com/526/punishment-driven-development-with-louise-elliott
[Scrum master toolbox] Purpose and management 3.0 http://podplayer.net/#/?id=15224714 from http://www.scrum-master-toolbox.com/
[Devnology] Lean software development http://devnology.nl/podcasts/devnology-podcast-012-mary-and-tom-poppendieck-part-1
[Full stack radio] Git source control tips http://www.fullstackradio.com/41

P.s If you are a little confused about the number in the title its based on the week number. Anyway it looks like I've been doing this longer than i really have ;-)

Wednesday, 4 May 2016

Deploying Azure websites and webjobs using your CI system with msbuild and azure powershell cmdlets

There are lots of tutorials detailing how to send web apps and web jobs up to azure as part of your CI pipeline but I've found them all lacking, mainly in that they require you to upload to Azure in the same command as performing your build.
Often this command looks like the following:
msbuild.exe foobar.csproj /p:DeployOnBuild=true /p:PublishProfile="azurePubProfile" /p:Configuration=Release
This simultaneously builds, configures and publishes the project to azure.
 
This is unacceptable to me as I want to promote the same built artifact through many environments ci-test-preprod-prod where the only thing to change is the config getting deployed to each. I don't want to keep building the code over and over when I deploy which has many issues ranging from changes in the code between deployments to changes in the environment of the build machine. I want to know that what is getting deployed to prod is exactly the same binaries as was deployed and tested in all previous environments. To achieve this we need to separate the building of the artifact from the deployment.

What follows is the method we are now using to build and deploy our services to Azure. It breaks down into 4 simple steps
  1. Build your solution, firstly restoring any nuget packages if needed
  2. Configure your service for the target environment and zip up the artifact
  3. Configure the powershell session for azure
  4. Publish the zipped artifact to azure

App service (websites)

Build

Firstly build your solution, if using any nuget packages restore these first
nuget restore
Perform the build on the solution
msbuild foobar.sln /t:build /p:configuration=release /p:OutDir=BUILD_OUTPUT_PATH
Grab the published website from ./foobar/BUILD_OUTPUT_PATH/_PublishedWebsites/foobar and safe it to your artifact store of choice.

Deploy

Firstly apply the correct config for your target environment for this deployment to the artifact saved from the build. there are many ways to do this so i wont go in to it here.

Next zip up the deployable artifact
Add-Type -Assembly System.IO.Compression.FileSystem
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir, $zipfilename, $compressionLevel, $false)

Prepare the powershell session for the upload to azure
Load in your azure cert
Import-AzurePublishSettingsFile azure-credentials.publishsettings
Select the desired subscription
Select-AzureSubscription 00000000-0000-0000-0000-000000000001
Publish the website using the azure cmdlet
Publish-AzureWebsiteProject -Package buildoutput.zip -Name foobar -Slot 'staging'

Webjobs

As above except the location of the built artifact foobarjob/BUILD_OUTPUT_PATH
And the cmdlet for creating the webjob
New-AzureWebsiteJob -Name foobar -JobName foobarjob -JobType Continuous -JobFile .\buildoutput.zip

Conclusion

It turns out its actually really easy to achieve the result we desired, mainly the repeatable deployment of a known, tested build artifact to any environment we like.

We use GoCd from thoughtworks to orchestrate the above process through the pipelines feature. When all this is combined with staging slots, blue green deployments and the like you get a really robust process, excellent auditability, a solid rollback strategy and not to mention peace of mind when pushing to prod.

Id love to hear how you achieve the same results, whether its through version control strategies, azure deployment slot strategies or something else.
Let me know.

Azure app service error 'An attempt was made to load a program with an incorrect format'

I was deploying a new website today and came across an issue running the site on azure. The site ran fine on my dev machine both running under vs2015 and when setup as a website under my local IIS.

But when running on a freshly created Azure app service i got the error:

Could not load file or assembly 'System.Web' or one of its dependencies. An attempt was made to load a program with an incorrect format.

Exception Details: System.BadImageFormatException: Could not load file or assembly 'System.Web' or one of its dependencies. An attempt was made to load a program with an incorrect format.


[BadImageFormatException: Could not load file or assembly 'System.Web' or one of its dependencies. An attempt was made to load a program with an incorrect format.] System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly ....


After digging around on the interwebs for a while it became apparent it was an issue with either the target architecture or the targetting of the dlls. My solution was built to target 'any cpu' but somehow the version of System.Web that was brought down by nuget was the 64bit version.

So i figured that changing the target architecture would have the desired effect and changed the azure platform from 32 bit (the default for new app services) to 64 bit in the application settings of the azure portal (portal.azure.com).


Problem solved. I hope this will point someone else to a quick resolution in the future.