GitHub Actions용 워크플로 커맨드

GitHub Actions용 워크플로 커맨드

워크플로에서 셸 명령을 실행하거나 액션의 코드에서 워크플로 커맨드를 사용할 수 있어요. 러너와 소통해서 환경 변수나 출력값, 로그 메시지를 제어하려면 꼭 알아두세요.

출처: 문서

본문

워크플로에서 셸 명령을 실행하거나 액션의 코드에서 워크플로 커맨드를 사용할 수 있습니다.

워크플로 커맨드에 대해

액션은 러너 머신과 통신해서 환경 변수를 설정하고, 다른 액션이 사용하는 출력값을 설정하고, 출력 로그에 디버그 메시지를 추가하고, 기타 작업을 수행할 수 있습니다.

대부분의 워크플로 커맨드는 특정 형식의 echo 명령을 사용하고, 일부는 파일에 쓰는 방식으로 호출됩니다. 자세한 내용은 Environment files를 참고하세요.

워크플로 커맨드의 예시

echo "::workflow-command parameter1={data},parameter2={data}::{command value}"
Write-Output "::workflow-command parameter1={data},parameter2={data}::{command value}"

[!NOTE] 워크플로 커맨드와 파라미터 이름은 대소문자를 구분하지 않습니다.

[!WARNING] Command Prompt를 사용한다면 워크플로 커맨드를 사용할 때 큰따옴표 문자(")를 생략하세요.

워크플로 커맨드를 사용해서 툴킷 함수에 접근하기

actions/toolkit에는 워크플로 커맨드로 실행할 수 있는 여러 함수가 포함되어 있습니다. YAML 파일 안에서 워크플로 커맨드를 실행하려면 :: 구문을 사용하세요. 그러면 해당 커맨드가 stdout을 통해 러너로 전송됩니다.

예를 들어 오류 주석을 만들기 위해 코드를 사용하는 대신, 아래처럼 사용합니다:

core.error('Missing semicolon', {file: 'app.js', startLine: 1})

예시: 오류 주석 만들기

워크플로에서 error 커맨드를 사용해서 같은 오류 주석을 만들 수 있습니다:

      - name: Create annotation for build error
        run: echo "::error file=app.js,line=1::Missing semicolon"
      - name: Create annotation for build error
        run: Write-Output "::error file=app.js,line=1::Missing semicolon"

다음 표는 워크플로 안에서 사용할 수 있는 툴킷 함수를 보여줍니다:

Toolkit function Equivalent workflow command
core.addPath 환경 파일 GITHUB_PATH로 접근
core.debug debug
core.notice notice
core.error error
core.endGroup endgroup
core.exportVariable 환경 파일 GITHUB_ENV로 접근
core.getInput 환경 변수 INPUT_{NAME}로 접근
core.getState 환경 변수 STATE_{NAME}로 접근
core.isDebug 환경 변수 RUNNER_DEBUG로 접근
core.summary 환경 파일 GITHUB_STEP_SUMMARY로 접근
core.saveState 환경 파일 GITHUB_STATE로 접근
core.setCommandEcho echo
core.setFailed ::errorexit 1의 바로가기로 사용
core.setOutput 환경 파일 GITHUB_OUTPUT로 접근
core.setSecret add-mask
core.startGroup group
core.warning warning

디버그 메시지 설정하기

로그에 디버그 메시지를 출력합니다. 이 커맨드가 설정한 디버그 메시지를 로그에서 보려면 값이 trueACTIONS_STEP_DEBUG라는 시크릿을 만들어야 합니다. 자세한 내용은 Enabling debug logging을 참고하세요.

::debug::{message}

예시: 디버그 메시지 설정하기

echo "::debug::Set the Octocat variable"
Write-Output "::debug::Set the Octocat variable"

공지(notice) 메시지 설정하기

공지 메시지를 만들고 로그에 출력합니다. 이 메시지는 저장소의 특정 파일과 메시지를 연결할 수 있는 주석을 만듭니다. 선택적으로 메시지는 파일 내의 위치를 지정할 수 있습니다.

::notice file={name},line={line},endLine={endLine},title={title}::{message}
Parameter Value Required Default
title Custom title No None
file Filename No .github
col Column number, starting at 1 No None
endColumn End column number No None
line Line number, starting at 1 No 1
endLine End line number No 1

예시: 공지 메시지 설정하기

echo "::notice file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
Write-Output "::notice file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"

경고 메시지 설정하기

경고 메시지를 만들고 로그에 출력합니다. 이 메시지는 저장소의 특정 파일과 메시지를 연결할 수 있는 주석을 만듭니다. 선택적으로 메시지는 파일 내의 위치를 지정할 수 있습니다.

::warning file={name},line={line},endLine={endLine},title={title}::{message}
Parameter Value Required Default
title Custom title No None
file Filename No .github
col Column number, starting at 1 No None
endColumn End column number No None
line Line number, starting at 1 No 1
endLine End line number No 1

예시: 경고 메시지 설정하기

echo "::warning file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Write-Output "::warning file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"

오류 메시지 설정하기

오류 메시지를 만들고 로그에 출력합니다. 이 메시지는 저장소의 특정 파일과 메시지를 연결할 수 있는 주석을 만듭니다. 선택적으로 메시지는 파일 내의 위치를 지정할 수 있습니다.

::error file={name},line={line},endLine={endLine},title={title}::{message}
Parameter Value Required Default
title Custom title No None
file Filename No .github
col Column number, starting at 1 No None
endColumn End column number No None
line Line number, starting at 1 No 1
endLine End line number No 1

예시: 오류 메시지 설정하기

echo "::error file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Write-Output "::error file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"

로그 줄 그룹화하기

로그에 펼칠 수 있는 그룹을 만듭니다. 그룹을 만들려면 group 커맨드를 사용하고 title을 지정합니다. groupendgroup 커맨드 사이에 로그로 출력하는 모든 것은 로그의 펼칠 수 있는 항목 안에 중첩됩니다.

::group::{title}
::endgroup::

예시: 로그 줄 그룹화하기

jobs:
  bash-example:
    runs-on: ubuntu-latest
    steps:
      - name: Group of log lines
        run: |
            echo "::group::My title"
            echo "Inside group"
            echo "::endgroup::"
jobs:
  powershell-example:
    runs-on: windows-latest
    steps:
      - name: Group of log lines
        run: |
            Write-Output "::group::My title"
            Write-Output "Inside group"
            Write-Output "::endgroup::"

Screenshot of the log for the workflow step. The second line, "My title", is an expanded group. The next line, "Inside group", is indented below.

로그에서 값 마스킹하기

::add-mask::{value}

값을 마스킹하면 문자열이나 변수가 로그에 출력되지 않도록 방지합니다. 공백으로 구분된 각 마스킹된 단어는 * 문자로 대체됩니다. 마스크의 value에는 환경 변수나 문자열을 사용할 수 있습니다. 이 작업은 잡마다 값당 한 번 수행해야 합니다. 값을 마스킹하면 시크릿으로 취급되어 러너에서 가려집니다. 예를 들어 값을 마스킹한 후에는 그 값을 출력으로 설정할 수 없습니다.

예시: 문자열 마스킹하기

로그에 "Mona The Octocat"을 출력하면 "***"이 표시됩니다.

echo "::add-mask::Mona The Octocat"
Write-Output "::add-mask::Mona The Octocat"

[!WARNING] 시크릿을 빌드 로그에 출력하거나 다른 워크플로 커맨드에서 사용하기 전에 add-mask로 시크릿을 등록해야 합니다.

예시: 환경 변수 마스킹하기

로그에 MY_NAME 변수나 "Mona The Octocat" 값을 출력하면 "Mona The Octocat" 대신 "***"이 표시됩니다.

jobs:
  bash-example:
    runs-on: ubuntu-latest
    env:
      MY_NAME: "Mona The Octocat"
    steps:
      - name: bash-version
        run: echo "::add-mask::$MY_NAME"
jobs:
  powershell-example:
    runs-on: windows-latest
    env:
      MY_NAME: "Mona The Octocat"
    steps:
      - name: powershell-version
        run: Write-Output "::add-mask::$env:MY_NAME"

예시: 단일 잡 내에서 생성된 출력 마스킹하기

시크릿을 다른 잡으로 전달할 필요가 없다면 다음을 할 수 있습니다:

  1. 시크릿을 생성합니다(출력하지 않고).
  2. add-mask로 마스킹합니다.
  3. GITHUB_OUTPUT을 사용해서 시크릿을 잡 내의 다른 스텝에서 사용할 수 있게 합니다.
on: push
jobs:
  generate-a-secret-output:
    runs-on: ubuntu-latest
    steps:
      - id: sets-a-secret
        name: Generate, mask, and output a secret
        run: |
          the_secret=$((RANDOM))
          echo "::add-mask::$the_secret"
          echo "secret-number=$the_secret" >> "$GITHUB_OUTPUT"
      - name: Use that secret output (protected by a mask)
        run: |
          echo "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"
on: push
jobs:
  generate-a-secret-output:
    runs-on: ubuntu-latest
    steps:
      - id: sets-a-secret
        name: Generate, mask, and output a secret
        shell: pwsh
        run: |
          Set-Variable -Name TheSecret -Value (Get-Random)
          Write-Output "::add-mask::$TheSecret"
          "secret-number=$TheSecret" >> $env:GITHUB_OUTPUT
      - name: Use that secret output (protected by a mask)
        shell: pwsh
        run: |
          Write-Output "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"

예시: 잡 또는 워크플로 간에 마스킹된 시크릿 전달하기

마스킹된 시크릿을 잡이나 워크플로 간에 전달하려면 시크릿을 저장소(store)에 저장한 다음 이후의 잡이나 워크플로에서 검색해야 합니다.

설정
  1. 워크플로 중에 생성할 시크릿을 저장할 시크릿 저장소를 설정합니다. 예를 들어 Vault.
  2. 해당 시크릿 저장소에 읽고 쓰기 위한 키를 생성합니다. 키를 저장소 시크릿으로 저장합니다. 다음 예시 워크플로에서 시크릿 이름은 SECRET_STORE_CREDENTIALS입니다. 자세한 내용은 Using secrets in GitHub Actions를 참고하세요.
워크플로

[!NOTE] 이 워크플로는 가상의 시크릿 저장소인 secret-store를 사용하며, 가상의 커맨드 store-secretretrieve-secret가 있습니다. some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29secret-store 애플리케이션을 설치하고 credentialsinstance에 연결하도록 구성하는 가상의 액션입니다.

on: push

jobs:
  secret-generator:
    runs-on: ubuntu-latest
    outputs:
      handle: ${{ steps.generate-secret.outputs.handle }}
    steps:
    - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
      with:
        credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
        instance: ${{ secrets.SECRET_STORE_INSTANCE }}
    - name: generate secret
      id: generate-secret
      shell: bash
      run: |
        GENERATED_SECRET=$((RANDOM))
        echo "::add-mask::$GENERATED_SECRET"
        SECRET_HANDLE=$(secret-store store-secret "$GENERATED_SECRET")
        echo "handle=$SECRET_HANDLE" >> "$GITHUB_OUTPUT"
  secret-consumer:
    runs-on: macos-latest
    needs: secret-generator
    steps:
    - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
      with:
        credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
        instance: ${{ secrets.SECRET_STORE_INSTANCE }}
    - name: use secret
      shell: bash
      run: |
        SECRET_HANDLE="${{ needs.secret-generator.outputs.handle }}"
        RETRIEVED_SECRET=$(secret-store retrieve-secret "$SECRET_HANDLE")
        echo "::add-mask::$RETRIEVED_SECRET"
        echo "We retrieved our masked secret: $RETRIEVED_SECRET"
on: push

jobs:
  secret-generator:
    runs-on: ubuntu-latest
    steps:
    - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
      with:
        credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
        instance: ${{ secrets.SECRET_STORE_INSTANCE }}
    - name: generate secret
      shell: pwsh
      run: |
        Set-Variable -Name Generated_Secret -Value (Get-Random)
        Write-Output "::add-mask::$Generated_Secret"
        Set-Variable -Name Secret_Handle -Value (Store-Secret "$Generated_Secret")
        "handle=$Secret_Handle" >> $env:GITHUB_OUTPUT
  secret-consumer:
    runs-on: macos-latest
    needs: secret-generator
    steps:
    - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
      with:
        credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
        instance: ${{ secrets.SECRET_STORE_INSTANCE }}
    - name: use secret
      shell: pwsh
      run: |
        Set-Variable -Name Secret_Handle -Value "${{ needs.secret-generator.outputs.handle }}"
        Set-Variable -Name Retrieved_Secret -Value (Retrieve-Secret "$Secret_Handle")
        echo "::add-mask::$Retrieved_Secret"
        echo "We retrieved our masked secret: $Retrieved_Secret"

워크플로 커맨드 중지 및 시작하기

모든 워크플로 커맨드의 처리를 중지합니다. 이 특수 커맨드를 사용하면 실수로 워크플로 커맨드를 실행하지 않고 무엇이든 로그로 기록할 수 있습니다. 예를 들어 주석이 있는 전체 스크립트를 출력하기 위해 로그 기록을 중지할 수 있습니다.

::stop-commands::{endtoken}

워크플로 커맨드 처리를 중지하려면 stop-commands에 고유한 토큰을 전달합니다. 워크플로 커맨드 처리를 재개하려면 워크플로 커맨드를 중지할 때 사용한 것과 같은 토큰을 전달합니다.

[!WARNING] 사용하는 토큰이 무작위로 생성되고 각 실행마다 고유한지 확인하세요.

::{endtoken}::

예시: 워크플로 커맨드 중지 및 시작하기

jobs:
  workflow-command-job:
    runs-on: ubuntu-latest
    steps:
      - name: Disable workflow commands
        run: |
          echo '::warning:: This is a warning message, to demonstrate that commands are being processed.'
          stopMarker=$(uuidgen)
          echo "::stop-commands::$stopMarker"
          echo '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.'
          echo "::$stopMarker::"
          echo '::warning:: This is a warning again, because stop-commands has been turned off.'
jobs:
  workflow-command-job:
    runs-on: windows-latest
    steps:
      - name: Disable workflow commands
        run: |
          Write-Output '::warning:: This is a warning message, to demonstrate that commands are being processed.'
          $stopMarker = New-Guid
          Write-Output "::stop-commands::$stopMarker"
          Write-Output '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.'
          Write-Output "::$stopMarker::"
          Write-Output '::warning:: This is a warning again, because stop-commands has been turned off.'

pre 및 post 액션에 값 보내기

GITHUB_STATE에 위치한 파일에 쓰면 워크플로의 pre:post: 액션과 공유할 환경 변수를 만들 수 있습니다. 예를 들어 pre: 액션으로 파일을 만들고, 파일 위치를 main: 액션에 전달한 다음, post: 액션으로 파일을 삭제할 수 있습니다. 또는 main: 액션으로 파일을 만들고 파일 위치를 post: 액션에 전달하고 post: 액션으로도 파일을 삭제할 수 있습니다.

pre:post: 액션이 여러 개라면 저장된 값은 GITHUB_STATE에 기록된 액션에서만 접근할 수 있습니다. post: 액션에 대한 자세한 내용은 Metadata syntax reference를 참고하세요.

GITHUB_STATE 파일은 액션 내에서만 사용할 수 있습니다. 저장된 값은 STATE_ 접두사가 있는 환경 값으로 저장됩니다.

이 예시는 JavaScript를 사용해서 GITHUB_STATE 파일에 씁니다. 결과 환경 변수는 값이 12345STATE_processID라는 이름이 됩니다:

import * as fs from 'fs'
import * as os from 'os'

fs.appendFileSync(process.env.GITHUB_STATE, `processID=12345${os.EOL}`, {
  encoding: 'utf8'
})

그런 다음 STATE_processID 변수는 main 액션 아래에서 실행되는 정리 스크립트에서만 독점적으로 사용할 수 있습니다. 이 예시는 main에서 실행되며 JavaScript를 사용해서 STATE_processID 환경 변수에 할당된 값을 표시합니다:

console.log("The running PID from the main action is: " + process.env.STATE_processID);

환경 파일(Environment files)

워크플로 실행 중 러너는 특정 작업을 수행하는 데 사용할 수 있는 임시 파일을 생성합니다. 이 파일들의 경로는 GitHub의 기본 환경 변수를 사용해서 접근하고 편집할 수 있습니다. Variables reference를 참고하세요. 커맨드의 올바른 처리를 보장하려면 이 파일들에 쓸 때 UTF-8 인코딩을 사용해야 합니다. 같은 파일에 여러 커맨드를 줄바꿈으로 구분해서 쓸 수 있습니다.

GitHub Action에서 환경 변수를 사용하려면 특정 GitHub Actions 커맨드를 사용해서 .env 파일을 만들거나 수정합니다.

방법은 다음과 같습니다:

name: Example Workflow for Environment Files

on: push

jobs:
  set_and_use_env_vars:
    runs-on: ubuntu-latest
    steps:
      - name: Set environment variable
        run: echo "MY_ENV_VAR=myValue" >> $GITHUB_ENV

      - name: Use environment variable
        run: |
          echo "The value of MY_ENV_VAR is $MY_ENV_VAR"

또 다른 예시는 빌드 타임스탬프, 커밋 SHA, 아티팩트 이름 같은 메타데이터를 저장하는 데 사용하는 것입니다:

steps:
  - name: Store build timestamp
    run: echo "BUILD_TIME=$(date +'%T')" >> $GITHUB_ENV

  - name: Deploy using stored timestamp
    run: echo "Deploying at $BUILD_TIME"

[!NOTE] PowerShell 5.1 이하 버전(shell: powershell)은 기본적으로 UTF-8을 사용하지 않으므로 UTF-8 인코딩을 지정해야 합니다. 예를 들어:

jobs:
  legacy-powershell-example:
    runs-on: windows-latest
    steps:
      - shell: powershell
        run: |
          "mypath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append

PowerShell Core 6 이상 버전(shell: pwsh)은 기본적으로 UTF-8을 사용합니다. 예를 들어:

jobs:
  powershell-core-example:
    runs-on: windows-latest
    steps:
      - shell: pwsh
        run: |
          "mypath" >> $env:GITHUB_PATH

환경 변수 설정하기

[!NOTE] 문제를 피하기 위해 운영 체제와 셸의 동작과 관계없이 환경 변수를 대소문자 구분으로 취급하는 것이 좋습니다.

echo "{environment_variable_name}={value}" >> "$GITHUB_ENV"
  • PowerShell 6 이상 버전 사용:

    "{environment_variable_name}={value}" >> $env:GITHUB_ENV
    
  • PowerShell 5.1 이하 버전 사용:

    "{environment_variable_name}={value}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
    

환경 변수를 정의하거나 업데이트하고 GITHUB_ENV 환경 파일에 기록하면 워크플로 잡의 이후 스텝에서 사용할 수 있게 만들 수 있습니다. 환경 변수를 만들거나 업데이트하는 스텝은 새 값에 접근할 수 없지만, 잡의 이후 모든 스텝에서는 접근할 수 있습니다.

GITHUB_*RUNNER_*라는 기본 환경 변수의 값은 덮어쓸 수 없습니다. 현재 CI 변수의 값은 덮어쓸 수 있습니다. 그러나 이것이 항상 가능하리라는 보장은 없습니다. 기본 환경 변수에 대한 자세한 내용은 Variables reference를 참고하세요.

[!NOTE] 보안 제한으로 인해 GITHUB_ENV를 사용해서 NODE_OPTIONS 환경 변수를 설정할 수 없습니다.

GITHUB_ENV에 환경 변수 쓰기 예시

steps:
  - name: Set the value
    id: step_one
    run: |
      echo "action_state=yellow" >> "$GITHUB_ENV"
  - name: Use the value
    id: step_two
    run: |
      printf '%s\n' "$action_state" # This will output 'yellow'
steps:
  - name: Set the value
    id: step_one
    run: |
      "action_state=yellow" >> $env:GITHUB_ENV
  - name: Use the value
    id: step_two
    run: |
      Write-Output "$env:action_state" # This will output 'yellow'

여러 줄 문자열

여러 줄 문자열의 경우 다음 구문으로 구분자(delimiter)를 사용할 수 있습니다.

{name}<<{delimiter}
{value}
{delimiter}

[!WARNING] 사용하는 구분자가 값 안에서 단독 줄로 발생하지 않도록 확인하세요. 값이 완전히 임의적이라면 이 형식을 사용하지 마세요. 대신 값을 파일에 쓰세요.

여러 줄 문자열의 예시

이 예시는 EOF를 구분자로 사용하고 JSON_RESPONSE 환경 변수를 curl 응답의 값으로 설정합니다.

steps:
  - name: Set the value in bash
    id: step_one
    run: |
      {
        echo 'JSON_RESPONSE<<EOF'
        curl https://example.com
        echo EOF
      } >> "$GITHUB_ENV"
steps:
  - name: Set the value in pwsh
    id: step_one
    run: |
      $EOF = (New-Guid).Guid
      "JSON_RESPONSE<<$EOF" >> $env:GITHUB_ENV
      (Invoke-WebRequest -Uri "https://example.com").Content >> $env:GITHUB_ENV
      "$EOF" >> $env:GITHUB_ENV
    shell: pwsh

출력 파라미터 설정하기

스텝의 출력 파라미터를 설정합니다. 이후 출력 값을 검색하려면 스텝에 id가 정의되어 있어야 합니다. Multiline strings 섹션에서 여러 줄 환경 변수를 정의하는 데 사용한 것과 같은 기법으로 여러 줄 출력 값을 설정할 수 있습니다.

echo "{name}={value}" >> "$GITHUB_OUTPUT"
"{name}=value" >> $env:GITHUB_OUTPUT

출력 파라미터 설정 예시

이 예시는 SELECTED_COLOR 출력 파라미터를 설정하고 나중에 검색하는 방법을 보여줍니다:

      - name: Set color
        id: color-selector
        run: echo "SELECTED_COLOR=green" >> "$GITHUB_OUTPUT"
      - name: Get color
        env:
          SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }}
        run: echo "The selected color is $SELECTED_COLOR"

