Azure DevOps Android构建成功但上传工件失败:未找到工件
Azure DevOps Android流水线报错:未找到工件文件夹
问题根源分析
报错显示找不到D:\a\1\s\app\build\outputs\apk,说明Gradle构建后未生成目标目录,核心原因是Windows环境下Gradle命令执行不兼容,或是路径配置逻辑错误,看似“构建成功”可能只是脚本未捕获Gradle实际执行失败的异常。
修复步骤
1. 修正Windows环境的Gradle调用命令
Windows虚拟机中不能直接用类Unix风格的./gradlew,必须调用Windows批处理文件gradlew.bat,修改构建脚本:
- script: | echo "Running Gradle task: assembleDebug" java -version gradlew.bat clean gradlew.bat assembleDebug displayName: 'Run Gradle Build'
2. 验证Gradle是否真的生成了APK
在Gradle构建步骤后添加目录检查,确认APK文件是否存在:
- script: | echo "Checking build output" dir /s /b app\build\outputs\apk\debug displayName: 'Verify APK Generation'
如果这一步报错,说明Gradle实际构建失败,需要查看流水线日志排查编译问题(比如依赖缺失、代码语法错误)。
3. 修正文件复制与发布的路径逻辑
当前配置中,CopyFiles任务将app\build\outputs\apk复制到 staging目录后,Publish任务却去$(Build.ArtifactStagingDirectory)\app\build\outputs\apk\debug找文件——这是错误的,复制后文件结构应为$(Build.ArtifactStagingDirectory)\debug,而非嵌套原路径。
修改后的文件处理任务:
- task: CopyFiles@2 displayName: 'Copy APK to Staging Directory' inputs: SourceFolder: 'app\build\outputs\apk\debug' Contents: '*.apk' TargetFolder: '$(Build.ArtifactStagingDirectory)' - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'apk' publishLocation: 'Container'
直接复制debug目录下的APK到 staging目录,再发布整个目录,路径逻辑更清晰。
4. 优化目录结构检查脚本
用更直观的命令查看当前目录和构建产物:
- script: | echo "Current working directory: %CD%" dir /s /b app\build displayName: 'Check Build Directory Structure'
dir /s /b会递归列出所有文件,能快速确认是否生成了APK。
完整修正后的azure-pipelines.yml示例
trigger: - main pool: vmImage: 'windows-latest' stages: - stage: Build displayName: 'Build APK' jobs: - job: BuildDebug displayName: 'Build Debug APK' steps: - task: JavaToolInstaller@0 inputs: versionSpec: '17' jdkArchitectureOption: 'x64' jdkSourceOption: 'PreInstalled' - script: | echo "Checking Java version" java -version displayName: 'Check Java Version' - script: | echo "Running Gradle task: assembleDebug" java -version gradlew.bat clean gradlew.bat assembleDebug displayName: 'Run Gradle Build' - script: | echo "Current working directory: %CD%" dir /s /b app\build displayName: 'Verify Build Output' - task: CopyFiles@2 displayName: 'Copy APK to Staging Directory' inputs: SourceFolder: 'app\build\outputs\apk\debug' Contents: '*.apk' TargetFolder: '$(Build.ArtifactStagingDirectory)' - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'apk' publishLocation: 'Container'
内容的提问来源于stack exchange,提问作者Gaurav Bajait
相关产品推荐
相关产品推荐

