jenkinscontinuous-integrationpsake

Cannot import module from Powershell script using Jenkins


I am trying to use Psake to build my Asp.Net MVC Solution on Jenkins Server. I have the Powershell scripts and Psake scripts checked in to source code. I have created a bootstrapper file build.ps1 that imports and invokes Psake.

Import-Module .\Psake.4.5.0\psake.psm1

    Invoke-Psake -buildFile .\default.ps1 `
        -taskList Default `
        -framework '4.6' `
        -parameters @{'solutionFilePath'='..\Application.sln'}

All my tasks are defined in the default.ps1 file which I am trying to invoke. Locally when I run the script, the Psake module is imported and everything works. On Jenkins server however I get the following error:

Import-Module : The specified module '.\Psake.4.5.0\psake.psm1' was not loaded 
because no valid module file was found in any module directory.At C:\Program 
Files (x86)\Jenkins\workspace\Atmosphere\Build\Build.ps1:9 char:1
+ Import-Module .\Psake.4.5.0\psake.psm1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (.\Psake.4.5.0\psake.psm1:S 
   tring) [Import-Module], FileNotFoundException
    + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Comm 
   ands.ImportModuleCommand

I am new to Jenkins, having used Team City previously and I have double checked that the Psake module is indeed being copied to the Jenkins Workspace.

This is how I am invoking the Build.ps1 from Jenkins

Powershell.exe -noprofile -executionpolicy Bypass -file .\Build\Build.ps1

Can someone please point me to what I am doing wrong?


Solution

  • Ok I was finally able to resolve the problem and wanted to share the solution in case someone else runs into it. When running Powershell Script .\ is automatically resolved to current directory. However when we are executing our Script from Jenkins, we need to reference path of our Jenkins Workspace and use full path. To do that, Jenkins provides variable $ENV:WORKSPACE

    Everywhere I was using .\ I changed it to use $ENV:WORKSPACE

    so

    Import-Module .\Psake.4.5.0\psake.psm1 became

    Import-Module $ENV:WORKSPACE\Build\Psake.4.5.0\psake.psm1

    And it started working!