이 예시는 SELECTED_COLOR 출력 파라미터를 설정하고 나중에 검색하는 방법을 보여줍니다:

      - name: Set color
        id: color-selector
        run: |
            "SELECTED_COLOR=green" >> $env:GITHUB_OUTPUT
      - name: Get color
        env:
          SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }}
        run: Write-Output "The selected color is $env:SELECTED_COLOR"

잡 요약 추가하기

echo "{markdown content}" >> $GITHUB_STEP_SUMMARY
"{markdown content}" >> $env:GITHUB_STEP_SUMMARY

각 잡에 대한 사용자 지정 Markdown을 설정해서 워크플로 실행의 요약 페이지에 표시할 수 있습니다. 잡 요약을 사용해서 테스트 결과 요약 같은 고유한 콘텐츠를 표시하고 그룹화할 수 있으므로, 워크플로 실행 결과를 보는 사람이 실패 같은 실행과 관련된 중요한 정보를 보기 위해 로그로 들어갈 필요가 없습니다.

잡 요약은 GitHub flavored Markdown을 지원하며, 스텝의 Markdown 콘텐츠를 GITHUB_STEP_SUMMARY 환경 파일에 추가할 수 있습니다. GITHUB_STEP_SUMMARY는 잡의 각 스텝마다 고유합니다. GITHUB_STEP_SUMMARY가 참조하는 스텝별 파일에 대한 자세한 내용은 Environment files를 참고하세요.

