azure-devops - Azure Devops Pipeline 中的作业完成后如何保留安全文件?
问题描述
目前我正在为 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 托管代理并将管道分隔为几个作业时,如果您将安全文件复制到一个作业中,第二个作业当然不会在新代理中运行没有文件。
您可以使用自托管代理解决您的问题(然后将文件复制到您的机器上,第二个作业在同一台机器上运行)。
或者您可以将文件上传到其他地方(安全),您可以在第二份工作中下载它(所以为什么不从一开始就这样做......)。
推荐阅读
- node.js - 我不小心删除了我(usr/)家中的目录 .npm,我该怎么办
- git - 我可以删除 git 中的还原吗?
- r - dygraph 同步十字准线
- c++ - 代码一起询问所有测试用例的输入,而不是一个一个地为每个测试用例提供输出
- php - php - 如何将 unicode 转换为 utf-8 字符串
- angular - 使用 Apache Webserver 代理 Angular 和 Apache Sling 服务器
- django - 从 Fullname 字段生成用户名并添加 8 个字符字符串
- firebase - 访问 API 并从预定函数写入 Cloud Firebase
- excel - Excel公式返回第一个静态字符和两个可能的第二个字符之一之间的字符串?
- java - 选择银行账户并使用菜单使用该账户