在Azure Devops Pipeline中完成工作后如何保存安全文件?

时间:2019-07-11 09:10:28

标签: 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示例时,它可以。我觉得这与每个工作都处于“结帐”阶段有关,但是我不确定。

1 个答案:

答案 0 :(得分:1)

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

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

或者您可以将文件上传到其他位置(受保护的),以便在第二份作业中下载该文件(因此,为什么不从头开始...)。