잡이 끝나면 잡의 모든 스텝에 대한 요약이 단일 잡 요약으로 그룹화되어 워크플로 실행 요약 페이지에 표시됩니다. 여러 잡이 요약을 생성하면 잡 요약은 잡 완료 시간순으로 정렬됩니다.

잡 요약 추가 예시

echo "### Hello world! :rocket:" >> $GITHUB_STEP_SUMMARY
"### Hello world! :rocket:" >> $env:GITHUB_STEP_SUMMARY

Screenshot of the summary page of a workflow run. Under "example summary" is "Hello world!" and a rocket emoji.

여러 줄 Markdown 콘텐츠

여러 줄 Markdown 콘텐츠의 경우 >>를 사용해서 현재 스텝의 콘텐츠를 계속해서 추가할 수 있습니다. 추가 작업마다 새 줄 문자가 자동으로 추가됩니다.

여러 줄 Markdown 콘텐츠의 예시
- name: Generate list using Markdown
  run: |
    echo "This is the lead in sentence for the list" >> $GITHUB_STEP_SUMMARY
    echo "" >> $GITHUB_STEP_SUMMARY # this is a blank line
    echo "- Lets add a bullet point" >> $GITHUB_STEP_SUMMARY
    echo "- Lets add a second bullet point" >> $GITHUB_STEP_SUMMARY
    echo "- How about a third one?" >> $GITHUB_STEP_SUMMARY
