我正在从经典构建系统(Azure Devops 中的任务定义)迁移到 yaml 构建定义,并在以下错误中运行。我能够在执行 PowerShell 脚本时分解错误,并发现 yaml 文件中的语法问题。
我使用 PowerShell 内联步骤,如下所示:
name: 1.1$(Rev:.r)
jobs:
- job: build
steps:
- task: PowerShell@2
displayName: 'Test'
inputs:
targetType: 'inline'
script: '$var1 = "valueVar1"
$var2 = "valueVar2"'
Run Code Online (Sandbox Code Playgroud)
当我运行命令时,我在 Azure Devops 中收到以下错误。
2019-12-07T18:39:15.3306239Z At D:\A\01\_temp\298966df-c117-432b-b4c1-17b4ece9d7f4.ps1:2 char:21
2019-12-07T18:39:15.3306715Z + $var1 = "var1Value" $var2 = "var2Value"
2019-12-07T18:39:15.3306784Z + ~~~~~
2019-12-07T18:39:15.3306847Z Unexpected token '$var2' in expression or statement.
2019-12-07T18:39:15.3307001Z + CategoryInfo : ParserError: (:) [], ParseException
2019-12-07T18:39:15.3307719Z + FullyQualifiedErrorId : UnexpectedToken
2019-12-07T18:39:15.3308055Z
2019-12-07T18:39:15.4085556Z ##[error]PowerShell exited with code …Run Code Online (Sandbox Code Playgroud) 我有一个 yml 管道,它是由合并到我们的开发分支触发的。这使用 PowerShell 脚本来检查合并中发生的更改,并创建应构建和部署的服务列表。在 PowerShell 中,我添加了名为 的手动触发器变量BuildQueueManual。我的问题不在于 yml 代码本身,而在于管道。
在 yml 中,我将此值添加为全局变量:
variables:
BuildQueueManual:
resources:
- repo: self
pool:
name: Windows
stages:
- stage: Prerequisites
jobs:
- job: GetBuildQueue
steps:
Run Code Online (Sandbox Code Playgroud)
但是,当我运行管道时,该变量不会出现。从下面的截图中可以看出,它没有定义变量:
我的目标是
\n\n我已完成第 1 步,但我似乎找不到从 API 调用中提取的文件。\n这是获取邮递员脚本的 API 调用的日志:
\n\n2020-02-11T13:54:34.8779080Z attempting to call Postman API for environment..\n2020-02-11T13:54:34.8781038Z file /home/vsts/work/1/a/postman\\EA.API.pipeline.json Saved!\nRun Code Online (Sandbox Code Playgroud)\n\n这是测试阶段运行邮递员脚本步骤的结果(我尝试访问pilot.environment和EA.API.pipeline.json):
\n\nerror: ENOENT: no such file or directory, open \'/home/vsts/work/1/a/postman/environments/pilot.environment.json\'\nRun Code Online (Sandbox Code Playgroud)\n\n现在我考虑的一个选项是在阶段之间擦除这些目录。我在构建阶段获取脚本,并尝试在测试阶段运行它们。这就是为什么在提取脚本后,我确保它们实际上在存储中,然后我尝试将它们作为工件发布:
\n\n========================== Starting Command Output ===========================\n/bin/bash --noprofile --norc /home/vsts/work/_temp/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx.sh\n/home/vsts/work/1/a\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 postman\\\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 postman\\EA.API.pipeline.json\nRun Code Online (Sandbox Code Playgroud)\n\n但在同一构建阶段的下一步中,我尝试将这些测试作为工件发布,并收到此错误:
\n\n##[error]Path does not exist: /home/vsts/work/1/a/postman/EA.API.pipeline.json\nRun Code Online (Sandbox Code Playgroud)\n\n这是 yaml:
\n\n - task: OneLuckiDev.getPostmanJSON.vsts-release-web-test.oneLuckiGetPostmanScripts@1\n displayName: \'Get Postman Script\'\n inputs:\n fileLocation: \'$(build.artifactstagingdirectory)/postman\'\n apiKey: \'$(PostmanAPIKey)\'\n - script: \'sudo apt-get …Run Code Online (Sandbox Code Playgroud) 我的 Azure 管道的 YAML 文件中有以下代码:
steps:
- bash: |
echo $(date +%Y)
echo "##vso[task.setvariable variable=buildName]$(date +%Y)_$(date +%m)_$(Build.BuildNumber)_v3.7"
echo $BUILDNAME
Run Code Online (Sandbox Code Playgroud)
第一个echo打印正确2020,但第三个打印正确$(date +%Y)_$(date +%m)_4728573844_v3.7。正如您所看到的,这里的年份和月份没有转换为值。为什么?
我们最近将 Azure DevOps 组织从免费托管代理产品切换为两个付费托管代理。添加第二个托管代理后,它会自动命名为“Azure Pipelines 2”,这是一个足够好的名称。问题是原始代理似乎被命名为“托管代理”,我一生都找不到重命名它的方法。如果可以将其重命名为“Azure Pipelines 1”,那就太好了。是否可以重命名托管代理?如果是这样,如何执行此操作,因为我在“组织设置”中的“代理池”选项中查看过,但没有看到任何方法可以执行此操作。
是否有一个选项可以设置自定义条件来测试上一个任务是否失败或超时?
目前,我正在使用Only when a previous task has failed当任务失败时有效的方法。如果任务超时,则不会将其视为错误并会跳过。
那么我需要一个自定义条件,例如or(failed(), timedout()). 是否可以?
语境
我们的任务遇到了这个间歇性问题npm install,我们无法找到原因,但它在下一次作业运行时得到解决,因此我们正在寻找重试功能。部分解决方案是复制npm install并使用控制选项,但它不适用于所有“失败”情况。@Levi Lu-MSFT 提供的解决方案似乎可以满足我们所有的需求(它会重试),但遗憾的是它没有解决问题,第二行重复任务也失败了。
错误示例:
20741 error stack: 'Error: EPERM: operation not permitted, unlink \'C:\\agent2\\_work\\4\\s\\node_modules\\.staging\\typescript-4440ace9\\lib\\tsc.js\'',
20741 error errno: -4048,
20741 error code: 'EPERM',
20741 error syscall: 'unlink',
20741 error path: 'C:\\agent2\\_work\\4\\s\\node_modules\\.staging\\typescript-4440ace9\\lib\\tsc.js',
20741 error parent: 's' }
20742 error The operation was rejected by your operating system.
20742 error It's possible that the file was already in use (by a …Run Code Online (Sandbox Code Playgroud) azure-devops azure-pipelines azure-pipelines-tasks azure-pipelines-yaml
我已经为 .NET Framework 项目创建了一个构建管道。当管道由拉取请求触发时,我在任务中遇到以下错误:“NuGet 恢复”
##[错误]nuget 命令失败,退出代码(1) 和错误(解析解决方案文件时出错
d:\a\1\s\***.sln:调用目标已引发异常。无法加载项目文件。无法加载文件或程序集Microsoft.Build.Framework, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a或其依赖项之一。系统找不到指定的文件。d:\a\1\s\***.sln)##[error]包恢复失败
当我尝试在与目标分支合并后在本地计算机上编译解决方案时,没有任何冲突或错误。
这是我的 YML 文件:
pool:
name: Hosted Windows 2019 with VS2019
demands:
- msbuild
- visualstudio
- vstest
steps:
- task: NuGetToolInstaller@0
displayName: 'Use NuGet 4.4.1'
inputs:
versionSpec: 4.4.1
- task: NuGetCommand@2 # --> This task fails.
displayName: 'NuGet restore'
inputs:
restoreSolution: '***.sln'
- task: VSBuild@1
displayName: 'Build solution'
inputs:
solution: '***.sln'
platform: 'any cpu'
configuration: 'release'
- task: PublishSymbols@2
displayName: 'Publish …Run Code Online (Sandbox Code Playgroud) 我正在使用 Azure DevOps 管道来部署我的代码,现在我需要将变量值从部署作业传递到依赖于它的后续作业。我已经阅读了这个例子,但它似乎根本不起作用。
我想做的是运行一个配置 Key Vault 的 Azure ARM 部署。密钥保管库的名称是从 ARM 部署作业输出的,然后我尝试将该名称传递给另一个需要添加特定机密的作业。访问控制已得到处理,但我仍然需要传递名称。
我已将问题归结为将变量从 a 传递deployment到 a的基础知识job。这是我完整的测试管道(几乎完全从这里复制):
trigger: none
stages:
- stage: X
jobs:
- deployment: A
pool:
vmImage: "ubuntu-16.04"
environment: test
strategy:
runOnce:
deploy:
steps:
- script: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the deployment variable value"
name: setvarStep
- script: echo $(setvarStep.myOutputVar)
name: echovar
- job: B
dependsOn: A
pool:
vmImage: "ubuntu-16.04"
variables:
myVarFromDeploymentJob: $[ dependencies.A.outputs['deploy.setvarStep.myOutputVar'] ]
steps:
- script: "echo $(myVarFromDeploymentJob)" …Run Code Online (Sandbox Code Playgroud) 我一直在使用 Azure DevOps 发布定义并从一些 C# 代码触发它:
var releaseClient = VssConnection.GetClient<ReleaseHttpClient>();
return await releaseClient.CreateReleaseAsync(
_releaseDefinitionId,
$"Release run for {build.BuildNumber}",
build.Definition.Name,
build.Id,
new Dictionary<string, string> {
{ "InputVariable1", _value1 },
{ "InputVariable2", _value2 },
{ "DatabaseConnectionString", "xxxxxxx" }
});
Run Code Online (Sandbox Code Playgroud)
我现在已将该发布定义转换为纯 YAML 管道 - 有什么方法可以从 C# 触发该管道的运行吗?
谢谢!
azure-pipelines ×10
azure-devops ×8
yaml ×4
.net ×1
azure ×1
bash ×1
build ×1
c# ×1
echo ×1
nuget ×1
powershell ×1
variables ×1