azure-devops - Azure Devops Pipeline 中的作业完成后如何保护文件的安全?

标签 azure-devops yaml azure-pipelines

目前我正在为 Azure Devops 开发管道脚本。我想提供一个 Maven 设置文件作为管道的安全文件。问题是,当我定义一个仅用于提供文件的作业时,当下一个作业开始时,该文件不再存在。

我尝试使用 DownloadSecureFile 任务和复制命令定义作业以获取设置文件。但是,当下一个作业开始时,该文件不再存在,因此无法使用。 我已经通过在管道中使用 pwd 和 ls 进行了检查。

这是我当前 YAML 文件的一部分(实际上有效):

some variables
...

trigger:
  branches:
    include:
    - stable
    - master

jobs:
- job: Latest_Release
  condition: eq(variables['Build.SourceBranchName'], 'master')
  steps:
  - task: DownloadSecureFile@1
    name: settingsxml
    displayName: Download maven settings xml
    inputs:
      secureFile: settings.xml
  - script: |
      cp $(settingsxml.secureFilePath) ./settings.xml
      docker login -u $(AzureRegistryUser) -p $(AzureRegistryPassword) $(AzureRegistryUrl)
      docker build -t $(AzureRegistryUrl)/$(projectName):$(projectVersionNumber-Latest) .
      docker push $(AzureRegistryUrl)/$(projectName):$(projectVersionNumber-Latest)

....
other jobs

我想将 DownloadSecureFile 任务和“cp $(settingsxml.secureFilePath) ./settings.xml”放入自己的作业中,因为有更多作业需要此文件用于其他分支/版本,而我不希望将完全相同的代码复制到所有作业。

这是我想要的 YAML 文件:

some variables
...

trigger:
  branches:
    include:
    - stable
    - master

jobs:
- job: provide_maven_settings
  # no condition because all branches need the file
  - task: DownloadSecureFile@1
    name: settingsxml
    displayName: Download maven settings xml
    inputs:
      secureFile: settings.xml
  - script: |
      cp $(settingsxml.secureFilePath) ./settings.xml
- job: Latest_Release
  condition: eq(variables['Build.SourceBranchName'], 'master')
  steps:
  - script: |
      docker login -u $(AzureRegistryUser) -p $(AzureRegistryPassword) $(AzureRegistryUrl)
      docker build -t $(AzureRegistryUrl)/$(projectName):$(projectVersionNumber-Latest) .
      docker push $(AzureRegistryUrl)/$(projectName):$(projectVersionNumber-Latest)

....
other jobs

在我的 dockerfile 中,设置文件的使用方式如下:

FROM maven:3.6.1-jdk-8-alpine AS MAVEN_TOOL_CHAIN 
COPY pom.xml /tmp/
COPY src /tmp/src/
COPY settings.xml /root/.m2/ # can't find file when executing this
WORKDIR /tmp/
RUN mvn install

...

当 docker build 启动时,会发生错误,因为它找不到设置文件。不过,当我使用第一个 YAML 示例时,它可以。我有一种感觉,这与每项工作都有“结帐”阶段有关,但我对此不确定。

最佳答案

Azure DevOps 中的每个作业都在不同代理上运行,因此当您使用 Microsoft 托管代理并将管道分隔为几个作业时,如果您在一个作业中复制安全文件,则第二个作业在新的代理中运行,当然没有该文件。

您可以使用自托管代理解决您的问题(然后将文件复制到您的计算机,并在同一计算机上运行第二个作业)。

或者您可以将文件上传到其他地方(安全),以便您可以在第二个作业中下载它(所以为什么不从一开始就这样做......)。

关于azure-devops - Azure Devops Pipeline 中的作业完成后如何保护文件的安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56985621/

相关文章:

.net - 如何使用 "dotnet"工具构建 .sqlproj 项目?

azure - 当 Azure DevOps 管道模板驻留在独立存储库中时,是否可以引用这些模板内的文件?

git - Azure 管道子模块克隆失败

azure - 如何将参数值与Azure yaml管道中的字符串进行比较

git - 支持在 Azure DevOps 中签名标签和验证签名

azure - 如何使用 Powershell 删除 Azure DevOps 旧构建管道及其租约

Azure DevOps PDF 导出插件建议

go - 带有可选 bool 值的未命名字符串的 YAML 列表

azure-devops - Azure DevOps yaml管道-将变量从一个作业输出到另一个作业

Azure Devops Pipeline ACR 部署到 Web 应用容器