- name: Generate list using Markdown
  run: |
    "This is the lead in sentence for the list" >> $env:GITHUB_STEP_SUMMARY
    "" >> $env:GITHUB_STEP_SUMMARY # this is a blank line
    "- Lets add a bullet point" >> $env:GITHUB_STEP_SUMMARY
    "- Lets add a second bullet point" >> $env:GITHUB_STEP_SUMMARY
    "- How about a third one?" >> $env:GITHUB_STEP_SUMMARY

잡 요약 덮어쓰기

현재 스텝의 모든 콘텐츠를 지우려면 Bash에서 >를 사용해서 이전에 추가된 콘텐츠를 덮어쓸 수 있고, PowerShell에서는 -Append를 제거할 수 있습니다.

잡 요약 덮어쓰기 예시
- name: Overwrite Markdown
  run: |
    echo "Adding some Markdown content" >> $GITHUB_STEP_SUMMARY
    echo "There was an error, we need to clear the previous Markdown with some new content." > $GITHUB_STEP_SUMMARY
- name: Overwrite Markdown
  run: |
    "Adding some Markdown content" >> $env:GITHUB_STEP_SUMMARY
    "There was an error, we need to clear the previous Markdown with some new content." >> $env:GITHUB_STEP_SUMMARY

잡 요약 제거하기

