Codedeploy 日志有错误

Codedeploy 日志有错误

我有一个应用程序,正在使用 AWS Codedeploy 将其部署到运行 Windows Server 2012 R2 且安装了代码部署的 EC2 实例。使用推荐的 CloudFormation 模板将 Codedeploy 安装到实例上,到目前为止运行良好。

我创建了一个简单的脚本,它应该在文件系统上创建一个文件夹,并在默认网站上的 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.

答案1

这是 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

您可以在脚本中写入主机或 stdout/stderr,如果它们正在运行,则输出将出现在这些日志中。

答案2

我终于再次让 CodeDeploy 运行我的 Powershell 脚本。看来我将ps1脚本放入部署包中的文件夹而不是文件根目录中,这给自己带来了问题appspec.yml

我认为这可能与我通过执行以下命令阅读 powershell.exe 的帮助文件时读到的消息有关powershell.exe /?

-File
在本地范围(“点源”)中运行指定的脚本,以便脚本创建的函数和变量在当前会话中可用。输入脚本文件路径和任何参数。File 必须是命令中的最后一个参数,因为在 File 参数名称后输入的所有字符都被解释为脚本文件路径后跟脚本参数。

相关内容