如何在Azure DevOps Pipeline中构建部署Laravel应用(Windows环境)
在Azure DevOps Pipeline中构建并部署Laravel应用的可行方案
一、构建可部署到服务器的压缩包
基于Azure提供的PHP通用模板修改即可适配Laravel,以下是完整的azure-pipelines.yml配置逻辑:
- 指定PHP版本
选择Laravel兼容的PHP版本(Laravel 9+推荐8.1及以上):
- task: UsePHP@1 inputs: version: '8.2'
- 安装Composer依赖
跳过开发依赖以减小包体积,同时优化自动加载:
- script: | php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php composer-setup.php php -r "unlink('composer-setup.php');" php composer.phar install --no-dev --optimize-autoloader displayName: '安装生产环境依赖'
- 优化Laravel应用
生成密钥并缓存配置、路由、视图,提升运行效率:
- script: | cp .env.example .env php artisan key:generate php artisan config:cache php artisan route:cache php artisan view:cache displayName: '优化Laravel应用配置'
- 打包并发布工件
将应用文件打包为ZIP,发布到Azure DevOps工件库供后续部署:
- task: ArchiveFiles@2 inputs: rootFolderOrFile: '$(System.DefaultWorkingDirectory)' includeRootFolder: false archiveType: 'zip' archiveFile: '$(Build.ArtifactStagingDirectory)/laravel-app.zip' replaceExistingArchive: true - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'drop' publishLocation: 'Container'
二、直接部署到Windows服务器
如果要一键完成构建+部署,在上述构建步骤后添加以下部署逻辑:
- 准备Windows服务器环境
提前在服务器上完成:
- 安装IIS并启用CGI、FastCGI模块
- 安装对应版本的PHP,配置IIS的PHP处理程序映射
- 确保
IIS_IUSRS组对目标目录有读写权限
- 复制应用文件到服务器
使用WindowsMachineFileCopy任务将打包好的文件部署到服务器:
- task: WindowsMachineFileCopy@2 inputs: sourcePath: '$(Build.ArtifactStagingDirectory)/laravel-app.zip' machineNames: '你的Windows服务器IP/主机名' adminUserName: '服务器管理员账户' adminPassword: '$(ServerPassword)' # 在Azure DevOps变量组中存储敏感密码 targetPath: 'C:\inetpub\wwwroot\laravel-app' cleanTargetFolder: true
- 自动化服务器配置
通过PowerShell任务完成权限设置和IIS站点配置:
# 设置storage和bootstrap/cache目录权限 - task: PowerShell@2 inputs: targetType: 'inline' script: | $acl = Get-Acl "C:\inetpub\wwwroot\laravel-app\storage" $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("IIS_IUSRS","Modify","ContainerInherit,ObjectInherit","None","Allow") $acl.AddAccessRule($rule) Set-Acl "C:\inetpub\wwwroot\laravel-app\storage" $acl $acl = Get-Acl "C:\inetpub\wwwroot\laravel-app\bootstrap\cache" $acl.AddAccessRule($rule) Set-Acl "C:\inetpub\wwwroot\laravel-app\bootstrap\cache" $acl machineName: '你的Windows服务器IP/主机名' userName: '服务器管理员账户' password: '$(ServerPassword)' # 配置IIS站点指向Laravel的public目录 - task: PowerShell@2 inputs: targetType: 'inline' script: | Import-Module WebAdministration $siteExists = Get-Website -Name "LaravelApp" -ErrorAction SilentlyContinue if (-not $siteExists) { New-Website -Name "LaravelApp" -PhysicalPath "C:\inetpub\wwwroot\laravel-app\public" -Port 80 -ApplicationPool "DefaultAppPool" } else { Set-ItemProperty "IIS:\Sites\LaravelApp" -name physicalPath -value "C:\inetpub\wwwroot\laravel-app\public" } machineName: '你的Windows服务器IP/主机名' userName: '服务器管理员账户' password: '$(ServerPassword)'
关键注意事项
- 敏感配置(数据库连接、APP_KEY等)不要硬编码在
.env中,建议在Azure DevOps变量组中配置,部署时通过PowerShell写入服务器的.env文件 - 确保服务器安装的PHP扩展满足Laravel要求(BCMath、Ctype、JSON、Mbstring、OpenSSL、PDO、Tokenizer、XML等)
- 若服务器无外网,必须在Pipeline中完成依赖安装后再部署,避免服务器拉取Composer包失败
内容的提问来源于stack exchange,提问作者Usman Khan
相关产品推荐
相关产品推荐

