Azure 管道、关于变量、powershell 和部署的问题
Azure pipelines, question about variables, powershell and deployments
我正在构建 Azure Pipelines,用于从我们的 Windows 自托管代理部署 Intranet、dotnet 核心项目。
我收到团队的请求,如果 PowerShell 脚本将变量初始化为某个值,下一步应该包括特定环境。
我们的目标是,对于某些项目,我们比较来自代理和 DEV 服务器的文件,如果不同,我们请求批准。
我试图使它与全局变量一起工作,但对不同的语法感到困惑。
这是我拥有的:
YAML
variables:
- name: MYVAR
value: '0'
stages:
- stage: Init
jobs:
- job: DisplayBefore
steps:
- checkout: none
- task: CmdLine@2
inputs:
script: |
echo Varname before :
echo $(MYVAR)
===> 显示:0
- stage: RunScript
dependsOn: Init
jobs:
- job: CallScript
steps:
- checkout: none
- task: PowerShell@2
name: SetVarname
inputs:
targetType: filePath
filePath: '{agent}\compareFileContent.ps1'
- job: DisplayInSameStage
dependsOn: CallScript
steps:
- checkout: none
- task: CmdLine@2
inputs:
script: |
echo Varname after :
echo ${{ variables.MYVAR }}
===> 显示:0
echo $(MYVAR)
===> 显示:0
- stage: DeploymentStage
dependsOn: RunScript
condition: eq(variables.MYVAR, '1')
jobs:
- deployment: DeploymentJob
environment: 'ATest'
strategy:
runOnce:
deploy:
steps:
- checkout: none
- task: CmdLine@2
inputs:
script: |
echo Varname after :
echo ${{ variables.MYVAR }}
{agent}\compareFileContent.ps1
[CmdletBinding()]
param ()
echo $env:MYVAR
===> Displays: 0
$env:MYVAR = 2
echo $env:MYVAR
===> Displays: 2
echo "##vso[task.setvariable variable=env:MYVAR;]3"
exit
我的计划是为相反的情况准备另一个阶段,也许您会看到更好的方法或指导来解决我所缺少的?谢谢!!!
*********** 更新 1
我使用了环境变量,因为我知道这是从脚本访问它们的方式,如果有其他方式,我很乐意知道!
我使用阶段是因为我需要使用环境,它们似乎需要自己的阶段和部署块,否则在评估条件之前测试环境。
这是我的最新测试:
variables:
- name: MYVAR
value: '0'
stages:
- stage: SingleStage
jobs:
- job: DisplayBefore
steps:
- checkout: none
- task: CmdLine@2
inputs:
script: |
echo $(MYVAR)
- job: CallScript
dependsOn: DisplayBefore
steps:
- checkout: none
- task: PowerShell@2
name: SetVarname
inputs:
targetType: filePath
filePath: '..\compareFileContent.ps1'
- deployment: DeploymentJob
dependsOn: DisplayInSameStage
condition: eq(variables.MYVAR, '1')
environment: 'ATest'
strategy:
runOnce:
deploy:
steps:
- checkout: none
- task: CmdLine@2
inputs:
script: |
echo EnvName Finally: $(EnvName)
这个 YAML 并没有做太多事情,因为它一开始就请求环境的批准。
我的方案要求仅根据在 PowerShell 脚本中计算的值触发此批准。
有什么想法吗?谢谢。
作业和阶段通常 run on different agents 因此您不能期望来自不同作业的环境变量保持其值。
如果您想使用全局变量,您可以在一个作业中包含多个步骤。否则,为了保持一些逻辑 job/stage 结构,您可以只写入和读取值 to/from 外部源。这取决于您的场景。
我正在构建 Azure Pipelines,用于从我们的 Windows 自托管代理部署 Intranet、dotnet 核心项目。
我收到团队的请求,如果 PowerShell 脚本将变量初始化为某个值,下一步应该包括特定环境。
我们的目标是,对于某些项目,我们比较来自代理和 DEV 服务器的文件,如果不同,我们请求批准。
我试图使它与全局变量一起工作,但对不同的语法感到困惑。
这是我拥有的:
YAML
variables:
- name: MYVAR
value: '0'
stages:
- stage: Init
jobs:
- job: DisplayBefore
steps:
- checkout: none
- task: CmdLine@2
inputs:
script: |
echo Varname before :
echo $(MYVAR)
===> 显示:0
- stage: RunScript
dependsOn: Init
jobs:
- job: CallScript
steps:
- checkout: none
- task: PowerShell@2
name: SetVarname
inputs:
targetType: filePath
filePath: '{agent}\compareFileContent.ps1'
- job: DisplayInSameStage
dependsOn: CallScript
steps:
- checkout: none
- task: CmdLine@2
inputs:
script: |
echo Varname after :
echo ${{ variables.MYVAR }}
===> 显示:0
echo $(MYVAR)
===> 显示:0
- stage: DeploymentStage
dependsOn: RunScript
condition: eq(variables.MYVAR, '1')
jobs:
- deployment: DeploymentJob
environment: 'ATest'
strategy:
runOnce:
deploy:
steps:
- checkout: none
- task: CmdLine@2
inputs:
script: |
echo Varname after :
echo ${{ variables.MYVAR }}
{agent}\compareFileContent.ps1
[CmdletBinding()]
param ()
echo $env:MYVAR
===> Displays: 0
$env:MYVAR = 2
echo $env:MYVAR
===> Displays: 2
echo "##vso[task.setvariable variable=env:MYVAR;]3"
exit
我的计划是为相反的情况准备另一个阶段,也许您会看到更好的方法或指导来解决我所缺少的?谢谢!!!
*********** 更新 1
我使用了环境变量,因为我知道这是从脚本访问它们的方式,如果有其他方式,我很乐意知道!
我使用阶段是因为我需要使用环境,它们似乎需要自己的阶段和部署块,否则在评估条件之前测试环境。
这是我的最新测试:
variables:
- name: MYVAR
value: '0'
stages:
- stage: SingleStage
jobs:
- job: DisplayBefore
steps:
- checkout: none
- task: CmdLine@2
inputs:
script: |
echo $(MYVAR)
- job: CallScript
dependsOn: DisplayBefore
steps:
- checkout: none
- task: PowerShell@2
name: SetVarname
inputs:
targetType: filePath
filePath: '..\compareFileContent.ps1'
- deployment: DeploymentJob
dependsOn: DisplayInSameStage
condition: eq(variables.MYVAR, '1')
environment: 'ATest'
strategy:
runOnce:
deploy:
steps:
- checkout: none
- task: CmdLine@2
inputs:
script: |
echo EnvName Finally: $(EnvName)
这个 YAML 并没有做太多事情,因为它一开始就请求环境的批准。
我的方案要求仅根据在 PowerShell 脚本中计算的值触发此批准。
有什么想法吗?谢谢。
作业和阶段通常 run on different agents 因此您不能期望来自不同作业的环境变量保持其值。
如果您想使用全局变量,您可以在一个作业中包含多个步骤。否则,为了保持一些逻辑 job/stage 结构,您可以只写入和读取值 to/from 外部源。这取决于您的场景。