현재 스텝의 요약을 완전히 제거하려면 GITHUB_STEP_SUMMARY가 참조하는 파일을 삭제할 수 있습니다.

잡 요약 제거 예시
- name: Delete all summary content
  run: |
    echo "Adding Markdown content that we want to remove before the step ends" >> $GITHUB_STEP_SUMMARY
    rm $GITHUB_STEP_SUMMARY
- name: Delete all summary content
  run: |
    "Adding Markdown content that we want to remove before the step ends" >> $env:GITHUB_STEP_SUMMARY
    Remove-Item $env:GITHUB_STEP_SUMMARY

스텝이 완료된 후에는 잡 요약이 업로드되며 이후 스텝은 이전에 업로드된 Markdown 콘텐츠를 수정할 수 없습니다. 요약은 실수로 추가된 시크릿을 자동으로 마스킹합니다. 잡 요약에 삭제해야 할 민감한 정보가 있다면 워크플로 실행 전체를 삭제해서 모든 잡 요약을 제거할 수 있습니다. 자세한 내용은 Deleting a workflow run을 참고하세요.

스텝 격리 및 한도

잡 요약은 스텝 간에 격리되며 각 스텝은 최대 크기 1MiB로 제한됩니다. 단일 스텝의 잠재적으로 잘못된 Markdown이 이후 스텝의 Markdown 렌더링을 깨뜨릴 수 없도록 스텝 간에 격리가 강제됩니다. 스텝에 1MiB가 넘는 콘텐츠가 추가되면 스텝의 업로드가 실패하고 오류 주석이 생성됩니다. 잡 요약의 업로드 실패는 스텝이나 잡의 전반적인 상태에 영향을 주지 않습니다. 잡당 최대 20개의 스텝 잡 요약이 표시됩니다.

