명령 로깅

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

로깅 명령은 태스크 및 스크립트가 에이전트와 통신하는 방법입니다. 새 변수를 만들고, 단계를 실패로 표시하고, 아티팩트를 업로드하는 등의 작업을 다룹니다. 로깅 명령은 파이프라인 문제를 해결할 때 유용합니다.

Important

Azure Pipelines 출력에 표시되지 않도록 비밀을 마스킹하기 위해 노력하지만 여전히 예방 조치를 취해야 합니다. 비밀을 출력으로 에코하지 마세요. 일부 운영 체제는 명령줄 인수를 기록합니다. 명령줄에 비밀을 전달하지 마세요. 대신 비밀을 환경 변수에 매핑하는 것이 좋습니다.

우리는 비밀의 부분 문자열을 마스크하지 않습니다. 예를 들어 "abc123"이 비밀로 설정된 경우 "abc"는 로그에서 마스킹되지 않습니다. 이는 너무 세분화된 수준에서 비밀을 마스킹하여 로그를 읽을 수 없게 만드는 것을 방지하기 위한 것입니다. 이러한 이유로 비밀에는 구조화된 데이터가 포함되어서는 안 됩니다. 예를 들어 "{ "foo": "bar" }"이(가) 비밀로 설정된 경우 "bar"는 로그에서 마스킹되지 않습니다.

Type 명령
작업 명령 AddAttachment, Complete, LogDetail, LogIssue, PrependPath, SetEndpoint, SetProgress, SetVariable, SetSecret, UploadFile, UploadSummary
아티팩트 명령 연결, 업로드
빌드 명령 AddBuildTag, UpdateBuildNumber, UploadLog
릴리스 명령 UpdateReleaseName

로깅 명령 형식

로깅 명령의 일반적인 형식은 다음과 같습니다.

##vso[area.action property1=value;property2=value;...]message

약간 다른 구문을 사용하는 몇 가지 서식 지정 명령도 있습니다.

##[command]message

로깅 명령을 호출하려면 표준 출력을 통해 명령을 에코합니다.

#!/bin/bash
echo "##vso[task.setvariable variable=testvar;]testvalue"

파일 경로는 Windows의 드라이브에 루팅되거나 Linux 및 macOS에서 시작하는 절대 경로로 / 지정되어야 합니다.

참고 항목

Linux 또는 macOS를 set -x 사용할 때는 로깅 명령 전에 명령을 사용할 수 없습니다. Bash에 대해 일시적으로 사용하지 않도록 설정하는 set -x 방법을 알아보려면 문제 해결을 참조하세요.

서식 명령

참고 항목

로깅 명령에 UTF-8 인코딩을 사용합니다.

이러한 명령은 Azure Pipelines의 로그 포맷터에 대한 메시지입니다. 특정 로그 줄을 오류, 경고, 축소 가능한 섹션 등으로 표시합니다.

서식 지정 명령은 다음과 같습니다.

##[group]Beginning of a group
##[warning]Warning message
##[error]Error message
##[section]Start of a section
##[debug]Debug text
##[command]Command-line being run
##[endgroup]

bash 또는 PowerShell 작업에서 서식 지정 명령을 사용할 수 있습니다.

steps:
- bash: |
    echo "##[group]Beginning of a group"
    echo "##[warning]Warning message"
    echo "##[error]Error message"
    echo "##[section]Start of a section"
    echo "##[debug]Debug text"
    echo "##[command]Command-line being run"
    echo "##[endgroup]"

이러한 명령은 다음과 같이 로그에 렌더링됩니다.

사용자 지정 서식 옵션이 있는 로그의 스크린샷

명령 블록도 축소할 수 있으며 다음과 같습니다.

축소된 로그 섹션 스크린샷

작업 명령

LogIssue: 오류 또는 경고 기록

##vso[task.logissue]error/warning message

사용

현재 작업의 타임라인 레코드에 오류 또는 경고 메시지를 기록합니다.

속성

  • type = error 또는 warning (필수)
  • sourcepath = 원본 파일 위치
  • linenumber = 줄 번호
  • columnnumber = 열 번호
  • code = 오류 또는 경고 코드

예: 오류 기록

#!/bin/bash
echo "##vso[task.logissue type=error]Something went very wrong."
exit 1

exit 1 는 선택 사항이지만 오류가 기록된 직후에 실행할 명령인 경우가 많습니다. 제어 옵션: 오류exit 1 발생 시 계속을 선택하면 실패한 빌드 대신 부분적으로 성공적인 빌드가 생성됩니다. 또는 .를 사용할 task.logissue type=error수도 있습니다.

예: 파일의 특정 위치에 대한 경고 기록

