如何用YAML创建Azure Pipeline实现PyInstaller编译Python代码并上传OneDrive
Azure Pipeline YAML 实现 Windows EXE 构建与 OneDrive 上传
以下是满足你需求的完整 YAML 流水线配置,包含详细注释和前置准备说明:
完整 YAML 代码
trigger: - main # 替换为你的代码分支名称 pool: vmImage: 'windows-latest' # 使用微软托管的 Windows 代理 steps: # 1. 配置 Python 环境 - task: UsePythonVersion@0 inputs: versionSpec: '3.10' # 选择与你的应用兼容的 Python 版本 addToPath: true # 2. 安装 PyInstaller - script: | pip install pyinstaller displayName: '安装 PyInstaller' # 3. 构建 EXE 文件 - script: | pyinstaller --onefile main.py displayName: '用 PyInstaller 打包生成 EXE' # 4. 将 EXE 上传至 OneDrive - task: PowerShell@2 inputs: targetType: 'inline' script: | # 从流水线秘密变量中读取配置 $clientId = "$(OneDriveClientId)" $clientSecret = "$(OneDriveClientSecret)" $tenantId = "$(OneDriveTenantId)" $userUPN = "$(OneDriveUserUPN)" # 目标 OneDrive 所属用户的邮箱(UPN) $oneDriveFolderPath = "/Documents/MyAppBuilds" # OneDrive 中的目标文件夹路径 $filePath = "$(Build.SourcesDirectory)/dist/main.exe" # 生成的 EXE 文件路径 $fileName = "main.exe" # 获取 Microsoft Graph API 访问令牌 $tokenBody = @{ Grant_Type = "client_credentials" Scope = "https://graph.microsoft.com/.default" Client_Id = $clientId Client_Secret = $clientSecret } $tokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" -Method POST -Body $tokenBody $accessToken = $tokenResponse.access_token # 遍历创建/查找 OneDrive 目标文件夹 $folderPathSegments = $oneDriveFolderPath.Trim('/') -split '/' $currentFolderId = "root" foreach ($segment in $folderPathSegments) { $folderResponse = Invoke-RestMethod -Uri "https://graph.microsoft.com/v1.0/users/$userUPN/drive/items/$currentFolderId/children?`$filter=name eq '$segment' and folder ne null" -Headers @{Authorization = "Bearer $accessToken"} -Method GET if ($folderResponse.value.Count -eq 0) { # 文件夹不存在则创建 $newFolderBody = @{ name = $segment folder = @{} "@microsoft.graph.conflictBehavior" = "rename" } | ConvertTo-Json $folderResponse = Invoke-RestMethod -Uri "https://graph.microsoft.com/v1.0/users/$userUPN/drive/items/$currentFolderId/children" -Headers @{Authorization = "Bearer $accessToken"; "Content-Type" = "application/json"} -Method POST -Body $newFolderBody $currentFolderId = $folderResponse.id } else { $currentFolderId = $folderResponse.value[0].id } } # 上传文件到 OneDrive $uploadUri = "https://graph.microsoft.com/v1.0/users/$userUPN/drive/items/$currentFolderId:/$fileName:/content" Invoke-RestMethod -Uri $uploadUri -Headers @{Authorization = "Bearer $accessToken"} -Method PUT -InFile $filePath -ContentType "application/octet-stream" Write-Host "成功将 $fileName 上传至 OneDrive 文件夹: $oneDriveFolderPath" displayName: '上传 EXE 到 OneDrive' env: OneDriveClientId: $(OneDriveClientId) OneDriveClientSecret: $(OneDriveClientSecret) OneDriveTenantId: $(OneDriveTenantId) OneDriveUserUPN: $(OneDriveUserUPN)
前置准备步骤
1. 创建 Azure AD 应用注册
- 登录 Azure 门户,进入「Azure Active Directory」→「应用注册」→「新注册」
- 填写应用名称,选择「仅此组织目录中的帐户」,完成注册
- 进入「证书和密码」→「新客户端密码」,生成并保存密码值(后续作为流水线变量)
- 进入「API 权限」→「添加权限」→「Microsoft Graph」→「应用程序权限」→ 找到「Files.ReadWrite.All」权限并添加,最后点击「为租户授予管理员同意」
2. 收集必要配置值
- Client ID:应用注册概览页中的「应用程序(客户端) ID」
- Client Secret:刚才生成的客户端密码值
- Tenant ID:应用注册概览页中的「目录(租户) ID」
- User UPN:目标 OneDrive 所属用户的邮箱地址(例如:xxx@yourdomain.com)
3. 配置流水线秘密变量
- 打开你的 Azure Pipeline,进入「编辑」→「变量」→「新建变量」
- 分别创建四个秘密变量:
OneDriveClientId、OneDriveClientSecret、OneDriveTenantId、OneDriveUserUPN,并填入对应的值,勾选「将此值保密」
使用说明
- 将上述 YAML 保存为
azure-pipelines.yml并推送到你的 Azure Repos 仓库 - 流水线会在你推送代码到指定分支时自动触发,完成 EXE 构建和 OneDrive 上传
- 若需要修改 Python 版本或 OneDrive 目标文件夹,直接调整 YAML 中的对应参数即可
内容的提问来源于stack exchange,提问作者houba
相关产品推荐
相关产品推荐