시스템 경로 추가하기

시스템 PATH 변수에 디렉터리를 앞에 추가하고 현재 잡의 이후 모든 액션에서 자동으로 사용할 수 있게 만듭니다. 현재 실행 중인 액션은 업데이트된 경로 변수에 접근할 수 없습니다. 잡에 대해 현재 정의된 경로를 보려면 스텝이나 액션에서 echo "$PATH"를 사용할 수 있습니다.

시스템 경로 추가 예시

이 예시는 사용자 $HOME/.local/bin 디렉터리를 PATH에 추가하는 방법을 보여줍니다:

echo "$HOME/.local/bin" >> "$GITHUB_PATH"

이 예시는 사용자 $env:HOMEPATH/.local/bin 디렉터리를 PATH에 추가하는 방법을 보여줍니다:

"$env:HOMEPATH/.local/bin" | Out-File -FilePath "$env:GITHUB_PATH" -Append

워크플로 아티팩트 선언하기

파일이나 OCI 참조를 워크플로 아티팩트로 선언하려면 GITHUB_ARTIFACTS 환경 파일에 줄마다 하나씩 작성합니다. 각 스텝은 새롭고 스텝별 파일에 씁니다. 경로는 해당 스텝에 고유합니다.

선언된 아티팩트에 대한 메타데이터는 잡의 모든 스텝에 걸쳐 수집되며 GITHUB_ARTIFACTS_LIST 파일을 통해 노출됩니다.

각 줄은 다음 형식 중 하나여야 합니다. 빈 줄과 #로 시작하는 줄은 무시됩니다.

  • 파일 경로: 파일에 대한 상대 또는 절대 경로이며, 선택적으로 file:// 접두사가 붙습니다. 상대 경로는 GITHUB_WORKSPACE에 대해 해석됩니다. 경로는 존재하는 일반 파일(디렉터리 아님)을 가리켜야 합니다. 러너는 파일의 기본 이름과 SHA-256 다이제스트를 기록합니다.
  • OCI 참조: REFERENCE@ALGORITHM:HEX 형식의 참조이며, 선택적으로 oci:// 접두사가 붙습니다. REFERENCE는 이미지 이름(선택적 태그 포함)이고, ALGORITHMsha256, sha384, sha512 중 하나여야 합니다. HEX는 해당 알고리즘의 전체 소문자 다이제스트여야 합니다: sha256은 64개, sha384는 96개, sha512는 128개의 16진수 문자입니다.

한도:

  • 스텝별 커맨드 파일은 1MiB로 제한됩니다.
  • 잡은 모든 스텝에 걸쳐 최대 500개의 워크플로 아티팩트를 축적할 수 있습니다.
  • 이름과 다이제스트가 동일한 아티팩트가 두 번 이상 선언되면 중복 제거됩니다. 충돌하는 선언(같은 이름, 다른 다이제스트)은 오류를 생성합니다.