#!/bin/bash
echo "##vso[task.logissue type=warning;sourcepath=consoleapp/main.cs;linenumber=1;columnnumber=1;code=100;]Found something that could be a problem."

SetProgress: 완료율 표시

##vso[task.setprogress]current operation

사용

현재 작업에 대한 진행률 및 현재 작업을 설정합니다.

속성

  • value = 완료율

예시

echo "Begin a lengthy process..."
for i in {0..100..10}
do
   sleep 1
   echo "##vso[task.setprogress value=$i;]Sample Progress Indicator"
done
echo "Lengthy process is complete."

모양을 확인하려면 빌드를 저장하고 큐에 대기한 다음 빌드 실행을 확인합니다. 태스크가 이 스크립트를 실행할 때 진행률 표시기가 변경되는 것을 관찰합니다.

완료: 완료 타임라인

##vso[task.complete]current operation

사용

현재 작업에 대한 타임라인 레코드를 완료하고 작업 결과 및 현재 작업을 설정합니다. 결과가 제공되지 않으면 결과를 성공으로 설정합니다.

속성

  • result =
    • Succeeded 작업이 성공했습니다.
    • SucceededWithIssues 작업에 문제가 발생했습니다. 빌드는 부분적으로 정상적으로 완료됩니다.
    • Failed 빌드가 실패로 완료됩니다. (있는 경우 제어 옵션: 오류 발생 시 계속 옵션이 선택되고, 빌드가 부분적으로 정상적으로 완료됩니다.)

예시

작업을 성공으로 기록합니다.

##vso[task.complete result=Succeeded;]DONE

작업을 실패로 설정합니다. 또는 .를 사용할 exit 1수도 있습니다.

- bash: |
    if [ -z "$SOLUTION" ]; then
      echo "##vso[task.logissue type=error;]Missing template parameter \"solution\""
      echo "##vso[task.complete result=Failed;]"
    fi

LogDetail: 작업에 대한 타임라인 레코드 만들기 또는 업데이트

##vso[task.logdetail]current operation

사용

타임라인 레코드를 만들고 업데이트합니다. 이는 주로 Azure Pipelines에서 내부적으로 단계, 작업 및 단계에 대해 보고하는 데 사용됩니다. 고객은 타임라인 항목을 추가할 수 있지만 일반적으로 UI에 표시되지 않습니다.

단계 중에 처음으로 볼 ##vso[task.detail] 때 단계에 대한 "세부 타임라인" 레코드를 만듭니다. 중첩된 타임라인 레코드를 id 만들고 업데이트할 수 있습니다parentid.

태스크 작성자는 각 타임라인 레코드에 사용한 GUID를 기억해야 합니다. 로깅 시스템은 각 타임라인 레코드에 대한 GUID를 추적하므로 새 GUID로 인해 새 타임라인 레코드가 생성됩니다.

속성

  • id = 타임라인 레코드 GUID(필수)
  • parentid= 부모 타임라인 레코드 GUID
  • type = 레코드 형식(처음으로 필요, 덮어쓸 수 없습니다.)
  • name = 레코드 이름(처음으로 필요, 덮어쓸 수 없습니다.)
  • order= 타임라인 레코드의 순서(처음으로 필요, 덮어쓸 수 없습니다).
  • starttime = Datetime
  • finishtime = Datetime
  • progress = 완료율
  • state = Unknown | Initialized | InProgress | Completed
  • result = Succeeded | SucceededWithIssues | Failed

예제

새 루트 타임라인 레코드를 만듭니다.

##vso[task.logdetail id=new guid;name=project1;type=build;order=1]create new timeline record

중첩된 새 타임라인 레코드를 만듭니다.

##vso[task.logdetail id=new guid;parentid=exist timeline record guid;name=project1;type=build;order=1]create new nested timeline record

타임라인 레코드 업데이트:

##vso[task.logdetail id=existing timeline record guid;progress=15;state=InProgress;]update timeline record

SetVariable: 변수 값 초기화 또는 수정

##vso[task.setvariable]value

사용

taskcontext의 변수 서비스에서 변수를 설정합니다. 첫 번째 작업은 변수를 설정할 수 있으며 다음 작업은 변수를 사용할 수 있습니다. 변수는 환경 변수로 다음 작업에 노출됩니다.

로 설정true하면 issecret 변수 값이 비밀로 저장되고 로그에서 마스킹됩니다. 비밀 변수는 작업에 환경 변수로 전달되지 않으며 대신 입력으로 전달되어야 합니다.

