LWRP for deleting old builds

2016/12/07

In your cookbook, in libraries folder, create the following:

provider_cache_cleaner.rb

class BuildCacheCleaner
  # Provider for build_cache_cleaner
  class BuildCacheCleanerProvider < Chef::Provider::LWRPBase
    provides :build_cache_cleaner
    use_inline_resources
    action :delete do
      delete_count = 0
      if ::File.directory?(new_resource.cache_path)
        search_path = ::File.join(new_resource.cache_path.to_path, “#{new_resource.suffix}*\.#{new_resource.extension}”)
        cached_files = ::Dir.glob(search_path).sort_by { |f| ::File.ctime(f) }
        if cached_files.count > new_resource.keep_count
          delete_count = cached_files.count – new_resource.keep_count
        end
        files_to_delete = cached_files.first(delete_count)
        unless files_to_delete.empty?
          Chef::Log.info(“#{delete_count} cached builds will be deleted !”)
          files_to_delete.each do |file_name|
            Chef::Log.info(“Deleting file #{::File.basename(file_name)} …”)
            ::File.delete(file_name)
          end
        end
      end
      new_resource.updated_by_last_action(true) if delete_count > 0
    end
  end
end

resource_cache_cleaner.rb

class BuildCacheCleaner
  # Resource for build_cache_cleaner
  class BuildCacheCleanerResource < Chef::Resource::LWRPBase
    resource_name :build_cache_cleaner
    provides :build_cache_cleaner

    actions(:delete)
    default_action(:delete)

    attribute :keep_count, :kind_of => Integer, :required => false, :default => 5
    attribute :suffix, :kind_of => String, :required => false, :default => ‘Build’
    attribute :extension, :kind_of => String, :required => false, :default => ‘zip’
    attribute :cache_path, :kind_of => String, :required => false, :default => Chef::Config[:file_cache_path]
  end
end

string_util.rb

# String utility extension methods
class String
  def to_path(end_slash = false)
    “#{‘/’ if self[0] == ‘\\’}#{split(‘\\’).join(‘/’)}#{‘/’ if end_slash}”
  end
end

matchers.rb

# ChefSpec is a tool to unit test cookbooks in conjunction with rspec
# Learn more on the README or at https://github.com/sethvargo/chefspec.
if defined?(ChefSpec)
  def delete_build_cache_cleaner(resource_name)
    ChefSpec::Matchers::ResourceMatcher.new(:build_cache_cleaner, :delete, resource_name)
  end
end

In your recipe, use the resource as follow:

build_cache_cleaner ‘delete cached builds’ do
  keep_count 7
end

In your ChefSpec test, add the following:

it ‘deletes unused cached builds’ do
  expect(chef_run).to delete_build_cache_cleaner(‘delete cached builds’)
end

Note 1: Credits go to StackOverflow, IT blogs and alike, sites that helped me with the code when searching for solutions.
Note 2: Be aware that when copy-pasting, the quotes and possibly other characters get messed up by WordPress, you’ll have to replace them.
Note 3: While I may have tested myself most of the bits of code posted here, please be aware that you’re trying the code/scripts at your own risk, and I take no responsibility for any damage that may occur on your system(s).

Advertisements

Ping website with port using PowerShell

2016/12/07

Update
Thanks, jrlops ! There’s an embedded PowerShell way for doing this:

Test-NetConnection http:/mywebsite.mydomain -Port 1234

Using .Net object:

(New-Object System.Net.Sockets.TcpClient).Connect( `http://mywebsite.mydomain` , 1234 )

Add Chef cookbook dependency in Berksfile group for testing

2016/11/24
source `https://supermarket.chef.io`

metadata

group :integration do
cookbook ‘some_cookbook’, path: ‘./test/fixtures/cookbooks/some_cookbook’

# not a strict dependency, but necessary for testing
cookbook ‘java’
end

Note 1: Credits go to StackOverflow, IT blogs and alike, sites that helped me with the code when searching for solutions.
Note 2: Be aware that when copy-pasting, the quotes and possibly other characters get messed up by WordPress, you’ll have to replace them.


Install latest ChefDK nightly build through crontab

2016/10/24

To install the latest ChefDK nightly build at 1 AM every day, put this in the root crontab:

0 1 * * * curl https://omnitruck.chef.io/install.sh | bash -s —- -p -P chefdk

Note 1: Credits go to StackOverflow, IT blogs and alike, sites that helped me with the code when searching for solutions.
Note 2: Be aware that when copy-pasting, the quotes and possibly other characters get messed up by WordPress, you’ll have to replace them.


Useful PowerShell profile code

2016/07/22

To check the location for your Powershell profile file, type $profile .
To reload your PowerShell profile, use & $profile .

Edit your PowerShell profile to set custom colors and console size as follow:

$host.UI.RawUI.BackgroundColor = ‘Gray’
$host.UI.RawUI.ForegroundColor = ‘Black’

$pshost = get-host
$pswindow = $pshost.ui.rawui

$newsize = $pswindow.buffersize
$newsize.height = 9000
$newsize.width = 140
$pswindow.buffersize = $newsize

$newsize = $pswindow.windowsize
$newsize.height = 65
$newsize.width = 140
$pswindow.windowsize = $newsize

# You’ll need a HOME variable defined as environment variable
cd $env:HOME

Clear-Host

Note 1: Credits go to StackOverflow, IT blogs and alike, sites that helped me with the code when searching for solutions.
Note 2: Be aware that when copy-pasting, the quotes and possibly other characters get messed up by WordPress, you’ll have to replace them.


PowerShell function for registry value test

2016/07/20

Below is a useful function for checking the existence and the value of a registry key.
Might need some rework, it’s not in a final version

function Test-RegistryValue
{
  param(
    [Parameter(Mandatory=$true)] [string]$Path,
    [Parameter(Mandatory=$true)] [string]$Name,
    [Parameter(Mandatory=$false)] $KeyValue
  )

  if( -not (Test-Path -Path $Path -PathType Container) ) {
    return $false
  }

  $properties = Get-ItemProperty -Path $Path
  if( -not $properties ) {
    return $false
  }
  else {
    $value = ($properties | Select-Object -ExpandProperty $Name)
    if ($value.ToString().ToLower() -eq $KeyValue.ToString().ToLower()) {
      return $true
    }
    else {
      return $false
    }
  }

  $member = Get-Member -InputObject $properties -Name $Name
  if( $member ) {
    return $true
  }
  else {
    return $false
  }
}

Note: Credits go to StackOverflow, IT blogs and alike, sites that helped me with the code when searching for solutions.


Upload a ZIP to Azure storage account in PowerShell

2016/06/23

This was tested under PowerShell 5, with Azure PowerShell module installed.

After you download your Azure publish settings file from https://manage.windowsazure.com/publishsettings/index?client=powershell&schemaVersion= you can use Get-AzureSubscription to choose a subscription for the upload (if you have several on your account)

if(-not (Get-Module Azure)) {
  Import-Module Azure
}

Import-AzurePublishSettingsFile “path/to/your/azure/publish/settings/file”

(Get-AzureSubscription).SubscriptionName # Choose subscription if several present

Select-AzureSubscription -SubscriptionName “YourSubscritionNameHere”
$storAcc = ‘companyartifacts’
$storCntr = ‘builds’
$blob = ‘Buildxyz.zip’
$key = (Get-AzureStorageKey -StorageAccountName $storAcc).Primary

$ctxt = New-AzureStorageContext -StorageAccountName $storAcc -StorageAccountKey $key

Write-Output “Uploading ZIP to Azure…”

Set-AzureStorageBlobContent -File “path\to\Buildxyz.zip” -Container $storCntr -Blob $blob -BlobType Block -Context $ctxt -Force

Note 1: Credits go to StackOverflow, IT blogs and alike, sites that helped me with the code when searching for solutions.
Note 2: Be aware that when copy-pasting, the quotes and possibly other characters get messed up by WordPress, you’ll have to replace them.


%d bloggers like this: