diff --git a/lib/ansible/modules/windows/win_psrepository.py b/lib/ansible/modules/windows/win_psrepository.py index 5887ce6299e..a4faa1c6cf5 100644 --- a/lib/ansible/modules/windows/win_psrepository.py +++ b/lib/ansible/modules/windows/win_psrepository.py @@ -44,7 +44,11 @@ options: type: str choices: [ trusted, untrusted ] notes: - - The PowerShellGet module (version 1.6.0 or newer) and the NuGet package provider (version 2.8.5.201 or newer) are required. + - PowerShell modules needed + - PowerShellGet >= 1.6.0 + - PackageManagement >= 1.1.7 + - PowerShell package provider needed + - NuGet >= 2.8.5.201 - See the examples on how to update the NuGet package provider. - You can not use C(win_psrepository) to re-register (add) removed PSGallery, use the command C(Register-PSRepository -Default) instead. seealso: @@ -53,10 +57,10 @@ author: - Wojciech Sciesinski (@it-praktyk) ''' -EXAMPLES = r''' +EXAMPLES = ''' --- - name: Ensure the required NuGet package provider version is installed - win_shell: Install-PackageProvider -Name NuGet -RequiredVersion 2.8.5.201 -Force + win_shell: Find-PackageProvider -Name Nuget -ForceBootstrap -IncludeDependencies -Force - name: Add a PowerShell module and register a repository win_psrepository: @@ -70,5 +74,5 @@ EXAMPLES = r''' state: absent ''' -RETURN = r''' +RETURN = ''' ''' diff --git a/test/integration/targets/win_psrepository/tasks/main.yml b/test/integration/targets/win_psrepository/tasks/main.yml index 72226eec44d..d0655241512 100644 --- a/test/integration/targets/win_psrepository/tasks/main.yml +++ b/test/integration/targets/win_psrepository/tasks/main.yml @@ -9,21 +9,78 @@ win_shell: '$PSVersionTable.PSVersion.Major' register: powershell_major_version -- name: Perform integration tests for Powershell 5+ - when: powershell_major_version.stdout | int >= 5 +- name: update PackageManagement and PowerShellGet when PowerShell < 5.0 + when: powershell_major_version.stdout | int < 5 block: + - name: download PackageManagement + win_get_url: + url: https://s3.amazonaws.com/ansible-ci-files/test/integration/targets/win_psmodule/PackageManagement_x64.msi + dest: '{{ win_output_dir }}\PackageManagement_x64.msi' - - name: ensure test repository is deleted - win_psrepository: - name: '{{ repository_name }}' + - name: install PackageManagement + win_package: + path: '{{ win_output_dir }}\PackageManagement_x64.msi' + state: present + + - name: create the required folder + win_file: + path: 'C:\Program Files\PackageManagement\ProviderAssemblies' + state: directory + + - name: download nuget + win_get_url: + url: https://s3.amazonaws.com/ansible-ci-files/test/integration/targets/win_psmodule/nuget.exe + dest: 'C:\Program Files\PackageManagement\ProviderAssemblies\NuGet-anycpu.exe' + + - name: update NuGet provider + win_shell: 'Find-PackageProvider -Name Nuget -ForceBootstrap -IncludeDependencies' + + - name: download and save the nevest version of the PackageManagement module from PowerShell Gallery + win_shell: 'Save-Module -Name PackageManagement, PowerShellGet -Path {{ win_output_dir }} -Force' + + - name: unload PackageManagement and PowerShellGet modules + win_shell: 'Remove-Module -Name PackageManagement,PowerShellGet -Force -ErrorAction Ignore' + ignore_errors: yes + + - name: get PSModulePath + win_shell: "$($Env:PSModulePath -Split ';')[0]" + register: psmodulepath + + - name: remove older versions of the PackageManagement and PowerShellGet + win_file: + path: "{{ psmodulepath.stdout | trim }}\\{{ item }}" state: absent + with_items: + - PackageManagement + - PowerShellGet - - name: run all tests - include_tasks: tests.yml + - name: create required folder + win_file: + path: "{{ psmodulepath.stdout | trim }}" + state: directory - always: + - name: update PowerShellGet and PackageManagement modules + win_shell: 'Copy-Item -Path {{ win_output_dir }}\{{ item }} -Destination {{ psmodulepath.stdout | trim }}\ -Recurse -Force' + with_items: + - PackageManagement + - PowerShellGet - - name: ensure test repository is deleted after tests run - win_psrepository: - name: '{{ repository_name }}' - state: absent +- name: update NuGet version + when: powershell_major_version.stdout | int >= 5 + win_shell: | + $nuget_exists = (Get-PackageProvider | Where-Object { $_.Name -eq 'Nuget' } | Measure-Object).Count -eq 1 + + if ( $nuget_exists ) { + $nuget_outdated = (Get-PackageProvider -Name NuGet -ErrorAction Ignore).Version -lt [Version]"2.8.5.201" + } + + if ( -not $nuget_exists -or $nuget_outdated ) { + Find-PackageProvider -Name Nuget -ForceBootstrap -IncludeDependencies -Force + } + +- name: unregister the repository + win_shell: 'Unregister-PSRepository {{ repository_name | quote }} -ErrorAction Ignore' + changed_when: false + +- name: run all tests + include_tasks: tests.yml