집합 변수를 참조하는 구문으로 true 설정된 경우 isoutput 동일한 작업, 향후 작업 또는 이후 단계에서 해당 변수에 액세스하는지 여부에 따라 달라집니다. 또한 동일한 작업 내에서 해당 변수를 사용하기 위한 구문으로 설정된 false 경우 isoutput 고유합니다. 각 사용 사례에 대한 적절한 구문을 확인하려면 출력 변수 수준을 참조하세요.

자세한 내용은 스크립트에서 변수 집합을 참조하고 변수를 정의합니다.

속성

  • variable = 변수 이름(필수)
  • issecret = 부울(선택 사항, 기본값은 false)
  • isoutput = 부울(선택 사항, 기본값은 false)
  • isreadonly = 부울(선택 사항, 기본값은 false)

예제

변수를 설정합니다.

- bash: |
    echo "##vso[task.setvariable variable=sauce;]crushed tomatoes"
    echo "##vso[task.setvariable variable=secretSauce;issecret=true]crushed tomatoes with garlic"
    echo "##vso[task.setvariable variable=outputSauce;isoutput=true]canned goods"
  name: SetVars

다음의 변수를 읽습니다.

- bash: |
    echo "Non-secrets automatically mapped in, sauce is $SAUCE"
    echo "Secrets are not automatically mapped in, secretSauce is $SECRETSAUCE"
    echo "You can use macro replacement to get secrets, and they'll be masked in the log: $(secretSauce)"

콘솔 출력:

Non-secrets automatically mapped in, sauce is crushed tomatoes
Secrets are not automatically mapped in, secretSauce is 
You can use macro replacement to get secrets, and they'll be masked in the log: ***
Future jobs can also see canned goods
Future jobs can also see canned goods

SetSecret: 값을 비밀로 등록

##vso[task.setsecret]value

사용

이 값은 작업 기간 동안 비밀로 등록됩니다. 이 시점부터 로그에서 값이 마스킹됩니다. 이 명령은 비밀이 변환되거나(예: base64 인코딩) 파생될 때 유용합니다.

참고: 이전에 발생한 비밀 값은 마스킹되지 않습니다.

예제

변수를 설정합니다.

- bash: |
    NEWSECRET=$(echo $OLDSECRET|base64)
    echo "##vso[task.setsecret]$NEWSECRET"
  name: SetSecret
  env:
    OLDSECRET: "SeCrEtVaLuE"

다음의 변수를 읽습니다.

- bash: |
    echo "Transformed and derived secrets will be masked: $(echo $OLDSECRET|base64)"
  env:
    OLDSECRET: "SeCrEtVaLuE"

콘솔 출력:

Transformed and derived secrets will be masked: ***

SetEndpoint: 서비스 연결 필드 수정

##vso[task.setendpoint]value

사용

지정된 값을 사용하여 서비스 연결 필드를 설정합니다. 업데이트된 값은 동일한 작업 내에서 실행되는 후속 작업의 엔드포인트에 유지됩니다.

속성

  • id = 서비스 연결 ID(필수)
  • field= 필드 형식, , dataParameter또는 url (필수) 중 authParameter하나
  • key = key(필수, 없는 경우 field = url)

예제

##vso[task.setendpoint id=000-0000-0000;field=authParameter;key=AccessToken]testvalue
##vso[task.setendpoint id=000-0000-0000;field=dataParameter;key=userVariable]testvalue
##vso[task.setendpoint id=000-0000-0000;field=url]https://example.com/service

AddAttachment: 빌드에 파일 첨부

##vso[task.addattachment]value

사용

첨부 파일을 업로드하고 현재 타임라인 레코드에 첨부합니다. 이러한 파일은 로그와 함께 다운로드할 수 없습니다. 이러한 값은 형식 또는 이름 값을 사용하는 확장에서만 참조할 수 있습니다.

속성

  • type = 첨부 파일 형식(필수)
  • name = 첨부 파일 이름(필수)

예시

##vso[task.addattachment type=myattachmenttype;name=myattachmentname;]c:\myattachment.txt

UploadSummary: 빌드 요약에 일부 Markdown 콘텐츠 추가

##vso[task.uploadsummary]local file path

사용

리포지토리의 .md 파일에서 현재 타임라인 레코드로 요약 Markdown을 업로드하고 첨부합니다. 이 요약은 빌드/릴리스 요약에 추가되며 로그와 함께 다운로드할 수 없습니다. 요약은 UTF-8 또는 ASCII 형식이어야 합니다. 파이프라인 실행의 확장 탭에 요약이 표시됩니다. 확장 탭의 Markdown 렌더링은 Azure DevOps Wiki 렌더링과 다릅니다.

예제

##vso[task.uploadsummary]$(System.DefaultWorkingDirectory)/testsummary.md

명령에 대한 짧은 손 형태입니다.

##vso[task.addattachment type=Distributedtask.Core.Summary;name=testsummaryname;]c:\testsummary.md

