programing

애저 데브옵스 파이프라인에서 사용자 환경 변수를 설정하고 읽는 방법은 무엇입니까?

bestprogram 2023. 5. 7. 12:04

애저 데브옵스 파이프라인에서 사용자 환경 변수를 설정하고 읽는 방법은 무엇입니까?

로컬 컴퓨터에 저장된 환경 변수에서 다음과 같은 값을 읽는 테스트 자동화 코드가 있습니다.

Environment.GetEnvironmentVariable("SAUCE_USERNAME", EnvironmentVariableTarget.User);

파이프라인 실행 중에 Azure Pipeline을 사용하여 이 변수를 생성한 다음 테스트 자동화 코드에서 읽으려고 합니다.YAML 파일 사용.

Azure Pipeline의 VS Test 단계에서 이 변수를 읽고 있습니다.제가 변수를 설정한다면, 그것은 애저 파이프라인의 수명을 위한 것이어야 합니다.

저는 여기에 있는 설명서를 사용하려고 했지만 실패했습니다.

아래 코드도 시도했지만 실패하고 다음 오류가 발생합니다.

azure-pipelines.yml(라인: 39, 콜: 1, Idx: 1252) - (라인: 39, 콜: 1, Idx: 1252):단순 키를 검색하는 동안 필요한 ':'을(를) 찾을 수 없습니다.

# Create a secret variable
- powershell: |
Write-Host '##vso[task.setvariable variable=sauce.userName;issecret=true]abc'

# Attempt to output the value in various ways
- powershell: |
# Using an input-macro:
Write-Host "This works: $(sauce.userName)"

# Using the env var directly:
Write-Host "This does not work: $env:SAUCE_USERNAME"

# Using the mapped env var:
Write-Host "This works: $env:SAUCE_USERNAME"
env:
SAUCE_USERNAME: $(sauce.userName)

가장 쉬운 방법은 다음과 같이 Azure DevOps(ADO) EnvVariable 값을 키에 전달하는 것입니다.

- task: DotNetCoreCLI@2
  displayName: 'Run tests'
  env:
    SAUCE_USERNAME: $(sauceUsername) #this will store the value from 'sauceUsername' into SAUCE_USERNAME
    SAUCE_ACCESS_KEY: $(sauceKey)

값을 표시하거나 사용하는 것은 시도할 때 작동합니다.

- bash: echo $(SAUCE_USERNAME) # will output our username stored in SAUCE_USERNAME env variable

그리고 만약 당신이 언급하고 있다면.SAUCE_USERNAME코드에서 코드는 Azure 서버에서 값을 픽업합니다.

이 기사는 설명이 잘 되어 있습니다.

이전에도 Powershell을 사용했지만 이 방법이 더 많이 사용되고 복잡합니다.

  1. Azure DevOps 파이프라인에서 변수를 만들고 해당 변수에 값을 제공합니다.
  2. 처음에 실행하여 환경 변수를 설정할 Powershell 스크립트를 만듭니다.이것이 제 포쉬의 모습입니다.
  3. 처음에 이 Posh를 CI 파이프라인의 별도 단계로 실행하면 파이프라인을 실행하는 데 사용되는 VM의 환경 변수가 설정됩니다.

이것은 당신에게 도움이 될 수 있는 또 다른 상세한 기사입니다.

요청에 따라 이를 가능하게 하는 PowerShell 코드도 첨부합니다.

Param(
[string]$sauceUserName,
[string]$sauceAccessKey,
[string]$sauceHeadlessUserName,
[string]$sauceHeadlessAccessKey
)
Write-Output "sauce.userName that was passed in from Azure DevOps=>$sauceUserName"
Write-Output "sauce.accessKey that was passed in from Azure DevOps=>$sauceAccessKey"
Write-Output "sauce.headless.userName that was passed in from Azure DevOps=>$sauceHeadlessUserName"
Write-Output "sauce.headless.access.key that was passed in from Azure DevOps=>$sauceHeadlessAccessKey"

[Environment]::SetEnvironmentVariable("SAUCE_USERNAME", "$sauceUserName", "User")
[Environment]::SetEnvironmentVariable("SAUCE_ACCESS_KEY", "$sauceAccessKey", "User")
[Environment]::SetEnvironmentVariable("SAUCE_HEADLESS_USERNAME", "$sauceUserName", "User")
[Environment]::SetEnvironmentVariable("SAUCE_HEADLESS_ACCESS_KEY", "$sauceAccessKey", "User")

위의 답변에서 제안한 바와 같이 다음 구문을 모두 사용하려고 했지만, 빌드 중이나 테스트 실행 중과 같이 파이프라인에서 더 아래 작업에 사용하려고 할 때 환경 변수가 항상 비어 있었습니다.