echo "dist/my-binary" >> "$GITHUB_ARTIFACTS"

OCI 참조를 선언하려면:

echo "oci://ghcr.io/octocat/myapp:1.0.0@sha256:914b38d45a65e4263a179d9c2b09cc04dcbcaa8257fa85100cf42f9a3b408cfb" >> "$GITHUB_ARTIFACTS"
"dist/my-binary" >> $env:GITHUB_ARTIFACTS

OCI 참조를 선언하려면:

"oci://ghcr.io/octocat/myapp:1.0.0@sha256:914b38d45a65e4263a179d9c2b09cc04dcbcaa8257fa85100cf42f9a3b408cfb" >> $env:GITHUB_ARTIFACTS

워크플로 아티팩트 읽기

현재 잡의 이전 스텝에서 선언한 집계된 워크플로 아티팩트 메타데이터를 GITHUB_ARTIFACTS_LIST 환경 파일에서 읽습니다. 이 파일은 읽기 전용이며 각 스텝이 완료된 후 러너가 업데이트합니다. 다음 구조의 UTF-8로 인코딩된 JSON 객체를 포함합니다:

{
  "version": 1,
  "subjects": [
    {
      "name": "my-binary",
      "digest": "sha256:abc123...",
      "kind": "file"
    },
    {
      "name": "ghcr.io/octocat/myapp:1.0.0",
      "digest": "sha256:a1b2c3d4...",
      "kind": "oci"
    }
  ]
}

subjects 배열의 각 항목은 다음을 포함합니다:

  • name: 파일의 기본 이름 또는 OCI 참조 이름(다이제스트 제외).
  • digest: 아티팩트의 algorithm:hex 다이제스트.
  • kind: file 또는 oci 중 하나.

아티팩트는 name별로 알파벳순으로 정렬됩니다.

cat "$GITHUB_ARTIFACTS_LIST"
Get-Content $env:GITHUB_ARTIFACTS_LIST

더 알아보기 (Learn more)