Назад | Перейти на главную страницу

Сценарий AWS CodeDeploy Powershell не выполняется

У меня есть приложение, которое я развертываю с помощью AWS Codedeploy в экземпляре EC2 под управлением Windows Server 2012 R2 с установленным развертыванием кода. Codedeploy устанавливается на экземпляр с использованием рекомендованного шаблона CloudFormation и до сих пор работает нормально.

Я создал простой сценарий, который должен создать папку в файловой системе и виртуальный каталог в IIS на веб-сайте по умолчанию, сценарий ниже:

# Are you running in 32-bit mode?
#   (\SysWOW64\ = 32-bit mode)

if ($PSHOME -like "*SysWOW64*")
{
  Write-Warning "Restarting this script under 64-bit Windows PowerShell."

  # Restart this script under 64-bit Windows PowerShell.
  #   (\SysNative\ redirects to \System32\ for 64-bit mode)

  & (Join-Path ($PSHOME -replace "SysWOW64", "SysNative") powershell.exe) -File `
    (Join-Path $PSScriptRoot $MyInvocation.MyCommand) @args

  # Exit 32-bit script.

  Exit $LastExitCode
}

# Was restart successful?
Write-Warning "Hello from $PSHOME"
Write-Warning "  (\SysWOW64\ = 32-bit mode, \System32\ = 64-bit mode)"
Write-Warning "Original arguments (if any): $args"

# Your 64-bit script code follows here...

# Install IIS Web Server administrator
Import-Module -Name ServerManager
Import-Module WebAdministration
Install-WindowsFeature Web-Server

$folderLoc = 'C:\inetpub\imageprocessorcache'

if (-not (Test-Path $folderLoc))
{
    # Create new folder
    New-Item $folderLoc -type directory

    # Get rule and add new rule to it
    $existingAcl = Get-Acl $folderLoc
    $permissions = 'Users', 'FullControl', 'ContainerInherit, ObjectInherit', 'None', 'Allow'
    $rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permissions
    $existingAcl.AddAccessRule($rule)

    # Apply new rule to the folder
    $existingAcl | Set-Acl -Path $folderLoc

    # Get the ACL for the folder for output purposes
    Get-Acl -Path $folderLoc
}

$virtualPathLocation = 'IIS:\Sites\Default Web Site\imageprocessorcache'

# Check if the virtual directory exists in IIS
if (-not (Test-Path $virtualPathLocation))
{
    # Create it because it doesn't exist yet
    New-WebVirtualDirectory -Name 'imageprocessorcache' -PhysicalPath $folderLoc -Site 'Default Web Site'
}

Вот файл appspec, который у меня есть:

version: 0.0
os: windows
files:
  - source: MyWebsite
    destination: c:\temp\CodeDeployFiles
hooks:
  BeforeInstall:
    - location: \Deployment Scripts\IISCreateImageProcessorVirtualDirectory.ps1
      timeout: 900

По какой-то причине сценарий не выполняется как часть процесса развертывания, кажется, что он пропускается или просто завершается с ошибкой.

Я могу подключиться к удаленному рабочему столу, перейти во временную папку на экземпляре EC2 (куда файлы копируются во время развертывания с помощью CodeDeploy) и щелкнуть правой кнопкой мыши по IISCreateImageProcessorVirtualDirectory.ps1 и выберите «Запускать с помощью Powershell» на скопированном скрипте. Это работает нормально, создаются папка и виртуальный каталог.

У меня был успешный бег .ps1 сценарии в прошлом с использованием кода развертываются с моей текущей настройкой, но этот не работает и не оставляет сообщений об ошибках.

Что могло быть причиной того, что скрипт не запускался?

Спасибо за вашу помощь.

Журнал Codedeploy с ошибкой

[2016-11-24 21:10:54.909] [d-DSQ9EQ28J]Script - .\Powershell Scripts\IISCreateImageProcessorVirtualDirectory.ps1
[2016-11-24 21:10:55.112] [d-DSQ9EQ28J][stderr]Processing -File 'C:\ProgramData/Amazon/CodeDeploy/c979dfe5-9d99-4cee-870d-cc9e3cb518bc/d-DSQ9EQ28J/deployment-archive/.\Powershell' failed because the file does not have a '.ps1' extension. Specify a valid Windows PowerShell script file name, and then try again.

Вот как агент CodeDeploy выполняет ваш скрипт (источник):

powershell.exe -ExecutionPolicy Bypass -File <absolute_path_to_your_script_here>

Так что попробуйте изменить свой хук на это:

hooks:
  BeforeInstall:
    - location: .\Deployment Scripts\IISCreateImageProcessorVirtualDirectory.ps1
      timeout: 900

Оператор .\ позволяет запускать скрипт в текущем каталоге.

Устранение общих неисправностей

Если вам нужно продолжить устранение неполадок, вы можете найти свои последние развертывания здесь: C:\ProgramData\Amazon\CodeDeploy\

И ваши журналы по развертыванию здесь: C:\ProgramData\Amazon\CodeDeploy\DEPLOYMENTGROUPIDGOESHERE\DEPLOYMENTIDGOESHERE\logs

Вы можете писать на host или на stdout / stderr в своих скриптах, и если они выполняются, этот вывод попадет в эти журналы.

Наконец-то я получил свои сценарии Powershell, которые снова запускает CodeDeploy. Кажется, я поставил себе проблемы, поставив ps1 скрипты в папку в моем пакете развертывания, а не в корень с моим appspec.yml файл.

Я думаю, что это может быть связано с сообщением, которое я прочитал, когда прочитал файл справки по powershell.exe, выполнив powershell.exe /?:

-Файл
Запускает указанный сценарий в локальной области («с точечным источником»), так что функции и переменные, создаваемые сценарием, доступны в текущем сеансе. Введите путь к файлу сценария и любые параметры. Файл должен быть последним параметром в команде, поскольку все символы, введенные после имени параметра файла, интерпретируются как путь к файлу сценария, за которым следуют параметры сценария.