Categories
Uncategorized Windows

Umbraco Continuous Deployment with Jenkins

I haven’t seen many posts about Continuous Integration. Perhaps this is because Umbraco Cloud option offers this feature off the shelf but I have some customers that require customizations (custom databases) that would be costly on the Umbraco Cloud setup. Therefore I decided to spin up Jenkins that connects to Github repo and does automatic deployment from the main branch whenever there is push to it.

Here are few quick steps that gets you started.

1. Setup Github

Wheater you use Github or Gitlab or your own Git repo these steps do not matter. You just need a branching stradegy where the master branch matches what is in your live site.

image of release branch workflows

Merge feature branches into the master branch using pull requests.

Install Jenkins

I have root server Windows 2019 running on Hetzner but I hear OVHCloud is good as well. So, I installed Jenkins instances directly on my test server and live server. I could do the setup with PowerShell remote but Jenkins is quick to install and requires very little maintainance and resources so I just have them running isolated on the given server.

In the Jenkins server you also need Microsoft Build Tools and Nuget installed on globally available.

Configure Jenkins for Umbraco

You need some plugins in order to build .NET projects and Frontend projects. Try these:

  • MBBuild
  • Global Slack Notifier Plugin (for notifying build success/failures)
  • NodeJS Plugin (control npm builds)
  • Nuget Plugin
  • PowerShell plugin (for scripting)
  • ThinBackup (for moving Jenkins configs between instances

Here is my sample configuration on Freestyle Jenkins project.

Node version

Nuget restore command and Injection to Assembly

Run MSBuild

Copy files from Jenkins build folder to Webroot


Notice that running IISReset here is probably not the best idea. I have done same thing on Sitecore projects where instead I stop/start Application Pool. Stop-WebAppPool -Name "DefaultAppPool" you may make restarting of the application few seconds faster that way. But you need to stop AppPool or IIS because sometiimes artificats are locked and if that happens things goes south.

Post Build actions

You can also setup here Email notification or if you use Teams , RocketChat etc. there is plugins for sending notification when build completes or fails.
If you work on bigger team you can also send email for whoever pushed bad code on the success/failure.

That’s it. Minimail Jenkins setup for Umbraco projects that I use. This same setup works for any .NET projects as I did not include any actions on uSync or anything other Umbraco specific.

I have done few DevOps Setups on Jenkins, TeamCity, Azure Devops and Github Actions. Which ever CI/CD tool you are using I recommend to create your scriptinigs on Node and/or PowerShell so you can easily jump between as they all work essentially same way.

Categories
Uncategorized

Restart Application Pool in Powershell and write it to EventLog

Sometimes on Continuous Integration or other automated scenarios you want to restart Application pool in order to recycle everything clean. This can be done by calling Powershell command Restart-WebAppPool like this: “Restart-WebAppPool AppPoolNameHere”. But you might also want to write log entry to EventLogs so you know what is going on.

In order to write to the event log, one can use the Write-EventLog cmdlet but there are mandatory parameters needed to write the event log information. These are:

  • LogName
  • Source
  • EventID
  • Message

If you want to create an entry log message “Format was called” into the Application Log and store this into your custom source “MyScript” with a custom event ID like “3001”, you will need to type it as:

Write-EventLog -LogName Application -Source MyScript -EventId 3001 -Message "Format was called"

If you have not registered your custom event source, you will encounter an error. In order to register a custom event source, you will need to call the New-EventLog cmdlet like the example below:

New-EventLog -LogName Application -Source MyScript

After this you can call Write-eventLog as following:

Write-EventLog -LogName Application -Source MyScript -EventId 3001 -Message “Format was called”

Categories
Uncategorized

Restart Windows in 1 hour or certain time

tldr;

  • Open Powershell as Admin
  • Type: Start-Sleep 3600 ; Restart-Computer -Confirm:$false <enter>

 

I work on RDP a lot against Windows Machines and sometimes there are updates and downloads what I need to do and afterwards update. Or perhaps I need to restart in certain time.

Basically what start-sleep does is pause the process for the number of seconds that you specify. The semicolon is like having another line in the code so it will execute what is next, which in this case is restart-computer. Since you may not be logged into the server or it may be at a lock-screen, you will need to include the -confirm:$false otherwise it may not execute.

If you want to restart on certain time

  • shutdown -r -t ([decimal]::round(((Get-Date).AddDays(1).Date.AddHours(3) - (Get-Date)).TotalSeconds))

This will get the number of seconds between the time the script is ran and 3:00AM the following day (on the server time). It then passes the result to shutdown.exe. Obviously this is designed to be ran before midnight. Remember “-r” so it is actually restarting instead of just shutting down.