[Environment]::SetEnvironmentVariable("SAUCE_USERNAME", "$(sauceUserName)", "User")

variables:
  sauceUserName: '$(sauceUserName)'

인라인 PowerShell 스크립트 작업에서 Azure DevOps 변수를 작성하는 데 구문을 사용했습니다.

- task: PowerShell@2
  displayName: Add the username as an environment variable so the tests can find it.
  inputs:
    targetType: 'inline'
    script: |
      Write-Host "Making the sauceUsername available as an environment variable."
      Write-Host "##vso[task.setvariable variable=SAUCE_USERNAME;]$(sauceUserName)"

그런 다음 빌드 작업에서 환경 변수를 찾을 수 있었고, 파이프라인 아래에 있는 PowerShell 스크립트 작업에서도 다음과 같은 코드로 액세스할 수 있었습니다.

- task: PowerShell@2
  displayName: Display the environment variable value for debugging purposes.
  inputs:
    targetType: 'inline'
    script: |
      [string] $username= $Env:SAUCE_USERNAME
      Write-Host "The SAUCE_USERNAME environment variable value is '$username'."

파이프라인 변수를 설정한 다음 yaml 파일에서 다음 매핑을 시도합니다.

# ASP.NET Core (.NET Framework)
# Build and test ASP.NET Core projects targeting the full .NET Framework.
# Add steps that publish symbols, save build artifacts, and more:
# https://learn.microsoft.com/azure/devops/pipelines/languages/dotnet-core

pool:
  vmImage: 'VS2017-Win2016'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
  yourEnvVar: '$(yourPipelineVariable)'
  yourOtherEnvVar: '$(yourOtherPipelineVariable)'

우리는 이것이 환경 변수를 설정할 수 없기 때문이라고 생각하고 몇 시간 동안 싸웠지만 결국 그것과는 아무런 상관이 없었습니다.

다음은 Azure DevOps를 위해 이 문제를 해결하기 위한 몇 가지 참고 사항입니다.

  • 파이프라인 변수는 환경 변수이며 공정의 첫 번째 단계에서 파이프라인에 주입됩니다.이를 확인하려면 의 로그를 참조하십시오.Initialize job모든 환경 변수를 나열하는 작업입니다.
  • 파이프라인 변수가 시스템에 있음을 증명하기 위해 파워셸 작업을 추가하고 인라인으로 연결할 수 있습니다.
Write-Host "Pipeline Variable: $(FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD)"
Write-Host "Environment Variable: $Env:FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD"
  • ()파이프라인 변수 주변은 파이프라인 변수를 사용하려는 경우에 매우 중요합니다.$(myVar)

사용자 질문과 무관하지만 2단계 인증(2FA)을 사용하여 AppStore에 업로드하려는 사용자에게 도움이 될 수 있습니다.다음은 당사에서 제공하는 문서입니다.

  • 우리는 설정해야 했습니다.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD그리고.FASTLANE_SESSION2FA를 우회하도록 하기 위해.세션 1에서는 AppStoreConnect에 로그인할 수 있었지만 App별 암호가 업로드에 사용되었습니다.로그는 사용된 세션 변수를 볼 수 없지만 발생하는 힌트를 정렬합니다.

여기서 정의한 대로 비밀 변수는 단계/작업 환경 변수 섹션에서 명시적으로 설정해야 합니다.

YAML 외부에 정의된 변수를 전달하려면 YAML의 변수가 외부 변수보다 우선하므로 YAML의 변수를 정의하지 않는 것이 중요합니다.

변수가 정의되면 $(변수 이름) 구문을 사용하여 인라인 파워셸 스크립트에서 변수를 참조할 수 있지만 변수 이름은 대문자로 표시해야 합니다.

devops 힌트에 따라:스크립트에서 변수를 사용하려면 환경 변수 구문을 사용합니다.. 및 공백을 _로 대체하고 문자를 대문자로 표시한 다음 플랫폼의 구문을 사용하여 환경 변수를 참조합니다.

환경 변수(예: 비밀)를 사용하여 매핑해야 하는 경우 올바른 구문은 다음과 같습니다.

      script: |
          write-host "env $env:myvariable"

      env:
        #not sure if case matters here
        myvariable: $(myvariable)

전체 예:

        - task: PowerShell@2
          inputs:
            targetType: 'inline'
            script: |

              #log the mapped variable, case doesn't matter
              write-host "env $env:myvariable"

              #directly access pipeline variable, CASE MATTERS!
              write-host "pipeline $(MYVARIABLE)"

              #show all environment variables
              get-childitem env:
          env:
            #not sure if case matters here
            myvariable: $(myvariable)

언급URL : https://stackoverflow.com/questions/52432799/how-to-set-and-read-user-environment-variable-in-azure-devops-pipeline