如何通过Azure CI/CD流水线将Library安全文件随构建产物同步部署
实现方案正确性判断
你当前的实现方式完全正确,是符合Azure DevOps安全文件使用规范的最优方案之一,完全可以满足你提到的所有需求。
用到的核心任务说明
你选择的几个任务刚好匹配需求:
DownloadSecureFile@1:Azure DevOps官方提供的专用任务,就是用来拉取存储在Library模块的安全文件的,这类文件会加密存储,下载到代理节点的临时目录,流水线运行结束后会自动清理,不会泄露敏感信息,刚好满足你从Library拉取安全文件的要求。- PowerShell拷贝任务:你选择在部署前把安全文件拷贝到
Release构建产物目录、同时完成密钥重命名的时机非常合理,直接把安全文件变成构建产物的一部分,后续部署任务会和原有产物一起同步到所有环境,完美解决了之前新构建产物覆盖导致需要手动重传安全文件的问题。 AzureRmWebAppDeployment@4:你配置的部署目录是整个Release文件夹,已经把新增的安全文件包含在内,同时你开启了RemoveAdditionalFilesFlag: true也不会影响,因为安全文件在部署前已经放到了待部署目录里,不会被判定为多余文件删除。
可优化的细节(可选调整)
你当前的YAML有一个小问题可以调整:
每个任务前不需要重复写steps字段,整个阶段的所有任务只需要用一个steps块包裹即可,重复写steps可能会导致流水线解析报错,调整后的结构参考如下:
steps: - task: qetza.replacetokens.replacetokens-task.replacetokens@4 displayName: 'Replace tokens in **/Web.config' inputs: rootDirectory: '$(System.DefaultWorkingDirectory)/Build Artifact/Release' targetFiles: '**/Web.config' tokenPattern: custom tokenPrefix: '<mailSettings>' tokenSuffix: '</mailSettings>' - task: DownloadSecureFile@1 displayName: GoogleServiceAccountKey inputs: secureFile: GoogleServiceAccountKey.json retryCount: 2 - task: DownloadSecureFile@1 displayName: DocuSignPrivateKey inputs: secureFile: 'Test-DocuSign-private.key' retryCount: 2 - powershell: | # 提前创建目录避免路径不存在报错 New-Item -ItemType Directory -Path "$(System.DefaultWorkingDirectory)/Build Artifact/Release" -Force # 拷贝Google服务账号密钥 Copy-Item -Path "$(GoogleServiceAccountKey.secureFilePath)" -Destination "$(System.DefaultWorkingDirectory)/Build Artifact/Release/GoogleServiceAccountKey.json" -Force # 拷贝并重命名DocuSign密钥 Copy-Item -Path "$(DocuSignPrivateKey.secureFilePath)" -Destination "$(System.DefaultWorkingDirectory)/Build Artifact/Release/private.key" -Force displayName: 'Copy Secure Files to Release Artifact' - task: AzureRmWebAppDeployment@4 displayName: 'Azure App Service Deploy: ee-dev' inputs: azureSubscription: 'Azure Dev Service Connection' WebAppName: 'ee-dev' packageForLinux: '$(System.DefaultWorkingDirectory)/Build Artifact/Release' enableCustomDeployment: true RemoveAdditionalFilesFlag: true AdditionalArguments: '-skip:objectName=filePath,absolutePath="Web.Dev.config|Web.Test.config|Web.Prod.config|Web.Sandbox.config|Web.Beta.config|\\*.zip" -retryAttempts:6 -retryInterval:10000' enableXmlTransform: true
另外可以在Copy-Item后加-Force参数,避免偶尔出现的文件覆盖权限报错。
内容的提问来源于stack exchange,提问作者Cataster
相关产品推荐
相关产品推荐