UploadFile: 작업 로그와 함께 다운로드할 수 있는 파일 업로드

##vso[task.uploadfile]local file path

사용

사용자 관심 있는 파일을 현재 타임라인 레코드에 추가 로그 정보로 업로드합니다. 파일은 작업 로그와 함께 다운로드할 수 있어야 합니다.

예시

##vso[task.uploadfile]c:\additionalfile.log

PrependPath: PATH 환경 변수에 대한 경로 앞에 추가

##vso[task.prependpath]local file path

사용

PATH 앞에 추가하여 PATH 환경 변수를 업데이트합니다. 업데이트된 환경 변수는 후속 작업에 반영됩니다.

예시

##vso[task.prependpath]c:\my\directory\path

아티팩트 명령

연결: 아티팩트 초기화

##vso[artifact.associate]artifact location

사용

기존 아티팩트 링크를 만듭니다. 아티팩트 위치는 파일 컨테이너 경로, VC 경로 또는 UNC 공유 경로여야 합니다.

속성

  • artifactname = 아티팩트 이름(필수)
  • type = 아티팩트 형식(필수) container | filepath | versioncontrol | gitref | tfvclabel

예제

  • 컨테이너

    ##vso[artifact.associate type=container;artifactname=MyServerDrop]#/1/build
    
  • Filepath

    ##vso[artifact.associate type=filepath;artifactname=MyFileShareDrop]\\MyShare\MyDropLocation
    
  • versioncontrol

    ##vso[artifact.associate type=versioncontrol;artifactname=MyTfvcPath]$/MyTeamProj/MyFolder
    
  • gitref

    ##vso[artifact.associate type=gitref;artifactname=MyTag]refs/tags/MyGitTag
    
  • tfvclabel

    ##vso[artifact.associate type=tfvclabel;artifactname=MyTag]MyTfvcLabel
    
  • 사용자 지정 아티팩트

    ##vso[artifact.associate artifactname=myDrop;artifacttype=myartifacttype]https://downloads.visualstudio.com/foo/bar/package.zip
    

업로드: 아티팩트 업로드

##vso[artifact.upload]local file path

사용

로컬 파일을 파일 컨테이너 폴더에 업로드하고 필요에 따라 아티팩트를 로 artifactname게시합니다.

속성

  • containerfolder = 파일이 업로드할 폴더입니다. 필요한 경우 폴더가 만들어집니다.
  • artifactname = 아티팩트 이름입니다. (필수)

예시

##vso[artifact.upload containerfolder=testresult;artifactname=uploadedresult]c:\testresult.trx

참고 항목

Artifact.associate와 Artifact.upload의 차이점은 첫 번째 항목을 사용하여 기존 아티팩트 링크를 만들 수 있고 후자는 새 아티팩트를 업로드/게시하는 데 사용할 수 있다는 점입니다.

빌드 명령

UploadLog: 로그 업로드

##vso[build.uploadlog]local file path

사용

사용자 관심 로그를 빌드의 컨테이너 "" 폴더에logs\tool 업로드합니다.

예시

##vso[build.uploadlog]c:\msbuild.log

UpdateBuildNumber: 자동으로 생성된 빌드 번호 재정의

##vso[build.updatebuildnumber]build number

사용

파이프라인 옵션에 지정한 토큰에서 빌드 번호를 자동으로 생성할 수 있습니다. 그러나 고유한 논리를 사용하여 빌드 번호를 설정하려는 경우 이 로깅 명령을 사용할 수 있습니다.

예시

##vso[build.updatebuildnumber]my-new-build-number

AddBuildTag: 빌드에 태그 추가

##vso[build.addbuildtag]build tag

사용

현재 빌드에 대한 태그를 추가합니다. 미리 정의된 변수 또는 사용자 정의 변수를 사용하여 태그를 확장할 수 있습니다. 예를 들어 여기서는 값 last_scanned-$(currentDate)이 있는 Bash 작업에 새 태그가 추가됩니다. AddBuildTag에서는 콜론을 사용할 수 없습니다.

예시

- task: Bash@3
    inputs:
    targetType: 'inline'
    script: |
        last_scanned="last_scanned-$(currentDate)"
        echo "##vso[build.addbuildtag]$last_scanned"
    displayName: 'Apply last scanned tag'

릴리스 명령

UpdateReleaseName: 현재 릴리스 이름 바꾸기

##vso[release.updatereleasename]release name

사용

실행 중인 릴리스의 릴리스 이름을 업데이트합니다.

참고 항목

버전 2020부터 Azure DevOps 및 Azure DevOps Server에서 지원됩니다.

예제

##vso[release.updatereleasename]my-new-release-name